[{"data":1,"prerenderedAt":3418},["ShallowReactive",2],{"wrun-open-editor-url":3,"indicators:core-concepts/user-functions":4},"https://openmarket.xyz/chart/#wrun-open=v1",{"slug":5,"filePath":6,"frontmatter":7,"rawMarkdown":12,"tree":13},"core-concepts/user-functions","core-concepts/user-functions.md",{"title":8,"description":9,"order":10,"section":11},"User-defined functions","Create custom, reusable functions with the function keyword: typed parameters, a typed return, default values, functions as values, and the rules that keep…",20,"core-concepts","---\ntitle: \"User-defined functions\"\ndescription: \"Create custom, reusable functions with the function keyword: typed parameters, a typed return, default values, functions as values, and the rules that keep…\"\norder: 20\nsection: \"core-concepts\"\n---\n\n\u003C!-- source: docs/indicators/core-concepts/user-functions.md; generated by packages/cli/scripts/gen-indicator-docs.ts, do not edit -->\n\n# User-defined functions\n\nCreate custom, reusable functions with the `function` keyword: typed\nparameters, a typed return, default values, functions as values, and the\nrules that keep them honest in a per-bar module. A wrun indicator's\nfunctions are plain TypeScript syntax, with every type written out and\nmodule-level state in place of closures.\n\n## Overview\n\n| Feature | Description |\n| --- | --- |\n| `function` | The keyword; declares a named function with typed parameters and return |\n| Any logic | Encapsulate a calculation, a predicate, a candle pattern, a session test |\n| Module state | Functions read and write module-level variables; that is how state reaches them |\n| Values | A non-capturing function is a value you can store and pass |\n\n## Function declaration\n\n### Basic syntax\n\n```text\nfunction functionName(parameter1: f64, parameter2: f64): f64 {\n  // body\n  return result;\n}\n```\n\nEvery parameter carries a type and the return type is written after the\nparameter list. Leaving the return type off is a parse error (`Type\nexpected.`), so annotate even `void`.\n\n### Calling\n\nCalls are positional, in the declared order. There are no keyword\narguments; readable names and a stable order do the same job, and a\nfunction with many settings takes a class instance instead of a long\nargument list. Parameters may carry defaults:\n\n```text\nfunction calculate(base: f64, multiplier: f64, offset: f64 = 0.0): f64 {\n  return base * multiplier + offset;\n}\n\nconst a = calculate(10.0, 2.0, 5.0);   // 25\nconst b = calculate(10.0, 2.0);        // 20, offset defaulted\n```\n\n### Syntax details\n\n**Function name:** standard identifier rules (letters, digits,\nunderscore; not starting with a digit). The two names `onStart` and\n`onBar` are the hooks the build calls; everything else is yours, and\nnothing needs an `export`.\n\n**Parameters:** typed, positional, optionally defaulted. A parameter is an\n`f64` for a price or a value, an `i32` for a count, a `StaticArray\u003Cf64>`\nfor a window, a class for a struct, or a function type for a callback.\n\n**Return statement:** every path returns a value of the declared type\n(`void` returns nothing). The compiler refuses a missing return.\n\n## Function examples\n\n### Safe division\n\n```text\nfunction safeDiv(a: f64, b: f64): f64 {\n  return b == 0.0 ? 0.0 : a / b;\n}\n\nconst ratio = safeDiv(10.0, 2.0);   // 5\nconst safe = safeDiv(10.0, 0.0);    // 0\n```\n\n### Average of two values\n\n```text\nfunction average(a: f64, b: f64): f64 {\n  return (a + b) / 2.0;\n}\n\nconst mid = average(close, prevClose);\n```\n\n### Custom pattern logic\n\nA candle-pattern test takes this bar's and the previous bar's open and\nclose. An indicator remembers the previous bar's values in module-level\nvariables that `onBar()` updates on every bar:\n\n```typescript sample=cc-functions-engulfing\ninput(\"open\", ohlcv.open);\ninput(\"close\", ohlcv.close);\ninput(\"low\", ohlcv.low);\noutput(\"engulfing\", shape, overlay, { color: \"#16a34a\", shape_where: \"is_engulfing\", description: \"Bullish engulfing candle\" });\noutput(\"is_engulfing\", none);\noutput(\"body_ratio\", line, lower, { color: \"#94a3b8\", description: \"This body divided by the previous body\" });\n\nfunction safeDiv(a: f64, b: f64): f64 {\n  return b == 0.0 ? 0.0 : a / b;\n}\n\nfunction isGreenCandle(openPrice: f64, closePrice: f64): bool {\n  return closePrice > openPrice;\n}\n\nfunction isBullishEngulfing(prevOpen: f64, prevClose: f64, currOpen: f64, currClose: f64): bool {\n  const prevWasRed = prevClose \u003C prevOpen;\n  const currIsGreen = isGreenCandle(currOpen, currClose);\n  const engulfs = currOpen \u003C prevClose && currClose > prevOpen;\n  return prevWasRed && currIsGreen && engulfs;\n}\n\nlet prevOpen: f64 = NaN;\nlet prevClose: f64 = NaN;\n\nfunction onBar(): void {\n  const open = bar.open();\n  const close = bar.close();\n  const ready = !isNaN(prevOpen);\n  const engulfing = ready && isBullishEngulfing(prevOpen, prevClose, open, close);\n  const bodyRatio = ready ? safeDiv(Math.abs(close - open), Math.abs(prevClose - prevOpen)) : NaN;\n  prevOpen = open;\n  prevClose = close;\n  if (!ready) return;\n  out_engulfing(bar.low()); // the mark sits under the candle\n  out_is_engulfing(engulfing ? 1.0 : 0.0);\n  out_body_ratio(bodyRatio);\n}\n```\n\nThe three helpers are pure: they take numbers and return a number or a\n`bool`, and `onBar()` supplies the remembered previous bar. That keeps the\npattern testable in isolation and the per-bar function short.\n\n## Functions as values\n\nA function that captures no local variable is a value. Store it in a\nvariable typed with its signature, pass it to a loop, keep a small table of\nthem:\n\n```text\nfunction aboveMean(x: f64): bool { return x > mean; }   // mean is module-level\n\nlet pred: (x: f64) => bool = aboveMean;\nconst hits = countWhere(window, n, pred);\n```\n\nArrow functions work the same way, and nested functions (declared inside\nanother function) are allowed as long as they read nothing from the\nenclosing function's locals. The full treatment, with the loop that takes\na predicate, is `lambdas-and-reducers.md`.\n\n## Constraints and rules\n\n### No declarations inside functions\n\n`param(...)`, `input(...)`, `output(...)`, `box(...)`, and the rest are\ntop-level statements of the file; the build reads them without running the\ncode. One inside a function is a named build error:\n\n```text\noutput(...) declarations must be top-level statements, not inside a function, class, or expression\n```\n\nPass an input's value in as an argument instead:\n\n```text\n// Invalid\nfunction bad(): f64 {\n  input(\"close\", ohlcv.close);   // a declaration cannot live here\n  return 0.0;\n}\n\n// Valid: declare at the top level, pass the value\nfunction good(close: f64, avg: f64): f64 {\n  return close - avg;\n}\n```\n\n### No locals from the outside\n\nA function reads its parameters and module-level state. An inner function\nor arrow that reads a local of the function around it is refused with\n`AS100: Not implemented: Closures`. Move the value to module scope or pass\nit as a parameter.\n\n### Allocation is once, not per call\n\nA function called in `onBar()` runs on every bar. A `new` inside it (a\nclass, an array, a string built with `+`) allocates memory the module never\nfrees. Helpers on the per-bar path take and return numbers, or write into\nbuffers allocated at module scope.\n\n### Types everywhere\n\nParameter types and the return type are required; there is no inference\nfrom usage. A function meant for both a price and a count is written for\n`f64`, and the caller casts (`f64(count)`).\n\n### Phase rules still apply inside functions\n\n`p_\u003Cparam>()` reads its value from `onStart()` on (at module start it\nreturns `NaN`), `in_\u003Cinput>()` and `bar.*()` from `onBar()` on (`NaN`\nbefore the first bar), and an `out_\u003Coutput>()` write reaches the row only\nfrom `onBar()`; a helper inherits the phase of its caller, so keep helpers\npure and let the hooks read and write.\n\n## Best practices\n\n- **Keep functions focused.** One thing per function: `rsiZone(rsiValue:\n  f64): f64` returns `0`, `1`, or `2`; the output write stays in\n  `onBar()`.\n- **Use descriptive names.** `isOverbought(rsiValue)`,\n  `percentChange(oldValue, newValue)`; not `calc(a, b)` or `check(x)`.\n- **Prefer parameters to module state for pure math.** A function that\n  takes everything it needs is reusable across indicators by pasting; a\n  function that reaches into module state is tied to this file. Reserve\n  module-state reads for predicates you pass as values.\n- **Turn a family of helpers into a class** when they share state: a\n  `Window` with `sum()`, `avg()`, and `median()` (`collections.md`), a\n  `Macd` with `update()` (`named-streams.md`). Helpers that share nothing\n  stay functions.\n",{"type":14,"children":15,"data":3411,"position":3413},"root",[16,26,29,30,69,70,88,90,307,308,322,323,339,340,391,392,447,448,463,464,479,480,541,542,558,559,646,647,736,737,784,785,800,801,816,817,877,878,893,894,945,946,962,963,997,998,2156,2157,2208,2209,2225,2226,2241,2242,2285,2286,2320,2321,2336,2337,2352,2353,2433,2434,2451,2452,2467,2468,2563,2564,2579,2580,2614,2615,2630,2631,2700,2701,2716,2717,2768,2769,2785,2786,2958,2959,2974,2975],{"type":17,"value":18,"position":19},"comment"," source: docs/indicators/core-concepts/user-functions.md; generated by packages/cli/scripts/gen-indicator-docs.ts, do not edit ",{"start":20,"end":23},{"line":21,"column":21,"offset":22},1,0,{"line":21,"column":24,"offset":25},135,134,{"type":27,"value":28},"text","\n",{"type":27,"value":28},{"type":31,"tagName":32,"properties":33,"children":34,"position":66},"element","p",{},[35,44,58],{"type":27,"value":36,"position":37},"Create custom, reusable functions with the ",{"start":38,"end":41},{"line":39,"column":21,"offset":40},5,162,{"line":39,"column":42,"offset":43},44,205,{"type":31,"tagName":45,"properties":46,"children":47,"position":55},"code",{},[48],{"type":27,"value":49,"position":50},"function",{"start":51,"end":52},{"line":39,"column":42,"offset":43},{"line":39,"column":53,"offset":54},54,215,{"start":56,"end":57},{"line":39,"column":42,"offset":43},{"line":39,"column":53,"offset":54},{"type":27,"value":59,"position":60}," keyword: typed\nparameters, a typed return, default values, functions as values, and the\nrules that keep them honest in a per-bar module. A wrun indicator's\nfunctions are plain TypeScript syntax, with every type written out and\nmodule-level state in place of closures.",{"start":61,"end":62},{"line":39,"column":53,"offset":54},{"line":63,"column":64,"offset":65},9,41,483,{"start":67,"end":68},{"line":39,"column":21,"offset":40},{"line":63,"column":64,"offset":65},{"type":27,"value":28},{"type":31,"tagName":71,"properties":72,"children":73,"position":84},"h2",{},[74],{"type":27,"value":75,"position":76},"Overview",{"start":77,"end":81},{"line":78,"column":79,"offset":80},11,4,488,{"line":78,"column":82,"offset":83},12,496,{"start":85,"end":87},{"line":78,"column":21,"offset":86},485,{"line":78,"column":82,"offset":83},{"type":27,"value":89},"\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":31,"tagName":91,"properties":92,"children":93,"position":304},"table",{},[94,143],{"type":31,"tagName":95,"properties":96,"children":97,"position":140},"thead",{},[98],{"type":31,"tagName":99,"properties":100,"children":101,"position":137},"tr",{},[102,121],{"type":31,"tagName":103,"properties":104,"children":105,"position":116},"th",{},[106],{"type":27,"value":107,"position":108},"Feature",{"start":109,"end":113},{"line":110,"column":111,"offset":112},13,3,500,{"line":110,"column":114,"offset":115},10,507,{"start":117,"end":119},{"line":110,"column":21,"offset":118},498,{"line":110,"column":78,"offset":120},508,{"type":31,"tagName":103,"properties":122,"children":123,"position":132},{},[124],{"type":27,"value":125,"position":126},"Description",{"start":127,"end":129},{"line":110,"column":110,"offset":128},510,{"line":110,"column":130,"offset":131},24,521,{"start":133,"end":134},{"line":110,"column":78,"offset":120},{"line":110,"column":135,"offset":136},26,523,{"start":138,"end":139},{"line":110,"column":21,"offset":118},{"line":110,"column":135,"offset":136},{"start":141,"end":142},{"line":110,"column":21,"offset":118},{"line":110,"column":135,"offset":136},{"type":31,"tagName":144,"properties":145,"children":146,"position":301},"tbody",{},[147,190,225,264],{"type":31,"tagName":99,"properties":148,"children":149,"position":187},{},[150,170],{"type":31,"tagName":151,"properties":152,"children":153,"position":164},"td",{},[154],{"type":31,"tagName":45,"properties":155,"children":156,"position":158},{},[157],{"type":27,"value":49},{"start":159,"end":162},{"line":160,"column":111,"offset":161},15,540,{"line":160,"column":110,"offset":163},550,{"start":165,"end":167},{"line":160,"column":21,"offset":166},538,{"line":160,"column":168,"offset":169},14,551,{"type":31,"tagName":151,"properties":171,"children":172,"position":182},{},[173],{"type":27,"value":174,"position":175},"The keyword; declares a named function with typed parameters and return",{"start":176,"end":179},{"line":160,"column":177,"offset":178},16,553,{"line":160,"column":180,"offset":181},87,624,{"start":183,"end":184},{"line":160,"column":168,"offset":169},{"line":160,"column":185,"offset":186},89,626,{"start":188,"end":189},{"line":160,"column":21,"offset":166},{"line":160,"column":185,"offset":186},{"type":31,"tagName":99,"properties":191,"children":192,"position":222},{},[193,208],{"type":31,"tagName":151,"properties":194,"children":195,"position":203},{},[196],{"type":27,"value":197,"position":198},"Any logic",{"start":199,"end":201},{"line":177,"column":111,"offset":200},629,{"line":177,"column":82,"offset":202},638,{"start":204,"end":206},{"line":177,"column":21,"offset":205},627,{"line":177,"column":110,"offset":207},639,{"type":31,"tagName":151,"properties":209,"children":210,"position":218},{},[211],{"type":27,"value":212,"position":213},"Encapsulate a calculation, a predicate, a candle pattern, a session test",{"start":214,"end":216},{"line":177,"column":160,"offset":215},641,{"line":177,"column":180,"offset":217},713,{"start":219,"end":220},{"line":177,"column":110,"offset":207},{"line":177,"column":185,"offset":221},715,{"start":223,"end":224},{"line":177,"column":21,"offset":205},{"line":177,"column":185,"offset":221},{"type":31,"tagName":99,"properties":226,"children":227,"position":261},{},[228,244],{"type":31,"tagName":151,"properties":229,"children":230,"position":239},{},[231],{"type":27,"value":232,"position":233},"Module state",{"start":234,"end":237},{"line":235,"column":111,"offset":236},17,718,{"line":235,"column":160,"offset":238},730,{"start":240,"end":242},{"line":235,"column":21,"offset":241},716,{"line":235,"column":177,"offset":243},731,{"type":31,"tagName":151,"properties":245,"children":246,"position":256},{},[247],{"type":27,"value":248,"position":249},"Functions read and write module-level variables; that is how state reaches them",{"start":250,"end":253},{"line":235,"column":251,"offset":252},18,733,{"line":235,"column":254,"offset":255},97,812,{"start":257,"end":258},{"line":235,"column":177,"offset":243},{"line":235,"column":259,"offset":260},99,814,{"start":262,"end":263},{"line":235,"column":21,"offset":241},{"line":235,"column":259,"offset":260},{"type":31,"tagName":99,"properties":265,"children":266,"position":298},{},[267,282],{"type":31,"tagName":151,"properties":268,"children":269,"position":277},{},[270],{"type":27,"value":271,"position":272},"Values",{"start":273,"end":275},{"line":251,"column":111,"offset":274},817,{"line":251,"column":63,"offset":276},823,{"start":278,"end":280},{"line":251,"column":21,"offset":279},815,{"line":251,"column":114,"offset":281},824,{"type":31,"tagName":151,"properties":283,"children":284,"position":293},{},[285],{"type":27,"value":286,"position":287},"A non-capturing function is a value you can store and pass",{"start":288,"end":290},{"line":251,"column":82,"offset":289},826,{"line":251,"column":291,"offset":292},70,884,{"start":294,"end":295},{"line":251,"column":114,"offset":281},{"line":251,"column":296,"offset":297},72,886,{"start":299,"end":300},{"line":251,"column":21,"offset":279},{"line":251,"column":296,"offset":297},{"start":302,"end":303},{"line":160,"column":21,"offset":166},{"line":251,"column":296,"offset":297},{"start":305,"end":306},{"line":110,"column":21,"offset":118},{"line":251,"column":296,"offset":297},{"type":27,"value":28},{"type":31,"tagName":71,"properties":309,"children":310,"position":318},{},[311],{"type":27,"value":312,"position":313},"Function declaration",{"start":314,"end":316},{"line":10,"column":79,"offset":315},891,{"line":10,"column":130,"offset":317},911,{"start":319,"end":321},{"line":10,"column":21,"offset":320},888,{"line":10,"column":130,"offset":317},{"type":27,"value":28},{"type":31,"tagName":324,"properties":325,"children":326,"position":335},"h3",{},[327],{"type":27,"value":328,"position":329},"Basic syntax",{"start":330,"end":333},{"line":331,"column":39,"offset":332},22,917,{"line":331,"column":235,"offset":334},929,{"start":336,"end":338},{"line":331,"column":21,"offset":337},913,{"line":331,"column":235,"offset":334},{"type":27,"value":28},{"type":14,"children":341},[342],{"type":31,"tagName":343,"properties":344,"children":348,"data":-1},"pre",{"class":345,"style":346,"tabindex":347},"shiki shiki-themes github-dark github-light","--shiki-dark:#e1e4e8;--shiki-light:#24292e;--shiki-dark-bg:#24292e;--shiki-light-bg:#fff","0",[349],{"type":31,"tagName":45,"properties":350,"children":353},{"class":351},[352],"language-text",[354,364,365,373,374,382,383],{"type":31,"tagName":355,"properties":356,"children":358},"span",{"class":357},"line",[359],{"type":31,"tagName":355,"properties":360,"children":361},{},[362],{"type":27,"value":363},"function functionName(parameter1: f64, parameter2: f64): f64 {",{"type":27,"value":28},{"type":31,"tagName":355,"properties":366,"children":367},{"class":357},[368],{"type":31,"tagName":355,"properties":369,"children":370},{},[371],{"type":27,"value":372},"  // body",{"type":27,"value":28},{"type":31,"tagName":355,"properties":375,"children":376},{"class":357},[377],{"type":31,"tagName":355,"properties":378,"children":379},{},[380],{"type":27,"value":381},"  return result;",{"type":27,"value":28},{"type":31,"tagName":355,"properties":384,"children":385},{"class":357},[386],{"type":31,"tagName":355,"properties":387,"children":388},{},[389],{"type":27,"value":390},"}",{"type":27,"value":28},{"type":31,"tagName":32,"properties":393,"children":394,"position":444},{},[395,405,418,424,437],{"type":27,"value":396,"position":397},"Every parameter carries a type and the return type is written after the\nparameter list. Leaving the return type off is a parse error (",{"start":398,"end":401},{"line":399,"column":21,"offset":400},31,1036,{"line":402,"column":403,"offset":404},32,63,1170,{"type":31,"tagName":45,"properties":406,"children":407,"position":415},{},[408],{"type":27,"value":409,"position":410},"Type expected.",{"start":411,"end":412},{"line":402,"column":403,"offset":404},{"line":413,"column":78,"offset":414},33,1186,{"start":416,"end":417},{"line":402,"column":403,"offset":404},{"line":413,"column":78,"offset":414},{"type":27,"value":419,"position":420},"), so annotate even ",{"start":421,"end":422},{"line":413,"column":78,"offset":414},{"line":413,"column":399,"offset":423},1206,{"type":31,"tagName":45,"properties":425,"children":426,"position":434},{},[427],{"type":27,"value":428,"position":429},"void",{"start":430,"end":431},{"line":413,"column":399,"offset":423},{"line":413,"column":432,"offset":433},37,1212,{"start":435,"end":436},{"line":413,"column":399,"offset":423},{"line":413,"column":432,"offset":433},{"type":27,"value":438,"position":439},".",{"start":440,"end":441},{"line":413,"column":432,"offset":433},{"line":413,"column":442,"offset":443},38,1213,{"start":445,"end":446},{"line":399,"column":21,"offset":400},{"line":413,"column":442,"offset":443},{"type":27,"value":28},{"type":31,"tagName":324,"properties":449,"children":450,"position":459},{},[451],{"type":27,"value":452,"position":453},"Calling",{"start":454,"end":457},{"line":455,"column":39,"offset":456},35,1219,{"line":455,"column":82,"offset":458},1226,{"start":460,"end":462},{"line":455,"column":21,"offset":461},1215,{"line":455,"column":82,"offset":458},{"type":27,"value":28},{"type":31,"tagName":32,"properties":465,"children":466,"position":476},{},[467],{"type":27,"value":468,"position":469},"Calls are positional, in the declared order. There are no keyword\narguments; readable names and a stable order do the same job, and a\nfunction with many settings takes a class instance instead of a long\nargument list. Parameters may carry defaults:",{"start":470,"end":472},{"line":432,"column":21,"offset":471},1228,{"line":473,"column":474,"offset":475},40,46,1476,{"start":477,"end":478},{"line":432,"column":21,"offset":471},{"line":473,"column":474,"offset":475},{"type":27,"value":28},{"type":14,"children":481},[482],{"type":31,"tagName":343,"properties":483,"children":484,"data":-1},{"class":345,"style":346,"tabindex":347},[485],{"type":31,"tagName":45,"properties":486,"children":488},{"class":487},[352],[489,497,498,506,507,514,515,523,524,532,533],{"type":31,"tagName":355,"properties":490,"children":491},{"class":357},[492],{"type":31,"tagName":355,"properties":493,"children":494},{},[495],{"type":27,"value":496},"function calculate(base: f64, multiplier: f64, offset: f64 = 0.0): f64 {",{"type":27,"value":28},{"type":31,"tagName":355,"properties":499,"children":500},{"class":357},[501],{"type":31,"tagName":355,"properties":502,"children":503},{},[504],{"type":27,"value":505},"  return base * multiplier + offset;",{"type":27,"value":28},{"type":31,"tagName":355,"properties":508,"children":509},{"class":357},[510],{"type":31,"tagName":355,"properties":511,"children":512},{},[513],{"type":27,"value":390},{"type":27,"value":28},{"type":31,"tagName":355,"properties":516,"children":517},{"class":357},[518],{"type":31,"tagName":355,"properties":519,"children":520},{},[521],{"type":27,"value":522},"",{"type":27,"value":28},{"type":31,"tagName":355,"properties":525,"children":526},{"class":357},[527],{"type":31,"tagName":355,"properties":528,"children":529},{},[530],{"type":27,"value":531},"const a = calculate(10.0, 2.0, 5.0);   // 25",{"type":27,"value":28},{"type":31,"tagName":355,"properties":534,"children":535},{"class":357},[536],{"type":31,"tagName":355,"properties":537,"children":538},{},[539],{"type":27,"value":540},"const b = calculate(10.0, 2.0);        // 20, offset defaulted",{"type":27,"value":28},{"type":31,"tagName":324,"properties":543,"children":544,"position":554},{},[545],{"type":27,"value":546,"position":547},"Syntax details",{"start":548,"end":551},{"line":549,"column":39,"offset":550},51,1716,{"line":549,"column":552,"offset":553},19,1730,{"start":555,"end":557},{"line":549,"column":21,"offset":556},1712,{"line":549,"column":552,"offset":553},{"type":27,"value":28},{"type":31,"tagName":32,"properties":560,"children":561,"position":643},{},[562,579,586,599,605,618,625,637],{"type":31,"tagName":563,"properties":564,"children":565,"position":574},"strong",{},[566],{"type":27,"value":567,"position":568},"Function name:",{"start":569,"end":572},{"line":570,"column":111,"offset":571},53,1734,{"line":570,"column":235,"offset":573},1748,{"start":575,"end":577},{"line":570,"column":21,"offset":576},1732,{"line":570,"column":552,"offset":578},1750,{"type":27,"value":580,"position":581}," standard identifier rules (letters, digits,\nunderscore; not starting with a digit). The two names ",{"start":582,"end":583},{"line":570,"column":552,"offset":578},{"line":53,"column":584,"offset":585},55,1849,{"type":31,"tagName":45,"properties":587,"children":588,"position":596},{},[589],{"type":27,"value":590,"position":591},"onStart",{"start":592,"end":593},{"line":53,"column":584,"offset":585},{"line":53,"column":594,"offset":595},64,1858,{"start":597,"end":598},{"line":53,"column":584,"offset":585},{"line":53,"column":594,"offset":595},{"type":27,"value":600,"position":601}," and\n",{"start":602,"end":603},{"line":53,"column":594,"offset":595},{"line":584,"column":21,"offset":604},1863,{"type":31,"tagName":45,"properties":606,"children":607,"position":615},{},[608],{"type":27,"value":609,"position":610},"onBar",{"start":611,"end":612},{"line":584,"column":21,"offset":604},{"line":584,"column":613,"offset":614},8,1870,{"start":616,"end":617},{"line":584,"column":21,"offset":604},{"line":584,"column":613,"offset":614},{"type":27,"value":619,"position":620}," are the hooks the build calls; everything else is yours, and\nnothing needs an ",{"start":621,"end":622},{"line":584,"column":613,"offset":614},{"line":623,"column":251,"offset":624},56,1949,{"type":31,"tagName":45,"properties":626,"children":627,"position":634},{},[628],{"type":27,"value":629,"position":630},"export",{"start":631,"end":632},{"line":623,"column":251,"offset":624},{"line":623,"column":135,"offset":633},1957,{"start":635,"end":636},{"line":623,"column":251,"offset":624},{"line":623,"column":135,"offset":633},{"type":27,"value":438,"position":638},{"start":639,"end":640},{"line":623,"column":135,"offset":633},{"line":623,"column":641,"offset":642},27,1958,{"start":644,"end":645},{"line":570,"column":21,"offset":576},{"line":623,"column":641,"offset":642},{"type":27,"value":28},{"type":31,"tagName":32,"properties":648,"children":649,"position":733},{},[650,666,673,686,693,706,712,725],{"type":31,"tagName":563,"properties":651,"children":652,"position":661},{},[653],{"type":27,"value":654,"position":655},"Parameters:",{"start":656,"end":659},{"line":657,"column":111,"offset":658},58,1962,{"line":657,"column":168,"offset":660},1973,{"start":662,"end":664},{"line":657,"column":21,"offset":663},1960,{"line":657,"column":177,"offset":665},1975,{"type":27,"value":667,"position":668}," typed, positional, optionally defaulted. A parameter is an\n",{"start":669,"end":670},{"line":657,"column":177,"offset":665},{"line":671,"column":21,"offset":672},59,2035,{"type":31,"tagName":45,"properties":674,"children":675,"position":683},{},[676],{"type":27,"value":677,"position":678},"f64",{"start":679,"end":680},{"line":671,"column":21,"offset":672},{"line":671,"column":681,"offset":682},6,2040,{"start":684,"end":685},{"line":671,"column":21,"offset":672},{"line":671,"column":681,"offset":682},{"type":27,"value":687,"position":688}," for a price or a value, an ",{"start":689,"end":690},{"line":671,"column":681,"offset":682},{"line":671,"column":691,"offset":692},34,2068,{"type":31,"tagName":45,"properties":694,"children":695,"position":703},{},[696],{"type":27,"value":697,"position":698},"i32",{"start":699,"end":700},{"line":671,"column":691,"offset":692},{"line":671,"column":701,"offset":702},39,2073,{"start":704,"end":705},{"line":671,"column":691,"offset":692},{"line":671,"column":701,"offset":702},{"type":27,"value":707,"position":708}," for a count, a ",{"start":709,"end":710},{"line":671,"column":701,"offset":702},{"line":671,"column":584,"offset":711},2089,{"type":31,"tagName":45,"properties":713,"children":714,"position":722},{},[715],{"type":27,"value":716,"position":717},"StaticArray\u003Cf64>",{"start":718,"end":719},{"line":671,"column":584,"offset":711},{"line":671,"column":720,"offset":721},73,2107,{"start":723,"end":724},{"line":671,"column":584,"offset":711},{"line":671,"column":720,"offset":721},{"type":27,"value":726,"position":727},"\nfor a window, a class for a struct, or a function type for a callback.",{"start":728,"end":729},{"line":671,"column":720,"offset":721},{"line":730,"column":731,"offset":732},60,71,2178,{"start":734,"end":735},{"line":657,"column":21,"offset":663},{"line":730,"column":731,"offset":732},{"type":27,"value":28},{"type":31,"tagName":32,"properties":738,"children":739,"position":781},{},[740,756,763,774],{"type":31,"tagName":563,"properties":741,"children":742,"position":751},{},[743],{"type":27,"value":744,"position":745},"Return statement:",{"start":746,"end":749},{"line":747,"column":111,"offset":748},62,2182,{"line":747,"column":10,"offset":750},2199,{"start":752,"end":754},{"line":747,"column":21,"offset":753},2180,{"line":747,"column":331,"offset":755},2201,{"type":27,"value":757,"position":758}," every path returns a value of the declared type\n(",{"start":759,"end":760},{"line":747,"column":331,"offset":755},{"line":403,"column":761,"offset":762},2,2251,{"type":31,"tagName":45,"properties":764,"children":765,"position":771},{},[766],{"type":27,"value":428,"position":767},{"start":768,"end":769},{"line":403,"column":761,"offset":762},{"line":403,"column":613,"offset":770},2257,{"start":772,"end":773},{"line":403,"column":761,"offset":762},{"line":403,"column":613,"offset":770},{"type":27,"value":775,"position":776}," returns nothing). The compiler refuses a missing return.",{"start":777,"end":778},{"line":403,"column":613,"offset":770},{"line":403,"column":779,"offset":780},65,2314,{"start":782,"end":783},{"line":747,"column":21,"offset":753},{"line":403,"column":779,"offset":780},{"type":27,"value":28},{"type":31,"tagName":71,"properties":786,"children":787,"position":796},{},[788],{"type":27,"value":789,"position":790},"Function examples",{"start":791,"end":793},{"line":779,"column":79,"offset":792},2319,{"line":779,"column":794,"offset":795},21,2336,{"start":797,"end":799},{"line":779,"column":21,"offset":798},2316,{"line":779,"column":794,"offset":795},{"type":27,"value":28},{"type":31,"tagName":324,"properties":802,"children":803,"position":812},{},[804],{"type":27,"value":805,"position":806},"Safe division",{"start":807,"end":810},{"line":808,"column":39,"offset":809},67,2342,{"line":808,"column":251,"offset":811},2355,{"start":813,"end":815},{"line":808,"column":21,"offset":814},2338,{"line":808,"column":251,"offset":811},{"type":27,"value":28},{"type":14,"children":818},[819],{"type":31,"tagName":343,"properties":820,"children":821,"data":-1},{"class":345,"style":346,"tabindex":347},[822],{"type":31,"tagName":45,"properties":823,"children":825},{"class":824},[352],[826,834,835,843,844,851,852,859,860,868,869],{"type":31,"tagName":355,"properties":827,"children":828},{"class":357},[829],{"type":31,"tagName":355,"properties":830,"children":831},{},[832],{"type":27,"value":833},"function safeDiv(a: f64, b: f64): f64 {",{"type":27,"value":28},{"type":31,"tagName":355,"properties":836,"children":837},{"class":357},[838],{"type":31,"tagName":355,"properties":839,"children":840},{},[841],{"type":27,"value":842},"  return b == 0.0 ? 0.0 : a / b;",{"type":27,"value":28},{"type":31,"tagName":355,"properties":845,"children":846},{"class":357},[847],{"type":31,"tagName":355,"properties":848,"children":849},{},[850],{"type":27,"value":390},{"type":27,"value":28},{"type":31,"tagName":355,"properties":853,"children":854},{"class":357},[855],{"type":31,"tagName":355,"properties":856,"children":857},{},[858],{"type":27,"value":522},{"type":27,"value":28},{"type":31,"tagName":355,"properties":861,"children":862},{"class":357},[863],{"type":31,"tagName":355,"properties":864,"children":865},{},[866],{"type":27,"value":867},"const ratio = safeDiv(10.0, 2.0);   // 5",{"type":27,"value":28},{"type":31,"tagName":355,"properties":870,"children":871},{"class":357},[872],{"type":31,"tagName":355,"properties":873,"children":874},{},[875],{"type":27,"value":876},"const safe = safeDiv(10.0, 0.0);    // 0",{"type":27,"value":28},{"type":31,"tagName":324,"properties":879,"children":880,"position":889},{},[881],{"type":27,"value":882,"position":883},"Average of two values",{"start":884,"end":887},{"line":885,"column":39,"offset":886},78,2532,{"line":885,"column":135,"offset":888},2553,{"start":890,"end":892},{"line":885,"column":21,"offset":891},2528,{"line":885,"column":135,"offset":888},{"type":27,"value":28},{"type":14,"children":895},[896],{"type":31,"tagName":343,"properties":897,"children":898,"data":-1},{"class":345,"style":346,"tabindex":347},[899],{"type":31,"tagName":45,"properties":900,"children":902},{"class":901},[352],[903,911,912,920,921,928,929,936,937],{"type":31,"tagName":355,"properties":904,"children":905},{"class":357},[906],{"type":31,"tagName":355,"properties":907,"children":908},{},[909],{"type":27,"value":910},"function average(a: f64, b: f64): f64 {",{"type":27,"value":28},{"type":31,"tagName":355,"properties":913,"children":914},{"class":357},[915],{"type":31,"tagName":355,"properties":916,"children":917},{},[918],{"type":27,"value":919},"  return (a + b) / 2.0;",{"type":27,"value":28},{"type":31,"tagName":355,"properties":922,"children":923},{"class":357},[924],{"type":31,"tagName":355,"properties":925,"children":926},{},[927],{"type":27,"value":390},{"type":27,"value":28},{"type":31,"tagName":355,"properties":930,"children":931},{"class":357},[932],{"type":31,"tagName":355,"properties":933,"children":934},{},[935],{"type":27,"value":522},{"type":27,"value":28},{"type":31,"tagName":355,"properties":938,"children":939},{"class":357},[940],{"type":31,"tagName":355,"properties":941,"children":942},{},[943],{"type":27,"value":944},"const mid = average(close, prevClose);",{"type":27,"value":28},{"type":31,"tagName":324,"properties":947,"children":948,"position":958},{},[949],{"type":27,"value":950,"position":951},"Custom pattern logic",{"start":952,"end":955},{"line":953,"column":39,"offset":954},88,2678,{"line":953,"column":956,"offset":957},25,2698,{"start":959,"end":961},{"line":953,"column":21,"offset":960},2674,{"line":953,"column":956,"offset":957},{"type":27,"value":28},{"type":31,"tagName":32,"properties":964,"children":965,"position":994},{},[966,975,987],{"type":27,"value":967,"position":968},"A candle-pattern test takes this bar's and the previous bar's open and\nclose. An indicator remembers the previous bar's values in module-level\nvariables that ",{"start":969,"end":972},{"line":970,"column":21,"offset":971},90,2700,{"line":973,"column":177,"offset":974},92,2858,{"type":31,"tagName":45,"properties":976,"children":977,"position":984},{},[978],{"type":27,"value":979,"position":980},"onBar()",{"start":981,"end":982},{"line":973,"column":177,"offset":974},{"line":973,"column":956,"offset":983},2867,{"start":985,"end":986},{"line":973,"column":177,"offset":974},{"line":973,"column":956,"offset":983},{"type":27,"value":988,"position":989}," updates on every bar:",{"start":990,"end":991},{"line":973,"column":956,"offset":983},{"line":973,"column":992,"offset":993},47,2889,{"start":995,"end":996},{"line":970,"column":21,"offset":971},{"line":973,"column":992,"offset":993},{"type":27,"value":28},{"type":14,"children":999},[1000],{"type":31,"tagName":343,"properties":1001,"children":1003,"data":-1},{"class":345,"style":346,"tabindex":347,"data-sample":1002},"cc-functions-engulfing",[1004],{"type":31,"tagName":45,"properties":1005,"children":1008},{"class":1006},[1007],"language-typescript",[1009,1035,1036,1057,1058,1079,1080,1132,1133,1153,1154,1193,1194,1197,1198,1267,1268,1321,1322,1329,1330,1333,1334,1397,1398,1420,1421,1428,1429,1432,1433,1529,1530,1563,1564,1589,1590,1637,1638,1668,1669,1676,1677,1680,1681,1716,1717,1749,1750,1753,1754,1784,1785,1816,1817,1846,1847,1878,1879,1913,1914,1998,1999,2017,2018,2035,2036,2068,2069,2098,2099,2134,2135,2148,2149],{"type":31,"tagName":355,"properties":1010,"children":1011},{"class":357},[1012,1018,1024,1030],{"type":31,"tagName":355,"properties":1013,"children":1015},{"style":1014},"--shiki-dark:#B392F0;--shiki-light:#6F42C1",[1016],{"type":27,"value":1017},"input",{"type":31,"tagName":355,"properties":1019,"children":1021},{"style":1020},"--shiki-dark:#E1E4E8;--shiki-light:#24292E",[1022],{"type":27,"value":1023},"(",{"type":31,"tagName":355,"properties":1025,"children":1027},{"style":1026},"--shiki-dark:#9ECBFF;--shiki-light:#032F62",[1028],{"type":27,"value":1029},"\"open\"",{"type":31,"tagName":355,"properties":1031,"children":1032},{"style":1020},[1033],{"type":27,"value":1034},", ohlcv.open);",{"type":27,"value":28},{"type":31,"tagName":355,"properties":1037,"children":1038},{"class":357},[1039,1043,1047,1052],{"type":31,"tagName":355,"properties":1040,"children":1041},{"style":1014},[1042],{"type":27,"value":1017},{"type":31,"tagName":355,"properties":1044,"children":1045},{"style":1020},[1046],{"type":27,"value":1023},{"type":31,"tagName":355,"properties":1048,"children":1049},{"style":1026},[1050],{"type":27,"value":1051},"\"close\"",{"type":31,"tagName":355,"properties":1053,"children":1054},{"style":1020},[1055],{"type":27,"value":1056},", ohlcv.close);",{"type":27,"value":28},{"type":31,"tagName":355,"properties":1059,"children":1060},{"class":357},[1061,1065,1069,1074],{"type":31,"tagName":355,"properties":1062,"children":1063},{"style":1014},[1064],{"type":27,"value":1017},{"type":31,"tagName":355,"properties":1066,"children":1067},{"style":1020},[1068],{"type":27,"value":1023},{"type":31,"tagName":355,"properties":1070,"children":1071},{"style":1026},[1072],{"type":27,"value":1073},"\"low\"",{"type":31,"tagName":355,"properties":1075,"children":1076},{"style":1020},[1077],{"type":27,"value":1078},", ohlcv.low);",{"type":27,"value":28},{"type":31,"tagName":355,"properties":1081,"children":1082},{"class":357},[1083,1088,1092,1097,1102,1107,1112,1117,1122,1127],{"type":31,"tagName":355,"properties":1084,"children":1085},{"style":1014},[1086],{"type":27,"value":1087},"output",{"type":31,"tagName":355,"properties":1089,"children":1090},{"style":1020},[1091],{"type":27,"value":1023},{"type":31,"tagName":355,"properties":1093,"children":1094},{"style":1026},[1095],{"type":27,"value":1096},"\"engulfing\"",{"type":31,"tagName":355,"properties":1098,"children":1099},{"style":1020},[1100],{"type":27,"value":1101},", shape, overlay, { color: ",{"type":31,"tagName":355,"properties":1103,"children":1104},{"style":1026},[1105],{"type":27,"value":1106},"\"#16a34a\"",{"type":31,"tagName":355,"properties":1108,"children":1109},{"style":1020},[1110],{"type":27,"value":1111},", shape_where: ",{"type":31,"tagName":355,"properties":1113,"children":1114},{"style":1026},[1115],{"type":27,"value":1116},"\"is_engulfing\"",{"type":31,"tagName":355,"properties":1118,"children":1119},{"style":1020},[1120],{"type":27,"value":1121},", description: ",{"type":31,"tagName":355,"properties":1123,"children":1124},{"style":1026},[1125],{"type":27,"value":1126},"\"Bullish engulfing candle\"",{"type":31,"tagName":355,"properties":1128,"children":1129},{"style":1020},[1130],{"type":27,"value":1131}," });",{"type":27,"value":28},{"type":31,"tagName":355,"properties":1134,"children":1135},{"class":357},[1136,1140,1144,1148],{"type":31,"tagName":355,"properties":1137,"children":1138},{"style":1014},[1139],{"type":27,"value":1087},{"type":31,"tagName":355,"properties":1141,"children":1142},{"style":1020},[1143],{"type":27,"value":1023},{"type":31,"tagName":355,"properties":1145,"children":1146},{"style":1026},[1147],{"type":27,"value":1116},{"type":31,"tagName":355,"properties":1149,"children":1150},{"style":1020},[1151],{"type":27,"value":1152},", none);",{"type":27,"value":28},{"type":31,"tagName":355,"properties":1155,"children":1156},{"class":357},[1157,1161,1165,1170,1175,1180,1184,1189],{"type":31,"tagName":355,"properties":1158,"children":1159},{"style":1014},[1160],{"type":27,"value":1087},{"type":31,"tagName":355,"properties":1162,"children":1163},{"style":1020},[1164],{"type":27,"value":1023},{"type":31,"tagName":355,"properties":1166,"children":1167},{"style":1026},[1168],{"type":27,"value":1169},"\"body_ratio\"",{"type":31,"tagName":355,"properties":1171,"children":1172},{"style":1020},[1173],{"type":27,"value":1174},", line, lower, { color: ",{"type":31,"tagName":355,"properties":1176,"children":1177},{"style":1026},[1178],{"type":27,"value":1179},"\"#94a3b8\"",{"type":31,"tagName":355,"properties":1181,"children":1182},{"style":1020},[1183],{"type":27,"value":1121},{"type":31,"tagName":355,"properties":1185,"children":1186},{"style":1026},[1187],{"type":27,"value":1188},"\"This body divided by the previous body\"",{"type":31,"tagName":355,"properties":1190,"children":1191},{"style":1020},[1192],{"type":27,"value":1131},{"type":27,"value":28},{"type":31,"tagName":355,"properties":1195,"children":1196},{"class":357},[],{"type":27,"value":28},{"type":31,"tagName":355,"properties":1199,"children":1200},{"class":357},[1201,1206,1211,1215,1221,1226,1231,1236,1241,1245,1249,1254,1258,1262],{"type":31,"tagName":355,"properties":1202,"children":1204},{"style":1203},"--shiki-dark:#F97583;--shiki-light:#D73A49",[1205],{"type":27,"value":49},{"type":31,"tagName":355,"properties":1207,"children":1208},{"style":1014},[1209],{"type":27,"value":1210}," safeDiv",{"type":31,"tagName":355,"properties":1212,"children":1213},{"style":1020},[1214],{"type":27,"value":1023},{"type":31,"tagName":355,"properties":1216,"children":1218},{"style":1217},"--shiki-dark:#FFAB70;--shiki-light:#E36209",[1219],{"type":27,"value":1220},"a",{"type":31,"tagName":355,"properties":1222,"children":1223},{"style":1203},[1224],{"type":27,"value":1225},":",{"type":31,"tagName":355,"properties":1227,"children":1228},{"style":1014},[1229],{"type":27,"value":1230}," f64",{"type":31,"tagName":355,"properties":1232,"children":1233},{"style":1020},[1234],{"type":27,"value":1235},", ",{"type":31,"tagName":355,"properties":1237,"children":1238},{"style":1217},[1239],{"type":27,"value":1240},"b",{"type":31,"tagName":355,"properties":1242,"children":1243},{"style":1203},[1244],{"type":27,"value":1225},{"type":31,"tagName":355,"properties":1246,"children":1247},{"style":1014},[1248],{"type":27,"value":1230},{"type":31,"tagName":355,"properties":1250,"children":1251},{"style":1020},[1252],{"type":27,"value":1253},")",{"type":31,"tagName":355,"properties":1255,"children":1256},{"style":1203},[1257],{"type":27,"value":1225},{"type":31,"tagName":355,"properties":1259,"children":1260},{"style":1014},[1261],{"type":27,"value":1230},{"type":31,"tagName":355,"properties":1263,"children":1264},{"style":1020},[1265],{"type":27,"value":1266}," {",{"type":27,"value":28},{"type":31,"tagName":355,"properties":1269,"children":1270},{"class":357},[1271,1276,1281,1286,1292,1297,1301,1306,1311,1316],{"type":31,"tagName":355,"properties":1272,"children":1273},{"style":1203},[1274],{"type":27,"value":1275},"  return",{"type":31,"tagName":355,"properties":1277,"children":1278},{"style":1020},[1279],{"type":27,"value":1280}," b ",{"type":31,"tagName":355,"properties":1282,"children":1283},{"style":1203},[1284],{"type":27,"value":1285},"==",{"type":31,"tagName":355,"properties":1287,"children":1289},{"style":1288},"--shiki-dark:#79B8FF;--shiki-light:#005CC5",[1290],{"type":27,"value":1291}," 0.0",{"type":31,"tagName":355,"properties":1293,"children":1294},{"style":1203},[1295],{"type":27,"value":1296}," ?",{"type":31,"tagName":355,"properties":1298,"children":1299},{"style":1288},[1300],{"type":27,"value":1291},{"type":31,"tagName":355,"properties":1302,"children":1303},{"style":1203},[1304],{"type":27,"value":1305}," :",{"type":31,"tagName":355,"properties":1307,"children":1308},{"style":1020},[1309],{"type":27,"value":1310}," a ",{"type":31,"tagName":355,"properties":1312,"children":1313},{"style":1203},[1314],{"type":27,"value":1315},"/",{"type":31,"tagName":355,"properties":1317,"children":1318},{"style":1020},[1319],{"type":27,"value":1320}," b;",{"type":27,"value":28},{"type":31,"tagName":355,"properties":1323,"children":1324},{"class":357},[1325],{"type":31,"tagName":355,"properties":1326,"children":1327},{"style":1020},[1328],{"type":27,"value":390},{"type":27,"value":28},{"type":31,"tagName":355,"properties":1331,"children":1332},{"class":357},[],{"type":27,"value":28},{"type":31,"tagName":355,"properties":1335,"children":1336},{"class":357},[1337,1341,1346,1350,1355,1359,1363,1367,1372,1376,1380,1384,1388,1393],{"type":31,"tagName":355,"properties":1338,"children":1339},{"style":1203},[1340],{"type":27,"value":49},{"type":31,"tagName":355,"properties":1342,"children":1343},{"style":1014},[1344],{"type":27,"value":1345}," isGreenCandle",{"type":31,"tagName":355,"properties":1347,"children":1348},{"style":1020},[1349],{"type":27,"value":1023},{"type":31,"tagName":355,"properties":1351,"children":1352},{"style":1217},[1353],{"type":27,"value":1354},"openPrice",{"type":31,"tagName":355,"properties":1356,"children":1357},{"style":1203},[1358],{"type":27,"value":1225},{"type":31,"tagName":355,"properties":1360,"children":1361},{"style":1014},[1362],{"type":27,"value":1230},{"type":31,"tagName":355,"properties":1364,"children":1365},{"style":1020},[1366],{"type":27,"value":1235},{"type":31,"tagName":355,"properties":1368,"children":1369},{"style":1217},[1370],{"type":27,"value":1371},"closePrice",{"type":31,"tagName":355,"properties":1373,"children":1374},{"style":1203},[1375],{"type":27,"value":1225},{"type":31,"tagName":355,"properties":1377,"children":1378},{"style":1014},[1379],{"type":27,"value":1230},{"type":31,"tagName":355,"properties":1381,"children":1382},{"style":1020},[1383],{"type":27,"value":1253},{"type":31,"tagName":355,"properties":1385,"children":1386},{"style":1203},[1387],{"type":27,"value":1225},{"type":31,"tagName":355,"properties":1389,"children":1390},{"style":1014},[1391],{"type":27,"value":1392}," bool",{"type":31,"tagName":355,"properties":1394,"children":1395},{"style":1020},[1396],{"type":27,"value":1266},{"type":27,"value":28},{"type":31,"tagName":355,"properties":1399,"children":1400},{"class":357},[1401,1405,1410,1415],{"type":31,"tagName":355,"properties":1402,"children":1403},{"style":1203},[1404],{"type":27,"value":1275},{"type":31,"tagName":355,"properties":1406,"children":1407},{"style":1020},[1408],{"type":27,"value":1409}," closePrice ",{"type":31,"tagName":355,"properties":1411,"children":1412},{"style":1203},[1413],{"type":27,"value":1414},">",{"type":31,"tagName":355,"properties":1416,"children":1417},{"style":1020},[1418],{"type":27,"value":1419}," openPrice;",{"type":27,"value":28},{"type":31,"tagName":355,"properties":1422,"children":1423},{"class":357},[1424],{"type":31,"tagName":355,"properties":1425,"children":1426},{"style":1020},[1427],{"type":27,"value":390},{"type":27,"value":28},{"type":31,"tagName":355,"properties":1430,"children":1431},{"class":357},[],{"type":27,"value":28},{"type":31,"tagName":355,"properties":1434,"children":1435},{"class":357},[1436,1440,1445,1449,1454,1458,1462,1466,1471,1475,1479,1483,1488,1492,1496,1500,1505,1509,1513,1517,1521,1525],{"type":31,"tagName":355,"properties":1437,"children":1438},{"style":1203},[1439],{"type":27,"value":49},{"type":31,"tagName":355,"properties":1441,"children":1442},{"style":1014},[1443],{"type":27,"value":1444}," isBullishEngulfing",{"type":31,"tagName":355,"properties":1446,"children":1447},{"style":1020},[1448],{"type":27,"value":1023},{"type":31,"tagName":355,"properties":1450,"children":1451},{"style":1217},[1452],{"type":27,"value":1453},"prevOpen",{"type":31,"tagName":355,"properties":1455,"children":1456},{"style":1203},[1457],{"type":27,"value":1225},{"type":31,"tagName":355,"properties":1459,"children":1460},{"style":1014},[1461],{"type":27,"value":1230},{"type":31,"tagName":355,"properties":1463,"children":1464},{"style":1020},[1465],{"type":27,"value":1235},{"type":31,"tagName":355,"properties":1467,"children":1468},{"style":1217},[1469],{"type":27,"value":1470},"prevClose",{"type":31,"tagName":355,"properties":1472,"children":1473},{"style":1203},[1474],{"type":27,"value":1225},{"type":31,"tagName":355,"properties":1476,"children":1477},{"style":1014},[1478],{"type":27,"value":1230},{"type":31,"tagName":355,"properties":1480,"children":1481},{"style":1020},[1482],{"type":27,"value":1235},{"type":31,"tagName":355,"properties":1484,"children":1485},{"style":1217},[1486],{"type":27,"value":1487},"currOpen",{"type":31,"tagName":355,"properties":1489,"children":1490},{"style":1203},[1491],{"type":27,"value":1225},{"type":31,"tagName":355,"properties":1493,"children":1494},{"style":1014},[1495],{"type":27,"value":1230},{"type":31,"tagName":355,"properties":1497,"children":1498},{"style":1020},[1499],{"type":27,"value":1235},{"type":31,"tagName":355,"properties":1501,"children":1502},{"style":1217},[1503],{"type":27,"value":1504},"currClose",{"type":31,"tagName":355,"properties":1506,"children":1507},{"style":1203},[1508],{"type":27,"value":1225},{"type":31,"tagName":355,"properties":1510,"children":1511},{"style":1014},[1512],{"type":27,"value":1230},{"type":31,"tagName":355,"properties":1514,"children":1515},{"style":1020},[1516],{"type":27,"value":1253},{"type":31,"tagName":355,"properties":1518,"children":1519},{"style":1203},[1520],{"type":27,"value":1225},{"type":31,"tagName":355,"properties":1522,"children":1523},{"style":1014},[1524],{"type":27,"value":1392},{"type":31,"tagName":355,"properties":1526,"children":1527},{"style":1020},[1528],{"type":27,"value":1266},{"type":27,"value":28},{"type":31,"tagName":355,"properties":1531,"children":1532},{"class":357},[1533,1538,1543,1548,1553,1558],{"type":31,"tagName":355,"properties":1534,"children":1535},{"style":1203},[1536],{"type":27,"value":1537},"  const",{"type":31,"tagName":355,"properties":1539,"children":1540},{"style":1288},[1541],{"type":27,"value":1542}," prevWasRed",{"type":31,"tagName":355,"properties":1544,"children":1545},{"style":1203},[1546],{"type":27,"value":1547}," =",{"type":31,"tagName":355,"properties":1549,"children":1550},{"style":1020},[1551],{"type":27,"value":1552}," prevClose ",{"type":31,"tagName":355,"properties":1554,"children":1555},{"style":1203},[1556],{"type":27,"value":1557},"\u003C",{"type":31,"tagName":355,"properties":1559,"children":1560},{"style":1020},[1561],{"type":27,"value":1562}," prevOpen;",{"type":27,"value":28},{"type":31,"tagName":355,"properties":1565,"children":1566},{"class":357},[1567,1571,1576,1580,1584],{"type":31,"tagName":355,"properties":1568,"children":1569},{"style":1203},[1570],{"type":27,"value":1537},{"type":31,"tagName":355,"properties":1572,"children":1573},{"style":1288},[1574],{"type":27,"value":1575}," currIsGreen",{"type":31,"tagName":355,"properties":1577,"children":1578},{"style":1203},[1579],{"type":27,"value":1547},{"type":31,"tagName":355,"properties":1581,"children":1582},{"style":1014},[1583],{"type":27,"value":1345},{"type":31,"tagName":355,"properties":1585,"children":1586},{"style":1020},[1587],{"type":27,"value":1588},"(currOpen, currClose);",{"type":27,"value":28},{"type":31,"tagName":355,"properties":1591,"children":1592},{"class":357},[1593,1597,1602,1606,1611,1615,1619,1624,1629,1633],{"type":31,"tagName":355,"properties":1594,"children":1595},{"style":1203},[1596],{"type":27,"value":1537},{"type":31,"tagName":355,"properties":1598,"children":1599},{"style":1288},[1600],{"type":27,"value":1601}," engulfs",{"type":31,"tagName":355,"properties":1603,"children":1604},{"style":1203},[1605],{"type":27,"value":1547},{"type":31,"tagName":355,"properties":1607,"children":1608},{"style":1020},[1609],{"type":27,"value":1610}," currOpen ",{"type":31,"tagName":355,"properties":1612,"children":1613},{"style":1203},[1614],{"type":27,"value":1557},{"type":31,"tagName":355,"properties":1616,"children":1617},{"style":1020},[1618],{"type":27,"value":1552},{"type":31,"tagName":355,"properties":1620,"children":1621},{"style":1203},[1622],{"type":27,"value":1623},"&&",{"type":31,"tagName":355,"properties":1625,"children":1626},{"style":1020},[1627],{"type":27,"value":1628}," currClose ",{"type":31,"tagName":355,"properties":1630,"children":1631},{"style":1203},[1632],{"type":27,"value":1414},{"type":31,"tagName":355,"properties":1634,"children":1635},{"style":1020},[1636],{"type":27,"value":1562},{"type":27,"value":28},{"type":31,"tagName":355,"properties":1639,"children":1640},{"class":357},[1641,1645,1650,1654,1659,1663],{"type":31,"tagName":355,"properties":1642,"children":1643},{"style":1203},[1644],{"type":27,"value":1275},{"type":31,"tagName":355,"properties":1646,"children":1647},{"style":1020},[1648],{"type":27,"value":1649}," prevWasRed ",{"type":31,"tagName":355,"properties":1651,"children":1652},{"style":1203},[1653],{"type":27,"value":1623},{"type":31,"tagName":355,"properties":1655,"children":1656},{"style":1020},[1657],{"type":27,"value":1658}," currIsGreen ",{"type":31,"tagName":355,"properties":1660,"children":1661},{"style":1203},[1662],{"type":27,"value":1623},{"type":31,"tagName":355,"properties":1664,"children":1665},{"style":1020},[1666],{"type":27,"value":1667}," engulfs;",{"type":27,"value":28},{"type":31,"tagName":355,"properties":1670,"children":1671},{"class":357},[1672],{"type":31,"tagName":355,"properties":1673,"children":1674},{"style":1020},[1675],{"type":27,"value":390},{"type":27,"value":28},{"type":31,"tagName":355,"properties":1678,"children":1679},{"class":357},[],{"type":27,"value":28},{"type":31,"tagName":355,"properties":1682,"children":1683},{"class":357},[1684,1689,1694,1698,1702,1706,1711],{"type":31,"tagName":355,"properties":1685,"children":1686},{"style":1203},[1687],{"type":27,"value":1688},"let",{"type":31,"tagName":355,"properties":1690,"children":1691},{"style":1020},[1692],{"type":27,"value":1693}," prevOpen",{"type":31,"tagName":355,"properties":1695,"children":1696},{"style":1203},[1697],{"type":27,"value":1225},{"type":31,"tagName":355,"properties":1699,"children":1700},{"style":1014},[1701],{"type":27,"value":1230},{"type":31,"tagName":355,"properties":1703,"children":1704},{"style":1203},[1705],{"type":27,"value":1547},{"type":31,"tagName":355,"properties":1707,"children":1708},{"style":1288},[1709],{"type":27,"value":1710}," NaN",{"type":31,"tagName":355,"properties":1712,"children":1713},{"style":1020},[1714],{"type":27,"value":1715},";",{"type":27,"value":28},{"type":31,"tagName":355,"properties":1718,"children":1719},{"class":357},[1720,1724,1729,1733,1737,1741,1745],{"type":31,"tagName":355,"properties":1721,"children":1722},{"style":1203},[1723],{"type":27,"value":1688},{"type":31,"tagName":355,"properties":1725,"children":1726},{"style":1020},[1727],{"type":27,"value":1728}," prevClose",{"type":31,"tagName":355,"properties":1730,"children":1731},{"style":1203},[1732],{"type":27,"value":1225},{"type":31,"tagName":355,"properties":1734,"children":1735},{"style":1014},[1736],{"type":27,"value":1230},{"type":31,"tagName":355,"properties":1738,"children":1739},{"style":1203},[1740],{"type":27,"value":1547},{"type":31,"tagName":355,"properties":1742,"children":1743},{"style":1288},[1744],{"type":27,"value":1710},{"type":31,"tagName":355,"properties":1746,"children":1747},{"style":1020},[1748],{"type":27,"value":1715},{"type":27,"value":28},{"type":31,"tagName":355,"properties":1751,"children":1752},{"class":357},[],{"type":27,"value":28},{"type":31,"tagName":355,"properties":1755,"children":1756},{"class":357},[1757,1761,1766,1771,1775,1780],{"type":31,"tagName":355,"properties":1758,"children":1759},{"style":1203},[1760],{"type":27,"value":49},{"type":31,"tagName":355,"properties":1762,"children":1763},{"style":1014},[1764],{"type":27,"value":1765}," onBar",{"type":31,"tagName":355,"properties":1767,"children":1768},{"style":1020},[1769],{"type":27,"value":1770},"()",{"type":31,"tagName":355,"properties":1772,"children":1773},{"style":1203},[1774],{"type":27,"value":1225},{"type":31,"tagName":355,"properties":1776,"children":1777},{"style":1288},[1778],{"type":27,"value":1779}," void",{"type":31,"tagName":355,"properties":1781,"children":1782},{"style":1020},[1783],{"type":27,"value":1266},{"type":27,"value":28},{"type":31,"tagName":355,"properties":1786,"children":1787},{"class":357},[1788,1792,1797,1801,1806,1811],{"type":31,"tagName":355,"properties":1789,"children":1790},{"style":1203},[1791],{"type":27,"value":1537},{"type":31,"tagName":355,"properties":1793,"children":1794},{"style":1288},[1795],{"type":27,"value":1796}," open",{"type":31,"tagName":355,"properties":1798,"children":1799},{"style":1203},[1800],{"type":27,"value":1547},{"type":31,"tagName":355,"properties":1802,"children":1803},{"style":1020},[1804],{"type":27,"value":1805}," bar.",{"type":31,"tagName":355,"properties":1807,"children":1808},{"style":1014},[1809],{"type":27,"value":1810},"open",{"type":31,"tagName":355,"properties":1812,"children":1813},{"style":1020},[1814],{"type":27,"value":1815},"();",{"type":27,"value":28},{"type":31,"tagName":355,"properties":1818,"children":1819},{"class":357},[1820,1824,1829,1833,1837,1842],{"type":31,"tagName":355,"properties":1821,"children":1822},{"style":1203},[1823],{"type":27,"value":1537},{"type":31,"tagName":355,"properties":1825,"children":1826},{"style":1288},[1827],{"type":27,"value":1828}," close",{"type":31,"tagName":355,"properties":1830,"children":1831},{"style":1203},[1832],{"type":27,"value":1547},{"type":31,"tagName":355,"properties":1834,"children":1835},{"style":1020},[1836],{"type":27,"value":1805},{"type":31,"tagName":355,"properties":1838,"children":1839},{"style":1014},[1840],{"type":27,"value":1841},"close",{"type":31,"tagName":355,"properties":1843,"children":1844},{"style":1020},[1845],{"type":27,"value":1815},{"type":27,"value":28},{"type":31,"tagName":355,"properties":1848,"children":1849},{"class":357},[1850,1854,1859,1863,1868,1873],{"type":31,"tagName":355,"properties":1851,"children":1852},{"style":1203},[1853],{"type":27,"value":1537},{"type":31,"tagName":355,"properties":1855,"children":1856},{"style":1288},[1857],{"type":27,"value":1858}," ready",{"type":31,"tagName":355,"properties":1860,"children":1861},{"style":1203},[1862],{"type":27,"value":1547},{"type":31,"tagName":355,"properties":1864,"children":1865},{"style":1203},[1866],{"type":27,"value":1867}," !",{"type":31,"tagName":355,"properties":1869,"children":1870},{"style":1014},[1871],{"type":27,"value":1872},"isNaN",{"type":31,"tagName":355,"properties":1874,"children":1875},{"style":1020},[1876],{"type":27,"value":1877},"(prevOpen);",{"type":27,"value":28},{"type":31,"tagName":355,"properties":1880,"children":1881},{"class":357},[1882,1886,1891,1895,1900,1904,1908],{"type":31,"tagName":355,"properties":1883,"children":1884},{"style":1203},[1885],{"type":27,"value":1537},{"type":31,"tagName":355,"properties":1887,"children":1888},{"style":1288},[1889],{"type":27,"value":1890}," engulfing",{"type":31,"tagName":355,"properties":1892,"children":1893},{"style":1203},[1894],{"type":27,"value":1547},{"type":31,"tagName":355,"properties":1896,"children":1897},{"style":1020},[1898],{"type":27,"value":1899}," ready ",{"type":31,"tagName":355,"properties":1901,"children":1902},{"style":1203},[1903],{"type":27,"value":1623},{"type":31,"tagName":355,"properties":1905,"children":1906},{"style":1014},[1907],{"type":27,"value":1444},{"type":31,"tagName":355,"properties":1909,"children":1910},{"style":1020},[1911],{"type":27,"value":1912},"(prevOpen, prevClose, open, close);",{"type":27,"value":28},{"type":31,"tagName":355,"properties":1915,"children":1916},{"class":357},[1917,1921,1926,1930,1934,1939,1943,1948,1953,1958,1963,1968,1972,1977,1981,1986,1990,1994],{"type":31,"tagName":355,"properties":1918,"children":1919},{"style":1203},[1920],{"type":27,"value":1537},{"type":31,"tagName":355,"properties":1922,"children":1923},{"style":1288},[1924],{"type":27,"value":1925}," bodyRatio",{"type":31,"tagName":355,"properties":1927,"children":1928},{"style":1203},[1929],{"type":27,"value":1547},{"type":31,"tagName":355,"properties":1931,"children":1932},{"style":1020},[1933],{"type":27,"value":1899},{"type":31,"tagName":355,"properties":1935,"children":1936},{"style":1203},[1937],{"type":27,"value":1938},"?",{"type":31,"tagName":355,"properties":1940,"children":1941},{"style":1014},[1942],{"type":27,"value":1210},{"type":31,"tagName":355,"properties":1944,"children":1945},{"style":1020},[1946],{"type":27,"value":1947},"(Math.",{"type":31,"tagName":355,"properties":1949,"children":1950},{"style":1014},[1951],{"type":27,"value":1952},"abs",{"type":31,"tagName":355,"properties":1954,"children":1955},{"style":1020},[1956],{"type":27,"value":1957},"(close ",{"type":31,"tagName":355,"properties":1959,"children":1960},{"style":1203},[1961],{"type":27,"value":1962},"-",{"type":31,"tagName":355,"properties":1964,"children":1965},{"style":1020},[1966],{"type":27,"value":1967}," open), Math.",{"type":31,"tagName":355,"properties":1969,"children":1970},{"style":1014},[1971],{"type":27,"value":1952},{"type":31,"tagName":355,"properties":1973,"children":1974},{"style":1020},[1975],{"type":27,"value":1976},"(prevClose ",{"type":31,"tagName":355,"properties":1978,"children":1979},{"style":1203},[1980],{"type":27,"value":1962},{"type":31,"tagName":355,"properties":1982,"children":1983},{"style":1020},[1984],{"type":27,"value":1985}," prevOpen)) ",{"type":31,"tagName":355,"properties":1987,"children":1988},{"style":1203},[1989],{"type":27,"value":1225},{"type":31,"tagName":355,"properties":1991,"children":1992},{"style":1288},[1993],{"type":27,"value":1710},{"type":31,"tagName":355,"properties":1995,"children":1996},{"style":1020},[1997],{"type":27,"value":1715},{"type":27,"value":28},{"type":31,"tagName":355,"properties":2000,"children":2001},{"class":357},[2002,2007,2012],{"type":31,"tagName":355,"properties":2003,"children":2004},{"style":1020},[2005],{"type":27,"value":2006},"  prevOpen ",{"type":31,"tagName":355,"properties":2008,"children":2009},{"style":1203},[2010],{"type":27,"value":2011},"=",{"type":31,"tagName":355,"properties":2013,"children":2014},{"style":1020},[2015],{"type":27,"value":2016}," open;",{"type":27,"value":28},{"type":31,"tagName":355,"properties":2019,"children":2020},{"class":357},[2021,2026,2030],{"type":31,"tagName":355,"properties":2022,"children":2023},{"style":1020},[2024],{"type":27,"value":2025},"  prevClose ",{"type":31,"tagName":355,"properties":2027,"children":2028},{"style":1203},[2029],{"type":27,"value":2011},{"type":31,"tagName":355,"properties":2031,"children":2032},{"style":1020},[2033],{"type":27,"value":2034}," close;",{"type":27,"value":28},{"type":31,"tagName":355,"properties":2037,"children":2038},{"class":357},[2039,2044,2049,2054,2059,2064],{"type":31,"tagName":355,"properties":2040,"children":2041},{"style":1203},[2042],{"type":27,"value":2043},"  if",{"type":31,"tagName":355,"properties":2045,"children":2046},{"style":1020},[2047],{"type":27,"value":2048}," (",{"type":31,"tagName":355,"properties":2050,"children":2051},{"style":1203},[2052],{"type":27,"value":2053},"!",{"type":31,"tagName":355,"properties":2055,"children":2056},{"style":1020},[2057],{"type":27,"value":2058},"ready) ",{"type":31,"tagName":355,"properties":2060,"children":2061},{"style":1203},[2062],{"type":27,"value":2063},"return",{"type":31,"tagName":355,"properties":2065,"children":2066},{"style":1020},[2067],{"type":27,"value":1715},{"type":27,"value":28},{"type":31,"tagName":355,"properties":2070,"children":2071},{"class":357},[2072,2077,2082,2087,2092],{"type":31,"tagName":355,"properties":2073,"children":2074},{"style":1014},[2075],{"type":27,"value":2076},"  out_engulfing",{"type":31,"tagName":355,"properties":2078,"children":2079},{"style":1020},[2080],{"type":27,"value":2081},"(bar.",{"type":31,"tagName":355,"properties":2083,"children":2084},{"style":1014},[2085],{"type":27,"value":2086},"low",{"type":31,"tagName":355,"properties":2088,"children":2089},{"style":1020},[2090],{"type":27,"value":2091},"()); ",{"type":31,"tagName":355,"properties":2093,"children":2095},{"style":2094},"--shiki-dark:#6A737D;--shiki-light:#6A737D",[2096],{"type":27,"value":2097},"// the mark sits under the candle",{"type":27,"value":28},{"type":31,"tagName":355,"properties":2100,"children":2101},{"class":357},[2102,2107,2112,2116,2121,2125,2129],{"type":31,"tagName":355,"properties":2103,"children":2104},{"style":1014},[2105],{"type":27,"value":2106},"  out_is_engulfing",{"type":31,"tagName":355,"properties":2108,"children":2109},{"style":1020},[2110],{"type":27,"value":2111},"(engulfing ",{"type":31,"tagName":355,"properties":2113,"children":2114},{"style":1203},[2115],{"type":27,"value":1938},{"type":31,"tagName":355,"properties":2117,"children":2118},{"style":1288},[2119],{"type":27,"value":2120}," 1.0",{"type":31,"tagName":355,"properties":2122,"children":2123},{"style":1203},[2124],{"type":27,"value":1305},{"type":31,"tagName":355,"properties":2126,"children":2127},{"style":1288},[2128],{"type":27,"value":1291},{"type":31,"tagName":355,"properties":2130,"children":2131},{"style":1020},[2132],{"type":27,"value":2133},");",{"type":27,"value":28},{"type":31,"tagName":355,"properties":2136,"children":2137},{"class":357},[2138,2143],{"type":31,"tagName":355,"properties":2139,"children":2140},{"style":1014},[2141],{"type":27,"value":2142},"  out_body_ratio",{"type":31,"tagName":355,"properties":2144,"children":2145},{"style":1020},[2146],{"type":27,"value":2147},"(bodyRatio);",{"type":27,"value":28},{"type":31,"tagName":355,"properties":2150,"children":2151},{"class":357},[2152],{"type":31,"tagName":355,"properties":2153,"children":2154},{"style":1020},[2155],{"type":27,"value":390},{"type":27,"value":28},{"type":31,"tagName":32,"properties":2158,"children":2159,"position":2205},{},[2160,2168,2181,2187,2198],{"type":27,"value":2161,"position":2162},"The three helpers are pure: they take numbers and return a number or a\n",{"start":2163,"end":2165},{"line":24,"column":21,"offset":2164},4329,{"line":2166,"column":21,"offset":2167},136,4400,{"type":31,"tagName":45,"properties":2169,"children":2170,"position":2178},{},[2171],{"type":27,"value":2172,"position":2173},"bool",{"start":2174,"end":2175},{"line":2166,"column":21,"offset":2167},{"line":2166,"column":2176,"offset":2177},7,4406,{"start":2179,"end":2180},{"line":2166,"column":21,"offset":2167},{"line":2166,"column":2176,"offset":2177},{"type":27,"value":2182,"position":2183},", and ",{"start":2184,"end":2185},{"line":2166,"column":2176,"offset":2177},{"line":2166,"column":110,"offset":2186},4412,{"type":31,"tagName":45,"properties":2188,"children":2189,"position":2195},{},[2190],{"type":27,"value":979,"position":2191},{"start":2192,"end":2193},{"line":2166,"column":110,"offset":2186},{"line":2166,"column":331,"offset":2194},4421,{"start":2196,"end":2197},{"line":2166,"column":110,"offset":2186},{"line":2166,"column":331,"offset":2194},{"type":27,"value":2199,"position":2200}," supplies the remembered previous bar. That keeps the\npattern testable in isolation and the per-bar function short.",{"start":2201,"end":2202},{"line":2166,"column":331,"offset":2194},{"line":2203,"column":747,"offset":2204},137,4536,{"start":2206,"end":2207},{"line":24,"column":21,"offset":2164},{"line":2203,"column":747,"offset":2204},{"type":27,"value":28},{"type":31,"tagName":71,"properties":2210,"children":2211,"position":2221},{},[2212],{"type":27,"value":2213,"position":2214},"Functions as values",{"start":2215,"end":2218},{"line":2216,"column":79,"offset":2217},139,4541,{"line":2216,"column":2219,"offset":2220},23,4560,{"start":2222,"end":2224},{"line":2216,"column":21,"offset":2223},4538,{"line":2216,"column":2219,"offset":2220},{"type":27,"value":28},{"type":31,"tagName":32,"properties":2227,"children":2228,"position":2238},{},[2229],{"type":27,"value":2230,"position":2231},"A function that captures no local variable is a value. Store it in a\nvariable typed with its signature, pass it to a loop, keep a small table of\nthem:",{"start":2232,"end":2235},{"line":2233,"column":21,"offset":2234},141,4562,{"line":2236,"column":681,"offset":2237},143,4712,{"start":2239,"end":2240},{"line":2233,"column":21,"offset":2234},{"line":2236,"column":681,"offset":2237},{"type":27,"value":28},{"type":14,"children":2243},[2244],{"type":31,"tagName":343,"properties":2245,"children":2246,"data":-1},{"class":345,"style":346,"tabindex":347},[2247],{"type":31,"tagName":45,"properties":2248,"children":2250},{"class":2249},[352],[2251,2259,2260,2267,2268,2276,2277],{"type":31,"tagName":355,"properties":2252,"children":2253},{"class":357},[2254],{"type":31,"tagName":355,"properties":2255,"children":2256},{},[2257],{"type":27,"value":2258},"function aboveMean(x: f64): bool { return x > mean; }   // mean is module-level",{"type":27,"value":28},{"type":31,"tagName":355,"properties":2261,"children":2262},{"class":357},[2263],{"type":31,"tagName":355,"properties":2264,"children":2265},{},[2266],{"type":27,"value":522},{"type":27,"value":28},{"type":31,"tagName":355,"properties":2269,"children":2270},{"class":357},[2271],{"type":31,"tagName":355,"properties":2272,"children":2273},{},[2274],{"type":27,"value":2275},"let pred: (x: f64) => bool = aboveMean;",{"type":27,"value":28},{"type":31,"tagName":355,"properties":2278,"children":2279},{"class":357},[2280],{"type":31,"tagName":355,"properties":2281,"children":2282},{},[2283],{"type":27,"value":2284},"const hits = countWhere(window, n, pred);",{"type":27,"value":28},{"type":31,"tagName":32,"properties":2287,"children":2288,"position":2317},{},[2289,2298,2311],{"type":27,"value":2290,"position":2291},"Arrow functions work the same way, and nested functions (declared inside\nanother function) are allowed as long as they read nothing from the\nenclosing function's locals. The full treatment, with the loop that takes\na predicate, is ",{"start":2292,"end":2295},{"line":2293,"column":21,"offset":2294},152,4890,{"line":2296,"column":235,"offset":2297},155,5121,{"type":31,"tagName":45,"properties":2299,"children":2300,"position":2308},{},[2301],{"type":27,"value":2302,"position":2303},"lambdas-and-reducers.md",{"start":2304,"end":2305},{"line":2296,"column":235,"offset":2297},{"line":2296,"column":2306,"offset":2307},42,5146,{"start":2309,"end":2310},{"line":2296,"column":235,"offset":2297},{"line":2296,"column":2306,"offset":2307},{"type":27,"value":438,"position":2312},{"start":2313,"end":2314},{"line":2296,"column":2306,"offset":2307},{"line":2296,"column":2315,"offset":2316},43,5147,{"start":2318,"end":2319},{"line":2293,"column":21,"offset":2294},{"line":2296,"column":2315,"offset":2316},{"type":27,"value":28},{"type":31,"tagName":71,"properties":2322,"children":2323,"position":2332},{},[2324],{"type":27,"value":2325,"position":2326},"Constraints and rules",{"start":2327,"end":2330},{"line":2328,"column":79,"offset":2329},157,5152,{"line":2328,"column":956,"offset":2331},5173,{"start":2333,"end":2335},{"line":2328,"column":21,"offset":2334},5149,{"line":2328,"column":956,"offset":2331},{"type":27,"value":28},{"type":31,"tagName":324,"properties":2338,"children":2339,"position":2348},{},[2340],{"type":27,"value":2341,"position":2342},"No declarations inside functions",{"start":2343,"end":2346},{"line":2344,"column":39,"offset":2345},159,5179,{"line":2344,"column":432,"offset":2347},5211,{"start":2349,"end":2351},{"line":2344,"column":21,"offset":2350},5175,{"line":2344,"column":432,"offset":2347},{"type":27,"value":28},{"type":31,"tagName":32,"properties":2354,"children":2355,"position":2430},{},[2356,2370,2375,2387,2393,2405,2410,2422],{"type":31,"tagName":45,"properties":2357,"children":2358,"position":2367},{},[2359],{"type":27,"value":2360,"position":2361},"param(...)",{"start":2362,"end":2365},{"line":2363,"column":21,"offset":2364},161,5213,{"line":2363,"column":110,"offset":2366},5225,{"start":2368,"end":2369},{"line":2363,"column":21,"offset":2364},{"line":2363,"column":110,"offset":2366},{"type":27,"value":1235,"position":2371},{"start":2372,"end":2373},{"line":2363,"column":110,"offset":2366},{"line":2363,"column":160,"offset":2374},5227,{"type":31,"tagName":45,"properties":2376,"children":2377,"position":2384},{},[2378],{"type":27,"value":2379,"position":2380},"input(...)",{"start":2381,"end":2382},{"line":2363,"column":160,"offset":2374},{"line":2363,"column":641,"offset":2383},5239,{"start":2385,"end":2386},{"line":2363,"column":160,"offset":2374},{"line":2363,"column":641,"offset":2383},{"type":27,"value":1235,"position":2388},{"start":2389,"end":2390},{"line":2363,"column":641,"offset":2383},{"line":2363,"column":2391,"offset":2392},29,5241,{"type":31,"tagName":45,"properties":2394,"children":2395,"position":2402},{},[2396],{"type":27,"value":2397,"position":2398},"output(...)",{"start":2399,"end":2400},{"line":2363,"column":2391,"offset":2392},{"line":2363,"column":2306,"offset":2401},5254,{"start":2403,"end":2404},{"line":2363,"column":2391,"offset":2392},{"line":2363,"column":2306,"offset":2401},{"type":27,"value":1235,"position":2406},{"start":2407,"end":2408},{"line":2363,"column":2306,"offset":2401},{"line":2363,"column":42,"offset":2409},5256,{"type":31,"tagName":45,"properties":2411,"children":2412,"position":2419},{},[2413],{"type":27,"value":2414,"position":2415},"box(...)",{"start":2416,"end":2417},{"line":2363,"column":42,"offset":2409},{"line":2363,"column":53,"offset":2418},5266,{"start":2420,"end":2421},{"line":2363,"column":42,"offset":2409},{"line":2363,"column":53,"offset":2418},{"type":27,"value":2423,"position":2424},", and the rest are\ntop-level statements of the file; the build reads them without running the\ncode. One inside a function is a named build error:",{"start":2425,"end":2426},{"line":2363,"column":53,"offset":2418},{"line":2427,"column":2428,"offset":2429},163,52,5411,{"start":2431,"end":2432},{"line":2363,"column":21,"offset":2364},{"line":2427,"column":2428,"offset":2429},{"type":27,"value":28},{"type":14,"children":2435},[2436],{"type":31,"tagName":343,"properties":2437,"children":2438,"data":-1},{"class":345,"style":346,"tabindex":347},[2439],{"type":31,"tagName":45,"properties":2440,"children":2442},{"class":2441},[352],[2443],{"type":31,"tagName":355,"properties":2444,"children":2445},{"class":357},[2446],{"type":31,"tagName":355,"properties":2447,"children":2448},{},[2449],{"type":27,"value":2450},"output(...) declarations must be top-level statements, not inside a function, class, or expression",{"type":27,"value":28},{"type":31,"tagName":32,"properties":2453,"children":2454,"position":2464},{},[2455],{"type":27,"value":2456,"position":2457},"Pass an input's value in as an argument instead:",{"start":2458,"end":2461},{"line":2459,"column":21,"offset":2460},169,5525,{"line":2459,"column":2462,"offset":2463},49,5573,{"start":2465,"end":2466},{"line":2459,"column":21,"offset":2460},{"line":2459,"column":2462,"offset":2463},{"type":27,"value":28},{"type":14,"children":2469},[2470],{"type":31,"tagName":343,"properties":2471,"children":2472,"data":-1},{"class":345,"style":346,"tabindex":347},[2473],{"type":31,"tagName":45,"properties":2474,"children":2476},{"class":2475},[352],[2477,2485,2486,2494,2495,2503,2504,2512,2513,2520,2521,2528,2529,2537,2538,2546,2547,2555,2556],{"type":31,"tagName":355,"properties":2478,"children":2479},{"class":357},[2480],{"type":31,"tagName":355,"properties":2481,"children":2482},{},[2483],{"type":27,"value":2484},"// Invalid",{"type":27,"value":28},{"type":31,"tagName":355,"properties":2487,"children":2488},{"class":357},[2489],{"type":31,"tagName":355,"properties":2490,"children":2491},{},[2492],{"type":27,"value":2493},"function bad(): f64 {",{"type":27,"value":28},{"type":31,"tagName":355,"properties":2496,"children":2497},{"class":357},[2498],{"type":31,"tagName":355,"properties":2499,"children":2500},{},[2501],{"type":27,"value":2502},"  input(\"close\", ohlcv.close);   // a declaration cannot live here",{"type":27,"value":28},{"type":31,"tagName":355,"properties":2505,"children":2506},{"class":357},[2507],{"type":31,"tagName":355,"properties":2508,"children":2509},{},[2510],{"type":27,"value":2511},"  return 0.0;",{"type":27,"value":28},{"type":31,"tagName":355,"properties":2514,"children":2515},{"class":357},[2516],{"type":31,"tagName":355,"properties":2517,"children":2518},{},[2519],{"type":27,"value":390},{"type":27,"value":28},{"type":31,"tagName":355,"properties":2522,"children":2523},{"class":357},[2524],{"type":31,"tagName":355,"properties":2525,"children":2526},{},[2527],{"type":27,"value":522},{"type":27,"value":28},{"type":31,"tagName":355,"properties":2530,"children":2531},{"class":357},[2532],{"type":31,"tagName":355,"properties":2533,"children":2534},{},[2535],{"type":27,"value":2536},"// Valid: declare at the top level, pass the value",{"type":27,"value":28},{"type":31,"tagName":355,"properties":2539,"children":2540},{"class":357},[2541],{"type":31,"tagName":355,"properties":2542,"children":2543},{},[2544],{"type":27,"value":2545},"function good(close: f64, avg: f64): f64 {",{"type":27,"value":28},{"type":31,"tagName":355,"properties":2548,"children":2549},{"class":357},[2550],{"type":31,"tagName":355,"properties":2551,"children":2552},{},[2553],{"type":27,"value":2554},"  return close - avg;",{"type":27,"value":28},{"type":31,"tagName":355,"properties":2557,"children":2558},{"class":357},[2559],{"type":31,"tagName":355,"properties":2560,"children":2561},{},[2562],{"type":27,"value":390},{"type":27,"value":28},{"type":31,"tagName":324,"properties":2565,"children":2566,"position":2575},{},[2567],{"type":27,"value":2568,"position":2569},"No locals from the outside",{"start":2570,"end":2573},{"line":2571,"column":39,"offset":2572},184,5827,{"line":2571,"column":399,"offset":2574},5853,{"start":2576,"end":2578},{"line":2571,"column":21,"offset":2577},5823,{"line":2571,"column":399,"offset":2574},{"type":27,"value":28},{"type":31,"tagName":32,"properties":2581,"children":2582,"position":2611},{},[2583,2592,2604],{"type":27,"value":2584,"position":2585},"A function reads its parameters and module-level state. An inner function\nor arrow that reads a local of the function around it is refused with\n",{"start":2586,"end":2589},{"line":2587,"column":21,"offset":2588},186,5855,{"line":2590,"column":21,"offset":2591},188,5999,{"type":31,"tagName":45,"properties":2593,"children":2594,"position":2601},{},[2595],{"type":27,"value":2596,"position":2597},"AS100: Not implemented: Closures",{"start":2598,"end":2599},{"line":2590,"column":21,"offset":2591},{"line":2590,"column":455,"offset":2600},6033,{"start":2602,"end":2603},{"line":2590,"column":21,"offset":2591},{"line":2590,"column":455,"offset":2600},{"type":27,"value":2605,"position":2606},". Move the value to module scope or pass\nit as a parameter.",{"start":2607,"end":2608},{"line":2590,"column":455,"offset":2600},{"line":2609,"column":552,"offset":2610},189,6092,{"start":2612,"end":2613},{"line":2587,"column":21,"offset":2588},{"line":2609,"column":552,"offset":2610},{"type":27,"value":28},{"type":31,"tagName":324,"properties":2616,"children":2617,"position":2626},{},[2618],{"type":27,"value":2619,"position":2620},"Allocation is once, not per call",{"start":2621,"end":2624},{"line":2622,"column":39,"offset":2623},191,6098,{"line":2622,"column":432,"offset":2625},6130,{"start":2627,"end":2629},{"line":2622,"column":21,"offset":2628},6094,{"line":2622,"column":432,"offset":2625},{"type":27,"value":28},{"type":31,"tagName":32,"properties":2632,"children":2633,"position":2697},{},[2634,2642,2653,2659,2671,2678,2690],{"type":27,"value":2635,"position":2636},"A function called in ",{"start":2637,"end":2640},{"line":2638,"column":21,"offset":2639},193,6132,{"line":2638,"column":331,"offset":2641},6153,{"type":31,"tagName":45,"properties":2643,"children":2644,"position":2650},{},[2645],{"type":27,"value":979,"position":2646},{"start":2647,"end":2648},{"line":2638,"column":331,"offset":2641},{"line":2638,"column":399,"offset":2649},6162,{"start":2651,"end":2652},{"line":2638,"column":331,"offset":2641},{"line":2638,"column":399,"offset":2649},{"type":27,"value":2654,"position":2655}," runs on every bar. A ",{"start":2656,"end":2657},{"line":2638,"column":399,"offset":2649},{"line":2638,"column":570,"offset":2658},6184,{"type":31,"tagName":45,"properties":2660,"children":2661,"position":2668},{},[2662],{"type":27,"value":2663,"position":2664},"new",{"start":2665,"end":2666},{"line":2638,"column":570,"offset":2658},{"line":2638,"column":657,"offset":2667},6189,{"start":2669,"end":2670},{"line":2638,"column":570,"offset":2658},{"line":2638,"column":657,"offset":2667},{"type":27,"value":2672,"position":2673}," inside it (a\nclass, an array, a string built with ",{"start":2674,"end":2675},{"line":2638,"column":657,"offset":2667},{"line":2676,"column":442,"offset":2677},194,6240,{"type":31,"tagName":45,"properties":2679,"children":2680,"position":2687},{},[2681],{"type":27,"value":2682,"position":2683},"+",{"start":2684,"end":2685},{"line":2676,"column":442,"offset":2677},{"line":2676,"column":64,"offset":2686},6243,{"start":2688,"end":2689},{"line":2676,"column":442,"offset":2677},{"line":2676,"column":64,"offset":2686},{"type":27,"value":2691,"position":2692},") allocates memory the module never\nfrees. Helpers on the per-bar path take and return numbers, or write into\nbuffers allocated at module scope.",{"start":2693,"end":2694},{"line":2676,"column":64,"offset":2686},{"line":2695,"column":455,"offset":2696},196,6387,{"start":2698,"end":2699},{"line":2638,"column":21,"offset":2639},{"line":2695,"column":455,"offset":2696},{"type":27,"value":28},{"type":31,"tagName":324,"properties":2702,"children":2703,"position":2712},{},[2704],{"type":27,"value":2705,"position":2706},"Types everywhere",{"start":2707,"end":2710},{"line":2708,"column":39,"offset":2709},198,6393,{"line":2708,"column":794,"offset":2711},6409,{"start":2713,"end":2715},{"line":2708,"column":21,"offset":2714},6389,{"line":2708,"column":794,"offset":2711},{"type":27,"value":28},{"type":31,"tagName":32,"properties":2718,"children":2719,"position":2765},{},[2720,2729,2740,2747,2759],{"type":27,"value":2721,"position":2722},"Parameter types and the return type are required; there is no inference\nfrom usage. A function meant for both a price and a count is written for\n",{"start":2723,"end":2726},{"line":2724,"column":21,"offset":2725},200,6411,{"line":2727,"column":21,"offset":2728},202,6556,{"type":31,"tagName":45,"properties":2730,"children":2731,"position":2737},{},[2732],{"type":27,"value":677,"position":2733},{"start":2734,"end":2735},{"line":2727,"column":21,"offset":2728},{"line":2727,"column":681,"offset":2736},6561,{"start":2738,"end":2739},{"line":2727,"column":21,"offset":2728},{"line":2727,"column":681,"offset":2736},{"type":27,"value":2741,"position":2742},", and the caller casts (",{"start":2743,"end":2744},{"line":2727,"column":681,"offset":2736},{"line":2727,"column":2745,"offset":2746},30,6585,{"type":31,"tagName":45,"properties":2748,"children":2749,"position":2756},{},[2750],{"type":27,"value":2751,"position":2752},"f64(count)",{"start":2753,"end":2754},{"line":2727,"column":2745,"offset":2746},{"line":2727,"column":2306,"offset":2755},6597,{"start":2757,"end":2758},{"line":2727,"column":2745,"offset":2746},{"line":2727,"column":2306,"offset":2755},{"type":27,"value":2760,"position":2761},").",{"start":2762,"end":2763},{"line":2727,"column":2306,"offset":2755},{"line":2727,"column":42,"offset":2764},6599,{"start":2766,"end":2767},{"line":2724,"column":21,"offset":2725},{"line":2727,"column":42,"offset":2764},{"type":27,"value":28},{"type":31,"tagName":324,"properties":2770,"children":2771,"position":2781},{},[2772],{"type":27,"value":2773,"position":2774},"Phase rules still apply inside functions",{"start":2775,"end":2778},{"line":2776,"column":39,"offset":2777},204,6605,{"line":2776,"column":2779,"offset":2780},45,6645,{"start":2782,"end":2784},{"line":2776,"column":21,"offset":2783},6601,{"line":2776,"column":2779,"offset":2780},{"type":27,"value":28},{"type":31,"tagName":32,"properties":2787,"children":2788,"position":2955},{},[2789,2803,2810,2822,2829,2841,2847,2859,2865,2877,2883,2894,2900,2911,2918,2930,2937,2948],{"type":31,"tagName":45,"properties":2790,"children":2791,"position":2800},{},[2792],{"type":27,"value":2793,"position":2794},"p_\u003Cparam>()",{"start":2795,"end":2798},{"line":2796,"column":21,"offset":2797},206,6647,{"line":2796,"column":168,"offset":2799},6660,{"start":2801,"end":2802},{"line":2796,"column":21,"offset":2797},{"line":2796,"column":168,"offset":2799},{"type":27,"value":2804,"position":2805}," reads its value from ",{"start":2806,"end":2807},{"line":2796,"column":168,"offset":2799},{"line":2796,"column":2808,"offset":2809},36,6682,{"type":31,"tagName":45,"properties":2811,"children":2812,"position":2819},{},[2813],{"type":27,"value":2814,"position":2815},"onStart()",{"start":2816,"end":2817},{"line":2796,"column":2808,"offset":2809},{"line":2796,"column":992,"offset":2818},6693,{"start":2820,"end":2821},{"line":2796,"column":2808,"offset":2809},{"line":2796,"column":992,"offset":2818},{"type":27,"value":2823,"position":2824}," on (at module start it\nreturns ",{"start":2825,"end":2826},{"line":2796,"column":992,"offset":2818},{"line":2827,"column":63,"offset":2828},207,6725,{"type":31,"tagName":45,"properties":2830,"children":2831,"position":2838},{},[2832],{"type":27,"value":2833,"position":2834},"NaN",{"start":2835,"end":2836},{"line":2827,"column":63,"offset":2828},{"line":2827,"column":168,"offset":2837},6730,{"start":2839,"end":2840},{"line":2827,"column":63,"offset":2828},{"line":2827,"column":168,"offset":2837},{"type":27,"value":2842,"position":2843},"), ",{"start":2844,"end":2845},{"line":2827,"column":168,"offset":2837},{"line":2827,"column":235,"offset":2846},6733,{"type":31,"tagName":45,"properties":2848,"children":2849,"position":2856},{},[2850],{"type":27,"value":2851,"position":2852},"in_\u003Cinput>()",{"start":2853,"end":2854},{"line":2827,"column":235,"offset":2846},{"line":2827,"column":399,"offset":2855},6747,{"start":2857,"end":2858},{"line":2827,"column":235,"offset":2846},{"line":2827,"column":399,"offset":2855},{"type":27,"value":2860,"position":2861}," and ",{"start":2862,"end":2863},{"line":2827,"column":399,"offset":2855},{"line":2827,"column":2808,"offset":2864},6752,{"type":31,"tagName":45,"properties":2866,"children":2867,"position":2874},{},[2868],{"type":27,"value":2869,"position":2870},"bar.*()",{"start":2871,"end":2872},{"line":2827,"column":2808,"offset":2864},{"line":2827,"column":2779,"offset":2873},6761,{"start":2875,"end":2876},{"line":2827,"column":2808,"offset":2864},{"line":2827,"column":2779,"offset":2873},{"type":27,"value":2878,"position":2879}," from ",{"start":2880,"end":2881},{"line":2827,"column":2779,"offset":2873},{"line":2827,"column":549,"offset":2882},6767,{"type":31,"tagName":45,"properties":2884,"children":2885,"position":2891},{},[2886],{"type":27,"value":979,"position":2887},{"start":2888,"end":2889},{"line":2827,"column":549,"offset":2882},{"line":2827,"column":730,"offset":2890},6776,{"start":2892,"end":2893},{"line":2827,"column":549,"offset":2882},{"line":2827,"column":730,"offset":2890},{"type":27,"value":2895,"position":2896}," on (",{"start":2897,"end":2898},{"line":2827,"column":730,"offset":2890},{"line":2827,"column":779,"offset":2899},6781,{"type":31,"tagName":45,"properties":2901,"children":2902,"position":2908},{},[2903],{"type":27,"value":2833,"position":2904},{"start":2905,"end":2906},{"line":2827,"column":779,"offset":2899},{"line":2827,"column":291,"offset":2907},6786,{"start":2909,"end":2910},{"line":2827,"column":779,"offset":2899},{"line":2827,"column":291,"offset":2907},{"type":27,"value":2912,"position":2913},"\nbefore the first bar), and an ",{"start":2914,"end":2915},{"line":2827,"column":291,"offset":2907},{"line":2916,"column":399,"offset":2917},208,6817,{"type":31,"tagName":45,"properties":2919,"children":2920,"position":2927},{},[2921],{"type":27,"value":2922,"position":2923},"out_\u003Coutput>()",{"start":2924,"end":2925},{"line":2916,"column":399,"offset":2917},{"line":2916,"column":992,"offset":2926},6833,{"start":2928,"end":2929},{"line":2916,"column":399,"offset":2917},{"line":2916,"column":992,"offset":2926},{"type":27,"value":2931,"position":2932}," write reaches the row only\nfrom ",{"start":2933,"end":2934},{"line":2916,"column":992,"offset":2926},{"line":2935,"column":681,"offset":2936},209,6866,{"type":31,"tagName":45,"properties":2938,"children":2939,"position":2945},{},[2940],{"type":27,"value":979,"position":2941},{"start":2942,"end":2943},{"line":2935,"column":681,"offset":2936},{"line":2935,"column":160,"offset":2944},6875,{"start":2946,"end":2947},{"line":2935,"column":681,"offset":2936},{"line":2935,"column":160,"offset":2944},{"type":27,"value":2949,"position":2950},"; a helper inherits the phase of its caller, so keep helpers\npure and let the hooks read and write.",{"start":2951,"end":2952},{"line":2935,"column":160,"offset":2944},{"line":2953,"column":701,"offset":2954},210,6974,{"start":2956,"end":2957},{"line":2796,"column":21,"offset":2797},{"line":2953,"column":701,"offset":2954},{"type":27,"value":28},{"type":31,"tagName":71,"properties":2960,"children":2961,"position":2970},{},[2962],{"type":27,"value":2963,"position":2964},"Best practices",{"start":2965,"end":2968},{"line":2966,"column":79,"offset":2967},212,6979,{"line":2966,"column":251,"offset":2969},6993,{"start":2971,"end":2973},{"line":2966,"column":21,"offset":2972},6976,{"line":2966,"column":251,"offset":2969},{"type":27,"value":28},{"type":31,"tagName":2976,"properties":2977,"children":2978,"position":3408},"ul",{},[2979,2980,3099,3100,3202,3203,3233,3234,3407],{"type":27,"value":28},{"type":31,"tagName":2981,"properties":2982,"children":2983,"position":3095},"li",{},[2984,3001,3007,3019,3025,3036,3041,3053,3059,3071,3078,3090],{"type":31,"tagName":563,"properties":2985,"children":2986,"position":2996},{},[2987],{"type":27,"value":2988,"position":2989},"Keep functions focused.",{"start":2990,"end":2993},{"line":2991,"column":39,"offset":2992},214,6999,{"line":2991,"column":2994,"offset":2995},28,7022,{"start":2997,"end":2999},{"line":2991,"column":111,"offset":2998},6997,{"line":2991,"column":2745,"offset":3000},7024,{"type":27,"value":3002,"position":3003}," One thing per function: ",{"start":3004,"end":3005},{"line":2991,"column":2745,"offset":3000},{"line":2991,"column":584,"offset":3006},7049,{"type":31,"tagName":45,"properties":3008,"children":3009,"position":3016},{},[3010],{"type":27,"value":3011,"position":3012},"rsiZone(rsiValue: f64): f64",{"start":3013,"end":3014},{"line":2991,"column":584,"offset":3006},{"line":54,"column":110,"offset":3015},7080,{"start":3017,"end":3018},{"line":2991,"column":584,"offset":3006},{"line":54,"column":110,"offset":3015},{"type":27,"value":3020,"position":3021}," returns ",{"start":3022,"end":3023},{"line":54,"column":110,"offset":3015},{"line":54,"column":331,"offset":3024},7089,{"type":31,"tagName":45,"properties":3026,"children":3027,"position":3033},{},[3028],{"type":27,"value":347,"position":3029},{"start":3030,"end":3031},{"line":54,"column":331,"offset":3024},{"line":54,"column":956,"offset":3032},7092,{"start":3034,"end":3035},{"line":54,"column":331,"offset":3024},{"line":54,"column":956,"offset":3032},{"type":27,"value":1235,"position":3037},{"start":3038,"end":3039},{"line":54,"column":956,"offset":3032},{"line":54,"column":641,"offset":3040},7094,{"type":31,"tagName":45,"properties":3042,"children":3043,"position":3050},{},[3044],{"type":27,"value":3045,"position":3046},"1",{"start":3047,"end":3048},{"line":54,"column":641,"offset":3040},{"line":54,"column":2745,"offset":3049},7097,{"start":3051,"end":3052},{"line":54,"column":641,"offset":3040},{"line":54,"column":2745,"offset":3049},{"type":27,"value":3054,"position":3055},", or ",{"start":3056,"end":3057},{"line":54,"column":2745,"offset":3049},{"line":54,"column":455,"offset":3058},7102,{"type":31,"tagName":45,"properties":3060,"children":3061,"position":3068},{},[3062],{"type":27,"value":3063,"position":3064},"2",{"start":3065,"end":3066},{"line":54,"column":455,"offset":3058},{"line":54,"column":442,"offset":3067},7105,{"start":3069,"end":3070},{"line":54,"column":455,"offset":3058},{"line":54,"column":442,"offset":3067},{"type":27,"value":3072,"position":3073},"; the output write stays in\n",{"start":3074,"end":3075},{"line":54,"column":442,"offset":3067},{"line":3076,"column":21,"offset":3077},216,7133,{"type":31,"tagName":45,"properties":3079,"children":3080,"position":3087},{},[3081],{"type":27,"value":979,"position":3082},{"start":3083,"end":3085},{"line":3076,"column":111,"offset":3084},7135,{"line":3076,"column":82,"offset":3086},7144,{"start":3088,"end":3089},{"line":3076,"column":111,"offset":3084},{"line":3076,"column":82,"offset":3086},{"type":27,"value":438,"position":3091},{"start":3092,"end":3093},{"line":3076,"column":82,"offset":3086},{"line":3076,"column":110,"offset":3094},7145,{"start":3096,"end":3098},{"line":2991,"column":21,"offset":3097},6995,{"line":3076,"column":110,"offset":3094},{"type":27,"value":28},{"type":31,"tagName":2981,"properties":3101,"children":3102,"position":3198},{},[3103,3119,3125,3137,3144,3157,3163,3175,3181,3193],{"type":31,"tagName":563,"properties":3104,"children":3105,"position":3114},{},[3106],{"type":27,"value":3107,"position":3108},"Use descriptive names.",{"start":3109,"end":3112},{"line":3110,"column":39,"offset":3111},217,7150,{"line":3110,"column":641,"offset":3113},7172,{"start":3115,"end":3117},{"line":3110,"column":111,"offset":3116},7148,{"line":3110,"column":2391,"offset":3118},7174,{"type":27,"value":3120,"position":3121}," ",{"start":3122,"end":3123},{"line":3110,"column":2391,"offset":3118},{"line":3110,"column":2745,"offset":3124},7175,{"type":31,"tagName":45,"properties":3126,"children":3127,"position":3134},{},[3128],{"type":27,"value":3129,"position":3130},"isOverbought(rsiValue)",{"start":3131,"end":3132},{"line":3110,"column":2745,"offset":3124},{"line":3110,"column":53,"offset":3133},7199,{"start":3135,"end":3136},{"line":3110,"column":2745,"offset":3124},{"line":3110,"column":53,"offset":3133},{"type":27,"value":3138,"position":3139},",\n",{"start":3140,"end":3141},{"line":3110,"column":53,"offset":3133},{"line":3142,"column":21,"offset":3143},218,7201,{"type":31,"tagName":45,"properties":3145,"children":3146,"position":3154},{},[3147],{"type":27,"value":3148,"position":3149},"percentChange(oldValue, newValue)",{"start":3150,"end":3152},{"line":3142,"column":111,"offset":3151},7203,{"line":3142,"column":442,"offset":3153},7238,{"start":3155,"end":3156},{"line":3142,"column":111,"offset":3151},{"line":3142,"column":442,"offset":3153},{"type":27,"value":3158,"position":3159},"; not ",{"start":3160,"end":3161},{"line":3142,"column":442,"offset":3153},{"line":3142,"column":42,"offset":3162},7244,{"type":31,"tagName":45,"properties":3164,"children":3165,"position":3172},{},[3166],{"type":27,"value":3167,"position":3168},"calc(a, b)",{"start":3169,"end":3170},{"line":3142,"column":42,"offset":3162},{"line":3142,"column":623,"offset":3171},7256,{"start":3173,"end":3174},{"line":3142,"column":42,"offset":3162},{"line":3142,"column":623,"offset":3171},{"type":27,"value":3176,"position":3177}," or ",{"start":3178,"end":3179},{"line":3142,"column":623,"offset":3171},{"line":3142,"column":730,"offset":3180},7260,{"type":31,"tagName":45,"properties":3182,"children":3183,"position":3190},{},[3184],{"type":27,"value":3185,"position":3186},"check(x)",{"start":3187,"end":3188},{"line":3142,"column":730,"offset":3180},{"line":3142,"column":291,"offset":3189},7270,{"start":3191,"end":3192},{"line":3142,"column":730,"offset":3180},{"line":3142,"column":291,"offset":3189},{"type":27,"value":438,"position":3194},{"start":3195,"end":3196},{"line":3142,"column":291,"offset":3189},{"line":3142,"column":731,"offset":3197},7271,{"start":3199,"end":3201},{"line":3110,"column":21,"offset":3200},7146,{"line":3142,"column":731,"offset":3197},{"type":27,"value":28},{"type":31,"tagName":2981,"properties":3204,"children":3205,"position":3229},{},[3206,3222],{"type":31,"tagName":563,"properties":3207,"children":3208,"position":3217},{},[3209],{"type":27,"value":3210,"position":3211},"Prefer parameters to module state for pure math.",{"start":3212,"end":3215},{"line":3213,"column":39,"offset":3214},219,7276,{"line":3213,"column":570,"offset":3216},7324,{"start":3218,"end":3220},{"line":3213,"column":111,"offset":3219},7274,{"line":3213,"column":584,"offset":3221},7326,{"type":27,"value":3223,"position":3224}," A function that\ntakes everything it needs is reusable across indicators by pasting; a\nfunction that reaches into module state is tied to this file. Reserve\nmodule-state reads for predicates you pass as values.",{"start":3225,"end":3226},{"line":3213,"column":584,"offset":3221},{"line":3227,"column":623,"offset":3228},222,7542,{"start":3230,"end":3232},{"line":3213,"column":21,"offset":3231},7272,{"line":3227,"column":623,"offset":3228},{"type":27,"value":28},{"type":31,"tagName":2981,"properties":3235,"children":3236,"position":3403},{},[3237,3253,3260,3273,3279,3291,3296,3308,3313,3325,3330,3342,3349,3362,3367,3379,3384,3396],{"type":31,"tagName":563,"properties":3238,"children":3239,"position":3248},{},[3240],{"type":27,"value":3241,"position":3242},"Turn a family of helpers into a class",{"start":3243,"end":3246},{"line":3244,"column":39,"offset":3245},223,7547,{"line":3244,"column":2306,"offset":3247},7584,{"start":3249,"end":3251},{"line":3244,"column":111,"offset":3250},7545,{"line":3244,"column":42,"offset":3252},7586,{"type":27,"value":3254,"position":3255}," when they share state: a\n",{"start":3256,"end":3257},{"line":3244,"column":42,"offset":3252},{"line":3258,"column":21,"offset":3259},224,7612,{"type":31,"tagName":45,"properties":3261,"children":3262,"position":3270},{},[3263],{"type":27,"value":3264,"position":3265},"Window",{"start":3266,"end":3268},{"line":3258,"column":111,"offset":3267},7614,{"line":3258,"column":78,"offset":3269},7622,{"start":3271,"end":3272},{"line":3258,"column":111,"offset":3267},{"line":3258,"column":78,"offset":3269},{"type":27,"value":3274,"position":3275}," with ",{"start":3276,"end":3277},{"line":3258,"column":78,"offset":3269},{"line":3258,"column":235,"offset":3278},7628,{"type":31,"tagName":45,"properties":3280,"children":3281,"position":3288},{},[3282],{"type":27,"value":3283,"position":3284},"sum()",{"start":3285,"end":3286},{"line":3258,"column":235,"offset":3278},{"line":3258,"column":130,"offset":3287},7635,{"start":3289,"end":3290},{"line":3258,"column":235,"offset":3278},{"line":3258,"column":130,"offset":3287},{"type":27,"value":1235,"position":3292},{"start":3293,"end":3294},{"line":3258,"column":130,"offset":3287},{"line":3258,"column":135,"offset":3295},7637,{"type":31,"tagName":45,"properties":3297,"children":3298,"position":3305},{},[3299],{"type":27,"value":3300,"position":3301},"avg()",{"start":3302,"end":3303},{"line":3258,"column":135,"offset":3295},{"line":3258,"column":413,"offset":3304},7644,{"start":3306,"end":3307},{"line":3258,"column":135,"offset":3295},{"line":3258,"column":413,"offset":3304},{"type":27,"value":2182,"position":3309},{"start":3310,"end":3311},{"line":3258,"column":413,"offset":3304},{"line":3258,"column":701,"offset":3312},7650,{"type":31,"tagName":45,"properties":3314,"children":3315,"position":3322},{},[3316],{"type":27,"value":3317,"position":3318},"median()",{"start":3319,"end":3320},{"line":3258,"column":701,"offset":3312},{"line":3258,"column":2462,"offset":3321},7660,{"start":3323,"end":3324},{"line":3258,"column":701,"offset":3312},{"line":3258,"column":2462,"offset":3321},{"type":27,"value":2048,"position":3326},{"start":3327,"end":3328},{"line":3258,"column":2462,"offset":3321},{"line":3258,"column":549,"offset":3329},7662,{"type":31,"tagName":45,"properties":3331,"children":3332,"position":3339},{},[3333],{"type":27,"value":3334,"position":3335},"collections.md",{"start":3336,"end":3337},{"line":3258,"column":549,"offset":3329},{"line":3258,"column":808,"offset":3338},7678,{"start":3340,"end":3341},{"line":3258,"column":549,"offset":3329},{"line":3258,"column":808,"offset":3338},{"type":27,"value":3343,"position":3344},"), a\n",{"start":3345,"end":3346},{"line":3258,"column":808,"offset":3338},{"line":3347,"column":21,"offset":3348},225,7683,{"type":31,"tagName":45,"properties":3350,"children":3351,"position":3359},{},[3352],{"type":27,"value":3353,"position":3354},"Macd",{"start":3355,"end":3357},{"line":3347,"column":111,"offset":3356},7685,{"line":3347,"column":63,"offset":3358},7691,{"start":3360,"end":3361},{"line":3347,"column":111,"offset":3356},{"line":3347,"column":63,"offset":3358},{"type":27,"value":3274,"position":3363},{"start":3364,"end":3365},{"line":3347,"column":63,"offset":3358},{"line":3347,"column":160,"offset":3366},7697,{"type":31,"tagName":45,"properties":3368,"children":3369,"position":3376},{},[3370],{"type":27,"value":3371,"position":3372},"update()",{"start":3373,"end":3374},{"line":3347,"column":160,"offset":3366},{"line":3347,"column":956,"offset":3375},7707,{"start":3377,"end":3378},{"line":3347,"column":160,"offset":3366},{"line":3347,"column":956,"offset":3375},{"type":27,"value":2048,"position":3380},{"start":3381,"end":3382},{"line":3347,"column":956,"offset":3375},{"line":3347,"column":641,"offset":3383},7709,{"type":31,"tagName":45,"properties":3385,"children":3386,"position":3393},{},[3387],{"type":27,"value":3388,"position":3389},"named-streams.md",{"start":3390,"end":3391},{"line":3347,"column":641,"offset":3383},{"line":3347,"column":2779,"offset":3392},7727,{"start":3394,"end":3395},{"line":3347,"column":641,"offset":3383},{"line":3347,"column":2779,"offset":3392},{"type":27,"value":3397,"position":3398},"). Helpers that share nothing\nstay functions.",{"start":3399,"end":3400},{"line":3347,"column":2779,"offset":3392},{"line":3401,"column":251,"offset":3402},226,7774,{"start":3404,"end":3406},{"line":3244,"column":21,"offset":3405},7543,{"line":3401,"column":251,"offset":3402},{"type":27,"value":28},{"start":3409,"end":3410},{"line":2991,"column":21,"offset":3097},{"line":3401,"column":251,"offset":3402},{"quirksMode":3412},false,{"start":3414,"end":3415},{"line":21,"column":21,"offset":22},{"line":3416,"column":21,"offset":3417},227,7775,1791265219238]