(window.webpackJsonp=window.webpackJsonp||[]).push([[61],{LEBU:function(e,t,n){"use strict";n.r(t),n.d(t,"_frontmatter",(function(){return i})),n.d(t,"default",(function(){return d}));var a=n("Fcif"),l=n("dV/x"),b=(n("mXGw"),n("/FXl")),r=n("TjRS");n("l1C2");const c=["components"],i={};void 0!==i&&i&&i===Object(i)&&Object.isExtensible(i)&&!Object.prototype.hasOwnProperty.call(i,"__filemeta")&&Object.defineProperty(i,"__filemeta",{configurable:!0,value:{name:"_frontmatter",filename:"src/components/uk/Scripting.mdx"}});const o={_frontmatter:i},p=r.a;function d(e){let{components:t}=e,n=Object(l.a)(e,c);return Object(b.b)(p,Object(a.a)({},o,n,{components:t,mdxType:"MDXLayout"}),Object(b.b)("h1",{id:"-api-для-користувацьких-індикаторів"},"📘 API для користувацьких індикаторів"),Object(b.b)("h2",{id:"-ші-для-генерації-користувацьких-індикаторів"},"🤖 ШІ для генерації користувацьких індикаторів"),Object(b.b)("p",null,"Використовуйте наступний документ із ChatGPT, Claude, Gemini або іншими ШІ-моделями для генерації користувацьких індикаторів для MobChart."),Object(b.b)("p",null,"👉 ",Object(b.b)("a",{parentName:"p",href:"../../public/AI.txt"},"AI.txt")),Object(b.b)("p",null,"Приклад запиту:"),Object(b.b)("pre",null,Object(b.b)("code",{parentName:"pre",className:"language-text"},"Прочитай прикріплений файл AI.txt:\nhttps://mobchart.com/docs/public/AI.txt\n\nВикористовуй його як єдине джерело інформації про API скриптингу MobChart.\n\nСтвори користувацький індикатор, який відображає EMA з періодами 20 і 50 на графіку. Зафарбуй свічки в зелений колір, якщо EMA20 знаходиться вище EMA50, і в червоний — в іншому випадку.\n\nВикористовуй лише документований API. Не вигадуй функції. Поверни повний код індикатора.\n")),Object(b.b)("h2",{id:"-принципи-безпеки-та-поточні-обмеження"},"🔒 Принципи безпеки та поточні обмеження"),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},"Середовище виконання скриптів побудоване на безпечній JavaScript-пісочниці. "),Object(b.b)("li",{parentName:"ul"},"На виконання вашого скрипту виділяється ",Object(b.b)("inlineCode",{parentName:"li"},"1500ms"),"."),Object(b.b)("li",{parentName:"ul"},"Довжина масиву повернених даних ",Object(b.b)("strong",{parentName:"li"},"не більше 1500"),". Таким чином, індикатор не може поширюватися глибше ніж на ",Object(b.b)("strong",{parentName:"li"},"1500 свічок"),"."),Object(b.b)("li",{parentName:"ul"},"Доступно ",Object(b.b)("strong",{parentName:"li"},"8 звернення")," до джерела даних у межах одного індикатора.")),Object(b.b)("hr",null),Object(b.b)("h2",{id:"️-розробка-індикатора"},"⚒️ Розробка індикатора"),Object(b.b)("p",null,"Розробка індикатора ведеться всередині окремого віджета, який може розташовуватися поруч із графіком, у якому буде ввімкнено даний індикатор."),Object(b.b)("img",{src:"../../public/code_chart_widgets.png"}),Object(b.b)("hr",null),Object(b.b)("h2",{id:"-створення-індикатора"},"🧭 Створення індикатора"),Object(b.b)("h3",{id:"definetitle-description-type-ispublic-ispubliccode"},Object(b.b)("inlineCode",{parentName:"h3"},"define(title, description, type, isPublic, isPublicCode)")),Object(b.b)("p",null,"Реєструє індикатор у системі."),Object(b.b)("table",null,Object(b.b)("thead",{parentName:"table"},Object(b.b)("tr",{parentName:"thead"},Object(b.b)("th",{parentName:"tr",align:null},"Параметр"),Object(b.b)("th",{parentName:"tr",align:null},"Тип"),Object(b.b)("th",{parentName:"tr",align:null},"Опис"))),Object(b.b)("tbody",{parentName:"table"},Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"title")),Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"string")),Object(b.b)("td",{parentName:"tr",align:null},"Назва індикатора")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"description")),Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"string")),Object(b.b)("td",{parentName:"tr",align:null},"Короткий опис")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"type")),Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"'onchart'")," ","|"," ",Object(b.b)("inlineCode",{parentName:"td"},"'offchart'")),Object(b.b)("td",{parentName:"tr",align:null},"Розташування індикатора (на графіку або в окремій панелі)")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"isPublic")),Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"true")," ","|"," ",Object(b.b)("inlineCode",{parentName:"td"},"false")),Object(b.b)("td",{parentName:"tr",align:null},"Індикатор доступний усім")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"isPublicCode")),Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"true")," ","|"," ",Object(b.b)("inlineCode",{parentName:"td"},"false")),Object(b.b)("td",{parentName:"tr",align:null},"Вихідний код індикатора доступний усім")))),Object(b.b)("p",null,Object(b.b)("strong",{parentName:"p"},"Приклад:")),Object(b.b)("pre",null,Object(b.b)("code",{parentName:"pre",className:"language-js"},'define("My Indicator", "Shows EMA line", "onchart", true, false);\n')),Object(b.b)("hr",null),Object(b.b)("p",null,"Розташування індикаторів при ",Object(b.b)("strong",{parentName:"p"},"onchart")," та ",Object(b.b)("strong",{parentName:"p"},"offchart"),":"),Object(b.b)("img",{src:"../../public/onchart_offchart.png"}),Object(b.b)("h2",{id:"️-введення-параметрів"},"⚙️ Введення параметрів"),Object(b.b)("p",null,"Класи ",Object(b.b)("strong",{parentName:"p"},Object(b.b)("inlineCode",{parentName:"strong"},"input"))," та ",Object(b.b)("strong",{parentName:"p"},Object(b.b)("inlineCode",{parentName:"strong"},"style"))," дозволяють створювати налаштування для користувача (аналог ",Object(b.b)("inlineCode",{parentName:"p"},"input()")," у PineScript)."),Object(b.b)("table",null,Object(b.b)("thead",{parentName:"table"},Object(b.b)("tr",{parentName:"thead"},Object(b.b)("th",{parentName:"tr",align:null},"Метод"),Object(b.b)("th",{parentName:"tr",align:null},"Опис"))),Object(b.b)("tbody",{parentName:"table"},Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"number(title, defaultValue, min, max, step)")),Object(b.b)("td",{parentName:"tr",align:null},"Числове введення")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"range(title, defaultValue, min, max, step)")),Object(b.b)("td",{parentName:"tr",align:null},"Введення з діапазону")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"select(title, defaultValue, values)")),Object(b.b)("td",{parentName:"tr",align:null},"Випадний список")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"color(title, defaultValue)")),Object(b.b)("td",{parentName:"tr",align:null},"Вибір кольору")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"boolean(title, defaultValue)")),Object(b.b)("td",{parentName:"tr",align:null},"Двійкова змінна")))),Object(b.b)("p",null,Object(b.b)("strong",{parentName:"p"},"Приклад (input) для основних параметрів:")),Object(b.b)("pre",null,Object(b.b)("code",{parentName:"pre",className:"language-js"},'const length = input.number("Period", 14, 1, 100, 1);\nconst type = input.select("Type", \'sma\', [\'sma\', \'ema\']);\nconst color = input.color("Line Color", "#FF0000");\n')),Object(b.b)("p",null,Object(b.b)("strong",{parentName:"p"},"Або (style) для візуальних параметрів:")),Object(b.b)("pre",null,Object(b.b)("code",{parentName:"pre",className:"language-js"},'const length = style.number("Size", 14, 1, 100, 1);\nconst color = style.select("Background Color", \'#FF0000\', ["#FF0000", "#AA0000", "#BB0000"]);\nconst color = style.color("Background Color", "#FF0000");\n')),Object(b.b)("img",{src:"../../public/input_style.png"}),Object(b.b)("hr",null),Object(b.b)("h2",{id:"-джерела-даних"},"🧮 Джерела даних"),Object(b.b)("p",null,"Клас ",Object(b.b)("strong",{parentName:"p"},Object(b.b)("inlineCode",{parentName:"strong"},"source"))," використовується для отримання ринкових даних із серверного боку. "),Object(b.b)("p",null,"Ми ",Object(b.b)("strong",{parentName:"p"},"не завжди")," гарантуємо повну відповідність повернених даних видимим свічкам на графіку."),Object(b.b)("p",null,"Наприклад, під час виконання скрипту метод ",Object(b.b)("strong",{parentName:"p"},"ohlcv()")," може повернути 400 свічок, але лише 300 лімітних ордерів (для теплової карти) від методу ",Object(b.b)("strong",{parentName:"p"},"depths()"),".\nВикористовуйте додаткові перевірки за параметром ",Object(b.b)("strong",{parentName:"p"},Object(b.b)("inlineCode",{parentName:"strong"},"startTime"))," у своєму коді."),Object(b.b)("p",null,"Наразі довжина масиву повернених даних ",Object(b.b)("strong",{parentName:"p"},"не більше 1500"),".",Object(b.b)("br",{parentName:"p"}),"\n","Таким чином, індикатор не може поширюватися глибше ніж на ",Object(b.b)("strong",{parentName:"p"},"1500 свічок"),"."),Object(b.b)("p",null,"Наразі дозволено ",Object(b.b)("strong",{parentName:"p"},"8 звернення")," до джерела даних у межах одного індикатора."),Object(b.b)("p",null,"Параметри ",Object(b.b)("inlineCode",{parentName:"p"},"exchange"),", ",Object(b.b)("inlineCode",{parentName:"p"},"ticker"),", ",Object(b.b)("inlineCode",{parentName:"p"},"timeframe")," за замовчуванням прив’язані до поточного графіка, на якому було відкрито індикатор.",Object(b.b)("br",{parentName:"p"}),"\n","Параметр ",Object(b.b)("inlineCode",{parentName:"p"},"lookback")," (вибірка історії барів від поточної дати, але ",Object(b.b)("strong",{parentName:"p"},"не більше 1500"),") задається на ваш розсуд."),Object(b.b)("table",null,Object(b.b)("thead",{parentName:"table"},Object(b.b)("tr",{parentName:"thead"},Object(b.b)("th",{parentName:"tr",align:null},'Метод "ohlcv"'),Object(b.b)("th",{parentName:"tr",align:null},"Опис"))),Object(b.b)("tbody",{parentName:"table"},Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"ohlcv(exchange, ticker, timeframe, lookback?)")),Object(b.b)("td",{parentName:"tr",align:null},"Дані свічок")))),Object(b.b)("pre",null,Object(b.b)("code",{parentName:"pre",className:"language-js"},'[\n {\n "open": 115886.17,\n "high": 115911.96,\n "low": 115764.27,\n "close": 115815.16,\n "volume": 228.41528,\n "startTime": 1757699100000\n },\n {...},\n ...\n] \n')),Object(b.b)("table",null,Object(b.b)("thead",{parentName:"table"},Object(b.b)("tr",{parentName:"thead"},Object(b.b)("th",{parentName:"tr",align:null},'Метод "depths"'),Object(b.b)("th",{parentName:"tr",align:null},"Опис"))),Object(b.b)("tbody",{parentName:"table"},Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"depths(exchange, ticker, timeframe, lookback?)")),Object(b.b)("td",{parentName:"tr",align:null},"Лімітні заявки")))),Object(b.b)("pre",null,Object(b.b)("code",{parentName:"pre",className:"language-js"},'[\n {\n "data": {\n "asks": {\n "109425": 5.467,\n "109495": 3.564,\n ...\n },\n "bids": {\n "33000": 3.746,\n "35000": 16.49,\n ...\n }\n },\n "startTime": 1757699100000\n },\n {...},\n ...\n]\n\n')),Object(b.b)("table",null,Object(b.b)("thead",{parentName:"table"},Object(b.b)("tr",{parentName:"thead"},Object(b.b)("th",{parentName:"tr",align:null},'Метод "clusters"'),Object(b.b)("th",{parentName:"tr",align:null},"Опис"))),Object(b.b)("tbody",{parentName:"table"},Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"clusters(exchange, ticker, timeframe, lookback?)")),Object(b.b)("td",{parentName:"tr",align:null},"Кластерні дані")))),Object(b.b)("pre",null,Object(b.b)("code",{parentName:"pre",className:"language-js"},'[\n {\n "data": {\n "totalBuy": 16053385,\n "totalSell": 20490989,\n "0.8654": { "buy": 286845, "sell": 336689 },\n "0.8653": { "buy": 271848, "sell": 259167 },\n "0.8652": { "buy": 318814, "sell": 373497 },\n ...\n },\n "startTime": 1757699100000\n },\n {...},\n ...\n]\n\n')),Object(b.b)("table",null,Object(b.b)("thead",{parentName:"table"},Object(b.b)("tr",{parentName:"thead"},Object(b.b)("th",{parentName:"tr",align:null},'Метод "liquidations"'),Object(b.b)("th",{parentName:"tr",align:null},"Опис"))),Object(b.b)("tbody",{parentName:"table"},Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"liquidations(exchange, ticker, timeframe, lookback?)")),Object(b.b)("td",{parentName:"tr",align:null},"Ліквідації")))),Object(b.b)("pre",null,Object(b.b)("code",{parentName:"pre",className:"language-js"},'[\n {\n "data": {\n "totalBuy": 16053385,\n "totalSell": 20490989,\n "0.8654": { "buy": 286845, "sell": 336689 },\n "0.8653": { "buy": 271848, "sell": 259167 },\n "0.8652": { "buy": 318814, "sell": 373497 },\n ...\n },\n "startTime": 1757699100000\n },\n {...},\n ...\n]\n\n')),Object(b.b)("table",null,Object(b.b)("thead",{parentName:"table"},Object(b.b)("tr",{parentName:"thead"},Object(b.b)("th",{parentName:"tr",align:null},'Метод "moreData"'),Object(b.b)("th",{parentName:"tr",align:null},"Опис"))),Object(b.b)("tbody",{parentName:"table"},Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"moreData(exchange, ticker, timeframe, lookback?)")),Object(b.b)("td",{parentName:"tr",align:null},"Додаткові дані")))),Object(b.b)("pre",null,Object(b.b)("code",{parentName:"pre",className:"language-js"},'[\n { \n "data": {\n "FR": 0.00003777, // Funding Rate\n "OI": { // Open Interest Candle\n "open": 85645.708,\n "close": 83496.225,\n "high": 85801.04,\n "low": 83397.918\n },\n "LS": { "l": 0.5426, "s": 0.4574 }, // Long/Short Ratio\n "taLS": { "l": 0.552, "s": 0.448 }, // Top Traders Account Ratio\n "tpLS": { "l": 0.5996, "s": 0.4004 } // Top Traders Position Ratio\n },\n "startTime": 1757699100000\n },\n {...},\n ...\n]\n\n')),Object(b.b)("p",null,Object(b.b)("strong",{parentName:"p"},"Приклад:")),Object(b.b)("pre",null,Object(b.b)("code",{parentName:"pre",className:"language-js"},"const candles = source.ohlcv(); // Параметри exchange, ticker, timeframe за замовчуванням прив’язані до поточного графіка.\nconst closes = candles.map(c => c.close);\n")),Object(b.b)("hr",null),Object(b.b)("h2",{id:"-глобальні-змінні"},"🌐 Глобальні змінні"),Object(b.b)("table",null,Object(b.b)("thead",{parentName:"table"},Object(b.b)("tr",{parentName:"thead"},Object(b.b)("th",{parentName:"tr",align:null},"Змінна"),Object(b.b)("th",{parentName:"tr",align:null},"Опис"),Object(b.b)("th",{parentName:"tr",align:null},"Приклад"))),Object(b.b)("tbody",{parentName:"table"},Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"currentExchange")),Object(b.b)("td",{parentName:"tr",align:null},"Поточна біржа на графіку"),Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"binance"),", ",Object(b.b)("inlineCode",{parentName:"td"},"binanceFutures"),", ",Object(b.b)("inlineCode",{parentName:"td"},"coinbase"),", ...")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"currentTicker")),Object(b.b)("td",{parentName:"tr",align:null},"Поточний тикер на графіку (формат залежить від біржі)"),Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"BTCUSDT"),", ",Object(b.b)("inlineCode",{parentName:"td"},"ADA-USD"),", ",Object(b.b)("inlineCode",{parentName:"td"},"BTC/USDC"),", ...")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"currentTimeframe")),Object(b.b)("td",{parentName:"tr",align:null},"Поточний таймфрейм на графіку"),Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"1m"),", ",Object(b.b)("inlineCode",{parentName:"td"},"5m"),", ",Object(b.b)("inlineCode",{parentName:"td"},"15m"),", ...")))),Object(b.b)("p",null,Object(b.b)("strong",{parentName:"p"},"Приклад:")),Object(b.b)("pre",null,Object(b.b)("code",{parentName:"pre",className:"language-js"},"const candles = source.ohlcv(currentExchange, currentTicker, currentTimeframe);\nconst closes = candles.map(c => c.close);\n")),Object(b.b)("hr",null),Object(b.b)("h2",{id:"-логування"},"🧾 Логування"),Object(b.b)("p",null,"Клас ",Object(b.b)("strong",{parentName:"p"},Object(b.b)("inlineCode",{parentName:"strong"},"logger"))," використовується для виведення інформації та налагодження."),Object(b.b)("table",null,Object(b.b)("thead",{parentName:"table"},Object(b.b)("tr",{parentName:"thead"},Object(b.b)("th",{parentName:"tr",align:null},"Метод"),Object(b.b)("th",{parentName:"tr",align:null},"Опис"))),Object(b.b)("tbody",{parentName:"table"},Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"log(...args)")),Object(b.b)("td",{parentName:"tr",align:null},"Додає запис до логу (з обмеженням довжини та кількості)")))),Object(b.b)("p",null,Object(b.b)("strong",{parentName:"p"},"Приклад:")),Object(b.b)("pre",null,Object(b.b)("code",{parentName:"pre",className:"language-js"},'const candles = source.ohlcv();\nlogger.log("First candle:", candles?.[0]);\n')),Object(b.b)("img",{src:"../../public/code_editor_log.png"}),Object(b.b)("hr",null),Object(b.b)("h2",{id:"-візуалізація"},"📈 Візуалізація"),Object(b.b)("p",null,"Клас ",Object(b.b)("strong",{parentName:"p"},Object(b.b)("inlineCode",{parentName:"strong"},"plot"))," відповідає за відображення графічних елементів і серій даних."),Object(b.b)("h3",{id:"-геометричні-фігури"},"🔹 Геометричні фігури"),Object(b.b)("table",null,Object(b.b)("thead",{parentName:"table"},Object(b.b)("tr",{parentName:"thead"},Object(b.b)("th",{parentName:"tr",align:null},"Метод"),Object(b.b)("th",{parentName:"tr",align:null},"Опис"))),Object(b.b)("tbody",{parentName:"table"},Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"box(title, date1, price1, date2, price2, fill, opacity, stroke, strokeOpacity, strokeWidth)")),Object(b.b)("td",{parentName:"tr",align:null},"Прямокутник")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"square(title, date1, price1, size, fill, opacity, stroke, strokeOpacity, strokeWidth)")),Object(b.b)("td",{parentName:"tr",align:null},"Квадрат")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"diamond(title, date1, price1, size, fill, opacity, stroke, strokeOpacity, strokeWidth)")),Object(b.b)("td",{parentName:"tr",align:null},"Ромб")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"triangle(title, date1, price1, size, fill, opacity, stroke, strokeOpacity, strokeWidth)")),Object(b.b)("td",{parentName:"tr",align:null},"Трикутник")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"circle(title, date1, price1, radius = 10, fill, opacity, stroke, strokeOpacity, strokeWidth)")),Object(b.b)("td",{parentName:"tr",align:null},"Коло")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"text(title, value, date1, price1, fontSize, fill, opacity)")),Object(b.b)("td",{parentName:"tr",align:null},"Текст на графіку")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"straightLine(title, date1, price1, date2, price2, stroke, strokeOpacity, strokeWidth, strokeDasharray)")),Object(b.b)("td",{parentName:"tr",align:null},"Пряма лінія")))),Object(b.b)("table",null,Object(b.b)("thead",{parentName:"table"},Object(b.b)("tr",{parentName:"thead"},Object(b.b)("th",{parentName:"tr",align:null},"Параметр"),Object(b.b)("th",{parentName:"tr",align:null},"Тип даних"),Object(b.b)("th",{parentName:"tr",align:null},"Опис"))),Object(b.b)("tbody",{parentName:"table"},Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"title")),Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"string")),Object(b.b)("td",{parentName:"tr",align:null},"Назва елемента (унікальний ідентифікатор на графіку)")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"date1")),Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"number")," (timestamp, ms)"),Object(b.b)("td",{parentName:"tr",align:null},"Початкова часова мітка")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"price1")),Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"number")),Object(b.b)("td",{parentName:"tr",align:null},"Початкова ціна (координата по осі Y)")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"date2")),Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"number")," (timestamp, ms)"),Object(b.b)("td",{parentName:"tr",align:null},"Кінцева часова мітка (для ліній і прямокутників)")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"price2")),Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"number")),Object(b.b)("td",{parentName:"tr",align:null},"Кінцева ціна (для ліній і прямокутників)")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"size")),Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"number")),Object(b.b)("td",{parentName:"tr",align:null},"Розмір фігури (у пікселях)")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"radius")),Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"number")),Object(b.b)("td",{parentName:"tr",align:null},"Радіус кола (за замовчуванням 10)")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"fill")),Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"string")," (hex, наприклад ",Object(b.b)("inlineCode",{parentName:"td"},'"#FF0000"'),")"),Object(b.b)("td",{parentName:"tr",align:null},"Колір заливки фігури")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"opacity")),Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"number")," (0–1)"),Object(b.b)("td",{parentName:"tr",align:null},"Прозорість заливки")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"stroke")),Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"string")," (hex, наприклад ",Object(b.b)("inlineCode",{parentName:"td"},'"#000000"'),")"),Object(b.b)("td",{parentName:"tr",align:null},"Колір обвідки")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"strokeOpacity")),Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"number")," (0–1)"),Object(b.b)("td",{parentName:"tr",align:null},"Прозорість обвідки")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"strokeWidth")),Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"number")),Object(b.b)("td",{parentName:"tr",align:null},"Товщина лінії обвідки (у пікселях)")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"strokeDasharray")),Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"array")," (наприклад ",Object(b.b)("inlineCode",{parentName:"td"},"[5,5]"),")"),Object(b.b)("td",{parentName:"tr",align:null},"Стиль пунктирної лінії")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"fontSize")),Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"number")),Object(b.b)("td",{parentName:"tr",align:null},"Розмір тексту (у пікселях)")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"value")),Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"string")),Object(b.b)("td",{parentName:"tr",align:null},"Текстове значення (для методу ",Object(b.b)("inlineCode",{parentName:"td"},"text"),")")))),Object(b.b)("p",null,Object(b.b)("strong",{parentName:"p"},"Приклад:")),Object(b.b)("pre",null,Object(b.b)("code",{parentName:"pre",className:"language-js"},'plot.text("Text object", "Hello world!", 1757699100000, 115000, 10, "#00C8FF", 0.5);\nplot.straightLine(`${namePrefix} Open`, level.timeStart, level.open, level.timeEnd, level.open, color);\nplot.circle(`${namePrefix} High`, level.timeStart, level.high, 3, color);\n')),Object(b.b)("p",null,"На графіку можна відобразити не більше ніж ",Object(b.b)("strong",{parentName:"p"},Object(b.b)("inlineCode",{parentName:"strong"},"3000"))," фігур."),Object(b.b)("hr",null),Object(b.b)("h3",{id:"-серії-даних"},"🔹 Серії даних"),Object(b.b)("table",null,Object(b.b)("thead",{parentName:"table"},Object(b.b)("tr",{parentName:"thead"},Object(b.b)("th",{parentName:"tr",align:null},"Метод"),Object(b.b)("th",{parentName:"tr",align:null},"Опис"))),Object(b.b)("tbody",{parentName:"table"},Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"lineSeries(title, values, stroke, strokeOpacity, strokeWidth, strokeDasharray)")),Object(b.b)("td",{parentName:"tr",align:null},"Лінійний графік")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"barSeries(title, values, fill, opacity)")),Object(b.b)("td",{parentName:"tr",align:null},"Гістограма")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"candleSeries(title, openValues, closeValues, highValues, lowValues, fill, opacity)")),Object(b.b)("td",{parentName:"tr",align:null},"Свічки")))),Object(b.b)("p",null,Object(b.b)("strong",{parentName:"p"},"Приклад:")),Object(b.b)("pre",null,Object(b.b)("code",{parentName:"pre",className:"language-js"},'plot.lineSeries("EMA", ta.ema(closes, 20), "#00C8FF");\nplot.barSeries("Premium %", premiumPercents, ((d) => d > 0 ? color1 : color2), 1);\nplot.candleSeries(\n "Candles",\n opens, closes, highs, lows,\n (v, i) => {\n return opens?.[i] > closes?.[i] ? colorBuy : colorSell\n }\n);\n')),Object(b.b)("p",null,"На графіку можна відобразити не більше ніж ",Object(b.b)("strong",{parentName:"p"},Object(b.b)("inlineCode",{parentName:"strong"},"10"))," серій даних."),Object(b.b)("hr",null),Object(b.b)("h2",{id:"-технічний-аналіз"},"📊 Технічний аналіз"),Object(b.b)("p",null,"Клас ",Object(b.b)("strong",{parentName:"p"},Object(b.b)("inlineCode",{parentName:"strong"},"ta"))," містить набір функцій, аналогічних PineScript."),Object(b.b)("h3",{id:"-допоміжні"},"🔹 Допоміжні"),Object(b.b)("table",null,Object(b.b)("thead",{parentName:"table"},Object(b.b)("tr",{parentName:"thead"},Object(b.b)("th",{parentName:"tr",align:null},"Метод"),Object(b.b)("th",{parentName:"tr",align:null},"Опис"))),Object(b.b)("tbody",{parentName:"table"},Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"highest(values, period)")),Object(b.b)("td",{parentName:"tr",align:null},"Максимум за період")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"lowest(values, period)")),Object(b.b)("td",{parentName:"tr",align:null},"Мінімум за період")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"variance(values, period)")),Object(b.b)("td",{parentName:"tr",align:null},"Дисперсія")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"stdev(values, period)")),Object(b.b)("td",{parentName:"tr",align:null},"Стандартне відхилення")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"crossover(series1, series2)")),Object(b.b)("td",{parentName:"tr",align:null},"Перетин вгору")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"crossunder(series1, series2)")),Object(b.b)("td",{parentName:"tr",align:null},"Перетин вниз")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"cross(series1, series2)")),Object(b.b)("td",{parentName:"tr",align:null},"Будь-який перетин")))),Object(b.b)("h3",{id:"-рухомі-середні"},"🔹 Рухомі середні"),Object(b.b)("table",null,Object(b.b)("thead",{parentName:"table"},Object(b.b)("tr",{parentName:"thead"},Object(b.b)("th",{parentName:"tr",align:null},"Метод"),Object(b.b)("th",{parentName:"tr",align:null},"Опис"))),Object(b.b)("tbody",{parentName:"table"},Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"sma(values, period)")),Object(b.b)("td",{parentName:"tr",align:null},"Проста рухома середня")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"ema(values, period)")),Object(b.b)("td",{parentName:"tr",align:null},"Експоненційна рухома середня")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"wma(values, period)")),Object(b.b)("td",{parentName:"tr",align:null},"Зважена рухома середня")))),Object(b.b)("h3",{id:"-індикатори"},"🔹 Індикатори"),Object(b.b)("table",null,Object(b.b)("thead",{parentName:"table"},Object(b.b)("tr",{parentName:"thead"},Object(b.b)("th",{parentName:"tr",align:null},"Метод"),Object(b.b)("th",{parentName:"tr",align:null},"Опис"))),Object(b.b)("tbody",{parentName:"table"},Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"rsi(values, period)")),Object(b.b)("td",{parentName:"tr",align:null},"Індекс відносної сили")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"macd(values, fast, slow, signalPeriod)")),Object(b.b)("td",{parentName:"tr",align:null},"MACD")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"bollinger(values, period, mult)")),Object(b.b)("td",{parentName:"tr",align:null},"Смуги Боллінджера")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"stoch(highs, lows, closes, period, smoothK, smoothD)")),Object(b.b)("td",{parentName:"tr",align:null},"Стохастичний осцилятор")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"atr(highs, lows, closes, period)")),Object(b.b)("td",{parentName:"tr",align:null},"Середній істинний діапазон")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"adx(highs, lows, closes, period)")),Object(b.b)("td",{parentName:"tr",align:null},"Індекс спрямованого руху")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"cci(highs, lows, closes, period)")),Object(b.b)("td",{parentName:"tr",align:null},"Індекс товарного каналу")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"vwap(highs, lows, closes, volumes)")),Object(b.b)("td",{parentName:"tr",align:null},"Об’ємно-зважена середня ціна")))),Object(b.b)("p",null,Object(b.b)("strong",{parentName:"p"},"Приклад:")),Object(b.b)("pre",null,Object(b.b)("code",{parentName:"pre",className:"language-js"},'const candles = source.ohlcv();\nconst closes = candles.map(c => c.close);\nconst rsiValues = ta.rsi(closes, 14);\nplot.lineSeries("RSI", rsiValues, "#00C8FF");\n')),Object(b.b)("hr",null),Object(b.b)("h2",{id:"-alerts"},"🔔 Alerts"),Object(b.b)("p",null,"Users can create alerts for your indicator from the ",Object(b.b)("strong",{parentName:"p"},"Alerts")," tab in the indicator settings on the chart.\nAlerts are checked on the server side every ",Object(b.b)("strong",{parentName:"p"},"30 seconds"),", notifications are sent to ",Object(b.b)("strong",{parentName:"p"},"Telegram")," and/or a user defined ",Object(b.b)("strong",{parentName:"p"},"Webhook URL"),"."),Object(b.b)("h3",{id:"️-alert-settings--alertinput"},"⚙️ Alert Settings — ",Object(b.b)("inlineCode",{parentName:"h3"},"alertInput")),Object(b.b)("p",null,"The ",Object(b.b)("strong",{parentName:"p"},Object(b.b)("inlineCode",{parentName:"strong"},"alertInput"))," class declares alert settings. It works exactly like ",Object(b.b)("inlineCode",{parentName:"p"},"input"),", but the fields are shown in the ",Object(b.b)("strong",{parentName:"p"},"Alerts")," tab and every user configures their own values for their alert."),Object(b.b)("p",null,"Scripts without ",Object(b.b)("inlineCode",{parentName:"p"},"alertInput")," declarations can not be used for alerts."),Object(b.b)("table",null,Object(b.b)("thead",{parentName:"table"},Object(b.b)("tr",{parentName:"thead"},Object(b.b)("th",{parentName:"tr",align:null},"Method"),Object(b.b)("th",{parentName:"tr",align:null},"Description"))),Object(b.b)("tbody",{parentName:"table"},Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"number(title, defaultValue, min, max, step)")),Object(b.b)("td",{parentName:"tr",align:null},"Numeric input")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"range(title, defaultValue, min, max, step)")),Object(b.b)("td",{parentName:"tr",align:null},"Range input")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"select(title, defaultValue, values)")),Object(b.b)("td",{parentName:"tr",align:null},"Dropdown selection")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"color(title, defaultValue)")),Object(b.b)("td",{parentName:"tr",align:null},"Color picker")),Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"boolean(title, defaultValue)")),Object(b.b)("td",{parentName:"tr",align:null},"Boolean input")))),Object(b.b)("p",null,Object(b.b)("strong",{parentName:"p"},"Example:")),Object(b.b)("pre",null,Object(b.b)("code",{parentName:"pre",className:"language-js"},'const alertVolumeThreshold = alertInput.number("Volume threshold", 1000, 0, 10000000, 1);\n')),Object(b.b)("h3",{id:"-firing-alerts--alertfire"},"🚨 Firing Alerts — ",Object(b.b)("inlineCode",{parentName:"h3"},"alert.fire")),Object(b.b)("table",null,Object(b.b)("thead",{parentName:"table"},Object(b.b)("tr",{parentName:"thead"},Object(b.b)("th",{parentName:"tr",align:null},"Method"),Object(b.b)("th",{parentName:"tr",align:null},"Description"))),Object(b.b)("tbody",{parentName:"table"},Object(b.b)("tr",{parentName:"tbody"},Object(b.b)("td",{parentName:"tr",align:null},Object(b.b)("inlineCode",{parentName:"td"},"fire(title, message, date)")),Object(b.b)("td",{parentName:"tr",align:null},"Fires an alert notification")))),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},"All three parameters are ",Object(b.b)("strong",{parentName:"li"},"required")," — a call with a missing ",Object(b.b)("inlineCode",{parentName:"li"},"title"),", ",Object(b.b)("inlineCode",{parentName:"li"},"message")," or ",Object(b.b)("inlineCode",{parentName:"li"},"date")," is skipped (a warning is written to the log)."),Object(b.b)("li",{parentName:"ul"},"Keep the alert ",Object(b.b)("strong",{parentName:"li"},"title constant"),", do not generate unique titles. Each title fires only once per run (max ",Object(b.b)("strong",{parentName:"li"},"20")," titles per run)."),Object(b.b)("li",{parentName:"ul"},Object(b.b)("inlineCode",{parentName:"li"},"date")," is the candle ",Object(b.b)("inlineCode",{parentName:"li"},"startTime")," the signal belongs to: the same title notifies again only when it fires for a ",Object(b.b)("strong",{parentName:"li"},"newer")," candle. Signals from candles older than the moment the user created their alert are ignored (anti-spam).")),Object(b.b)("p",null,Object(b.b)("strong",{parentName:"p"},"Example:")),Object(b.b)("pre",null,Object(b.b)("code",{parentName:"pre",className:"language-js"},'if (candle.volume > alertVolumeThreshold) {\n alert.fire("High volume", `vol ${candle.volume}`, candle.startTime);\n}\n')),Object(b.b)("h3",{id:"-shape-alerts--plotshapealert"},"📐 Shape Alerts — ",Object(b.b)("inlineCode",{parentName:"h3"},"plot.(...).alert(...)")),Object(b.b)("p",null,"All geometric shapes (",Object(b.b)("inlineCode",{parentName:"p"},"box"),", ",Object(b.b)("inlineCode",{parentName:"p"},"square"),", ",Object(b.b)("inlineCode",{parentName:"p"},"diamond"),", ",Object(b.b)("inlineCode",{parentName:"p"},"triangle"),", ",Object(b.b)("inlineCode",{parentName:"p"},"circle"),", ",Object(b.b)("inlineCode",{parentName:"p"},"straightLine"),", ",Object(b.b)("inlineCode",{parentName:"p"},"text"),") return a handle with an ",Object(b.b)("inlineCode",{parentName:"p"},".alert()")," method.\nThe alert fires with the shape's ",Object(b.b)("inlineCode",{parentName:"p"},"date1")," automatically, so the anti-spam logic works without extra code — this is the recommended way for per-candle signals."),Object(b.b)("p",null,"Two forms:"),Object(b.b)("pre",null,Object(b.b)("code",{parentName:"pre",className:"language-js"},'// simple: fires every time the shape is plotted for a new date\nplot.box(...).alert("High volume", `vol ${candle.volume}`);\n\n// callback: return nothing to skip, [title, message] to fire\nplot.box(...).alert((shape) => {\n if (candle.volume > alertVolumeThreshold)\n alert.fire("High volume", `vol ${candle.volume}`, candle.startTime);\n});\n')),Object(b.b)("p",null,"The callback receives the shape data (",Object(b.b)("inlineCode",{parentName:"p"},"date1"),", ",Object(b.b)("inlineCode",{parentName:"p"},"price1"),", ",Object(b.b)("inlineCode",{parentName:"p"},"date2"),", ",Object(b.b)("inlineCode",{parentName:"p"},"price2"),", ...)."),Object(b.b)("h3",{id:"-series-alerts--plotseriesalert"},"📈 Series Alerts — ",Object(b.b)("inlineCode",{parentName:"h3"},"plot.(...).alert(...)")),Object(b.b)("p",null,"Data series (",Object(b.b)("inlineCode",{parentName:"p"},"lineSeries"),", ",Object(b.b)("inlineCode",{parentName:"p"},"barSeries"),", ",Object(b.b)("inlineCode",{parentName:"p"},"candleSeries"),") also return the ",Object(b.b)("inlineCode",{parentName:"p"},".alert()")," handle.\nThe callback receives the ",Object(b.b)("strong",{parentName:"p"},"latest data point")," and the latest candle date, the alert fires with that date."),Object(b.b)("ul",null,Object(b.b)("li",{parentName:"ul"},Object(b.b)("inlineCode",{parentName:"li"},"lineSeries")," / ",Object(b.b)("inlineCode",{parentName:"li"},"barSeries")," — the callback receives the last ",Object(b.b)("strong",{parentName:"li"},"value")," (a number)"),Object(b.b)("li",{parentName:"ul"},Object(b.b)("inlineCode",{parentName:"li"},"candleSeries")," — the callback receives the last candle ",Object(b.b)("inlineCode",{parentName:"li"},"{open, close, high, low}"))),Object(b.b)("pre",null,Object(b.b)("code",{parentName:"pre",className:"language-js"},'plot.lineSeries("RSI", rsiValues, color).alert((rsi, date) => {\n if (rsi > alertRsiThreshold) alert.fire("RSI high", `RSI ${rsi.toFixed(1)}`, latestCandle.startTime);\n});\n')),Object(b.b)("p",null,"A condition that stays true notifies once per ",Object(b.b)("strong",{parentName:"p"},"new candle"),". For one-time signals use crossover-style conditions (",Object(b.b)("inlineCode",{parentName:"p"},"ta.crossover"),")."),Object(b.b)("h3",{id:"-full-example"},"🧩 Full Example"),Object(b.b)("pre",null,Object(b.b)("code",{parentName:"pre",className:"language-js"},'const title = "Volume alerts";\nconst description = "Shows boxes on high-volume candles";\ndefine(title, description, "onchart", true, true);\n\nconst color = style.color("Color", "#00C8FF");\nconst volumeThreshold = input.number("Volume threshold", 1000, 0, 10000000, 1);\nconst alertVolumeThreshold = alertInput.number("Alert volume threshold", 5000, 0, 10000000, 1);\nconst alertCloseThreshold = alertInput.number("Alert close threshold", 100000, 0, 10000000, 1);\n\nconst candles = source.ohlcv();\nconst latestCandle = candles.at(-1);\nconst closes = candles.map(c => c.close);\n\n// series alert: checks the latest close\nplot.lineSeries("Closes", closes, color).alert((close, date) => {\n if (close > alertCloseThreshold) alert.fire("Close above threshold", `close ${close}`, latestCandle.startTime);\n});\n\nfor (let i = 0; i < candles.length; i++) {\n const candle = candles[i];\n\n if (candle.volume > volumeThreshold) {\n const right = i < candles.length - 1 ? candles[i + 1].startTime : candle.startTime + 60000;\n\n // shape alert: checked against the user\'s alert threshold\n plot.box(`Volume ${i}`, candle.startTime, candle.high, right, candle.low, "#00C8FF", 0.3)\n .alert(() => {\n if (candle.volume > alertVolumeThreshold)\n alert.fire("High volume", `vol ${candle.volume}`, candle.startTime);\n });\n }\n}\n')),Object(b.b)("hr",null),Object(b.b)("h2",{id:"-приклади-індикаторів"},"🧠 Приклади індикаторів"),Object(b.b)("pre",null,Object(b.b)("code",{parentName:"pre",className:"language-js"},'const title = "Your first indicator";\nconst description = "Shows closes lines on the chart";\nconst indicatorType = "onchart";\n\ndefine(title, description, type, true, true);\n\nconst color = input.color("Line Color", "#00C8FF");\nconst candles = source.ohlcv();\nconst closes = candles.map(c => c.close);\nplot.lineSeries("Closes", closes, color);\n\n')),Object(b.b)("pre",null,Object(b.b)("code",{parentName:"pre",className:"language-js"},'define("Example Indicator", "Demonstrates basic plotting", "onchart", true, true);\n\nconst color = input.color("Line Color", "#00FF99");\nconst candles = source.ohlcv();\nconst closes = candles.map(c => c.close);\n\nconst ema20 = ta.ema(closes, 20);\nplot.lineSeries("EMA 20", ema20, color);\n\n')),Object(b.b)("pre",null,Object(b.b)("code",{parentName:"pre",className:"language-js"},'const title = "Colored Volume Bars"; \nconst description = "Volumes colored based on candle direction."; \nconst indicatorType = "onchart"; \nconst isPublic = true; \nconst isPublicCode = true; \n\ndefine(title, description, indicatorType, isPublic, isPublicCode); \n\n// Get OHLC candles\nconst candles = source.ohlcv(); \n\nconst colorUp = style.color("Color 1", "#2BB462"); // Greenish color for rising prices\nconst colorDown = style.color("Color 2", "#FB4C51"); // Reddish color for falling prices\nconst volumes = candles.map(candle => candle.volume); \n\nplot.barSeries("Volume", volumes, (value, index) => {\n const currentCandle = candles[index]; \n return currentCandle.close >= currentCandle.open ? colorUp : colorDown; \n});\n\n')),Object(b.b)("pre",null,Object(b.b)("code",{parentName:"pre",className:"language-js"},"define('Coinbase Premium Index', 'Coinbase Premium Index', 'offchart', true, false);\n\nconst color1 = style.color(\"Color 1\", \"#2BB462\");\nconst color2 = style.color(\"Color 2\", \"#FB4C51\");\n\n// Get OHLC candles\nconst cbCandles = source.ohlcv('coinbase', 'BTC-USD');\nconst binanceCandles = source.ohlcv('binance', 'BTCUSDT');\n\n// Extract closes\nconst cbCloses = cbCandles.map(c => c.close);\nconst binanceCloses = binanceCandles.map(c => c.close);\n\n// --- Coinbase Premium Index calculation ---\nconst premiumPercent = cbCloses.map((cb, i) => {\n const b = binanceCloses[i];\n return ((cb - b) / b) * 100;\n});\n\n// Plot premium index\nplot.barSeries(\"Premium %\", premiumPercent, ((d) => d > 0 ? color1 : color2)) // Percentage difference\n\n")),Object(b.b)("pre",null,Object(b.b)("code",{parentName:"pre",className:"language-js"},'const title = "Candles";\nconst description = "Simple candles draw";\nconst indicatorType = "offchart";\nconst isPublic = true;\nconst isPublicCode = true;\ndefine(title, description, indicatorType, isPublic, isPublicCode);\n\nconst colorBuy = style.color("Buy Color", "#2BB462");\nconst colorSell = style.color("Sell Color", "#7a3d3f");\nconst candles = source.ohlcv();\nconst closes = candles.map(c => c.close);\nconst opens = candles.map(c => c.open);\nconst highs = candles.map(c => c.high);\nconst lows = candles.map(c => c.low);\nplot.candleSeries(\n "Candles",\n opens, closes, highs, lows,\n (v, i) => {\n return opens?.[i] > closes?.[i] ? colorBuy : colorSell\n }\n);\n\n')))}void 0!==d&&d&&d===Object(d)&&Object.isExtensible(d)&&!Object.prototype.hasOwnProperty.call(d,"__filemeta")&&Object.defineProperty(d,"__filemeta",{configurable:!0,value:{name:"MDXContent",filename:"src/components/uk/Scripting.mdx"}}),d.isMDXComponent=!0}}]); //# sourceMappingURL=component---src-components-uk-scripting-mdx-5a503ac9c8333d7073dc.js.map