{
 "schemaNote": "BSV generator coverage v0.1. Facts counted from the generator and BSV's own checks at build time. No target is runtime-tested by BSV.",
 "generatedFrom": "trader-toolkit/generator/render.mjs, trader-toolkit/recipes and scripts/site checks in the BSV repository",
 "higherTimeframeDisclosure": "Correction (2026-10-04): before this date every BSV generator target computed indicators marked with a higher timeframe (timeframeRef) on the chart timeframe, with no warning. This affected the recipe mtf-confirmation-panel. Now 3 targets compute real higher-timeframe values from closed bars (checked inside their libraries), 7 more (Pine v6, MQL5, MQL4, NinjaTrader 8, cTrader, AmiBroker, thinkorswim) read the last closed higher-timeframe bar with the platform's officially documented idiom (pattern checked statically; not run by BSV), and the other 12 leave those blocks as TODO stubs.",
 "counts": {
  "targets": 22,
  "recipes": 14,
  "byCheckKind": {
   "API_STUB_RUN": 1,
   "ENGINE_STAND_IN": 1,
   "LIBRARY_RUN": 3,
   "PARITY_ONLY": 10,
   "STRUCTURAL": 1,
   "STUB_COMPILE": 4,
   "SUBSET_EVALUATOR": 2
  },
  "runtimeTestedByBSV": 0,
  "higherTimeframeReal": 3,
  "higherTimeframeDocumentedIdiom": 7,
  "recipeTargetPairsWithoutTodo": 148
 },
 "targets": [
  {
   "id": "pine-v6",
   "label": "TradingView · Pine v6",
   "extension": ".pine",
   "check": {
    "kind": "PARITY_ONLY",
    "script": "scripts/site/test_builder_parity.mjs",
    "note": "Only checked that the browser builder output equals the CLI generator; no target-specific check."
   },
   "higherTimeframe": {
    "status": "CLOSED_BAR_IDIOM_STATIC",
    "note": "request.security(syminfo.tickerid, tf, expr[1], lookahead = barmerge.lookahead_on) — the non-repainting idiom from the Pine Script v6 manual — plus a runtime.error guard when the chart timeframe is not lower. Pattern checked statically by BSV; not run by BSV (UNTESTED_RUNTIME).",
    "docs": [
     "https://www.tradingview.com/pine-script-docs/concepts/repainting/",
     "https://www.tradingview.com/pine-script-docs/concepts/other-timeframes-and-data/"
    ],
    "check": "scripts/site/check_htf.py"
   },
   "runtimeTestedByBSV": false
  },
  {
   "id": "mql5",
   "label": "MT5 · MQL5",
   "extension": ".mq5",
   "check": {
    "kind": "PARITY_ONLY",
    "script": "scripts/site/test_builder_parity.mjs",
    "note": "Only checked that the browser builder output equals the CLI generator; no target-specific check."
   },
   "higherTimeframe": {
    "status": "CLOSED_BAR_IDIOM_STATIC",
    "note": "Indicator handle on the higher PERIOD; value read with CopyBuffer at start_pos = iBarShift(chart bar time) + 1 = the last closed higher-timeframe bar. OnInit fails when the chart period is not lower. Pattern checked statically by BSV; not compiled or run by BSV (UNTESTED_RUNTIME). Bars follow broker server time.",
    "docs": [
     "https://www.mql5.com/en/docs/series/ibarshift",
     "https://www.mql5.com/en/docs/series/copybuffer",
     "https://www.mql5.com/en/docs/constants/chartconstants/enum_timeframes"
    ],
    "check": "scripts/site/check_htf.py"
   },
   "runtimeTestedByBSV": false
  },
  {
   "id": "ctrader",
   "label": "cTrader · C#",
   "extension": ".cs",
   "check": {
    "kind": "STUB_COMPILE",
    "script": "scripts/site/check_ctrader_stubs.sh",
    "note": "dotnet build against BSV stubs from the cTrader Algo API reference; not a real cTrader build."
   },
   "higherTimeframe": {
    "status": "CLOSED_BAR_IDIOM_STATIC",
    "note": "MarketData.GetBars(TimeFrame.Hour) and the indicator on that series; value at index k - 1, where k = GetIndexByTime(chart bar open time) stepped back with the OpenTimes indexer until that bar opened at or before the chart bar's open. The reference does not state how GetIndexByTime rounds a time inside a bar, so the step-back makes k - 1 a closed bar under any rounding (worst case one extra bar of lag, never a forming bar). Higher-timeframe values stay empty unless the chart TimeFrame is a strictly lower time frame. Pattern checked statically and compiled against BSV stubs; not run on cTrader (UNTESTED_RUNTIME).",
    "docs": [
     "https://help.ctrader.com/ctrader-algo/references/Collections/DataSeries/TimeSeries/",
     "https://help.ctrader.com/ctrader-algo/references/MarketData/MarketData/",
     "https://help.ctrader.com/ctrader-algo/references/Period/TimeFrame/"
    ],
    "check": "scripts/site/check_htf.py"
   },
   "runtimeTestedByBSV": false
  },
  {
   "id": "mql4",
   "label": "MT4 · MQL4",
   "extension": ".mq4",
   "check": {
    "kind": "PARITY_ONLY",
    "script": "scripts/site/test_builder_parity.mjs",
    "note": "Only checked that the browser builder output equals the CLI generator; no target-specific check."
   },
   "higherTimeframe": {
    "status": "CLOSED_BAR_IDIOM_STATIC",
    "note": "iMA/iRSI/iATR on the higher PERIOD at shift = iBarShift(chart bar time) + 1 = the last closed higher-timeframe bar; standard MT4 periods only. OnInit fails when the chart period is not lower. Pattern checked statically by BSV; not compiled or run by BSV (UNTESTED_RUNTIME). Bars follow broker server time.",
    "docs": [
     "https://docs.mql4.com/series/ibarshift",
     "https://docs.mql4.com/indicators/ima",
     "https://docs.mql4.com/constants/chartconstants/enum_timeframes"
    ],
    "check": "scripts/site/check_htf.py"
   },
   "runtimeTestedByBSV": false
  },
  {
   "id": "ctrader-python",
   "label": "cTrader · Python",
   "extension": ".py",
   "check": {
    "kind": "PARITY_ONLY",
    "script": "scripts/site/test_builder_parity.mjs",
    "note": "Only checked that the browser builder output equals the CLI generator; no target-specific check."
   },
   "higherTimeframe": {
    "status": "UNSUPPORTED_TODO",
    "note": "Blocks that use a higher timeframe are left as unsupported stubs with a TODO line (empty value / false signal); never computed on the chart timeframe."
   },
   "runtimeTestedByBSV": false
  },
  {
   "id": "bookmap-python",
   "label": "Bookmap · Python",
   "extension": ".py",
   "check": {
    "kind": "PARITY_ONLY",
    "script": "scripts/site/test_builder_parity.mjs",
    "note": "Only checked that the browser builder output equals the CLI generator; no target-specific check."
   },
   "higherTimeframe": {
    "status": "UNSUPPORTED_TODO",
    "note": "Blocks that use a higher timeframe are left as unsupported stubs with a TODO line (empty value / false signal); never computed on the chart timeframe."
   },
   "runtimeTestedByBSV": false
  },
  {
   "id": "ninjatrader",
   "label": "NinjaTrader 8 · NinjaScript",
   "extension": ".cs",
   "check": {
    "kind": "PARITY_ONLY",
    "script": "scripts/site/test_builder_parity.mjs",
    "note": "Only checked that the browser builder output equals the CLI generator; no target-specific check."
   },
   "higherTimeframe": {
    "status": "CLOSED_BAR_IDIOM_STATIC",
    "note": "AddDataSeries in State.Configure with Calculate forced to OnBarClose (the manual: chart bars then only know the last closed bar of the added series; shared timestamps run the chart series first); indicator on that series, stored per chart bar in BarsInProgress 0; DataLoaded throws when the chart timeframe is not lower. Pattern checked statically by BSV; not compiled or run by BSV (UNTESTED_RUNTIME). Bars follow the trading hours template.",
    "docs": [
     "https://ninjatrader.com/support/helpGuides/nt8/multi-time_frame__instruments.htm",
     "https://ninjatrader.com/support/helpGuides/nt8/adddataseries.htm"
    ],
    "check": "scripts/site/check_htf.py"
   },
   "runtimeTestedByBSV": false
  },
  {
   "id": "quantower",
   "label": "Quantower · C#",
   "extension": ".cs",
   "check": {
    "kind": "PARITY_ONLY",
    "script": "scripts/site/test_builder_parity.mjs",
    "note": "Only checked that the browser builder output equals the CLI generator; no target-specific check."
   },
   "higherTimeframe": {
    "status": "UNSUPPORTED_TODO",
    "note": "Blocks that use a higher timeframe are left as unsupported stubs with a TODO line (empty value / false signal); never computed on the chart timeframe."
   },
   "runtimeTestedByBSV": false
  },
  {
   "id": "sierra-acsil",
   "label": "Sierra Chart · ACSIL C++",
   "extension": ".cpp",
   "check": {
    "kind": "PARITY_ONLY",
    "script": "scripts/site/test_builder_parity.mjs",
    "note": "Only checked that the browser builder output equals the CLI generator; no target-specific check."
   },
   "higherTimeframe": {
    "status": "UNSUPPORTED_TODO",
    "note": "Blocks that use a higher timeframe are left as unsupported stubs with a TODO line (empty value / false signal); never computed on the chart timeframe."
   },
   "runtimeTestedByBSV": false
  },
  {
   "id": "prorealtime",
   "label": "ProRealTime · ProBuilder",
   "extension": ".txt",
   "check": {
    "kind": "PARITY_ONLY",
    "script": "scripts/site/test_builder_parity.mjs",
    "note": "Only checked that the browser builder output equals the CLI generator; no target-specific check."
   },
   "higherTimeframe": {
    "status": "UNSUPPORTED_TODO",
    "note": "Blocks that use a higher timeframe are left as unsupported stubs with a TODO line (empty value / false signal); never computed on the chart timeframe."
   },
   "runtimeTestedByBSV": false
  },
  {
   "id": "gocharting-lipi",
   "label": "GoCharting · Lipi",
   "extension": ".lipi",
   "check": {
    "kind": "PARITY_ONLY",
    "script": "scripts/site/test_builder_parity.mjs",
    "note": "Only checked that the browser builder output equals the CLI generator; no target-specific check."
   },
   "higherTimeframe": {
    "status": "UNSUPPORTED_TODO",
    "note": "Blocks that use a higher timeframe are left as unsupported stubs with a TODO line (empty value / false signal); never computed on the chart timeframe."
   },
   "runtimeTestedByBSV": false
  },
  {
   "id": "motivewave",
   "label": "MotiveWave · Java",
   "extension": ".java",
   "check": {
    "kind": "STUB_COMPILE",
    "script": "scripts/site/check_motivewave_stubs.sh",
    "note": "javac against BSV stubs written from the public SDK javadoc; not the real SDK."
   },
   "higherTimeframe": {
    "status": "UNSUPPORTED_TODO",
    "note": "Blocks that use a higher timeframe are left as unsupported stubs with a TODO line (empty value / false signal); never computed on the chart timeframe."
   },
   "runtimeTestedByBSV": false
  },
  {
   "id": "vela",
   "label": "Vela · JavaScript",
   "extension": ".js",
   "check": {
    "kind": "ENGINE_STAND_IN",
    "script": "scripts/site/test_vela_engine.mjs",
    "note": "Vela imports swapped for local stand-ins and run over synthetic bars; not a Vela runtime test."
   },
   "higherTimeframe": {
    "status": "UNSUPPORTED_TODO",
    "note": "Blocks that use a higher timeframe are left as unsupported stubs with a TODO line (empty value / false signal); never computed on the chart timeframe."
   },
   "runtimeTestedByBSV": false
  },
  {
   "id": "jforex",
   "label": "JForex · Java",
   "extension": ".java",
   "check": {
    "kind": "STUB_COMPILE",
    "script": "scripts/site/check_jforex_stubs.sh",
    "note": "javac against BSV stubs written from the JForex API javadoc; not run."
   },
   "higherTimeframe": {
    "status": "UNSUPPORTED_TODO",
    "note": "Blocks that use a higher timeframe are left as unsupported stubs with a TODO line (empty value / false signal); never computed on the chart timeframe."
   },
   "runtimeTestedByBSV": false
  },
  {
   "id": "easylanguage",
   "label": "TradeStation · EasyLanguage",
   "extension": ".txt",
   "check": {
    "kind": "STRUCTURAL",
    "script": "scripts/site/check_easylanguage_output.mjs",
    "note": "Structural check only; not a TradeStation Verify."
   },
   "higherTimeframe": {
    "status": "UNSUPPORTED_TODO",
    "note": "Blocks that use a higher timeframe are left as unsupported stubs with a TODO line (empty value / false signal); never computed on the chart timeframe."
   },
   "runtimeTestedByBSV": false
  },
  {
   "id": "atas",
   "label": "ATAS · C#",
   "extension": ".cs",
   "check": {
    "kind": "STUB_COMPILE",
    "script": "scripts/site/check_atas_stubs.sh",
    "note": "dotnet build against BSV stubs from the ATAS API reference; not a real ATAS build."
   },
   "higherTimeframe": {
    "status": "UNSUPPORTED_TODO",
    "note": "Blocks that use a higher timeframe are left as unsupported stubs with a TODO line (empty value / false signal); never computed on the chart timeframe."
   },
   "runtimeTestedByBSV": false
  },
  {
   "id": "amibroker",
   "label": "AmiBroker · AFL",
   "extension": ".afl",
   "check": {
    "kind": "SUBSET_EVALUATOR",
    "script": "scripts/site/check_amibroker_afl.mjs",
    "note": "BSV-written AFL-subset parser/evaluator; not AmiBroker."
   },
   "higherTimeframe": {
    "status": "CLOSED_BAR_IDIOM_STATIC",
    "note": "TimeFrameSet(3600); H_x = Ref(EMA(Close, 50), -1); TimeFrameRestore(); then TimeFrameExpand(H_x, 3600, expandFirst) — the guide's TimeFrameGetPrice construction with a negative shift, which the guide says to use for trading rules (shift 0 can look into the future). Null unless the chart interval is shorter; signals require NOT IsNull. Pattern checked statically, and BSV's AFL-subset evaluator compares the values with an independent hourly reference and a prefix (no-lookahead) test on 15-minute bars; not run in AmiBroker (UNTESTED_RUNTIME).",
    "docs": [
     "https://www.amibroker.com/guide/h_timeframe.html"
    ],
    "check": "scripts/site/check_htf.py"
   },
   "runtimeTestedByBSV": false
  },
  {
   "id": "thinkscript",
   "label": "thinkorswim · thinkScript",
   "extension": ".ts",
   "check": {
    "kind": "SUBSET_EVALUATOR",
    "script": "scripts/site/check_thinkscript.mjs",
    "note": "BSV-written thinkScript-subset parser/evaluator; not thinkorswim."
   },
   "higherTimeframe": {
    "status": "CLOSED_BAR_IDIOM_STATIC",
    "note": "C_x = close(period = AggregationPeriod.HOUR); E_x = ExpAverage(C_x, 50); H_x = E_x[1] — expressions made only of secondary-aggregation variables and constants keep that aggregation (manual), so [1] is the previous higher bar, as High(period = AggregationPeriod.DAY)[1] is the previous day in the manual; no chart-period price is mixed in. Empty unless GetAggregationPeriod() is shorter (time charts). Pattern checked statically, and BSV's thinkScript-subset evaluator (which models secondary contexts) compares the values with an independent hourly reference and a prefix (no-lookahead) test on 15-minute bars; not run in thinkorswim (UNTESTED_RUNTIME).",
    "docs": [
     "https://toslc.thinkorswim.com/center/reference/thinkScript/tutorials/Advanced/Chapter-11---Referencing-Secondary-Aggregation",
     "https://toslc.thinkorswim.com/center/reference/thinkScript/Constants/AggregationPeriod",
     "https://toslc.thinkorswim.com/center/reference/thinkScript/Functions/Others/GetAggregationPeriod"
    ],
    "check": "scripts/site/check_htf.py"
   },
   "runtimeTestedByBSV": false
  },
  {
   "id": "tradovate",
   "label": "Tradovate · JavaScript",
   "extension": ".js",
   "check": {
    "kind": "API_STUB_RUN",
    "script": "scripts/site/check_tradovate.mjs",
    "note": "Run in node:vm against a BSV stub of the documented custom-indicator API; not Tradovate."
   },
   "higherTimeframe": {
    "status": "UNSUPPORTED_TODO",
    "note": "Blocks that use a higher timeframe are left as unsupported stubs with a TODO line (empty value / false signal); never computed on the chart timeframe."
   },
   "runtimeTestedByBSV": false
  },
  {
   "id": "backtrader",
   "label": "backtrader · Python",
   "extension": ".py",
   "check": {
    "kind": "LIBRARY_RUN",
    "script": "scripts/site/check_backtrader.py",
    "note": "Executed inside the backtrader library on synthetic bars; not a broker or live feed."
   },
   "higherTimeframe": {
    "status": "CLOSED_BARS_CHECKED",
    "note": "Computed from closed higher-timeframe bars only (no repaint, no lookahead); checked in the library on synthetic bars, including a cut-off run and a stop on too-coarse bars."
   },
   "runtimeTestedByBSV": false
  },
  {
   "id": "backtesting-py",
   "label": "Backtesting.py · Python",
   "extension": ".py",
   "check": {
    "kind": "LIBRARY_RUN",
    "script": "scripts/site/check_backtesting_py.py",
    "note": "Executed inside the Backtesting.py library on synthetic bars; not a broker or live feed."
   },
   "higherTimeframe": {
    "status": "CLOSED_BARS_CHECKED",
    "note": "Computed from closed higher-timeframe bars only (no repaint, no lookahead); checked in the library on synthetic bars, including a cut-off run and a stop on too-coarse bars."
   },
   "runtimeTestedByBSV": false
  },
  {
   "id": "nautilus",
   "label": "NautilusTrader · Python",
   "extension": ".py",
   "check": {
    "kind": "LIBRARY_RUN",
    "script": "scripts/site/check_nautilus.py",
    "note": "Executed inside the NautilusTrader BacktestEngine on synthetic bars; not a broker, venue or live feed."
   },
   "higherTimeframe": {
    "status": "CLOSED_BARS_CHECKED",
    "note": "Computed from closed higher-timeframe bars only (no repaint, no lookahead); checked in the library on synthetic bars, including a cut-off run and a stop on too-coarse bars."
   },
   "runtimeTestedByBSV": false
  }
 ],
 "recipes": [
  {
   "id": "mtf-trend-panel",
   "todoLines": {
    "pine-v6": 0,
    "mql5": 1,
    "ctrader": 0,
    "mql4": 1,
    "ctrader-python": 0,
    "bookmap-python": 0,
    "ninjatrader": 0,
    "quantower": 0,
    "sierra-acsil": 0,
    "prorealtime": 1,
    "gocharting-lipi": 0,
    "motivewave": 0,
    "vela": 0,
    "jforex": 0,
    "easylanguage": 0,
    "atas": 0,
    "amibroker": 0,
    "thinkscript": 0,
    "tradovate": 0,
    "backtrader": 0,
    "backtesting-py": 0,
    "nautilus": 0
   },
   "unsupportedBlocks": []
  },
  {
   "id": "session-breakout-alert",
   "todoLines": {
    "pine-v6": 0,
    "mql5": 2,
    "ctrader": 1,
    "mql4": 2,
    "ctrader-python": 1,
    "bookmap-python": 1,
    "ninjatrader": 1,
    "quantower": 1,
    "sierra-acsil": 1,
    "prorealtime": 2,
    "gocharting-lipi": 0,
    "motivewave": 0,
    "vela": 0,
    "jforex": 0,
    "easylanguage": 1,
    "atas": 1,
    "amibroker": 1,
    "thinkscript": 1,
    "tradovate": 0,
    "backtrader": 0,
    "backtesting-py": 0,
    "nautilus": 0
   },
   "unsupportedBlocks": []
  },
  {
   "id": "atr-risk-overlay",
   "todoLines": {
    "pine-v6": 0,
    "mql5": 1,
    "ctrader": 0,
    "mql4": 1,
    "ctrader-python": 0,
    "bookmap-python": 0,
    "ninjatrader": 0,
    "quantower": 0,
    "sierra-acsil": 0,
    "prorealtime": 0,
    "gocharting-lipi": 0,
    "motivewave": 0,
    "vela": 0,
    "jforex": 0,
    "easylanguage": 0,
    "atas": 0,
    "amibroker": 0,
    "thinkscript": 0,
    "tradovate": 0,
    "backtrader": 0,
    "backtesting-py": 0,
    "nautilus": 0
   },
   "unsupportedBlocks": []
  },
  {
   "id": "liquidity-sweep-alert",
   "todoLines": {
    "pine-v6": 3,
    "mql5": 4,
    "ctrader": 3,
    "mql4": 4,
    "ctrader-python": 3,
    "bookmap-python": 3,
    "ninjatrader": 3,
    "quantower": 3,
    "sierra-acsil": 3,
    "prorealtime": 4,
    "gocharting-lipi": 3,
    "motivewave": 3,
    "vela": 3,
    "jforex": 3,
    "easylanguage": 3,
    "atas": 3,
    "amibroker": 3,
    "thinkscript": 3,
    "tradovate": 1,
    "backtrader": 0,
    "backtesting-py": 0,
    "nautilus": 0
   },
   "unsupportedBlocks": [
    "signal.liquidity_sweep",
    "structure.pivot",
    "visual.zone"
   ]
  },
  {
   "id": "volatility-regime-map",
   "todoLines": {
    "pine-v6": 1,
    "mql5": 2,
    "ctrader": 1,
    "mql4": 2,
    "ctrader-python": 1,
    "bookmap-python": 1,
    "ninjatrader": 1,
    "quantower": 1,
    "sierra-acsil": 1,
    "prorealtime": 1,
    "gocharting-lipi": 1,
    "motivewave": 1,
    "vela": 1,
    "jforex": 0,
    "easylanguage": 1,
    "atas": 1,
    "amibroker": 0,
    "thinkscript": 0,
    "tradovate": 1,
    "backtrader": 0,
    "backtesting-py": 0,
    "nautilus": 0
   },
   "unsupportedBlocks": [
    "visual.table"
   ]
  },
  {
   "id": "opening-range-dashboard",
   "todoLines": {
    "pine-v6": 4,
    "mql5": 6,
    "ctrader": 5,
    "mql4": 6,
    "ctrader-python": 5,
    "bookmap-python": 5,
    "ninjatrader": 5,
    "quantower": 5,
    "sierra-acsil": 5,
    "prorealtime": 6,
    "gocharting-lipi": 4,
    "motivewave": 4,
    "vela": 4,
    "jforex": 5,
    "easylanguage": 5,
    "atas": 5,
    "amibroker": 6,
    "thinkscript": 6,
    "tradovate": 4,
    "backtrader": 0,
    "backtesting-py": 0,
    "nautilus": 0
   },
   "unsupportedBlocks": [
    "signal.breakout",
    "structure.range",
    "visual.table",
    "visual.zone"
   ]
  },
  {
   "id": "mtf-confirmation-panel",
   "todoLines": {
    "pine-v6": 1,
    "mql5": 2,
    "ctrader": 1,
    "mql4": 2,
    "ctrader-python": 4,
    "bookmap-python": 4,
    "ninjatrader": 1,
    "quantower": 4,
    "sierra-acsil": 4,
    "prorealtime": 4,
    "gocharting-lipi": 4,
    "motivewave": 4,
    "vela": 4,
    "jforex": 7,
    "easylanguage": 4,
    "atas": 4,
    "amibroker": 0,
    "thinkscript": 0,
    "tradovate": 4,
    "backtrader": 0,
    "backtesting-py": 0,
    "nautilus": 0
   },
   "unsupportedBlocks": [
    "data.higher_timeframe",
    "visual.table"
   ]
  },
  {
   "id": "rsi-mean-reversion-alert",
   "todoLines": {
    "pine-v6": 0,
    "mql5": 1,
    "ctrader": 0,
    "mql4": 1,
    "ctrader-python": 0,
    "bookmap-python": 0,
    "ninjatrader": 0,
    "quantower": 0,
    "sierra-acsil": 0,
    "prorealtime": 0,
    "gocharting-lipi": 0,
    "motivewave": 0,
    "vela": 0,
    "jforex": 0,
    "easylanguage": 0,
    "atas": 0,
    "amibroker": 0,
    "thinkscript": 0,
    "tradovate": 0,
    "backtrader": 0,
    "backtesting-py": 0,
    "nautilus": 0
   },
   "unsupportedBlocks": []
  },
  {
   "id": "trend-pullback-composite",
   "todoLines": {
    "pine-v6": 0,
    "mql5": 1,
    "ctrader": 0,
    "mql4": 1,
    "ctrader-python": 0,
    "bookmap-python": 0,
    "ninjatrader": 0,
    "quantower": 0,
    "sierra-acsil": 0,
    "prorealtime": 1,
    "gocharting-lipi": 0,
    "motivewave": 0,
    "vela": 0,
    "jforex": 0,
    "easylanguage": 0,
    "atas": 0,
    "amibroker": 0,
    "thinkscript": 0,
    "tradovate": 0,
    "backtrader": 0,
    "backtesting-py": 0,
    "nautilus": 0
   },
   "unsupportedBlocks": []
  },
  {
   "id": "session-statistics-panel",
   "todoLines": {
    "pine-v6": 2,
    "mql5": 4,
    "ctrader": 3,
    "mql4": 4,
    "ctrader-python": 3,
    "bookmap-python": 3,
    "ninjatrader": 3,
    "quantower": 3,
    "sierra-acsil": 3,
    "prorealtime": 3,
    "gocharting-lipi": 2,
    "motivewave": 2,
    "vela": 2,
    "jforex": 3,
    "easylanguage": 3,
    "atas": 3,
    "amibroker": 4,
    "thinkscript": 4,
    "tradovate": 2,
    "backtrader": 0,
    "backtesting-py": 0,
    "nautilus": 0
   },
   "unsupportedBlocks": [
    "structure.range",
    "visual.table"
   ]
  },
  {
   "id": "divergence-scanner",
   "todoLines": {
    "pine-v6": 3,
    "mql5": 4,
    "ctrader": 3,
    "mql4": 4,
    "ctrader-python": 3,
    "bookmap-python": 3,
    "ninjatrader": 3,
    "quantower": 3,
    "sierra-acsil": 3,
    "prorealtime": 3,
    "gocharting-lipi": 3,
    "motivewave": 3,
    "vela": 3,
    "jforex": 3,
    "easylanguage": 3,
    "atas": 3,
    "amibroker": 3,
    "thinkscript": 3,
    "tradovate": 1,
    "backtrader": 1,
    "backtesting-py": 1,
    "nautilus": 1
   },
   "unsupportedBlocks": [
    "scanner.symbol_set",
    "signal.divergence",
    "structure.pivot"
   ]
  },
  {
   "id": "webhook-alert-router",
   "todoLines": {
    "pine-v6": 1,
    "mql5": 2,
    "ctrader": 1,
    "mql4": 2,
    "ctrader-python": 1,
    "bookmap-python": 1,
    "ninjatrader": 1,
    "quantower": 1,
    "sierra-acsil": 1,
    "prorealtime": 1,
    "gocharting-lipi": 1,
    "motivewave": 1,
    "vela": 1,
    "jforex": 1,
    "easylanguage": 1,
    "atas": 1,
    "amibroker": 1,
    "thinkscript": 1,
    "tradovate": 1,
    "backtrader": 0,
    "backtesting-py": 0,
    "nautilus": 0
   },
   "unsupportedBlocks": [
    "alert.webhook"
   ]
  },
  {
   "id": "golden-cross-alert",
   "todoLines": {
    "pine-v6": 0,
    "mql5": 1,
    "ctrader": 0,
    "mql4": 1,
    "ctrader-python": 0,
    "bookmap-python": 0,
    "ninjatrader": 0,
    "quantower": 0,
    "sierra-acsil": 0,
    "prorealtime": 1,
    "gocharting-lipi": 0,
    "motivewave": 0,
    "vela": 0,
    "jforex": 0,
    "easylanguage": 0,
    "atas": 0,
    "amibroker": 0,
    "thinkscript": 0,
    "tradovate": 0,
    "backtrader": 0,
    "backtesting-py": 0,
    "nautilus": 0
   },
   "unsupportedBlocks": []
  },
  {
   "id": "ema-cross-rsi-filter",
   "todoLines": {
    "pine-v6": 0,
    "mql5": 1,
    "ctrader": 0,
    "mql4": 1,
    "ctrader-python": 0,
    "bookmap-python": 0,
    "ninjatrader": 0,
    "quantower": 0,
    "sierra-acsil": 0,
    "prorealtime": 1,
    "gocharting-lipi": 0,
    "motivewave": 0,
    "vela": 0,
    "jforex": 0,
    "easylanguage": 0,
    "atas": 0,
    "amibroker": 0,
    "thinkscript": 0,
    "tradovate": 0,
    "backtrader": 0,
    "backtesting-py": 0,
    "nautilus": 0
   },
   "unsupportedBlocks": []
  }
 ]
}
