{"id":476794,"date":"2026-04-21T10:05:43","date_gmt":"2026-04-21T10:05:43","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=476794"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=476794","title":{"rendered":"\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c Pine Script \u043d\u0430 \u0431\u0438\u0440\u0436\u0430\u0445 \u0431\u0435\u0437 TradingView"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<blockquote>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435,\u00a0<a href=\"https:\/\/github.com\/backtest-kit\/uzse-backtest-app\" rel=\"noopener noreferrer nofollow\">\u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d \u0432 \u044d\u0442\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a><\/p>\n<\/blockquote>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f3d\/be9\/4a9\/f3dbe94a900a6fdcee7e617354a5345e.png\" width=\"1248\" height=\"832\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f3d\/be9\/4a9\/f3dbe94a900a6fdcee7e617354a5345e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f3d\/be9\/4a9\/f3dbe94a900a6fdcee7e617354a5345e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u042d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u044f\u0437\u044b\u043a\u0430 Pine Script \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430. \u041e\u0434\u043d\u0430\u043a\u043e, \u0441\u0430\u043c Trading View \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0435 \u0432\u0435\u0437\u0434\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u043e\u043d\u0434\u043e\u0432\u044b\u0435 \u0431\u0438\u0440\u0436\u0438 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0440\u044b\u043d\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0430 TradingView \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435\u0442 \u2014 \u043d\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0438 \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u0438.<\/p>\n<ul>\n<li>\n<p>MSE (\u041c\u043e\u043d\u0433\u043e\u043b\u0438\u044f) \u2014 \u043d\u0435\u0442<\/p>\n<\/li>\n<li>\n<p>UZSE (\u0423\u0437\u0431\u0435\u043a\u0438\u0441\u0442\u0430\u043d) \u2014 \u043d\u0435\u0442<\/p>\n<\/li>\n<li>\n<p>DSE (\u0414\u0430\u043a\u043a\u0430, \u0411\u0430\u043d\u0433\u043b\u0430\u0434\u0435\u0448) \u2014 \u043d\u0435\u0442<\/p>\n<\/li>\n<li>\n<p>GSE (\u0413\u0430\u043d\u0430) \u2014 \u043d\u0435\u0442<\/p>\n<\/li>\n<li>\n<p>SGBV (\u0410\u043b\u0436\u0438\u0440) \u2014 \u043d\u0435\u0442<\/p>\n<\/li>\n<li>\n<p>BSE (\u0411\u043e\u0442\u0441\u0432\u0430\u043d\u0430) \u2014 \u043d\u0435\u0442<\/p>\n<\/li>\n<li>\n<p>ESE (\u042d\u0441\u0432\u0430\u0442\u0438\u043d\u0438) \u2014 \u043d\u0435\u0442<\/p>\n<\/li>\n<li>\n<p>MERJ (\u0421\u0435\u0439\u0448\u0435\u043b\u044b) \u2014 \u043d\u0435\u0442<\/p>\n<\/li>\n<\/ul>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0441\u0430\u0439\u0442\u044b?<\/h3>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u0446\u0435\u043d\u044b \u044f \u0432\u0438\u0436\u0443 \u0441\u044b\u0440\u043e\u0439 aggregate trades \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0432 Excel \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0441\u044f\u0446 (\u0441 \u0443\u0447\u0451\u0442\u043e\u043c 6 \u0447\u0430\u0441\u043e\u0432\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0434\u043d\u044f \u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c\u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u043c\u0438), \u044f \u0447\u0443\u0432\u0441\u0442\u0432\u0443\u044e \u0441\u0435\u0431\u044f \u0441\u043b\u0435\u043f\u044b\u043c. \u041a\u043d\u043e\u043f\u043a\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0432\u0435\u0434\u0451\u0442 \u0432 \u043d\u0438\u043a\u0443\u0434\u0430.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bd4\/0b9\/0da\/bd40b90da1ed12df89036a6502183f87.png\" width=\"1920\" height=\"1037\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/bd4\/0b9\/0da\/bd40b90da1ed12df89036a6502183f87.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bd4\/0b9\/0da\/bd40b90da1ed12df89036a6502183f87.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u0446\u0435\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c Excel, \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u0441\u043f\u0435\u043a\u0442\u0440 \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043e\u043a Open Source, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u044c \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e81\/bf5\/d66\/e81bf5d668d31f5a43f41cec473022e3.png\" width=\"1920\" height=\"1039\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/e81\/bf5\/d66\/e81bf5d668d31f5a43f41cec473022e3.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e81\/bf5\/d66\/e81bf5d668d31f5a43f41cec473022e3.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h3>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0432\u0435\u0447\u0438 \u0438\u0437 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0441\u0434\u0435\u043b\u043e\u043a<\/h3>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 \u0441\u0434\u0435\u043b\u043a\u0430\u043c\u0438. \u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Excel, \u043d\u043e \u0442\u0430\u043c \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u043c\u0438\u043d\u0443\u0442\u044b<\/p>\n<pre><code class=\"typescript\">async function main() {  const buildUrl = (p: number) =&gt;    `https:\/\/uzse.uz\/trade\\_results?begin=${begin}&amp;end=${end}&amp;mkt_id=${mktId}&amp;page=${p}&amp;search_key=${symbol}`;  const browser = await chromium.launch({ headless: true });  const page = await browser.newPage();  const firstHtml = await fetchPage(page, buildUrl(1));  fs.writeFileSync(path.join(TMP_DIR, \"trades_page_1.html\"), firstHtml, \"utf8\");  const totalPages = getLastPage(firstHtml);  console.log(`Total pages: ${totalPages}`);  for (let p = 2; p &lt;= totalPages; p++) {    const html = await fetchPage(page, buildUrl(p));    fs.writeFileSync(path.join(TMP_DIR, `trades_page_${p}.html`), html, \"utf8\");    console.log(`Downloaded page ${p}\/${totalPages}`);  }  await browser.close();  console.log(`Done. HTML saved to ${TMP_DIR}`);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0432 MongoDb<\/p>\n<pre><code class=\"typescript\">function parseHtmlTable(html: string, pageIndex: number) {  const rows: object[] = [];  const trRegex = \/&lt;tr[\\s\\S]*?&lt;\\\/tr&gt;\/gi;  const tdRegex = \/&lt;td[^&gt;]*&gt;([\\s\\S]*?)&lt;\\\/td&gt;\/gi;  const tagRegex = \/&lt;[^&gt;]+&gt;\/g;  let rowIndex = 0;  const urlKey = extractUrlKey(html);  let trMatch: RegExpExecArray | null;  while ((trMatch = trRegex.exec(html)) !== null) {    const rowHtml = trMatch[0];    const cells: string[] = [];    let tdMatch: RegExpExecArray | null;    while ((tdMatch = tdRegex.exec(rowHtml)) !== null) {      cells.push(tdMatch[1].replace(tagRegex, \" \").replace(\/\\s+\/g, \" \").trim());    }    if (cells.length &lt; 10) continue;    const symbolParts = cells[2].split(\/\\s+\/).filter(Boolean);    const volumeParts = cells[9].split(\/\\s+\/).filter(Boolean);    const time = parseRuDate(cells[0]);    const symbol = symbolParts[0] ?? \"\";    const tradePrice = parseNumber(cells[7]);    const quantity = parseNumber(cells[8]);    const volume = parseNumber(volumeParts[volumeParts.length - 1] ?? \"\");    const hash = crypto      .createHash(\"sha1\")      .update(`${symbol}|${time?.toISOString()}|${tradePrice}|${quantity}|${volume}|${pageIndex}|${rowIndex}|${urlKey}`)      .digest(\"hex\");    rowIndex++;    rows.push({ time, symbol, issuer: cells[3], securityType: cells[4], market: cells[5], platform: cells[6], tradePrice, quantity, volume, hash });  }  return rows.filter((r: any) =&gt; r.time !== null);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0412\u0438\u0434\u0438\u043c \u0433\u0440\u0430\u0444\u0438\u043a<\/h3>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e46\/a95\/8f4\/e46a958f4f8a0287f48bf3913552fc7f.jpg\" width=\"1280\" height=\"830\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/e46\/a95\/8f4\/e46a958f4f8a0287f48bf3913552fc7f.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e46\/a95\/8f4\/e46a958f4f8a0287f48bf3913552fc7f.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p><strong>\u0422\u043e\u0440\u0433\u0438 \u043d\u0435 \u0432\u0435\u043b\u0438\u0441\u044c \u043d\u0435\u0434\u0435\u043b\u044e \u0441 12.08.2023 \u043f\u043e 21.08.2023<\/strong>. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0442\u0440\u0430\u0448\u043d\u043e, \u0443\u0442\u043e\u0447\u043d\u044f\u0435\u043c Claude \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0432 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u0441\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438<\/p>\n<p><strong>\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043e\u0431\u0432\u0430\u043b\u0430:<\/strong>\u00a0\u0434\u043e\u043f\u044d\u043c\u0438\u0441\u0441\u0438\u044f \u0441 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u0443\u0441\u0442\u0430\u0432\u043d\u043e\u0433\u043e \u043a\u0430\u043f\u0438\u0442\u0430\u043b\u0430 \u0432 3 \u0440\u0430\u0437\u0430<\/p>\n<p>\u041d\u0430 \u0433\u043e\u0434\u043e\u0432\u043e\u043c \u043e\u0431\u0449\u0435\u043c \u0441\u043e\u0431\u0440\u0430\u043d\u0438\u0438 \u0430\u043a\u0446\u0438\u043e\u043d\u0435\u0440\u043e\u0432 26 \u043c\u0430\u044f 2023 \u0433\u043e\u0434\u0430 \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0431 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0438 \u0443\u0441\u0442\u0430\u0432\u043d\u043e\u0433\u043e \u043a\u0430\u043f\u0438\u0442\u0430\u043b\u0430 \u0431\u0430\u043d\u043a\u0430 \u0441 107,77 \u043c\u043b\u0440\u0434 \u0441\u0443\u043c\u043e\u0432 \u0434\u043e 323,32 \u043c\u043b\u0440\u0434 \u0441\u0443\u043c\u043e\u0432 \u2014\u00a0<strong>\u0442\u043e \u0435\u0441\u0442\u044c \u0432 ~3 \u0440\u0430\u0437\u0430<\/strong>\u00a0\u2014 \u0437\u0430 \u0441\u0447\u0451\u0442 \u043d\u0435\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u043f\u0440\u0438\u0431\u044b\u043b\u0438. \u0412\u044b\u043f\u0443\u0441\u043a \u043d\u043e\u0432\u044b\u0445 \u0430\u043a\u0446\u0438\u0439 \u0431\u044b\u043b \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0440\u0435\u0433\u0443\u043b\u044f\u0442\u043e\u0440\u043e\u043c 7 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 2023 \u0433\u043e\u0434\u0430.<\/p>\n<p>\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0430\u043a\u0446\u0438\u0439 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b\u043e \u043f\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0435 \u0441\u0440\u0435\u0434\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0430\u043a\u0446\u0438\u043e\u043d\u0435\u0440\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0445 \u0432 \u0440\u0435\u0435\u0441\u0442\u0440, \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 10-\u0439 \u0434\u0435\u043d\u044c \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0432\u044b\u043f\u0443\u0441\u043a\u0430 \u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u0435\u0435\u0441\u0442\u0440 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e\u00a0<strong>17 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 2023 \u0433\u043e\u0434\u0430<\/strong>.<\/p>\n<p>\u041f\u0440\u0438\u0431\u044b\u043b\u044c \u043d\u0435 \u0432\u044b\u043f\u043b\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0435\u043d\u044c\u0433\u0430\u043c\u0438, \u0430 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0430\u043a\u0446\u0438\u0438.<\/p>\n<h3>\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0435\u0445\u0430\u043d\u0430\u043b\u0438\u0437<\/h3>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d3f\/282\/9b9\/d3f2829b9fe54630c580060601436da7.PNG\" width=\"1920\" height=\"1031\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/d3f\/282\/9b9\/d3f2829b9fe54630c580060601436da7.PNG 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d3f\/282\/9b9\/d3f2829b9fe54630c580060601436da7.PNG 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u042f \u0432\u0437\u044f\u043b \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u043f\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440<strong>. \u0412\u0440\u043e\u0434\u0435 \u0431\u044b, \u043f\u0440\u043e\u0434\u0430\u0451\u043c \u043d\u0430 \u0446\u0435\u043d\u0435 \u043a\u0440\u0430\u0441\u043d\u043e\u0439 \u043c\u0435\u0434\u0432\u0435\u0436\u0435\u0439 \u043b\u0438\u043d\u0438\u0438 \u0438 \u043f\u043e\u043a\u0443\u043f\u0430\u0435\u043c \u043d\u0430 \u0437\u0435\u043b\u0451\u043d\u043e\u0439 \u0431\u044b\u0447\u0435\u0439<\/strong>. \u0412\u0430\u0436\u043d\u043e, \u0447\u0442\u043e \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/db9\/433\/7fa\/db94337fab6a467b0cc8c8af33b6dc8d.PNG\" width=\"1920\" height=\"955\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/db9\/433\/7fa\/db94337fab6a467b0cc8c8af33b6dc8d.PNG 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/db9\/433\/7fa\/db94337fab6a467b0cc8c8af33b6dc8d.PNG 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0422\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u044e. \u0412\u0438\u0434\u043d\u043e: \u0446\u0435\u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0443\u0445\u043e\u0434\u0438\u043b\u0430 \u0434\u0430\u043b\u0435\u043a\u043e \u0432\u044b\u0448\u0435 <code>SMA(20)<\/code>. <strong>\u0422\u043e\u0442 \u0436\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d: \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043d\u0435\u0439 \u0431\u0435\u0437 \u0442\u043e\u0440\u0433\u043e\u0432.<\/strong> \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a <code>single-price auction day<\/code>.<\/p>\n<h3>\u041a\u0430\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0432\u0435\u0447\u0438<\/h3>\n<p>\u0424\u0430\u0439\u043b <code>.\/modules\/editor.module.ts<\/code><\/p>\n<pre><code class=\"typescript\">import { addExchangeSchema } from \"backtest-kit\";import { CandleModel } from \"..\/schema\/Candle.schema\";import \"..\/config\/setup\";addExchangeSchema({  exchangeName: \"mongo-exchange\",  getCandles: async (symbol, interval, since, limit) =&gt; {    const candles = await CandleModel.find(      { symbol, interval, timestamp: { $gte: since.getTime() } },      { timestamp: 1, open: 1, high: 1, low: 1, close: 1, volume: 1, _id: 0 }    )      .sort({ timestamp: 1 })      .limit(limit)      .lean();    return candles.map(({ timestamp, open, high, low, close, volume }) =&gt; ({      timestamp,      open,      high,      low,      close,      volume,    }));  },});<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u041a\u0430\u043a \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c<\/h3>\n<p>\u0427\u0435\u0440\u0435\u0437\u00a0<code>npm start<\/code><\/p>\n<pre><code class=\"json\">{  \"name\": \"backtest-kit-project\",  \"version\": \"1.0.0\",  \"description\": \"Backtest Kit trading bot project\",  \"main\": \"index.js\",  \"homepage\": \"https:\/\/backtest-kit.github.io\/documents\/article_07_ai_news_trading_signals.html\",  \"scripts\": {    \"start\": \"node .\/node_modules\/@backtest-kit\/cli\/build\/index.mjs --editor\"  },  \"keywords\": [],  \"author\": \"\",  \"license\": \"ISC\",  \"type\": \"commonjs\",  \"dependencies\": {    \"@backtest-kit\/cli\": \"^7.1.0\",    \"@backtest-kit\/graph\": \"^7.1.0\",    \"@backtest-kit\/pinets\": \"^7.1.0\",    \"@backtest-kit\/ui\": \"^7.1.0\",    \"agent-swarm-kit\": \"^2.5.1\",    \"backtest-kit\": \"^7.1.0\",    \"functools-kit\": \"^2.2.0\",    \"garch\": \"^1.2.3\",    \"get-moment-stamp\": \"^1.1.2\",    \"mongoose\": \"^8.23.0\",    \"ollama\": \"^0.6.3\",    \"playwright\": \"^1.59.1\",    \"volume-anomaly\": \"^1.2.3\"  }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h2>\u0427\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e<\/h2>\n<ol>\n<li>\n<p><strong>\u0423\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u0440\u044b\u043d\u043a\u0430 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430 Pine Script<\/strong><\/p>\n<p>\u0415\u0433\u043e \u043a\u0430\u043a \u0441\u043b\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0430 \u0440\u044b\u043d\u043a\u0435, \u0442\u0430\u043a \u0438 \u043d\u0435\u043a\u0443\u0434\u0430 \u043f\u0440\u0438\u0441\u0442\u0440\u043e\u0438\u0442\u044c: \u043d\u0435\u0442 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b Trading View. \u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0418\u0418 \u043d\u0435 \u0440\u0435\u0448\u0438\u0442, \u043d\u0443\u0436\u0435\u043d \u0447\u0435\u043b\u043e\u0432\u0435\u043a<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u043e\u0432\u043e\u0441\u0442\u043d\u043e\u0439 \u0441\u0435\u043d\u0442\u0438\u043c\u0435\u043d\u0442 \u043d\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430 \u0446\u0435\u043d\u0443 \u0430\u043a\u0446\u0438\u0439<\/strong><\/p>\n<p>\u0418\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u0430\u043b\u0438\u0431\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0418\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b, \u0435\u0441\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f \u0441\u0435\u043d\u0442\u0438\u043c\u0435\u043d\u0442 \u0440\u044b\u043d\u043a\u0430. <a href=\"https:\/\/www.gazeta.uz\/ru\/2026\/04\/17\/ravshan-muhitdinov\/\" rel=\"noopener noreferrer nofollow\">\u041d\u043e\u0432\u043e\u0441\u0442\u0438 \u0423\u0437\u0431\u0435\u043a\u0438\u0441\u0442\u0430\u043d\u0430 \u043d\u0435 \u043c\u0435\u0434\u0438\u0439\u043d\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u043f\u0430\u0440\u0442\u0438\u0438 &#8212; \u0438\u043d\u0432\u0435\u0441\u0442\u0438\u0446\u0438\u0438<\/strong><\/p>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0441\u0435\u043d\u0442\u0438\u043c\u0435\u043d\u0442 \u044d\u0442\u043e \u043f\u0440\u0435\u0437\u0438\u0434\u0435\u043d\u0442 \u0440\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0438. \u041e\u043d <a href=\"https:\/\/www.gazeta.uz\/ru\/2026\/04\/20\/drugs\/\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u0437\u0432\u0430\u043b \u043e\u0431\u0449\u0435\u0439 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e<\/a> \u0432\u0441\u0435\u0433\u043e \u043c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u0442\u0430\u043a\u0438\u043c \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043c \u043f\u0443\u0442\u0451\u043c \u0438\u043d\u0432\u0435\u0441\u0442\u0438\u0446\u0438\u0439 \u0432 \u0438\u0445 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043a\u0443 \u0438 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435. <\/p>\n<\/li>\n<\/ol>\n<h3>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435!<\/h3>\n<p>\u0422\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/habr.com\/ru\/articles\/1025238\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u043d\u043e\u0433\u043e \u0441\u0435\u043d\u0442\u0438\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0440\u044b\u043d\u043e\u043a<\/a><\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1026010\/\">https:\/\/habr.com\/ru\/articles\/1026010\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435,\u00a0\u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d \u0432 \u044d\u0442\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438\u042d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u044f\u0437\u044b\u043a\u0430 Pine Script \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430. \u041e\u0434\u043d\u0430\u043a\u043e, \u0441\u0430\u043c Trading View \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0435 \u0432\u0435\u0437\u0434\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u043e\u043d\u0434\u043e\u0432\u044b\u0435 \u0431\u0438\u0440\u0436\u0438 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0440\u044b\u043d\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0430 TradingView \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435\u0442 \u2014 \u043d\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0438 \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u0438.MSE (\u041c\u043e\u043d\u0433\u043e\u043b\u0438\u044f) \u2014 \u043d\u0435\u0442UZSE (\u0423\u0437\u0431\u0435\u043a\u0438\u0441\u0442\u0430\u043d) \u2014 \u043d\u0435\u0442DSE (\u0414\u0430\u043a\u043a\u0430, \u0411\u0430\u043d\u0433\u043b\u0430\u0434\u0435\u0448) \u2014 \u043d\u0435\u0442GSE (\u0413\u0430\u043d\u0430) \u2014 \u043d\u0435\u0442SGBV (\u0410\u043b\u0436\u0438\u0440) \u2014 \u043d\u0435\u0442BSE (\u0411\u043e\u0442\u0441\u0432\u0430\u043d\u0430) \u2014 \u043d\u0435\u0442ESE (\u042d\u0441\u0432\u0430\u0442\u0438\u043d\u0438) \u2014 \u043d\u0435\u0442MERJ (\u0421\u0435\u0439\u0448\u0435\u043b\u044b) \u2014 \u043d\u0435\u0442\u041f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0441\u0430\u0439\u0442\u044b?\u041a\u043e\u0433\u0434\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u0446\u0435\u043d\u044b \u044f \u0432\u0438\u0436\u0443 \u0441\u044b\u0440\u043e\u0439 aggregate trades \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0432 Excel \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0441\u044f\u0446 (\u0441 \u0443\u0447\u0451\u0442\u043e\u043c 6 \u0447\u0430\u0441\u043e\u0432\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0434\u043d\u044f \u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c\u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u043c\u0438), \u044f \u0447\u0443\u0432\u0441\u0442\u0432\u0443\u044e \u0441\u0435\u0431\u044f \u0441\u043b\u0435\u043f\u044b\u043c. \u041a\u043d\u043e\u043f\u043a\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0432\u0435\u0434\u0451\u0442 \u0432 \u043d\u0438\u043a\u0443\u0434\u0430.\u041f\u043e\u043c\u0438\u043c\u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u0446\u0435\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c Excel, \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u0441\u043f\u0435\u043a\u0442\u0440 \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043e\u043a Open Source, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u044c \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434.\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0432\u0435\u0447\u0438 \u0438\u0437 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0441\u0434\u0435\u043b\u043e\u043a\u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 \u0441\u0434\u0435\u043b\u043a\u0430\u043c\u0438. \u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Excel, \u043d\u043e \u0442\u0430\u043c \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u043c\u0438\u043d\u0443\u0442\u044basync function main() {  const buildUrl = (p: number) =&gt;    `https:\/\/uzse.uz\/trade\\_results?begin=${begin}&amp;end=${end}&amp;mkt_id=${mktId}&amp;page=${p}&amp;search_key=${symbol}`;  const browser = await chromium.launch({ headless: true });  const page = await browser.newPage();  const firstHtml = await fetchPage(page, buildUrl(1));  fs.writeFileSync(path.join(TMP_DIR, &#171;trades_page_1.html&#187;), firstHtml, &#171;utf8&#187;);  const totalPages = getLastPage(firstHtml);  console.log(`Total pages: ${totalPages}`);  for (let p = 2; p &lt;= totalPages; p++) {    const html = await fetchPage(page, buildUrl(p));    fs.writeFileSync(path.join(TMP_DIR, `trades_page_${p}.html`), html, &#171;utf8&#8243;);    console.log(`Downloaded page ${p}\/${totalPages}`);  }  await browser.close();  console.log(`Done. HTML saved to ${TMP_DIR}`);}\u0412\u0442\u043e\u0440\u043e\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0432 MongoDbfunction parseHtmlTable(html: string, pageIndex: number) {  const rows: object[] = [];  const trRegex = \/&lt;tr[\\s\\S]*?&lt;\\\/tr&gt;\/gi;  const tdRegex = \/&lt;td[^&gt;]*&gt;([\\s\\S]*?)&lt;\\\/td&gt;\/gi;  const tagRegex = \/&lt;[^&gt;]+&gt;\/g;  let rowIndex = 0;  const urlKey = extractUrlKey(html);  let trMatch: RegExpExecArray | null;  while ((trMatch = trRegex.exec(html)) !== null) {    const rowHtml = trMatch[0];    const cells: string[] = [];    let tdMatch: RegExpExecArray | null;    while ((tdMatch = tdRegex.exec(rowHtml)) !== null) {      cells.push(tdMatch[1].replace(tagRegex, &#187; &#171;).replace(\/\\s+\/g, &#187; &#171;).trim());    }    if (cells.length &lt; 10) continue;    const symbolParts = cells[2].split(\/\\s+\/).filter(Boolean);    const volumeParts = cells[9].split(\/\\s+\/).filter(Boolean);    const time = parseRuDate(cells[0]);    const symbol = symbolParts[0] ?? &#171;&#187;;    const tradePrice = parseNumber(cells[7]);    const quantity = parseNumber(cells[8]);    const volume = parseNumber(volumeParts[volumeParts.length &#8212; 1] ?? &#171;&#187;);    const hash = crypto      .createHash(&#171;sha1&#187;)      .update(`${symbol}|${time?.toISOString()}|${tradePrice}|${quantity}|${volume}|${pageIndex}|${rowIndex}|${urlKey}`)      .digest(&#171;hex&#187;);    rowIndex++;    rows.push({ time, symbol, issuer: cells[3], securityType: cells[4], market: cells[5], platform: cells[6], tradePrice, quantity, volume, hash });  }  return rows.filter((r: any) =&gt; r.time !== null);}\u0412\u0438\u0434\u0438\u043c \u0433\u0440\u0430\u0444\u0438\u043a\u0422\u043e\u0440\u0433\u0438 \u043d\u0435 \u0432\u0435\u043b\u0438\u0441\u044c \u043d\u0435\u0434\u0435\u043b\u044e \u0441 12.08.2023 \u043f\u043e 21.08.2023. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0442\u0440\u0430\u0448\u043d\u043e, \u0443\u0442\u043e\u0447\u043d\u044f\u0435\u043c Claude \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0432 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u0441\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043e\u0431\u0432\u0430\u043b\u0430:\u00a0\u0434\u043e\u043f\u044d\u043c\u0438\u0441\u0441\u0438\u044f \u0441 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u0443\u0441\u0442\u0430\u0432\u043d\u043e\u0433\u043e \u043a\u0430\u043f\u0438\u0442\u0430\u043b\u0430 \u0432 3 \u0440\u0430\u0437\u0430\u041d\u0430 \u0433\u043e\u0434\u043e\u0432\u043e\u043c \u043e\u0431\u0449\u0435\u043c \u0441\u043e\u0431\u0440\u0430\u043d\u0438\u0438 \u0430\u043a\u0446\u0438\u043e\u043d\u0435\u0440\u043e\u0432 26 \u043c\u0430\u044f 2023 \u0433\u043e\u0434\u0430 \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0431 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0438 \u0443\u0441\u0442\u0430\u0432\u043d\u043e\u0433\u043e \u043a\u0430\u043f\u0438\u0442\u0430\u043b\u0430 \u0431\u0430\u043d\u043a\u0430 \u0441 107,77 \u043c\u043b\u0440\u0434 \u0441\u0443\u043c\u043e\u0432 \u0434\u043e 323,32 \u043c\u043b\u0440\u0434 \u0441\u0443\u043c\u043e\u0432 \u2014\u00a0\u0442\u043e \u0435\u0441\u0442\u044c \u0432 ~3 \u0440\u0430\u0437\u0430\u00a0\u2014 \u0437\u0430 \u0441\u0447\u0451\u0442 \u043d\u0435\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u043f\u0440\u0438\u0431\u044b\u043b\u0438. \u0412\u044b\u043f\u0443\u0441\u043a \u043d\u043e\u0432\u044b\u0445 \u0430\u043a\u0446\u0438\u0439 \u0431\u044b\u043b \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0440\u0435\u0433\u0443\u043b\u044f\u0442\u043e\u0440\u043e\u043c 7 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 2023 \u0433\u043e\u0434\u0430.\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0430\u043a\u0446\u0438\u0439 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b\u043e \u043f\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0435 \u0441\u0440\u0435\u0434\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0430\u043a\u0446\u0438\u043e\u043d\u0435\u0440\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0445 \u0432 \u0440\u0435\u0435\u0441\u0442\u0440, \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 10-\u0439 \u0434\u0435\u043d\u044c \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0432\u044b\u043f\u0443\u0441\u043a\u0430 \u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u0435\u0435\u0441\u0442\u0440 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e\u00a017 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 2023 \u0433\u043e\u0434\u0430.\u041f\u0440\u0438\u0431\u044b\u043b\u044c \u043d\u0435 \u0432\u044b\u043f\u043b\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0435\u043d\u044c\u0433\u0430\u043c\u0438, \u0430 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0430\u043a\u0446\u0438\u0438.\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0435\u0445\u0430\u043d\u0430\u043b\u0438\u0437\u042f \u0432\u0437\u044f\u043b \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u043f\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440. \u0412\u0440\u043e\u0434\u0435 \u0431\u044b, \u043f\u0440\u043e\u0434\u0430\u0451\u043c \u043d\u0430 \u0446\u0435\u043d\u0435 \u043a\u0440\u0430\u0441\u043d\u043e\u0439 \u043c\u0435\u0434\u0432\u0435\u0436\u0435\u0439 \u043b\u0438\u043d\u0438\u0438 \u0438 \u043f\u043e\u043a\u0443\u043f\u0430\u0435\u043c \u043d\u0430 \u0437\u0435\u043b\u0451\u043d\u043e\u0439 \u0431\u044b\u0447\u0435\u0439. \u0412\u0430\u0436\u043d\u043e, \u0447\u0442\u043e \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f.\u0422\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u044e. \u0412\u0438\u0434\u043d\u043e: \u0446\u0435\u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0443\u0445\u043e\u0434\u0438\u043b\u0430 \u0434\u0430\u043b\u0435\u043a\u043e \u0432\u044b\u0448\u0435 SMA(20). \u0422\u043e\u0442 \u0436\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d: \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043d\u0435\u0439 \u0431\u0435\u0437 \u0442\u043e\u0440\u0433\u043e\u0432. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a single-price auction day.\u041a\u0430\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0432\u0435\u0447\u0438\u0424\u0430\u0439\u043b .\/modules\/editor.module.tsimport { addExchangeSchema } from &#171;backtest-kit&#187;;import { CandleModel } from &#171;..\/schema\/Candle.schema&#187;;import &#171;..\/config\/setup&#187;;addExchangeSchema({  exchangeName: &#171;mongo-exchange&#187;,  getCandles: async (symbol, interval, since, limit) =&gt; {    const candles = await CandleModel.find(      { symbol, interval, timestamp: { $gte: since.getTime() } },      { timestamp: 1, open: 1, high: 1, low: 1, close: 1, volume: 1, _id: 0 }    )      .sort({ timestamp: 1 })      .limit(limit)      .lean();    return candles.map(({ timestamp, open, high, low, close, volume }) =&gt; ({      timestamp,      open,      high,      low,      close,      volume,    }));  },});\u041a\u0430\u043a \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0427\u0435\u0440\u0435\u0437\u00a0npm start{  &#171;name&#187;: &#171;backtest-kit-project&#187;,  &#171;version&#187;: &#171;1.0.0&#187;,  &#171;description&#187;: &#171;Backtest Kit trading bot project&#187;,  &#171;main&#187;: &#171;index.js&#187;,  &#171;homepage&#187;: &#171;https:\/\/backtest-kit.github.io\/documents\/article_07_ai_news_trading_signals.html&#187;,  &#171;scripts&#187;: {    &#171;start&#187;: &#171;node .\/node_modules\/@backtest-kit\/cli\/build\/index.mjs &#8212;editor&#187;  },  &#171;keywords&#187;: [],  &#171;author&#187;: &#171;&#187;,  &#171;license&#187;: &#171;ISC&#187;,  &#171;type&#187;: &#171;commonjs&#187;,  &#171;dependencies&#187;: {    &#171;@backtest-kit\/cli&#187;: &#171;^7.1.0&#187;,    &#171;@backtest-kit\/graph&#187;: &#171;^7.1.0&#187;,    &#171;@backtest-kit\/pinets&#187;: &#171;^7.1.0&#187;,    &#171;@backtest-kit\/ui&#187;: &#171;^7.1.0&#187;,    &#171;agent-swarm-kit&#187;: &#171;^2.5.1&#187;,    &#171;backtest-kit&#187;: &#171;^7.1.0&#187;,    &#171;functools-kit&#187;: &#171;^2.2.0&#187;,    &#171;garch&#187;: &#171;^1.2.3&#187;,    &#171;get-moment-stamp&#187;: &#171;^1.1.2&#187;,    &#171;mongoose&#187;: &#171;^8.23.0&#187;,    &#171;ollama&#187;: &#171;^0.6.3&#187;,    &#171;playwright&#187;: &#171;^1.59.1&#187;,    &#171;volume-anomaly&#187;: &#171;^1.2.3&#187;  }}\u0427\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0423\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u0440\u044b\u043d\u043a\u0430 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430 Pine Script\u0415\u0433\u043e \u043a\u0430\u043a \u0441\u043b\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0430 \u0440\u044b\u043d\u043a\u0435, \u0442\u0430\u043a \u0438 \u043d\u0435\u043a\u0443\u0434\u0430 \u043f\u0440\u0438\u0441\u0442\u0440\u043e\u0438\u0442\u044c: \u043d\u0435\u0442 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b Trading View. \u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0418\u0418 \u043d\u0435 \u0440\u0435\u0448\u0438\u0442, \u043d\u0443\u0436\u0435\u043d \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u041d\u043e\u0432\u043e\u0441\u0442\u043d\u043e\u0439 \u0441\u0435\u043d\u0442\u0438\u043c\u0435\u043d\u0442 \u043d\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430 \u0446\u0435\u043d\u0443 \u0430\u043a\u0446\u0438\u0439\u0418\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u0430\u043b\u0438\u0431\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0418\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b, \u0435\u0441\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f \u0441\u0435\u043d\u0442\u0438\u043c\u0435\u043d\u0442 \u0440\u044b\u043d\u043a\u0430. \u041d\u043e\u0432\u043e\u0441\u0442\u0438 \u0423\u0437\u0431\u0435\u043a\u0438\u0441\u0442\u0430\u043d\u0430 \u043d\u0435 \u043c\u0435\u0434\u0438\u0439\u043d\u044b\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u043f\u0430\u0440\u0442\u0438\u0438 &#8212; \u0438\u043d\u0432\u0435\u0441\u0442\u0438\u0446\u0438\u0438\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0441\u0435\u043d\u0442\u0438\u043c\u0435\u043d\u0442 \u044d\u0442\u043e \u043f\u0440\u0435\u0437\u0438\u0434\u0435\u043d\u0442 \u0440\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0438. \u041e\u043d \u043d\u0430\u0437\u0432\u0430\u043b \u043e\u0431\u0449\u0435\u0439 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u0441\u0435\u0433\u043e \u043c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u0442\u0430\u043a\u0438\u043c \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043c \u043f\u0443\u0442\u0451\u043c \u0438\u043d\u0432\u0435\u0441\u0442\u0438\u0446\u0438\u0439 \u0432 \u0438\u0445 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043a\u0443 \u0438 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435. \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435!\u0422\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u043e \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u043d\u043e\u0433\u043e \u0441\u0435\u043d\u0442\u0438\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0440\u044b\u043d\u043e\u043a\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 https:\/\/habr.com\/ru\/articles\/1026010\/<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-476794","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/476794","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=476794"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/476794\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=476794"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=476794"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=476794"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}