[{"data":1,"prerenderedAt":3021},["ShallowReactive",2],{"indicators:getting-started/primer-first-steps":3},{"slug":4,"filePath":5,"frontmatter":6,"rawMarkdown":11,"tree":12},"getting-started/primer-first-steps","getting-started/primer-first-steps.md",{"title":7,"description":8,"order":9,"section":10},"First steps","Write your first Indicator and see a line appear on the chart. No prior experience with Indicators, or with kScript (legacy), is needed: by the end of this…",5,"getting-started","---\ntitle: \"First steps\"\ndescription: \"Write your first Indicator and see a line appear on the chart. No prior experience with Indicators, or with kScript (legacy), is needed: by the end of this…\"\norder: 5\nsection: \"getting-started\"\n---\n\n\u003C!-- source: docs/indicators/getting-started/primer-first-steps.md; generated by packages/cli/scripts/gen-indicator-docs.ts, do not edit -->\n\n# First steps\n\nWrite your first Indicator and see a line appear on the chart. No prior\nexperience with Indicators, or with kScript (legacy), is needed: by the end\nof this short page you will have a moving average drawing on a live chart,\ncompiled in your own browser, and you will know the three parts every\nIndicator shares.\n\n## What is an Indicator?\n\nAn Indicator is one TypeScript file. You write it in the chart's editor,\n**Run** compiles it in your browser and draws it on the chart, and the same\nfile publishes to the registry and runs on your own machine unchanged.\nEvery output is a number series: a line, a shape, a box coordinate, a\nmetric an alert can watch. The module has no filesystem, no network, and\nno order capability; the host feeds it one bar at a time and reads the\nnumbers it writes back.\n\nNothing to install: you write the file in the browser and it runs against\nlive and historical market data immediately (the terminal path, the same\nfile with the `om` CLI, is `quick-start.md`).\n\n## Where it lives\n\n1. On the chart toolbar, open **Indicators**. The dialog opens on the\n   **Indicators** tab: the packages you can add straight to the chart.\n2. The **kScript (legacy)** tab holds **My Scripts**, **Community**, and\n   **Marketplace**: the scripts that run on the kScript engine.\n3. **Build** opens the editor. In its sidebar, **New indicator** starts a\n   TypeScript Indicator; **New kScript (legacy)** starts a kScript.\n\nA kScript row that has a proven Indicator port shows a **New engine**\nbadge. Adding that row mounts the Indicator by default; **Use kScript\nengine** on the row adds the kScript version instead and keeps the kScript\nengine for that indicator.\n\nEverything happens in the editor. Type the file, press **Run**, and your\nIndicator appears on (or below) the chart right away. Change a line, press\nRun again, and the chart updates. That tight loop is the whole workflow:\nwrite, run, look at the chart, repeat.\n\n## The shape of every Indicator\n\nBefore writing anything, here is the mental model. Every Indicator has the\nsame three moving parts:\n\n1. **Declarations.** A few plain statements at the top of the file say what\n   the Indicator reads and writes: `param(...)` for a setting the chart\n   user can change, `input(...)` for a per-bar number the chart feeds in,\n   `output(...)` for a per-bar number the Indicator sends back and the\n   chart draws. No output, nothing on the chart.\n2. **State.** Module-level variables hold whatever must survive from one\n   bar to the next: a moving average's window, the previous close, a\n   counter. There is no history array to index; what you want to remember,\n   you keep.\n3. **Four functions.** `init()` runs once before the first bar, `state()`\n   runs once per bar, `finalize()` writes the outputs for a bar that has a\n   value, and `reset()` puts the state back to its starting point. The\n   host calls them; you never call them yourself.\n\nThere is one more rule, and it is easy: **the first line of the file is the\nlanguage marker `//@lang=wrun-ts`.** It is how the editor knows the tab\nholds an Indicator rather than a kScript. Leave it alone; everything you\nwrite goes under it.\n\n## Step 1: New indicator\n\nThe editor opens a file whose first line is the language marker:\n\n```text\n//@lang=wrun-ts\n```\n\nEverything under it is the `sma-codefirst` template, a complete moving\naverage in 25 non-blank lines, a comment on every statement. Read it top to\nbottom, then press Run:\n\n```typescript\n// A simple moving average, declared and computed in one file. Read it top to bottom.\nimport { input, line, ohlcv, output, overlay, param } from \"./sdk/declare\"; // the declaring words\nimport { in_close } from \"./gen/inputs\"; // generated: an in_ reader for each input declared below\nimport { emitRow, out_sma } from \"./gen/outputs\"; // generated: an out_ writer per output, plus emitRow\nimport { p_period } from \"./gen/params\"; // generated: a p_ reader for each param declared below\nimport { Sma } from \"./sdk/ta\"; // a moving-average helper that keeps its own window of values\n\n// A param is a setting the chart user can change: its name, its default, then the allowed range.\nparam(\"period\", 20, { min: 1, max: 200 });\n// An input is a per-bar number the chart feeds in; ohlcv.close is each candle's close price.\ninput(\"close\", ohlcv.close);\n// An output is a per-bar number the Indicator sends back, here drawn as a line on the price panel.\n// output() returns a handle; bind it with a const only when a box() or segment() needs to name it.\noutput(\"sma\", line, overlay);\n\nlet sma = new Sma(20); // module state lives between bars; init() rebuilds it at the chosen period\nlet value: f64 = NaN; // this bar's average (f64 is the number type), NaN until the window is full\n\n// init() runs once before the first bar: read each setting through its p_ reader (i32() = whole bars).\nexport function init(): void { sma = new Sma(i32(p_period())); }\n// state() runs once per bar: read the bar through its in_ reader and fold it into the window.\n// Warmup rows are NaN: until the window holds period bars there is no average yet, so return 0\n// and the chart draws nothing for that bar; return 1 once the value is real.\nexport function state(): i32 { value = sma.update(in_close()); return isNaN(value) ? 0 : 1; }\n// finalize() runs after state() returns 1: write each output through its out_ writer, then emitRow().\nexport function finalize(): void { out_sma(value); emitRow(); }\n// reset() runs when the chart restarts the series: put the state back to what init() built.\nexport function reset(): void { sma.reset(); value = NaN; }\n```\n\nAll three parts are there. Let's walk through them.\n\n## Read the template\n\nThree declarations at the top say what the Indicator reads and writes. They\nare plain statements, extracted from the file before it compiles, so every\nname must be a string literal and every default a literal number:\n\n- `param(\"period\", 20, { min: 1, max: 200 })` is a setting. It shows in\n  the overlay's settings dialog with that default and range.\n- `input(\"close\", ohlcv.close)` is a feed: the chart's own close price, one\n  value per bar.\n- `output(\"sma\", line, overlay)` is what the chart draws: a line on the\n  price pane. `lower` instead of `overlay` puts it in its own pane; `none`\n  instead of `line` computes it without drawing it.\n\nThe generated imports (`./gen/params`, `./gen/inputs`, `./gen/outputs`) are\nhow the code reads and writes those names: `p_period()`, `in_close()`,\n`out_sma(value)`. Rename a declaration and its accessor renames with it; the\ncompiler then points at every stale import.\n\nFour functions do the work, and the build refuses any other signature:\n\n| Function | Runs | Do this here |\n| --- | --- | --- |\n| `init()` | once, before the first bar | read params, size your averages |\n| `state()` | once per bar | read inputs, update your state, return `1` when the bar has a value or `0` while warming up |\n| `finalize()` | once per bar that returned `1` | write every output, then `emitRow()` last |\n| `reset()` | when the chart replays the forming bar | clear every module-level variable and `.reset()` every TA object |\n\nEvery TA class (`Sma`, `Ema`, `Rsi`, `Cross`, and the rest of the kScript\ncatalog) comes from `./sdk/ta`: construct them in `init()`, feed them one value per bar with\n`.update()`, and they return `NaN` until their window is full. Returning `0`\nfrom `state()` on those bars is what keeps the line empty there instead of\ndrawing garbage (`core-concepts/execution-model.md`).\n\n## Step 2: Run\n\nPress **Run**. The editor compiles the file in your browser (the same\ncompiler version the CLI uses, so the bytes match) and mounts the draft on\nthe chart as an overlay. Errors show as squiggles under the offending\ncharacters and as rows in the Problems lane; fix them and Run again. The\nbuild has a few stages, so a message may come from the declaration\nextractor, the sheet validator, or the compiler; `faq/common-errors.md`\nlists the ones you will meet.\n\nIndicators run in your browser: every input reads the chart's own market\nand interval, the forming bar re-evaluates on every tick, and nothing is\nsent anywhere to compute.\n\n## What you'll see\n\nA line tracing the 20-bar average of the close, sitting right on the price\nchart. The first nineteen bars of loaded history are empty: the window is\nnot full yet, `state()` returned `0`, and the chart drew nothing. From the\ntwentieth bar on the line follows price, smoothed. It is not a fancy\nindicator, but it proves the whole pipeline works: your code received real\nbars, computed a number for each, and the chart drew them. That is the\nfoundation for everything else.\n\n## One small thing to notice\n\nLook at the `output` line again: `output(\"sma\", line, overlay)`. **Every\noutput needs a name**, and the name does three jobs at once. It is the\nlegend entry on the chart, it is the writer you call in `finalize()`\n(`out_sma`), and once the Indicator is published and installed it is the\ntail of a metric id (`wrun/@you/my-sma/sma`) that an alert, a screen, or\na backtest can read. Names are unique per Indicator and lowercase with\nunderscores; pick clear ones from the start.\n\nThat's it. You have a running Indicator. If your line showed up, the hard\npart is over. Everything from here is doing more interesting things with\nthe same three pieces.\n\n## Next\n\nNow let's turn this into something you would actually use. On the next\npage we build a real indicator step by step: a moving-average crossover\nsignal with a mark on every cross.\n\n[Build your first Indicator](primer-first-indicator.md)\n",{"type":13,"children":14,"data":3014,"position":3016},"root",[15,25,28,29,46,47,66,67,108,109,165,166,181,182,437,438,500,501,535,536,551,552,566,567,794,795,846,847,862,863,876,877,898,899,932,933,1689,1690,1704,1705,1721,1722,1737,1738,1909,1910,2034,2035,2049,2051,2432,2433,2642,2643,2659,2660,2713,2714,2728,2729,2745,2746,2796,2797,2813,2814,2940,2941,2956,2957,2973,2974,2989,2990],{"type":16,"value":17,"position":18},"comment"," source: docs/indicators/getting-started/primer-first-steps.md; generated by packages/cli/scripts/gen-indicator-docs.ts, do not edit ",{"start":19,"end":22},{"line":20,"column":20,"offset":21},1,0,{"line":20,"column":23,"offset":24},141,140,{"type":26,"value":27},"text","\n",{"type":26,"value":27},{"type":30,"tagName":31,"properties":32,"children":33,"position":43},"element","p",{},[34],{"type":26,"value":35,"position":36},"Write your first Indicator and see a line appear on the chart. No prior\nexperience with Indicators, or with kScript (legacy), is needed: by the end\nof this short page you will have a moving average drawing on a live chart,\ncompiled in your own browser, and you will know the three parts every\nIndicator shares.",{"start":37,"end":39},{"line":9,"column":20,"offset":38},157,{"line":40,"column":41,"offset":42},9,18,467,{"start":44,"end":45},{"line":9,"column":20,"offset":38},{"line":40,"column":41,"offset":42},{"type":26,"value":27},{"type":30,"tagName":48,"properties":49,"children":51,"position":62},"h2",{"id":50},"what-is-an-indicator",[52],{"type":26,"value":53,"position":54},"What is an Indicator?",{"start":55,"end":59},{"line":56,"column":57,"offset":58},11,4,472,{"line":56,"column":60,"offset":61},25,493,{"start":63,"end":65},{"line":56,"column":20,"offset":64},469,{"line":56,"column":60,"offset":61},{"type":26,"value":27},{"type":30,"tagName":31,"properties":68,"children":69,"position":105},{},[70,79,97],{"type":26,"value":71,"position":72},"An Indicator is one TypeScript file. You write it in the chart's editor,\n",{"start":73,"end":76},{"line":74,"column":20,"offset":75},13,495,{"line":77,"column":20,"offset":78},14,568,{"type":30,"tagName":80,"properties":81,"children":82,"position":92},"strong",{},[83],{"type":26,"value":84,"position":85},"Run",{"start":86,"end":89},{"line":77,"column":87,"offset":88},3,570,{"line":77,"column":90,"offset":91},6,573,{"start":93,"end":94},{"line":77,"column":20,"offset":78},{"line":77,"column":95,"offset":96},8,575,{"type":26,"value":98,"position":99}," compiles it in your browser and draws it on the chart, and the same\nfile publishes to the registry and runs on your own machine unchanged.\nEvery output is a number series: a line, a shape, a box coordinate, a\nmetric an alert can watch. The module has no filesystem, no network, and\nno order capability; the host feeds it one bar at a time and reads the\nnumbers it writes back.",{"start":100,"end":101},{"line":77,"column":95,"offset":96},{"line":102,"column":103,"offset":104},19,24,952,{"start":106,"end":107},{"line":74,"column":20,"offset":75},{"line":102,"column":103,"offset":104},{"type":26,"value":27},{"type":30,"tagName":31,"properties":110,"children":111,"position":162},{},[112,122,135,142,155],{"type":26,"value":113,"position":114},"Nothing to install: you write the file in the browser and it runs against\nlive and historical market data immediately (the terminal path, the same\nfile with the ",{"start":115,"end":118},{"line":116,"column":20,"offset":117},21,954,{"line":119,"column":120,"offset":121},23,15,1115,{"type":30,"tagName":123,"properties":124,"children":125,"position":132},"code",{},[126],{"type":26,"value":127,"position":128},"om",{"start":129,"end":130},{"line":119,"column":120,"offset":121},{"line":119,"column":102,"offset":131},1119,{"start":133,"end":134},{"line":119,"column":120,"offset":121},{"line":119,"column":102,"offset":131},{"type":26,"value":136,"position":137}," CLI, is ",{"start":138,"end":139},{"line":119,"column":102,"offset":131},{"line":119,"column":140,"offset":141},28,1128,{"type":30,"tagName":123,"properties":143,"children":144,"position":152},{},[145],{"type":26,"value":146,"position":147},"quick-start.md",{"start":148,"end":149},{"line":119,"column":140,"offset":141},{"line":119,"column":150,"offset":151},44,1144,{"start":153,"end":154},{"line":119,"column":140,"offset":141},{"line":119,"column":150,"offset":151},{"type":26,"value":156,"position":157},").",{"start":158,"end":159},{"line":119,"column":150,"offset":151},{"line":119,"column":160,"offset":161},46,1146,{"start":163,"end":164},{"line":116,"column":20,"offset":117},{"line":119,"column":160,"offset":161},{"type":26,"value":27},{"type":30,"tagName":48,"properties":167,"children":169,"position":177},{"id":168},"where-it-lives",[170],{"type":26,"value":171,"position":172},"Where it lives",{"start":173,"end":175},{"line":60,"column":57,"offset":174},1151,{"line":60,"column":41,"offset":176},1165,{"start":178,"end":180},{"line":60,"column":20,"offset":179},1148,{"line":60,"column":41,"offset":176},{"type":26,"value":27},{"type":30,"tagName":183,"properties":184,"children":185,"position":434},"ol",{},[186,187,249,250,359,360,433],{"type":26,"value":27},{"type":30,"tagName":188,"properties":189,"children":190,"position":245},"li",{},[191,200,217,223,238],{"type":26,"value":192,"position":193},"On the chart toolbar, open ",{"start":194,"end":197},{"line":195,"column":57,"offset":196},27,1170,{"line":195,"column":198,"offset":199},31,1197,{"type":30,"tagName":80,"properties":201,"children":202,"position":212},{},[203],{"type":26,"value":204,"position":205},"Indicators",{"start":206,"end":209},{"line":195,"column":207,"offset":208},33,1199,{"line":195,"column":210,"offset":211},43,1209,{"start":213,"end":214},{"line":195,"column":198,"offset":199},{"line":195,"column":215,"offset":216},45,1211,{"type":26,"value":218,"position":219},". The dialog opens on the\n",{"start":220,"end":221},{"line":195,"column":215,"offset":216},{"line":140,"column":20,"offset":222},1237,{"type":30,"tagName":80,"properties":224,"children":225,"position":233},{},[226],{"type":26,"value":204,"position":227},{"start":228,"end":230},{"line":140,"column":90,"offset":229},1242,{"line":140,"column":231,"offset":232},16,1252,{"start":234,"end":236},{"line":140,"column":57,"offset":235},1240,{"line":140,"column":41,"offset":237},1254,{"type":26,"value":239,"position":240}," tab: the packages you can add straight to the chart.",{"start":241,"end":242},{"line":140,"column":41,"offset":237},{"line":140,"column":243,"offset":244},71,1307,{"start":246,"end":248},{"line":195,"column":20,"offset":247},1167,{"line":140,"column":243,"offset":244},{"type":26,"value":27},{"type":30,"tagName":188,"properties":251,"children":252,"position":355},{},[253,261,277,284,301,308,325,332,348],{"type":26,"value":254,"position":255},"The ",{"start":256,"end":259},{"line":257,"column":57,"offset":258},29,1311,{"line":257,"column":95,"offset":260},1315,{"type":30,"tagName":80,"properties":262,"children":263,"position":273},{},[264],{"type":26,"value":265,"position":266},"kScript (legacy)",{"start":267,"end":270},{"line":257,"column":268,"offset":269},10,1317,{"line":257,"column":271,"offset":272},26,1333,{"start":274,"end":275},{"line":257,"column":95,"offset":260},{"line":257,"column":140,"offset":276},1335,{"type":26,"value":278,"position":279}," tab holds ",{"start":280,"end":281},{"line":257,"column":140,"offset":276},{"line":257,"column":282,"offset":283},39,1346,{"type":30,"tagName":80,"properties":285,"children":286,"position":296},{},[287],{"type":26,"value":288,"position":289},"My Scripts",{"start":290,"end":293},{"line":257,"column":291,"offset":292},41,1348,{"line":257,"column":294,"offset":295},51,1358,{"start":297,"end":298},{"line":257,"column":282,"offset":283},{"line":257,"column":299,"offset":300},53,1360,{"type":26,"value":302,"position":303},", ",{"start":304,"end":305},{"line":257,"column":299,"offset":300},{"line":257,"column":306,"offset":307},55,1362,{"type":30,"tagName":80,"properties":309,"children":310,"position":320},{},[311],{"type":26,"value":312,"position":313},"Community",{"start":314,"end":317},{"line":257,"column":315,"offset":316},57,1364,{"line":257,"column":318,"offset":319},66,1373,{"start":321,"end":322},{"line":257,"column":306,"offset":307},{"line":257,"column":323,"offset":324},68,1375,{"type":26,"value":326,"position":327},", and\n",{"start":328,"end":329},{"line":257,"column":323,"offset":324},{"line":330,"column":20,"offset":331},30,1381,{"type":30,"tagName":80,"properties":333,"children":334,"position":343},{},[335],{"type":26,"value":336,"position":337},"Marketplace",{"start":338,"end":340},{"line":330,"column":90,"offset":339},1386,{"line":330,"column":341,"offset":342},17,1397,{"start":344,"end":346},{"line":330,"column":57,"offset":345},1384,{"line":330,"column":102,"offset":347},1399,{"type":26,"value":349,"position":350},": the scripts that run on the kScript engine.",{"start":351,"end":352},{"line":330,"column":102,"offset":347},{"line":330,"column":353,"offset":354},64,1444,{"start":356,"end":358},{"line":257,"column":20,"offset":357},1308,{"line":330,"column":353,"offset":354},{"type":26,"value":27},{"type":30,"tagName":188,"properties":361,"children":362,"position":429},{},[363,378,385,402,409,423],{"type":30,"tagName":80,"properties":364,"children":365,"position":373},{},[366],{"type":26,"value":367,"position":368},"Build",{"start":369,"end":371},{"line":198,"column":90,"offset":370},1450,{"line":198,"column":56,"offset":372},1455,{"start":374,"end":376},{"line":198,"column":57,"offset":375},1448,{"line":198,"column":74,"offset":377},1457,{"type":26,"value":379,"position":380}," opens the editor. In its sidebar, ",{"start":381,"end":382},{"line":198,"column":74,"offset":377},{"line":198,"column":383,"offset":384},48,1492,{"type":30,"tagName":80,"properties":386,"children":387,"position":397},{},[388],{"type":26,"value":389,"position":390},"New indicator",{"start":391,"end":394},{"line":198,"column":392,"offset":393},50,1494,{"line":198,"column":395,"offset":396},63,1507,{"start":398,"end":399},{"line":198,"column":383,"offset":384},{"line":198,"column":400,"offset":401},65,1509,{"type":26,"value":403,"position":404}," starts a\nTypeScript Indicator; ",{"start":405,"end":406},{"line":198,"column":400,"offset":401},{"line":407,"column":271,"offset":408},32,1544,{"type":30,"tagName":80,"properties":410,"children":411,"position":419},{},[412],{"type":26,"value":413,"position":414},"New kScript (legacy)",{"start":415,"end":417},{"line":407,"column":140,"offset":416},1546,{"line":407,"column":383,"offset":418},1566,{"start":420,"end":421},{"line":407,"column":271,"offset":408},{"line":407,"column":392,"offset":422},1568,{"type":26,"value":424,"position":425}," starts a kScript.",{"start":426,"end":427},{"line":407,"column":392,"offset":422},{"line":407,"column":323,"offset":428},1586,{"start":430,"end":432},{"line":198,"column":20,"offset":431},1445,{"line":407,"column":323,"offset":428},{"type":26,"value":27},{"start":435,"end":436},{"line":195,"column":20,"offset":247},{"line":407,"column":323,"offset":428},{"type":26,"value":27},{"type":30,"tagName":31,"properties":439,"children":440,"position":497},{},[441,450,466,473,490],{"type":26,"value":442,"position":443},"A kScript row that has a proven Indicator port shows a ",{"start":444,"end":447},{"line":445,"column":20,"offset":446},34,1588,{"line":445,"column":448,"offset":449},56,1643,{"type":30,"tagName":80,"properties":451,"children":452,"position":461},{},[453],{"type":26,"value":454,"position":455},"New engine",{"start":456,"end":459},{"line":445,"column":457,"offset":458},58,1645,{"line":445,"column":323,"offset":460},1655,{"start":462,"end":463},{"line":445,"column":448,"offset":449},{"line":445,"column":464,"offset":465},70,1657,{"type":26,"value":467,"position":468},"\nbadge. Adding that row mounts the Indicator by default; ",{"start":469,"end":470},{"line":445,"column":464,"offset":465},{"line":471,"column":315,"offset":472},35,1714,{"type":30,"tagName":80,"properties":474,"children":475,"position":486},{},[476],{"type":26,"value":477,"position":478},"Use kScript\nengine",{"start":479,"end":482},{"line":471,"column":480,"offset":481},59,1716,{"line":483,"column":484,"offset":485},36,7,1734,{"start":487,"end":488},{"line":471,"column":315,"offset":472},{"line":483,"column":40,"offset":489},1736,{"type":26,"value":491,"position":492}," on the row adds the kScript version instead and keeps the kScript\nengine for that indicator.",{"start":493,"end":494},{"line":483,"column":40,"offset":489},{"line":495,"column":195,"offset":496},37,1829,{"start":498,"end":499},{"line":445,"column":20,"offset":446},{"line":495,"column":195,"offset":496},{"type":26,"value":27},{"type":30,"tagName":31,"properties":502,"children":503,"position":532},{},[504,511,525],{"type":26,"value":505,"position":506},"Everything happens in the editor. Type the file, press ",{"start":507,"end":509},{"line":282,"column":20,"offset":508},1831,{"line":282,"column":448,"offset":510},1886,{"type":30,"tagName":80,"properties":512,"children":513,"position":521},{},[514],{"type":26,"value":84,"position":515},{"start":516,"end":518},{"line":282,"column":457,"offset":517},1888,{"line":282,"column":519,"offset":520},61,1891,{"start":522,"end":523},{"line":282,"column":448,"offset":510},{"line":282,"column":395,"offset":524},1893,{"type":26,"value":526,"position":527},", and your\nIndicator appears on (or below) the chart right away. Change a line, press\nRun again, and the chart updates. That tight loop is the whole workflow:\nwrite, run, look at the chart, repeat.",{"start":528,"end":529},{"line":282,"column":395,"offset":524},{"line":530,"column":282,"offset":531},42,2090,{"start":533,"end":534},{"line":282,"column":20,"offset":508},{"line":530,"column":282,"offset":531},{"type":26,"value":27},{"type":30,"tagName":48,"properties":537,"children":539,"position":547},{"id":538},"the-shape-of-every-indicator",[540],{"type":26,"value":541,"position":542},"The shape of every Indicator",{"start":543,"end":545},{"line":150,"column":57,"offset":544},2095,{"line":150,"column":407,"offset":546},2123,{"start":548,"end":550},{"line":150,"column":20,"offset":549},2092,{"line":150,"column":407,"offset":546},{"type":26,"value":27},{"type":30,"tagName":31,"properties":553,"children":554,"position":563},{},[555],{"type":26,"value":556,"position":557},"Before writing anything, here is the mental model. Every Indicator has the\nsame three moving parts:",{"start":558,"end":560},{"line":160,"column":20,"offset":559},2125,{"line":561,"column":60,"offset":562},47,2224,{"start":564,"end":565},{"line":160,"column":20,"offset":559},{"line":561,"column":60,"offset":562},{"type":26,"value":27},{"type":30,"tagName":183,"properties":568,"children":569,"position":791},{},[570,571,656,657,687,688,790],{"type":26,"value":27},{"type":30,"tagName":188,"properties":572,"children":573,"position":652},{},[574,590,596,608,614,626,633,646],{"type":30,"tagName":80,"properties":575,"children":576,"position":585},{},[577],{"type":26,"value":578,"position":579},"Declarations.",{"start":580,"end":583},{"line":581,"column":90,"offset":582},49,2231,{"line":581,"column":102,"offset":584},2244,{"start":586,"end":588},{"line":581,"column":57,"offset":587},2229,{"line":581,"column":116,"offset":589},2246,{"type":26,"value":591,"position":592}," A few plain statements at the top of the file say what\nthe Indicator reads and writes: ",{"start":593,"end":594},{"line":581,"column":116,"offset":589},{"line":392,"column":483,"offset":595},2337,{"type":30,"tagName":123,"properties":597,"children":598,"position":605},{},[599],{"type":26,"value":600,"position":601},"param(...)",{"start":602,"end":603},{"line":392,"column":483,"offset":595},{"line":392,"column":383,"offset":604},2349,{"start":606,"end":607},{"line":392,"column":483,"offset":595},{"line":392,"column":383,"offset":604},{"type":26,"value":609,"position":610}," for a setting the chart\nuser can change, ",{"start":611,"end":612},{"line":392,"column":383,"offset":604},{"line":294,"column":116,"offset":613},2394,{"type":30,"tagName":123,"properties":615,"children":616,"position":623},{},[617],{"type":26,"value":618,"position":619},"input(...)",{"start":620,"end":621},{"line":294,"column":116,"offset":613},{"line":294,"column":207,"offset":622},2406,{"start":624,"end":625},{"line":294,"column":116,"offset":613},{"line":294,"column":207,"offset":622},{"type":26,"value":627,"position":628}," for a per-bar number the chart feeds in,\n",{"start":629,"end":630},{"line":294,"column":207,"offset":622},{"line":631,"column":20,"offset":632},52,2448,{"type":30,"tagName":123,"properties":634,"children":635,"position":643},{},[636],{"type":26,"value":637,"position":638},"output(...)",{"start":639,"end":641},{"line":631,"column":57,"offset":640},2451,{"line":631,"column":341,"offset":642},2464,{"start":644,"end":645},{"line":631,"column":57,"offset":640},{"line":631,"column":341,"offset":642},{"type":26,"value":647,"position":648}," for a per-bar number the Indicator sends back and the\nchart draws. No output, nothing on the chart.",{"start":649,"end":650},{"line":631,"column":341,"offset":642},{"line":299,"column":581,"offset":651},2567,{"start":653,"end":655},{"line":581,"column":20,"offset":654},2226,{"line":299,"column":581,"offset":651},{"type":26,"value":27},{"type":30,"tagName":188,"properties":658,"children":659,"position":683},{},[660,677],{"type":30,"tagName":80,"properties":661,"children":662,"position":672},{},[663],{"type":26,"value":664,"position":665},"State.",{"start":666,"end":669},{"line":667,"column":90,"offset":668},54,2573,{"line":667,"column":670,"offset":671},12,2579,{"start":673,"end":675},{"line":667,"column":57,"offset":674},2571,{"line":667,"column":77,"offset":676},2581,{"type":26,"value":678,"position":679}," Module-level variables hold whatever must survive from one\nbar to the next: a moving average's window, the previous close, a\ncounter. There is no history array to index; what you want to remember,\nyou keep.",{"start":680,"end":681},{"line":667,"column":77,"offset":676},{"line":315,"column":74,"offset":682},2797,{"start":684,"end":686},{"line":667,"column":20,"offset":685},2568,{"line":315,"column":74,"offset":682},{"type":26,"value":27},{"type":30,"tagName":188,"properties":689,"children":690,"position":786},{},[691,706,712,724,730,743,749,761,768,780],{"type":30,"tagName":80,"properties":692,"children":693,"position":701},{},[694],{"type":26,"value":695,"position":696},"Four functions.",{"start":697,"end":699},{"line":457,"column":90,"offset":698},2803,{"line":457,"column":116,"offset":700},2818,{"start":702,"end":704},{"line":457,"column":57,"offset":703},2801,{"line":457,"column":119,"offset":705},2820,{"type":26,"value":707,"position":708}," ",{"start":709,"end":710},{"line":457,"column":119,"offset":705},{"line":457,"column":103,"offset":711},2821,{"type":30,"tagName":123,"properties":713,"children":714,"position":721},{},[715],{"type":26,"value":716,"position":717},"init()",{"start":718,"end":719},{"line":457,"column":103,"offset":711},{"line":457,"column":407,"offset":720},2829,{"start":722,"end":723},{"line":457,"column":103,"offset":711},{"line":457,"column":407,"offset":720},{"type":26,"value":725,"position":726}," runs once before the first bar, ",{"start":727,"end":728},{"line":457,"column":407,"offset":720},{"line":457,"column":400,"offset":729},2862,{"type":30,"tagName":123,"properties":731,"children":732,"position":740},{},[733],{"type":26,"value":734,"position":735},"state()",{"start":736,"end":737},{"line":457,"column":400,"offset":729},{"line":457,"column":738,"offset":739},74,2871,{"start":741,"end":742},{"line":457,"column":400,"offset":729},{"line":457,"column":738,"offset":739},{"type":26,"value":744,"position":745},"\nruns once per bar, ",{"start":746,"end":747},{"line":457,"column":738,"offset":739},{"line":480,"column":119,"offset":748},2894,{"type":30,"tagName":123,"properties":750,"children":751,"position":758},{},[752],{"type":26,"value":753,"position":754},"finalize()",{"start":755,"end":756},{"line":480,"column":119,"offset":748},{"line":480,"column":471,"offset":757},2906,{"start":759,"end":760},{"line":480,"column":119,"offset":748},{"line":480,"column":471,"offset":757},{"type":26,"value":762,"position":763}," writes the outputs for a bar that has a\nvalue, and ",{"start":764,"end":765},{"line":480,"column":471,"offset":757},{"line":766,"column":120,"offset":767},60,2961,{"type":30,"tagName":123,"properties":769,"children":770,"position":777},{},[771],{"type":26,"value":772,"position":773},"reset()",{"start":774,"end":775},{"line":766,"column":120,"offset":767},{"line":766,"column":103,"offset":776},2970,{"start":778,"end":779},{"line":766,"column":120,"offset":767},{"line":766,"column":103,"offset":776},{"type":26,"value":781,"position":782}," puts the state back to its starting point. The\nhost calls them; you never call them yourself.",{"start":783,"end":784},{"line":766,"column":103,"offset":776},{"line":519,"column":392,"offset":785},3067,{"start":787,"end":789},{"line":457,"column":20,"offset":788},2798,{"line":519,"column":392,"offset":785},{"type":26,"value":27},{"start":792,"end":793},{"line":581,"column":20,"offset":654},{"line":519,"column":392,"offset":785},{"type":26,"value":27},{"type":30,"tagName":31,"properties":796,"children":797,"position":843},{},[798,805,837],{"type":26,"value":799,"position":800},"There is one more rule, and it is easy: ",{"start":801,"end":803},{"line":395,"column":20,"offset":802},3069,{"line":395,"column":291,"offset":804},3109,{"type":30,"tagName":80,"properties":806,"children":807,"position":833},{},[808,815,827],{"type":26,"value":809,"position":810},"the first line of the file is the\nlanguage marker ",{"start":811,"end":813},{"line":395,"column":210,"offset":812},3111,{"line":353,"column":341,"offset":814},3161,{"type":30,"tagName":123,"properties":816,"children":817,"position":824},{},[818],{"type":26,"value":819,"position":820},"//@lang=wrun-ts",{"start":821,"end":822},{"line":353,"column":341,"offset":814},{"line":353,"column":445,"offset":823},3178,{"start":825,"end":826},{"line":353,"column":341,"offset":814},{"line":353,"column":445,"offset":823},{"type":26,"value":828,"position":829},".",{"start":830,"end":831},{"line":353,"column":445,"offset":823},{"line":353,"column":471,"offset":832},3179,{"start":834,"end":835},{"line":395,"column":291,"offset":804},{"line":353,"column":495,"offset":836},3181,{"type":26,"value":838,"position":839}," It is how the editor knows the tab\nholds an Indicator rather than a kScript. Leave it alone; everything you\nwrite goes under it.",{"start":840,"end":841},{"line":353,"column":495,"offset":836},{"line":318,"column":116,"offset":842},3310,{"start":844,"end":845},{"line":395,"column":20,"offset":802},{"line":318,"column":116,"offset":842},{"type":26,"value":27},{"type":30,"tagName":48,"properties":848,"children":850,"position":858},{"id":849},"step-1-new-indicator",[851],{"type":26,"value":852,"position":853},"Step 1: New indicator",{"start":854,"end":856},{"line":323,"column":57,"offset":855},3315,{"line":323,"column":60,"offset":857},3336,{"start":859,"end":861},{"line":323,"column":20,"offset":860},3312,{"line":323,"column":60,"offset":857},{"type":26,"value":27},{"type":30,"tagName":31,"properties":864,"children":865,"position":873},{},[866],{"type":26,"value":867,"position":868},"The editor opens a file whose first line is the language marker:",{"start":869,"end":871},{"line":464,"column":20,"offset":870},3338,{"line":464,"column":400,"offset":872},3402,{"start":874,"end":875},{"line":464,"column":20,"offset":870},{"line":464,"column":400,"offset":872},{"type":26,"value":27},{"type":13,"children":878},[879],{"type":30,"tagName":880,"properties":881,"children":885,"data":-1},"pre",{"class":882,"style":883,"tabindex":884},"shiki shiki-themes github-dark github-light","--shiki-dark:#e1e4e8;--shiki-light:#24292e;--shiki-dark-bg:#24292e;--shiki-light-bg:#fff","0",[886],{"type":30,"tagName":123,"properties":887,"children":888},{},[889],{"type":30,"tagName":890,"properties":891,"children":893},"span",{"class":892},"line",[894],{"type":30,"tagName":890,"properties":895,"children":896},{},[897],{"type":26,"value":819},{"type":26,"value":27},{"type":30,"tagName":31,"properties":900,"children":901,"position":929},{},[902,910,922],{"type":26,"value":903,"position":904},"Everything under it is the ",{"start":905,"end":908},{"line":906,"column":20,"offset":907},76,3433,{"line":906,"column":140,"offset":909},3460,{"type":30,"tagName":123,"properties":911,"children":912,"position":919},{},[913],{"type":26,"value":914,"position":915},"sma-codefirst",{"start":916,"end":917},{"line":906,"column":140,"offset":909},{"line":906,"column":210,"offset":918},3475,{"start":920,"end":921},{"line":906,"column":140,"offset":909},{"line":906,"column":210,"offset":918},{"type":26,"value":923,"position":924}," template, a complete moving\naverage in 25 non-blank lines, a comment on every statement. Read it top to\nbottom, then press Run:",{"start":925,"end":926},{"line":906,"column":210,"offset":918},{"line":927,"column":103,"offset":928},78,3603,{"start":930,"end":931},{"line":906,"column":20,"offset":907},{"line":927,"column":103,"offset":928},{"type":26,"value":27},{"type":13,"children":934},[935],{"type":30,"tagName":880,"properties":936,"children":937,"data":-1},{"class":882,"style":883,"tabindex":884},[938],{"type":30,"tagName":123,"properties":939,"children":940},{},[941,950,951,987,988,1018,1019,1049,1050,1080,1081,1111,1112,1115,1116,1124,1125,1179,1180,1188,1189,1211,1212,1220,1221,1229,1230,1252,1253,1256,1257,1303,1304,1345,1346,1349,1350,1358,1359,1431,1432,1440,1441,1449,1450,1458,1459,1561,1562,1570,1571,1624,1625,1633,1634],{"type":30,"tagName":890,"properties":942,"children":943},{"class":892},[944],{"type":30,"tagName":890,"properties":945,"children":947},{"style":946},"--shiki-dark:#6A737D;--shiki-light:#6A737D",[948],{"type":26,"value":949},"// A simple moving average, declared and computed in one file. Read it top to bottom.",{"type":26,"value":27},{"type":30,"tagName":890,"properties":952,"children":953},{"class":892},[954,960,966,971,977,982],{"type":30,"tagName":890,"properties":955,"children":957},{"style":956},"--shiki-dark:#F97583;--shiki-light:#D73A49",[958],{"type":26,"value":959},"import",{"type":30,"tagName":890,"properties":961,"children":963},{"style":962},"--shiki-dark:#E1E4E8;--shiki-light:#24292E",[964],{"type":26,"value":965}," { input, line, ohlcv, output, overlay, param } ",{"type":30,"tagName":890,"properties":967,"children":968},{"style":956},[969],{"type":26,"value":970},"from",{"type":30,"tagName":890,"properties":972,"children":974},{"style":973},"--shiki-dark:#9ECBFF;--shiki-light:#032F62",[975],{"type":26,"value":976}," \"./sdk/declare\"",{"type":30,"tagName":890,"properties":978,"children":979},{"style":962},[980],{"type":26,"value":981},"; ",{"type":30,"tagName":890,"properties":983,"children":984},{"style":946},[985],{"type":26,"value":986},"// the declaring words",{"type":26,"value":27},{"type":30,"tagName":890,"properties":989,"children":990},{"class":892},[991,995,1000,1004,1009,1013],{"type":30,"tagName":890,"properties":992,"children":993},{"style":956},[994],{"type":26,"value":959},{"type":30,"tagName":890,"properties":996,"children":997},{"style":962},[998],{"type":26,"value":999}," { in_close } ",{"type":30,"tagName":890,"properties":1001,"children":1002},{"style":956},[1003],{"type":26,"value":970},{"type":30,"tagName":890,"properties":1005,"children":1006},{"style":973},[1007],{"type":26,"value":1008}," \"./gen/inputs\"",{"type":30,"tagName":890,"properties":1010,"children":1011},{"style":962},[1012],{"type":26,"value":981},{"type":30,"tagName":890,"properties":1014,"children":1015},{"style":946},[1016],{"type":26,"value":1017},"// generated: an in_ reader for each input declared below",{"type":26,"value":27},{"type":30,"tagName":890,"properties":1020,"children":1021},{"class":892},[1022,1026,1031,1035,1040,1044],{"type":30,"tagName":890,"properties":1023,"children":1024},{"style":956},[1025],{"type":26,"value":959},{"type":30,"tagName":890,"properties":1027,"children":1028},{"style":962},[1029],{"type":26,"value":1030}," { emitRow, out_sma } ",{"type":30,"tagName":890,"properties":1032,"children":1033},{"style":956},[1034],{"type":26,"value":970},{"type":30,"tagName":890,"properties":1036,"children":1037},{"style":973},[1038],{"type":26,"value":1039}," \"./gen/outputs\"",{"type":30,"tagName":890,"properties":1041,"children":1042},{"style":962},[1043],{"type":26,"value":981},{"type":30,"tagName":890,"properties":1045,"children":1046},{"style":946},[1047],{"type":26,"value":1048},"// generated: an out_ writer per output, plus emitRow",{"type":26,"value":27},{"type":30,"tagName":890,"properties":1051,"children":1052},{"class":892},[1053,1057,1062,1066,1071,1075],{"type":30,"tagName":890,"properties":1054,"children":1055},{"style":956},[1056],{"type":26,"value":959},{"type":30,"tagName":890,"properties":1058,"children":1059},{"style":962},[1060],{"type":26,"value":1061}," { p_period } ",{"type":30,"tagName":890,"properties":1063,"children":1064},{"style":956},[1065],{"type":26,"value":970},{"type":30,"tagName":890,"properties":1067,"children":1068},{"style":973},[1069],{"type":26,"value":1070}," \"./gen/params\"",{"type":30,"tagName":890,"properties":1072,"children":1073},{"style":962},[1074],{"type":26,"value":981},{"type":30,"tagName":890,"properties":1076,"children":1077},{"style":946},[1078],{"type":26,"value":1079},"// generated: a p_ reader for each param declared below",{"type":26,"value":27},{"type":30,"tagName":890,"properties":1082,"children":1083},{"class":892},[1084,1088,1093,1097,1102,1106],{"type":30,"tagName":890,"properties":1085,"children":1086},{"style":956},[1087],{"type":26,"value":959},{"type":30,"tagName":890,"properties":1089,"children":1090},{"style":962},[1091],{"type":26,"value":1092}," { Sma } ",{"type":30,"tagName":890,"properties":1094,"children":1095},{"style":956},[1096],{"type":26,"value":970},{"type":30,"tagName":890,"properties":1098,"children":1099},{"style":973},[1100],{"type":26,"value":1101}," \"./sdk/ta\"",{"type":30,"tagName":890,"properties":1103,"children":1104},{"style":962},[1105],{"type":26,"value":981},{"type":30,"tagName":890,"properties":1107,"children":1108},{"style":946},[1109],{"type":26,"value":1110},"// a moving-average helper that keeps its own window of values",{"type":26,"value":27},{"type":30,"tagName":890,"properties":1113,"children":1114},{"class":892},[],{"type":26,"value":27},{"type":30,"tagName":890,"properties":1117,"children":1118},{"class":892},[1119],{"type":30,"tagName":890,"properties":1120,"children":1121},{"style":946},[1122],{"type":26,"value":1123},"// A param is a setting the chart user can change: its name, its default, then the allowed range.",{"type":26,"value":27},{"type":30,"tagName":890,"properties":1126,"children":1127},{"class":892},[1128,1134,1139,1144,1148,1154,1159,1164,1169,1174],{"type":30,"tagName":890,"properties":1129,"children":1131},{"style":1130},"--shiki-dark:#B392F0;--shiki-light:#6F42C1",[1132],{"type":26,"value":1133},"param",{"type":30,"tagName":890,"properties":1135,"children":1136},{"style":962},[1137],{"type":26,"value":1138},"(",{"type":30,"tagName":890,"properties":1140,"children":1141},{"style":973},[1142],{"type":26,"value":1143},"\"period\"",{"type":30,"tagName":890,"properties":1145,"children":1146},{"style":962},[1147],{"type":26,"value":302},{"type":30,"tagName":890,"properties":1149,"children":1151},{"style":1150},"--shiki-dark:#79B8FF;--shiki-light:#005CC5",[1152],{"type":26,"value":1153},"20",{"type":30,"tagName":890,"properties":1155,"children":1156},{"style":962},[1157],{"type":26,"value":1158},", { min: ",{"type":30,"tagName":890,"properties":1160,"children":1161},{"style":1150},[1162],{"type":26,"value":1163},"1",{"type":30,"tagName":890,"properties":1165,"children":1166},{"style":962},[1167],{"type":26,"value":1168},", max: ",{"type":30,"tagName":890,"properties":1170,"children":1171},{"style":1150},[1172],{"type":26,"value":1173},"200",{"type":30,"tagName":890,"properties":1175,"children":1176},{"style":962},[1177],{"type":26,"value":1178}," });",{"type":26,"value":27},{"type":30,"tagName":890,"properties":1181,"children":1182},{"class":892},[1183],{"type":30,"tagName":890,"properties":1184,"children":1185},{"style":946},[1186],{"type":26,"value":1187},"// An input is a per-bar number the chart feeds in; ohlcv.close is each candle's close price.",{"type":26,"value":27},{"type":30,"tagName":890,"properties":1190,"children":1191},{"class":892},[1192,1197,1201,1206],{"type":30,"tagName":890,"properties":1193,"children":1194},{"style":1130},[1195],{"type":26,"value":1196},"input",{"type":30,"tagName":890,"properties":1198,"children":1199},{"style":962},[1200],{"type":26,"value":1138},{"type":30,"tagName":890,"properties":1202,"children":1203},{"style":973},[1204],{"type":26,"value":1205},"\"close\"",{"type":30,"tagName":890,"properties":1207,"children":1208},{"style":962},[1209],{"type":26,"value":1210},", ohlcv.close);",{"type":26,"value":27},{"type":30,"tagName":890,"properties":1213,"children":1214},{"class":892},[1215],{"type":30,"tagName":890,"properties":1216,"children":1217},{"style":946},[1218],{"type":26,"value":1219},"// An output is a per-bar number the Indicator sends back, here drawn as a line on the price panel.",{"type":26,"value":27},{"type":30,"tagName":890,"properties":1222,"children":1223},{"class":892},[1224],{"type":30,"tagName":890,"properties":1225,"children":1226},{"style":946},[1227],{"type":26,"value":1228},"// output() returns a handle; bind it with a const only when a box() or segment() needs to name it.",{"type":26,"value":27},{"type":30,"tagName":890,"properties":1231,"children":1232},{"class":892},[1233,1238,1242,1247],{"type":30,"tagName":890,"properties":1234,"children":1235},{"style":1130},[1236],{"type":26,"value":1237},"output",{"type":30,"tagName":890,"properties":1239,"children":1240},{"style":962},[1241],{"type":26,"value":1138},{"type":30,"tagName":890,"properties":1243,"children":1244},{"style":973},[1245],{"type":26,"value":1246},"\"sma\"",{"type":30,"tagName":890,"properties":1248,"children":1249},{"style":962},[1250],{"type":26,"value":1251},", line, overlay);",{"type":26,"value":27},{"type":30,"tagName":890,"properties":1254,"children":1255},{"class":892},[],{"type":26,"value":27},{"type":30,"tagName":890,"properties":1258,"children":1259},{"class":892},[1260,1265,1270,1275,1280,1285,1289,1293,1298],{"type":30,"tagName":890,"properties":1261,"children":1262},{"style":956},[1263],{"type":26,"value":1264},"let",{"type":30,"tagName":890,"properties":1266,"children":1267},{"style":962},[1268],{"type":26,"value":1269}," sma ",{"type":30,"tagName":890,"properties":1271,"children":1272},{"style":956},[1273],{"type":26,"value":1274},"=",{"type":30,"tagName":890,"properties":1276,"children":1277},{"style":956},[1278],{"type":26,"value":1279}," new",{"type":30,"tagName":890,"properties":1281,"children":1282},{"style":1130},[1283],{"type":26,"value":1284}," Sma",{"type":30,"tagName":890,"properties":1286,"children":1287},{"style":962},[1288],{"type":26,"value":1138},{"type":30,"tagName":890,"properties":1290,"children":1291},{"style":1150},[1292],{"type":26,"value":1153},{"type":30,"tagName":890,"properties":1294,"children":1295},{"style":962},[1296],{"type":26,"value":1297},"); ",{"type":30,"tagName":890,"properties":1299,"children":1300},{"style":946},[1301],{"type":26,"value":1302},"// module state lives between bars; init() rebuilds it at the chosen period",{"type":26,"value":27},{"type":30,"tagName":890,"properties":1305,"children":1306},{"class":892},[1307,1311,1316,1321,1326,1331,1336,1340],{"type":30,"tagName":890,"properties":1308,"children":1309},{"style":956},[1310],{"type":26,"value":1264},{"type":30,"tagName":890,"properties":1312,"children":1313},{"style":962},[1314],{"type":26,"value":1315}," value",{"type":30,"tagName":890,"properties":1317,"children":1318},{"style":956},[1319],{"type":26,"value":1320},":",{"type":30,"tagName":890,"properties":1322,"children":1323},{"style":1130},[1324],{"type":26,"value":1325}," f64",{"type":30,"tagName":890,"properties":1327,"children":1328},{"style":956},[1329],{"type":26,"value":1330}," =",{"type":30,"tagName":890,"properties":1332,"children":1333},{"style":1150},[1334],{"type":26,"value":1335}," NaN",{"type":30,"tagName":890,"properties":1337,"children":1338},{"style":962},[1339],{"type":26,"value":981},{"type":30,"tagName":890,"properties":1341,"children":1342},{"style":946},[1343],{"type":26,"value":1344},"// this bar's average (f64 is the number type), NaN until the window is full",{"type":26,"value":27},{"type":30,"tagName":890,"properties":1347,"children":1348},{"class":892},[],{"type":26,"value":27},{"type":30,"tagName":890,"properties":1351,"children":1352},{"class":892},[1353],{"type":30,"tagName":890,"properties":1354,"children":1355},{"style":946},[1356],{"type":26,"value":1357},"// init() runs once before the first bar: read each setting through its p_ reader (i32() = whole bars).",{"type":26,"value":27},{"type":30,"tagName":890,"properties":1360,"children":1361},{"class":892},[1362,1367,1372,1377,1382,1386,1391,1396,1400,1404,1408,1412,1417,1421,1426],{"type":30,"tagName":890,"properties":1363,"children":1364},{"style":956},[1365],{"type":26,"value":1366},"export",{"type":30,"tagName":890,"properties":1368,"children":1369},{"style":956},[1370],{"type":26,"value":1371}," function",{"type":30,"tagName":890,"properties":1373,"children":1374},{"style":1130},[1375],{"type":26,"value":1376}," init",{"type":30,"tagName":890,"properties":1378,"children":1379},{"style":962},[1380],{"type":26,"value":1381},"()",{"type":30,"tagName":890,"properties":1383,"children":1384},{"style":956},[1385],{"type":26,"value":1320},{"type":30,"tagName":890,"properties":1387,"children":1388},{"style":1150},[1389],{"type":26,"value":1390}," void",{"type":30,"tagName":890,"properties":1392,"children":1393},{"style":962},[1394],{"type":26,"value":1395}," { sma ",{"type":30,"tagName":890,"properties":1397,"children":1398},{"style":956},[1399],{"type":26,"value":1274},{"type":30,"tagName":890,"properties":1401,"children":1402},{"style":956},[1403],{"type":26,"value":1279},{"type":30,"tagName":890,"properties":1405,"children":1406},{"style":1130},[1407],{"type":26,"value":1284},{"type":30,"tagName":890,"properties":1409,"children":1410},{"style":962},[1411],{"type":26,"value":1138},{"type":30,"tagName":890,"properties":1413,"children":1414},{"style":1130},[1415],{"type":26,"value":1416},"i32",{"type":30,"tagName":890,"properties":1418,"children":1419},{"style":962},[1420],{"type":26,"value":1138},{"type":30,"tagName":890,"properties":1422,"children":1423},{"style":1130},[1424],{"type":26,"value":1425},"p_period",{"type":30,"tagName":890,"properties":1427,"children":1428},{"style":962},[1429],{"type":26,"value":1430},"())); }",{"type":26,"value":27},{"type":30,"tagName":890,"properties":1433,"children":1434},{"class":892},[1435],{"type":30,"tagName":890,"properties":1436,"children":1437},{"style":946},[1438],{"type":26,"value":1439},"// state() runs once per bar: read the bar through its in_ reader and fold it into the window.",{"type":26,"value":27},{"type":30,"tagName":890,"properties":1442,"children":1443},{"class":892},[1444],{"type":30,"tagName":890,"properties":1445,"children":1446},{"style":946},[1447],{"type":26,"value":1448},"// Warmup rows are NaN: until the window holds period bars there is no average yet, so return 0",{"type":26,"value":27},{"type":30,"tagName":890,"properties":1451,"children":1452},{"class":892},[1453],{"type":30,"tagName":890,"properties":1454,"children":1455},{"style":946},[1456],{"type":26,"value":1457},"// and the chart draws nothing for that bar; return 1 once the value is real.",{"type":26,"value":27},{"type":30,"tagName":890,"properties":1460,"children":1461},{"class":892},[1462,1466,1470,1475,1479,1483,1488,1493,1497,1502,1507,1511,1516,1521,1526,1531,1536,1541,1546,1551,1556],{"type":30,"tagName":890,"properties":1463,"children":1464},{"style":956},[1465],{"type":26,"value":1366},{"type":30,"tagName":890,"properties":1467,"children":1468},{"style":956},[1469],{"type":26,"value":1371},{"type":30,"tagName":890,"properties":1471,"children":1472},{"style":1130},[1473],{"type":26,"value":1474}," state",{"type":30,"tagName":890,"properties":1476,"children":1477},{"style":962},[1478],{"type":26,"value":1381},{"type":30,"tagName":890,"properties":1480,"children":1481},{"style":956},[1482],{"type":26,"value":1320},{"type":30,"tagName":890,"properties":1484,"children":1485},{"style":1130},[1486],{"type":26,"value":1487}," i32",{"type":30,"tagName":890,"properties":1489,"children":1490},{"style":962},[1491],{"type":26,"value":1492}," { value ",{"type":30,"tagName":890,"properties":1494,"children":1495},{"style":956},[1496],{"type":26,"value":1274},{"type":30,"tagName":890,"properties":1498,"children":1499},{"style":962},[1500],{"type":26,"value":1501}," sma.",{"type":30,"tagName":890,"properties":1503,"children":1504},{"style":1130},[1505],{"type":26,"value":1506},"update",{"type":30,"tagName":890,"properties":1508,"children":1509},{"style":962},[1510],{"type":26,"value":1138},{"type":30,"tagName":890,"properties":1512,"children":1513},{"style":1130},[1514],{"type":26,"value":1515},"in_close",{"type":30,"tagName":890,"properties":1517,"children":1518},{"style":962},[1519],{"type":26,"value":1520},"()); ",{"type":30,"tagName":890,"properties":1522,"children":1523},{"style":956},[1524],{"type":26,"value":1525},"return",{"type":30,"tagName":890,"properties":1527,"children":1528},{"style":1130},[1529],{"type":26,"value":1530}," isNaN",{"type":30,"tagName":890,"properties":1532,"children":1533},{"style":962},[1534],{"type":26,"value":1535},"(value) ",{"type":30,"tagName":890,"properties":1537,"children":1538},{"style":956},[1539],{"type":26,"value":1540},"?",{"type":30,"tagName":890,"properties":1542,"children":1543},{"style":1150},[1544],{"type":26,"value":1545}," 0",{"type":30,"tagName":890,"properties":1547,"children":1548},{"style":956},[1549],{"type":26,"value":1550}," :",{"type":30,"tagName":890,"properties":1552,"children":1553},{"style":1150},[1554],{"type":26,"value":1555}," 1",{"type":30,"tagName":890,"properties":1557,"children":1558},{"style":962},[1559],{"type":26,"value":1560},"; }",{"type":26,"value":27},{"type":30,"tagName":890,"properties":1563,"children":1564},{"class":892},[1565],{"type":30,"tagName":890,"properties":1566,"children":1567},{"style":946},[1568],{"type":26,"value":1569},"// finalize() runs after state() returns 1: write each output through its out_ writer, then emitRow().",{"type":26,"value":27},{"type":30,"tagName":890,"properties":1572,"children":1573},{"class":892},[1574,1578,1582,1587,1591,1595,1599,1604,1609,1614,1619],{"type":30,"tagName":890,"properties":1575,"children":1576},{"style":956},[1577],{"type":26,"value":1366},{"type":30,"tagName":890,"properties":1579,"children":1580},{"style":956},[1581],{"type":26,"value":1371},{"type":30,"tagName":890,"properties":1583,"children":1584},{"style":1130},[1585],{"type":26,"value":1586}," finalize",{"type":30,"tagName":890,"properties":1588,"children":1589},{"style":962},[1590],{"type":26,"value":1381},{"type":30,"tagName":890,"properties":1592,"children":1593},{"style":956},[1594],{"type":26,"value":1320},{"type":30,"tagName":890,"properties":1596,"children":1597},{"style":1150},[1598],{"type":26,"value":1390},{"type":30,"tagName":890,"properties":1600,"children":1601},{"style":962},[1602],{"type":26,"value":1603}," { ",{"type":30,"tagName":890,"properties":1605,"children":1606},{"style":1130},[1607],{"type":26,"value":1608},"out_sma",{"type":30,"tagName":890,"properties":1610,"children":1611},{"style":962},[1612],{"type":26,"value":1613},"(value); ",{"type":30,"tagName":890,"properties":1615,"children":1616},{"style":1130},[1617],{"type":26,"value":1618},"emitRow",{"type":30,"tagName":890,"properties":1620,"children":1621},{"style":962},[1622],{"type":26,"value":1623},"(); }",{"type":26,"value":27},{"type":30,"tagName":890,"properties":1626,"children":1627},{"class":892},[1628],{"type":30,"tagName":890,"properties":1629,"children":1630},{"style":946},[1631],{"type":26,"value":1632},"// reset() runs when the chart restarts the series: put the state back to what init() built.",{"type":26,"value":27},{"type":30,"tagName":890,"properties":1635,"children":1636},{"class":892},[1637,1641,1645,1650,1654,1658,1662,1667,1672,1677,1681,1685],{"type":30,"tagName":890,"properties":1638,"children":1639},{"style":956},[1640],{"type":26,"value":1366},{"type":30,"tagName":890,"properties":1642,"children":1643},{"style":956},[1644],{"type":26,"value":1371},{"type":30,"tagName":890,"properties":1646,"children":1647},{"style":1130},[1648],{"type":26,"value":1649}," reset",{"type":30,"tagName":890,"properties":1651,"children":1652},{"style":962},[1653],{"type":26,"value":1381},{"type":30,"tagName":890,"properties":1655,"children":1656},{"style":956},[1657],{"type":26,"value":1320},{"type":30,"tagName":890,"properties":1659,"children":1660},{"style":1150},[1661],{"type":26,"value":1390},{"type":30,"tagName":890,"properties":1663,"children":1664},{"style":962},[1665],{"type":26,"value":1666}," { sma.",{"type":30,"tagName":890,"properties":1668,"children":1669},{"style":1130},[1670],{"type":26,"value":1671},"reset",{"type":30,"tagName":890,"properties":1673,"children":1674},{"style":962},[1675],{"type":26,"value":1676},"(); value ",{"type":30,"tagName":890,"properties":1678,"children":1679},{"style":956},[1680],{"type":26,"value":1274},{"type":30,"tagName":890,"properties":1682,"children":1683},{"style":1150},[1684],{"type":26,"value":1335},{"type":30,"tagName":890,"properties":1686,"children":1687},{"style":962},[1688],{"type":26,"value":1560},{"type":26,"value":27},{"type":30,"tagName":31,"properties":1691,"children":1692,"position":1701},{},[1693],{"type":26,"value":1694,"position":1695},"All three parts are there. Let's walk through them.",{"start":1696,"end":1699},{"line":1697,"column":20,"offset":1698},111,5751,{"line":1697,"column":631,"offset":1700},5802,{"start":1702,"end":1703},{"line":1697,"column":20,"offset":1698},{"line":1697,"column":631,"offset":1700},{"type":26,"value":27},{"type":30,"tagName":48,"properties":1706,"children":1708,"position":1717},{"id":1707},"read-the-template",[1709],{"type":26,"value":1710,"position":1711},"Read the template",{"start":1712,"end":1715},{"line":1713,"column":57,"offset":1714},113,5807,{"line":1713,"column":116,"offset":1716},5824,{"start":1718,"end":1720},{"line":1713,"column":20,"offset":1719},5804,{"line":1713,"column":116,"offset":1716},{"type":26,"value":27},{"type":30,"tagName":31,"properties":1723,"children":1724,"position":1734},{},[1725],{"type":26,"value":1726,"position":1727},"Three declarations at the top say what the Indicator reads and writes. They\nare plain statements, extracted from the file before it compiles, so every\nname must be a string literal and every default a literal number:",{"start":1728,"end":1731},{"line":1729,"column":20,"offset":1730},115,5826,{"line":1732,"column":318,"offset":1733},117,6042,{"start":1735,"end":1736},{"line":1729,"column":20,"offset":1730},{"line":1732,"column":318,"offset":1733},{"type":26,"value":27},{"type":30,"tagName":1739,"properties":1740,"children":1741,"position":1906},"ul",{},[1742,1743,1771,1772,1800,1801,1905],{"type":26,"value":27},{"type":30,"tagName":188,"properties":1744,"children":1745,"position":1767},{},[1746,1760],{"type":30,"tagName":123,"properties":1747,"children":1748,"position":1757},{},[1749],{"type":26,"value":1750,"position":1751},"param(\"period\", 20, { min: 1, max: 200 })",{"start":1752,"end":1755},{"line":1753,"column":87,"offset":1754},119,6046,{"line":1753,"column":160,"offset":1756},6089,{"start":1758,"end":1759},{"line":1753,"column":87,"offset":1754},{"line":1753,"column":160,"offset":1756},{"type":26,"value":1761,"position":1762}," is a setting. It shows in\nthe overlay's settings dialog with that default and range.",{"start":1763,"end":1764},{"line":1753,"column":160,"offset":1756},{"line":1765,"column":519,"offset":1766},120,6176,{"start":1768,"end":1770},{"line":1753,"column":20,"offset":1769},6044,{"line":1765,"column":519,"offset":1766},{"type":26,"value":27},{"type":30,"tagName":188,"properties":1773,"children":1774,"position":1796},{},[1775,1789],{"type":30,"tagName":123,"properties":1776,"children":1777,"position":1786},{},[1778],{"type":26,"value":1779,"position":1780},"input(\"close\", ohlcv.close)",{"start":1781,"end":1784},{"line":1782,"column":87,"offset":1783},121,6179,{"line":1782,"column":407,"offset":1785},6208,{"start":1787,"end":1788},{"line":1782,"column":87,"offset":1783},{"line":1782,"column":407,"offset":1785},{"type":26,"value":1790,"position":1791}," is a feed: the chart's own close price, one\nvalue per bar.",{"start":1792,"end":1793},{"line":1782,"column":407,"offset":1785},{"line":1794,"column":341,"offset":1795},122,6269,{"start":1797,"end":1799},{"line":1782,"column":20,"offset":1798},6177,{"line":1794,"column":341,"offset":1795},{"type":26,"value":27},{"type":30,"tagName":188,"properties":1802,"children":1803,"position":1901},{},[1804,1818,1825,1838,1844,1856,1863,1876,1883,1895],{"type":30,"tagName":123,"properties":1805,"children":1806,"position":1815},{},[1807],{"type":26,"value":1808,"position":1809},"output(\"sma\", line, overlay)",{"start":1810,"end":1813},{"line":1811,"column":87,"offset":1812},123,6272,{"line":1811,"column":207,"offset":1814},6302,{"start":1816,"end":1817},{"line":1811,"column":87,"offset":1812},{"line":1811,"column":207,"offset":1814},{"type":26,"value":1819,"position":1820}," is what the chart draws: a line on the\nprice pane. ",{"start":1821,"end":1822},{"line":1811,"column":207,"offset":1814},{"line":1823,"column":120,"offset":1824},124,6356,{"type":30,"tagName":123,"properties":1826,"children":1827,"position":1835},{},[1828],{"type":26,"value":1829,"position":1830},"lower",{"start":1831,"end":1832},{"line":1823,"column":120,"offset":1824},{"line":1823,"column":1833,"offset":1834},22,6363,{"start":1836,"end":1837},{"line":1823,"column":120,"offset":1824},{"line":1823,"column":1833,"offset":1834},{"type":26,"value":1839,"position":1840}," instead of ",{"start":1841,"end":1842},{"line":1823,"column":1833,"offset":1834},{"line":1823,"column":445,"offset":1843},6375,{"type":30,"tagName":123,"properties":1845,"children":1846,"position":1853},{},[1847],{"type":26,"value":1848,"position":1849},"overlay",{"start":1850,"end":1851},{"line":1823,"column":445,"offset":1843},{"line":1823,"column":210,"offset":1852},6384,{"start":1854,"end":1855},{"line":1823,"column":445,"offset":1843},{"line":1823,"column":210,"offset":1852},{"type":26,"value":1857,"position":1858}," puts it in its own pane; ",{"start":1859,"end":1860},{"line":1823,"column":210,"offset":1852},{"line":1823,"column":1861,"offset":1862},69,6410,{"type":30,"tagName":123,"properties":1864,"children":1865,"position":1873},{},[1866],{"type":26,"value":1867,"position":1868},"none",{"start":1869,"end":1870},{"line":1823,"column":1861,"offset":1862},{"line":1823,"column":1871,"offset":1872},75,6416,{"start":1874,"end":1875},{"line":1823,"column":1861,"offset":1862},{"line":1823,"column":1871,"offset":1872},{"type":26,"value":1877,"position":1878},"\ninstead of ",{"start":1879,"end":1880},{"line":1823,"column":1871,"offset":1872},{"line":1881,"column":77,"offset":1882},125,6430,{"type":30,"tagName":123,"properties":1884,"children":1885,"position":1892},{},[1886],{"type":26,"value":892,"position":1887},{"start":1888,"end":1889},{"line":1881,"column":77,"offset":1882},{"line":1881,"column":1890,"offset":1891},20,6436,{"start":1893,"end":1894},{"line":1881,"column":77,"offset":1882},{"line":1881,"column":1890,"offset":1891},{"type":26,"value":1896,"position":1897}," computes it without drawing it.",{"start":1898,"end":1899},{"line":1881,"column":1890,"offset":1891},{"line":1881,"column":631,"offset":1900},6468,{"start":1902,"end":1904},{"line":1811,"column":20,"offset":1903},6270,{"line":1881,"column":631,"offset":1900},{"type":26,"value":27},{"start":1907,"end":1908},{"line":1753,"column":20,"offset":1769},{"line":1881,"column":631,"offset":1900},{"type":26,"value":27},{"type":30,"tagName":31,"properties":1911,"children":1912,"position":2031},{},[1913,1921,1934,1940,1952,1957,1969,1976,1988,1993,2005,2012,2024],{"type":26,"value":1914,"position":1915},"The generated imports (",{"start":1916,"end":1919},{"line":1917,"column":20,"offset":1918},127,6470,{"line":1917,"column":103,"offset":1920},6493,{"type":30,"tagName":123,"properties":1922,"children":1923,"position":1931},{},[1924],{"type":26,"value":1925,"position":1926},"./gen/params",{"start":1927,"end":1928},{"line":1917,"column":103,"offset":1920},{"line":1917,"column":1929,"offset":1930},38,6507,{"start":1932,"end":1933},{"line":1917,"column":103,"offset":1920},{"line":1917,"column":1929,"offset":1930},{"type":26,"value":302,"position":1935},{"start":1936,"end":1937},{"line":1917,"column":1929,"offset":1930},{"line":1917,"column":1938,"offset":1939},40,6509,{"type":30,"tagName":123,"properties":1941,"children":1942,"position":1949},{},[1943],{"type":26,"value":1944,"position":1945},"./gen/inputs",{"start":1946,"end":1947},{"line":1917,"column":1938,"offset":1939},{"line":1917,"column":667,"offset":1948},6523,{"start":1950,"end":1951},{"line":1917,"column":1938,"offset":1939},{"line":1917,"column":667,"offset":1948},{"type":26,"value":302,"position":1953},{"start":1954,"end":1955},{"line":1917,"column":667,"offset":1948},{"line":1917,"column":448,"offset":1956},6525,{"type":30,"tagName":123,"properties":1958,"children":1959,"position":1966},{},[1960],{"type":26,"value":1961,"position":1962},"./gen/outputs",{"start":1963,"end":1964},{"line":1917,"column":448,"offset":1956},{"line":1917,"column":243,"offset":1965},6540,{"start":1967,"end":1968},{"line":1917,"column":448,"offset":1956},{"line":1917,"column":243,"offset":1965},{"type":26,"value":1970,"position":1971},") are\nhow the code reads and writes those names: ",{"start":1972,"end":1973},{"line":1917,"column":243,"offset":1965},{"line":1974,"column":150,"offset":1975},128,6589,{"type":30,"tagName":123,"properties":1977,"children":1978,"position":1985},{},[1979],{"type":26,"value":1980,"position":1981},"p_period()",{"start":1982,"end":1983},{"line":1974,"column":150,"offset":1975},{"line":1974,"column":448,"offset":1984},6601,{"start":1986,"end":1987},{"line":1974,"column":150,"offset":1975},{"line":1974,"column":448,"offset":1984},{"type":26,"value":302,"position":1989},{"start":1990,"end":1991},{"line":1974,"column":448,"offset":1984},{"line":1974,"column":457,"offset":1992},6603,{"type":30,"tagName":123,"properties":1994,"children":1995,"position":2002},{},[1996],{"type":26,"value":1997,"position":1998},"in_close()",{"start":1999,"end":2000},{"line":1974,"column":457,"offset":1992},{"line":1974,"column":464,"offset":2001},6615,{"start":2003,"end":2004},{"line":1974,"column":457,"offset":1992},{"line":1974,"column":464,"offset":2001},{"type":26,"value":2006,"position":2007},",\n",{"start":2008,"end":2009},{"line":1974,"column":464,"offset":2001},{"line":2010,"column":20,"offset":2011},129,6617,{"type":30,"tagName":123,"properties":2013,"children":2014,"position":2021},{},[2015],{"type":26,"value":2016,"position":2017},"out_sma(value)",{"start":2018,"end":2019},{"line":2010,"column":20,"offset":2011},{"line":2010,"column":341,"offset":2020},6633,{"start":2022,"end":2023},{"line":2010,"column":20,"offset":2011},{"line":2010,"column":341,"offset":2020},{"type":26,"value":2025,"position":2026},". Rename a declaration and its accessor renames with it; the\ncompiler then points at every stale import.",{"start":2027,"end":2028},{"line":2010,"column":341,"offset":2020},{"line":2029,"column":150,"offset":2030},130,6737,{"start":2032,"end":2033},{"line":1917,"column":20,"offset":1918},{"line":2029,"column":150,"offset":2030},{"type":26,"value":27},{"type":30,"tagName":31,"properties":2036,"children":2037,"position":2046},{},[2038],{"type":26,"value":2039,"position":2040},"Four functions do the work, and the build refuses any other signature:",{"start":2041,"end":2044},{"line":2042,"column":20,"offset":2043},132,6739,{"line":2042,"column":243,"offset":2045},6809,{"start":2047,"end":2048},{"line":2042,"column":20,"offset":2043},{"line":2042,"column":243,"offset":2045},{"type":26,"value":2050},"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",{"type":30,"tagName":2052,"properties":2053,"children":2054,"position":2429},"table",{},[2055,2114],{"type":30,"tagName":2056,"properties":2057,"children":2058,"position":2111},"thead",{},[2059],{"type":30,"tagName":2060,"properties":2061,"children":2062,"position":2108},"tr",{},[2063,2080,2094],{"type":30,"tagName":2064,"properties":2065,"children":2066,"position":2075},"th",{},[2067],{"type":26,"value":2068,"position":2069},"Function",{"start":2070,"end":2073},{"line":2071,"column":87,"offset":2072},134,6813,{"line":2071,"column":56,"offset":2074},6821,{"start":2076,"end":2078},{"line":2071,"column":20,"offset":2077},6811,{"line":2071,"column":670,"offset":2079},6822,{"type":30,"tagName":2064,"properties":2081,"children":2082,"position":2090},{},[2083],{"type":26,"value":2084,"position":2085},"Runs",{"start":2086,"end":2088},{"line":2071,"column":77,"offset":2087},6824,{"line":2071,"column":41,"offset":2089},6828,{"start":2091,"end":2092},{"line":2071,"column":670,"offset":2079},{"line":2071,"column":102,"offset":2093},6829,{"type":30,"tagName":2064,"properties":2095,"children":2096,"position":2104},{},[2097],{"type":26,"value":2098,"position":2099},"Do this here",{"start":2100,"end":2102},{"line":2071,"column":116,"offset":2101},6831,{"line":2071,"column":207,"offset":2103},6843,{"start":2105,"end":2106},{"line":2071,"column":102,"offset":2093},{"line":2071,"column":471,"offset":2107},6845,{"start":2109,"end":2110},{"line":2071,"column":20,"offset":2077},{"line":2071,"column":471,"offset":2107},{"start":2112,"end":2113},{"line":2071,"column":20,"offset":2077},{"line":2071,"column":471,"offset":2107},{"type":30,"tagName":2115,"properties":2116,"children":2117,"position":2426},"tbody",{},[2118,2174,2266,2353],{"type":30,"tagName":2060,"properties":2119,"children":2120,"position":2171},{},[2121,2143,2157],{"type":30,"tagName":2122,"properties":2123,"children":2124,"position":2138},"td",{},[2125],{"type":30,"tagName":123,"properties":2126,"children":2127,"position":2135},{},[2128],{"type":26,"value":716,"position":2129},{"start":2130,"end":2133},{"line":2131,"column":87,"offset":2132},136,6868,{"line":2131,"column":56,"offset":2134},6876,{"start":2136,"end":2137},{"line":2131,"column":87,"offset":2132},{"line":2131,"column":56,"offset":2134},{"start":2139,"end":2141},{"line":2131,"column":20,"offset":2140},6866,{"line":2131,"column":670,"offset":2142},6877,{"type":30,"tagName":2122,"properties":2144,"children":2145,"position":2153},{},[2146],{"type":26,"value":2147,"position":2148},"once, before the first bar",{"start":2149,"end":2151},{"line":2131,"column":77,"offset":2150},6879,{"line":2131,"column":1938,"offset":2152},6905,{"start":2154,"end":2155},{"line":2131,"column":670,"offset":2142},{"line":2131,"column":291,"offset":2156},6906,{"type":30,"tagName":2122,"properties":2158,"children":2159,"position":2167},{},[2160],{"type":26,"value":2161,"position":2162},"read params, size your averages",{"start":2163,"end":2165},{"line":2131,"column":210,"offset":2164},6908,{"line":2131,"column":738,"offset":2166},6939,{"start":2168,"end":2169},{"line":2131,"column":291,"offset":2156},{"line":2131,"column":906,"offset":2170},6941,{"start":2172,"end":2173},{"line":2131,"column":20,"offset":2140},{"line":2131,"column":906,"offset":2170},{"type":30,"tagName":2060,"properties":2175,"children":2176,"position":2263},{},[2177,2198,2212],{"type":30,"tagName":2122,"properties":2178,"children":2179,"position":2193},{},[2180],{"type":30,"tagName":123,"properties":2181,"children":2182,"position":2190},{},[2183],{"type":26,"value":734,"position":2184},{"start":2185,"end":2188},{"line":2186,"column":87,"offset":2187},137,6944,{"line":2186,"column":670,"offset":2189},6953,{"start":2191,"end":2192},{"line":2186,"column":87,"offset":2187},{"line":2186,"column":670,"offset":2189},{"start":2194,"end":2196},{"line":2186,"column":20,"offset":2195},6942,{"line":2186,"column":74,"offset":2197},6954,{"type":30,"tagName":2122,"properties":2199,"children":2200,"position":2208},{},[2201],{"type":26,"value":2202,"position":2203},"once per bar",{"start":2204,"end":2206},{"line":2186,"column":120,"offset":2205},6956,{"line":2186,"column":195,"offset":2207},6968,{"start":2209,"end":2210},{"line":2186,"column":74,"offset":2197},{"line":2186,"column":140,"offset":2211},6969,{"type":30,"tagName":2122,"properties":2213,"children":2214,"position":2259},{},[2215,2222,2234,2241,2253],{"type":26,"value":2216,"position":2217},"read inputs, update your state, return ",{"start":2218,"end":2220},{"line":2186,"column":330,"offset":2219},6971,{"line":2186,"column":1861,"offset":2221},7010,{"type":30,"tagName":123,"properties":2223,"children":2224,"position":2231},{},[2225],{"type":26,"value":1163,"position":2226},{"start":2227,"end":2228},{"line":2186,"column":1861,"offset":2221},{"line":2186,"column":2229,"offset":2230},72,7013,{"start":2232,"end":2233},{"line":2186,"column":1861,"offset":2221},{"line":2186,"column":2229,"offset":2230},{"type":26,"value":2235,"position":2236}," when the bar has a value or ",{"start":2237,"end":2238},{"line":2186,"column":2229,"offset":2230},{"line":2186,"column":2239,"offset":2240},101,7042,{"type":30,"tagName":123,"properties":2242,"children":2243,"position":2250},{},[2244],{"type":26,"value":884,"position":2245},{"start":2246,"end":2247},{"line":2186,"column":2239,"offset":2240},{"line":2186,"column":2248,"offset":2249},104,7045,{"start":2251,"end":2252},{"line":2186,"column":2239,"offset":2240},{"line":2186,"column":2248,"offset":2249},{"type":26,"value":2254,"position":2255}," while warming up",{"start":2256,"end":2257},{"line":2186,"column":2248,"offset":2249},{"line":2186,"column":1782,"offset":2258},7062,{"start":2260,"end":2261},{"line":2186,"column":140,"offset":2211},{"line":2186,"column":1811,"offset":2262},7064,{"start":2264,"end":2265},{"line":2186,"column":20,"offset":2195},{"line":2186,"column":1811,"offset":2262},{"type":30,"tagName":2060,"properties":2267,"children":2268,"position":2350},{},[2269,2290,2315],{"type":30,"tagName":2122,"properties":2270,"children":2271,"position":2285},{},[2272],{"type":30,"tagName":123,"properties":2273,"children":2274,"position":2282},{},[2275],{"type":26,"value":753,"position":2276},{"start":2277,"end":2280},{"line":2278,"column":87,"offset":2279},138,7067,{"line":2278,"column":120,"offset":2281},7079,{"start":2283,"end":2284},{"line":2278,"column":87,"offset":2279},{"line":2278,"column":120,"offset":2281},{"start":2286,"end":2288},{"line":2278,"column":20,"offset":2287},7065,{"line":2278,"column":231,"offset":2289},7080,{"type":30,"tagName":2122,"properties":2291,"children":2292,"position":2311},{},[2293,2300],{"type":26,"value":2294,"position":2295},"once per bar that returned ",{"start":2296,"end":2298},{"line":2278,"column":41,"offset":2297},7082,{"line":2278,"column":215,"offset":2299},7109,{"type":30,"tagName":123,"properties":2301,"children":2302,"position":2308},{},[2303],{"type":26,"value":1163,"position":2304},{"start":2305,"end":2306},{"line":2278,"column":215,"offset":2299},{"line":2278,"column":383,"offset":2307},7112,{"start":2309,"end":2310},{"line":2278,"column":215,"offset":2299},{"line":2278,"column":383,"offset":2307},{"start":2312,"end":2313},{"line":2278,"column":231,"offset":2289},{"line":2278,"column":581,"offset":2314},7113,{"type":30,"tagName":2122,"properties":2316,"children":2317,"position":2345},{},[2318,2325,2338],{"type":26,"value":2319,"position":2320},"write every output, then ",{"start":2321,"end":2323},{"line":2278,"column":294,"offset":2322},7115,{"line":2278,"column":906,"offset":2324},7140,{"type":30,"tagName":123,"properties":2326,"children":2327,"position":2335},{},[2328],{"type":26,"value":2329,"position":2330},"emitRow()",{"start":2331,"end":2332},{"line":2278,"column":906,"offset":2324},{"line":2278,"column":2333,"offset":2334},87,7151,{"start":2336,"end":2337},{"line":2278,"column":906,"offset":2324},{"line":2278,"column":2333,"offset":2334},{"type":26,"value":2339,"position":2340}," last",{"start":2341,"end":2342},{"line":2278,"column":2333,"offset":2334},{"line":2278,"column":2343,"offset":2344},92,7156,{"start":2346,"end":2347},{"line":2278,"column":581,"offset":2314},{"line":2278,"column":2348,"offset":2349},94,7158,{"start":2351,"end":2352},{"line":2278,"column":20,"offset":2287},{"line":2278,"column":2348,"offset":2349},{"type":30,"tagName":2060,"properties":2354,"children":2355,"position":2423},{},[2356,2377,2391],{"type":30,"tagName":2122,"properties":2357,"children":2358,"position":2372},{},[2359],{"type":30,"tagName":123,"properties":2360,"children":2361,"position":2369},{},[2362],{"type":26,"value":772,"position":2363},{"start":2364,"end":2367},{"line":2365,"column":87,"offset":2366},139,7161,{"line":2365,"column":670,"offset":2368},7170,{"start":2370,"end":2371},{"line":2365,"column":87,"offset":2366},{"line":2365,"column":670,"offset":2368},{"start":2373,"end":2375},{"line":2365,"column":20,"offset":2374},7159,{"line":2365,"column":74,"offset":2376},7171,{"type":30,"tagName":2122,"properties":2378,"children":2379,"position":2387},{},[2380],{"type":26,"value":2381,"position":2382},"when the chart replays the forming bar",{"start":2383,"end":2385},{"line":2365,"column":120,"offset":2384},7173,{"line":2365,"column":299,"offset":2386},7211,{"start":2388,"end":2389},{"line":2365,"column":74,"offset":2376},{"line":2365,"column":667,"offset":2390},7212,{"type":30,"tagName":2122,"properties":2392,"children":2393,"position":2419},{},[2394,2401,2413],{"type":26,"value":2395,"position":2396},"clear every module-level variable and ",{"start":2397,"end":2399},{"line":2365,"column":448,"offset":2398},7214,{"line":2365,"column":2348,"offset":2400},7252,{"type":30,"tagName":123,"properties":2402,"children":2403,"position":2410},{},[2404],{"type":26,"value":2405,"position":2406},".reset()",{"start":2407,"end":2408},{"line":2365,"column":2348,"offset":2400},{"line":2365,"column":2248,"offset":2409},7262,{"start":2411,"end":2412},{"line":2365,"column":2348,"offset":2400},{"line":2365,"column":2248,"offset":2409},{"type":26,"value":2414,"position":2415}," every TA object",{"start":2416,"end":2417},{"line":2365,"column":2248,"offset":2409},{"line":2365,"column":1765,"offset":2418},7278,{"start":2420,"end":2421},{"line":2365,"column":667,"offset":2390},{"line":2365,"column":1794,"offset":2422},7280,{"start":2424,"end":2425},{"line":2365,"column":20,"offset":2374},{"line":2365,"column":1794,"offset":2422},{"start":2427,"end":2428},{"line":2131,"column":20,"offset":2140},{"line":2365,"column":1794,"offset":2422},{"start":2430,"end":2431},{"line":2071,"column":20,"offset":2077},{"line":2365,"column":1794,"offset":2422},{"type":26,"value":27},{"type":30,"tagName":31,"properties":2434,"children":2435,"position":2639},{},[2436,2443,2455,2460,2472,2477,2489,2494,2506,2513,2525,2531,2542,2549,2561,2567,2579,2585,2597,2604,2615,2622,2634],{"type":26,"value":2437,"position":2438},"Every TA class (",{"start":2439,"end":2441},{"line":23,"column":20,"offset":2440},7282,{"line":23,"column":341,"offset":2442},7298,{"type":30,"tagName":123,"properties":2444,"children":2445,"position":2452},{},[2446],{"type":26,"value":2447,"position":2448},"Sma",{"start":2449,"end":2450},{"line":23,"column":341,"offset":2442},{"line":23,"column":1833,"offset":2451},7303,{"start":2453,"end":2454},{"line":23,"column":341,"offset":2442},{"line":23,"column":1833,"offset":2451},{"type":26,"value":302,"position":2456},{"start":2457,"end":2458},{"line":23,"column":1833,"offset":2451},{"line":23,"column":103,"offset":2459},7305,{"type":30,"tagName":123,"properties":2461,"children":2462,"position":2469},{},[2463],{"type":26,"value":2464,"position":2465},"Ema",{"start":2466,"end":2467},{"line":23,"column":103,"offset":2459},{"line":23,"column":257,"offset":2468},7310,{"start":2470,"end":2471},{"line":23,"column":103,"offset":2459},{"line":23,"column":257,"offset":2468},{"type":26,"value":302,"position":2473},{"start":2474,"end":2475},{"line":23,"column":257,"offset":2468},{"line":23,"column":198,"offset":2476},7312,{"type":30,"tagName":123,"properties":2478,"children":2479,"position":2486},{},[2480],{"type":26,"value":2481,"position":2482},"Rsi",{"start":2483,"end":2484},{"line":23,"column":198,"offset":2476},{"line":23,"column":483,"offset":2485},7317,{"start":2487,"end":2488},{"line":23,"column":198,"offset":2476},{"line":23,"column":483,"offset":2485},{"type":26,"value":302,"position":2490},{"start":2491,"end":2492},{"line":23,"column":483,"offset":2485},{"line":23,"column":1929,"offset":2493},7319,{"type":30,"tagName":123,"properties":2495,"children":2496,"position":2503},{},[2497],{"type":26,"value":2498,"position":2499},"Cross",{"start":2500,"end":2501},{"line":23,"column":1929,"offset":2493},{"line":23,"column":215,"offset":2502},7326,{"start":2504,"end":2505},{"line":23,"column":1929,"offset":2493},{"line":23,"column":215,"offset":2502},{"type":26,"value":2507,"position":2508},", and the rest of the kScript\ncatalog) comes from ",{"start":2509,"end":2510},{"line":23,"column":215,"offset":2502},{"line":2511,"column":116,"offset":2512},142,7376,{"type":30,"tagName":123,"properties":2514,"children":2515,"position":2522},{},[2516],{"type":26,"value":2517,"position":2518},"./sdk/ta",{"start":2519,"end":2520},{"line":2511,"column":116,"offset":2512},{"line":2511,"column":198,"offset":2521},7386,{"start":2523,"end":2524},{"line":2511,"column":116,"offset":2512},{"line":2511,"column":198,"offset":2521},{"type":26,"value":2526,"position":2527},": construct them in ",{"start":2528,"end":2529},{"line":2511,"column":198,"offset":2521},{"line":2511,"column":294,"offset":2530},7406,{"type":30,"tagName":123,"properties":2532,"children":2533,"position":2539},{},[2534],{"type":26,"value":716,"position":2535},{"start":2536,"end":2537},{"line":2511,"column":294,"offset":2530},{"line":2511,"column":480,"offset":2538},7414,{"start":2540,"end":2541},{"line":2511,"column":294,"offset":2530},{"line":2511,"column":480,"offset":2538},{"type":26,"value":2543,"position":2544},", feed them one value per bar with\n",{"start":2545,"end":2546},{"line":2511,"column":480,"offset":2538},{"line":2547,"column":20,"offset":2548},143,7449,{"type":30,"tagName":123,"properties":2550,"children":2551,"position":2558},{},[2552],{"type":26,"value":2553,"position":2554},".update()",{"start":2555,"end":2556},{"line":2547,"column":20,"offset":2548},{"line":2547,"column":670,"offset":2557},7460,{"start":2559,"end":2560},{"line":2547,"column":20,"offset":2548},{"line":2547,"column":670,"offset":2557},{"type":26,"value":2562,"position":2563},", and they return ",{"start":2564,"end":2565},{"line":2547,"column":670,"offset":2557},{"line":2547,"column":330,"offset":2566},7478,{"type":30,"tagName":123,"properties":2568,"children":2569,"position":2576},{},[2570],{"type":26,"value":2571,"position":2572},"NaN",{"start":2573,"end":2574},{"line":2547,"column":330,"offset":2566},{"line":2547,"column":471,"offset":2575},7483,{"start":2577,"end":2578},{"line":2547,"column":330,"offset":2566},{"line":2547,"column":471,"offset":2575},{"type":26,"value":2580,"position":2581}," until their window is full. Returning ",{"start":2582,"end":2583},{"line":2547,"column":471,"offset":2575},{"line":2547,"column":738,"offset":2584},7522,{"type":30,"tagName":123,"properties":2586,"children":2587,"position":2594},{},[2588],{"type":26,"value":884,"position":2589},{"start":2590,"end":2591},{"line":2547,"column":738,"offset":2584},{"line":2547,"column":2592,"offset":2593},77,7525,{"start":2595,"end":2596},{"line":2547,"column":738,"offset":2584},{"line":2547,"column":2592,"offset":2593},{"type":26,"value":2598,"position":2599},"\nfrom ",{"start":2600,"end":2601},{"line":2547,"column":2592,"offset":2593},{"line":2602,"column":90,"offset":2603},144,7531,{"type":30,"tagName":123,"properties":2605,"children":2606,"position":2612},{},[2607],{"type":26,"value":734,"position":2608},{"start":2609,"end":2610},{"line":2602,"column":90,"offset":2603},{"line":2602,"column":120,"offset":2611},7540,{"start":2613,"end":2614},{"line":2602,"column":90,"offset":2603},{"line":2602,"column":120,"offset":2611},{"type":26,"value":2616,"position":2617}," on those bars is what keeps the line empty there instead of\ndrawing garbage (",{"start":2618,"end":2619},{"line":2602,"column":120,"offset":2611},{"line":2620,"column":41,"offset":2621},145,7618,{"type":30,"tagName":123,"properties":2623,"children":2624,"position":2631},{},[2625],{"type":26,"value":2626,"position":2627},"core-concepts/execution-model.md",{"start":2628,"end":2629},{"line":2620,"column":41,"offset":2621},{"line":2620,"column":631,"offset":2630},7652,{"start":2632,"end":2633},{"line":2620,"column":41,"offset":2621},{"line":2620,"column":631,"offset":2630},{"type":26,"value":156,"position":2635},{"start":2636,"end":2637},{"line":2620,"column":631,"offset":2630},{"line":2620,"column":667,"offset":2638},7654,{"start":2640,"end":2641},{"line":23,"column":20,"offset":2440},{"line":2620,"column":667,"offset":2638},{"type":26,"value":27},{"type":30,"tagName":48,"properties":2644,"children":2646,"position":2655},{"id":2645},"step-2-run",[2647],{"type":26,"value":2648,"position":2649},"Step 2: Run",{"start":2650,"end":2653},{"line":2651,"column":57,"offset":2652},147,7659,{"line":2651,"column":120,"offset":2654},7670,{"start":2656,"end":2658},{"line":2651,"column":20,"offset":2657},7656,{"line":2651,"column":120,"offset":2654},{"type":26,"value":27},{"type":30,"tagName":31,"properties":2661,"children":2662,"position":2710},{},[2663,2671,2684,2691,2703],{"type":26,"value":2664,"position":2665},"Press ",{"start":2666,"end":2669},{"line":2667,"column":20,"offset":2668},149,7672,{"line":2667,"column":484,"offset":2670},7678,{"type":30,"tagName":80,"properties":2672,"children":2673,"position":2680},{},[2674],{"type":26,"value":84,"position":2675},{"start":2676,"end":2678},{"line":2667,"column":40,"offset":2677},7680,{"line":2667,"column":670,"offset":2679},7683,{"start":2681,"end":2682},{"line":2667,"column":484,"offset":2670},{"line":2667,"column":77,"offset":2683},7685,{"type":26,"value":2685,"position":2686},". The editor compiles the file in your browser (the same\ncompiler version the CLI uses, so the bytes match) and mounts the draft on\nthe chart as an overlay. Errors show as squiggles under the offending\ncharacters and as rows in the Problems lane; fix them and Run again. The\nbuild has a few stages, so a message may come from the declaration\nextractor, the sheet validator, or the compiler; ",{"start":2687,"end":2688},{"line":2667,"column":77,"offset":2683},{"line":2689,"column":392,"offset":2690},154,8076,{"type":30,"tagName":123,"properties":2692,"children":2693,"position":2700},{},[2694],{"type":26,"value":2695,"position":2696},"faq/common-errors.md",{"start":2697,"end":2698},{"line":2689,"column":392,"offset":2690},{"line":2689,"column":2229,"offset":2699},8098,{"start":2701,"end":2702},{"line":2689,"column":392,"offset":2690},{"line":2689,"column":2229,"offset":2699},{"type":26,"value":2704,"position":2705},"\nlists the ones you will meet.",{"start":2706,"end":2707},{"line":2689,"column":2229,"offset":2699},{"line":2708,"column":330,"offset":2709},155,8128,{"start":2711,"end":2712},{"line":2667,"column":20,"offset":2668},{"line":2708,"column":330,"offset":2709},{"type":26,"value":27},{"type":30,"tagName":31,"properties":2715,"children":2716,"position":2725},{},[2717],{"type":26,"value":2718,"position":2719},"Indicators run in your browser: every input reads the chart's own market\nand interval, the forming bar re-evaluates on every tick, and nothing is\nsent anywhere to compute.",{"start":2720,"end":2722},{"line":38,"column":20,"offset":2721},8130,{"line":2723,"column":271,"offset":2724},159,8301,{"start":2726,"end":2727},{"line":38,"column":20,"offset":2721},{"line":2723,"column":271,"offset":2724},{"type":26,"value":27},{"type":30,"tagName":48,"properties":2730,"children":2732,"position":2741},{"id":2731},"what-youll-see",[2733],{"type":26,"value":2734,"position":2735},"What you'll see",{"start":2736,"end":2739},{"line":2737,"column":57,"offset":2738},161,8306,{"line":2737,"column":102,"offset":2740},8321,{"start":2742,"end":2744},{"line":2737,"column":20,"offset":2743},8303,{"line":2737,"column":102,"offset":2740},{"type":26,"value":27},{"type":30,"tagName":31,"properties":2747,"children":2748,"position":2793},{},[2749,2758,2769,2775,2786],{"type":26,"value":2750,"position":2751},"A line tracing the 20-bar average of the close, sitting right on the price\nchart. The first nineteen bars of loaded history are empty: the window is\nnot full yet, ",{"start":2752,"end":2755},{"line":2753,"column":20,"offset":2754},163,8323,{"line":2756,"column":120,"offset":2757},165,8486,{"type":30,"tagName":123,"properties":2759,"children":2760,"position":2766},{},[2761],{"type":26,"value":734,"position":2762},{"start":2763,"end":2764},{"line":2756,"column":120,"offset":2757},{"line":2756,"column":103,"offset":2765},8495,{"start":2767,"end":2768},{"line":2756,"column":120,"offset":2757},{"line":2756,"column":103,"offset":2765},{"type":26,"value":2770,"position":2771}," returned ",{"start":2772,"end":2773},{"line":2756,"column":103,"offset":2765},{"line":2756,"column":445,"offset":2774},8505,{"type":30,"tagName":123,"properties":2776,"children":2777,"position":2783},{},[2778],{"type":26,"value":884,"position":2779},{"start":2780,"end":2781},{"line":2756,"column":445,"offset":2774},{"line":2756,"column":495,"offset":2782},8508,{"start":2784,"end":2785},{"line":2756,"column":445,"offset":2774},{"line":2756,"column":495,"offset":2782},{"type":26,"value":2787,"position":2788},", and the chart drew nothing. From the\ntwentieth bar on the line follows price, smoothed. It is not a fancy\nindicator, but it proves the whole pipeline works: your code received real\nbars, computed a number for each, and the chart drew them. That is the\nfoundation for everything else.",{"start":2789,"end":2790},{"line":2756,"column":495,"offset":2782},{"line":2791,"column":407,"offset":2792},169,8793,{"start":2794,"end":2795},{"line":2753,"column":20,"offset":2754},{"line":2791,"column":407,"offset":2792},{"type":26,"value":27},{"type":30,"tagName":48,"properties":2798,"children":2800,"position":2809},{"id":2799},"one-small-thing-to-notice",[2801],{"type":26,"value":2802,"position":2803},"One small thing to notice",{"start":2804,"end":2807},{"line":2805,"column":57,"offset":2806},171,8798,{"line":2805,"column":257,"offset":2808},8823,{"start":2810,"end":2812},{"line":2805,"column":20,"offset":2811},8795,{"line":2805,"column":257,"offset":2808},{"type":26,"value":27},{"type":30,"tagName":31,"properties":2815,"children":2816,"position":2937},{},[2817,2825,2836,2842,2853,2859,2874,2881,2892,2900,2911,2918,2930],{"type":26,"value":2818,"position":2819},"Look at the ",{"start":2820,"end":2823},{"line":2821,"column":20,"offset":2822},173,8825,{"line":2821,"column":74,"offset":2824},8837,{"type":30,"tagName":123,"properties":2826,"children":2827,"position":2833},{},[2828],{"type":26,"value":1237,"position":2829},{"start":2830,"end":2831},{"line":2821,"column":74,"offset":2824},{"line":2821,"column":116,"offset":2832},8845,{"start":2834,"end":2835},{"line":2821,"column":74,"offset":2824},{"line":2821,"column":116,"offset":2832},{"type":26,"value":2837,"position":2838}," line again: ",{"start":2839,"end":2840},{"line":2821,"column":116,"offset":2832},{"line":2821,"column":445,"offset":2841},8858,{"type":30,"tagName":123,"properties":2843,"children":2844,"position":2850},{},[2845],{"type":26,"value":1808,"position":2846},{"start":2847,"end":2848},{"line":2821,"column":445,"offset":2841},{"line":2821,"column":353,"offset":2849},8888,{"start":2851,"end":2852},{"line":2821,"column":445,"offset":2841},{"line":2821,"column":353,"offset":2849},{"type":26,"value":2854,"position":2855},". ",{"start":2856,"end":2857},{"line":2821,"column":353,"offset":2849},{"line":2821,"column":318,"offset":2858},8890,{"type":30,"tagName":80,"properties":2860,"children":2861,"position":2870},{},[2862],{"type":26,"value":2863,"position":2864},"Every\noutput needs a name",{"start":2865,"end":2867},{"line":2821,"column":323,"offset":2866},8892,{"line":2868,"column":1890,"offset":2869},174,8917,{"start":2871,"end":2872},{"line":2821,"column":318,"offset":2858},{"line":2868,"column":1833,"offset":2873},8919,{"type":26,"value":2875,"position":2876},", and the name does three jobs at once. It is the\nlegend entry on the chart, it is the writer you call in ",{"start":2877,"end":2878},{"line":2868,"column":1833,"offset":2873},{"line":2879,"column":315,"offset":2880},175,9025,{"type":30,"tagName":123,"properties":2882,"children":2883,"position":2889},{},[2884],{"type":26,"value":753,"position":2885},{"start":2886,"end":2887},{"line":2879,"column":315,"offset":2880},{"line":2879,"column":1861,"offset":2888},9037,{"start":2890,"end":2891},{"line":2879,"column":315,"offset":2880},{"line":2879,"column":1861,"offset":2888},{"type":26,"value":2893,"position":2894},"\n(",{"start":2895,"end":2896},{"line":2879,"column":1861,"offset":2888},{"line":2897,"column":2898,"offset":2899},176,2,9039,{"type":30,"tagName":123,"properties":2901,"children":2902,"position":2908},{},[2903],{"type":26,"value":1608,"position":2904},{"start":2905,"end":2906},{"line":2897,"column":2898,"offset":2899},{"line":2897,"column":56,"offset":2907},9048,{"start":2909,"end":2910},{"line":2897,"column":2898,"offset":2899},{"line":2897,"column":56,"offset":2907},{"type":26,"value":2912,"position":2913},"), and once the Indicator is published and installed it is the\ntail of a metric id (",{"start":2914,"end":2915},{"line":2897,"column":56,"offset":2907},{"line":2916,"column":1833,"offset":2917},177,9132,{"type":30,"tagName":123,"properties":2919,"children":2920,"position":2927},{},[2921],{"type":26,"value":2922,"position":2923},"wrun/@you/my-sma/sma",{"start":2924,"end":2925},{"line":2916,"column":1833,"offset":2917},{"line":2916,"column":150,"offset":2926},9154,{"start":2928,"end":2929},{"line":2916,"column":1833,"offset":2917},{"line":2916,"column":150,"offset":2926},{"type":26,"value":2931,"position":2932},") that an alert, a screen, or\na backtest can read. Names are unique per Indicator and lowercase with\nunderscores; pick clear ones from the start.",{"start":2933,"end":2934},{"line":2916,"column":150,"offset":2926},{"line":2935,"column":215,"offset":2936},179,9299,{"start":2938,"end":2939},{"line":2821,"column":20,"offset":2822},{"line":2935,"column":215,"offset":2936},{"type":26,"value":27},{"type":30,"tagName":31,"properties":2942,"children":2943,"position":2953},{},[2944],{"type":26,"value":2945,"position":2946},"That's it. You have a running Indicator. If your line showed up, the hard\npart is over. Everything from here is doing more interesting things with\nthe same three pieces.",{"start":2947,"end":2950},{"line":2948,"column":20,"offset":2949},181,9301,{"line":2951,"column":119,"offset":2952},183,9470,{"start":2954,"end":2955},{"line":2948,"column":20,"offset":2949},{"line":2951,"column":119,"offset":2952},{"type":26,"value":27},{"type":30,"tagName":48,"properties":2958,"children":2960,"position":2969},{"id":2959},"next",[2961],{"type":26,"value":2962,"position":2963},"Next",{"start":2964,"end":2967},{"line":2965,"column":57,"offset":2966},185,9475,{"line":2965,"column":95,"offset":2968},9479,{"start":2970,"end":2972},{"line":2965,"column":20,"offset":2971},9472,{"line":2965,"column":95,"offset":2968},{"type":26,"value":27},{"type":30,"tagName":31,"properties":2975,"children":2976,"position":2986},{},[2977],{"type":26,"value":2978,"position":2979},"Now let's turn this into something you would actually use. On the next\npage we build a real indicator step by step: a moving-average crossover\nsignal with a mark on every cross.",{"start":2980,"end":2983},{"line":2981,"column":20,"offset":2982},187,9481,{"line":2984,"column":471,"offset":2985},189,9658,{"start":2987,"end":2988},{"line":2981,"column":20,"offset":2982},{"line":2984,"column":471,"offset":2985},{"type":26,"value":27},{"type":30,"tagName":31,"properties":2991,"children":2992,"position":3011},{},[2993],{"type":30,"tagName":2994,"properties":2995,"children":2997,"position":3006},"a",{"href":2996},"primer-first-indicator.md",[2998],{"type":26,"value":2999,"position":3000},"Build your first Indicator",{"start":3001,"end":3004},{"line":3002,"column":2898,"offset":3003},191,9661,{"line":3002,"column":140,"offset":3005},9687,{"start":3007,"end":3009},{"line":3002,"column":20,"offset":3008},9660,{"line":3002,"column":448,"offset":3010},9715,{"start":3012,"end":3013},{"line":3002,"column":20,"offset":3008},{"line":3002,"column":448,"offset":3010},{"quirksMode":3015},false,{"start":3017,"end":3018},{"line":20,"column":20,"offset":21},{"line":3019,"column":20,"offset":3020},192,9716,1790157127165]