<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
    <title>Notes &amp; Insights - quantitative</title>
    <subtitle>Блог об архитектуре систем, AI-агентах, распределенных системах и алгоритмическом трейдинге.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://xsa-dev.github.io/tags/quantitative/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://xsa-dev.github.io"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-10-09T00:00:00+00:00</updated>
    <id>https://xsa-dev.github.io/tags/quantitative/atom.xml</id>
    <entry xml:lang="ru">
        <title>Бюджет и риск-гейты для DCA-позиций: расчёт до запуска бота</title>
        <published>2026-10-09T00:00:00+00:00</published>
        <updated>2026-10-09T00:00:00+00:00</updated>
        
        <author>
          <name>Alexei Savin</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://xsa-dev.github.io/posts/dca-martingale-capital-budget-risk-gates/"/>
        <id>https://xsa-dev.github.io/posts/dca-martingale-capital-budget-risk-gates/</id>
        
        <content type="html" xml:base="https://xsa-dev.github.io/posts/dca-martingale-capital-budget-risk-gates/">&lt;p&gt;Усреднение снижает цену безубыточности, но одновременно увеличивает сумму под риском. &lt;strong&gt;Высокий риск · образовательный разбор.&lt;/strong&gt; Это не инвестиционная рекомендация и не инструкция к запуску торгового бота. Если в отчёте DCA-бота показан только процент прибыльных сделок, главный вопрос остаётся без ответа: &lt;strong&gt;сколько капитала потребует серия покупок, если отскока не будет?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Повод для разбора — видео &lt;a rel=&quot;external&quot; href=&quot;https://youtu.be/M1036x1Hobg&quot;&gt;DCA Martingale Trading Bot Explained&lt;/a&gt;. Рыночный бэктест в рамках этой статьи не проводился.&lt;/p&gt;
&lt;h2 id=&quot;dca-ne-obiazatel-no-martingeil&quot;&gt;DCA — не обязательно мартингейл&lt;/h2&gt;
&lt;p&gt;В этой статье DCA означает дополнительные покупки при снижении цены внутри одной сделки. Это не регулярное долгосрочное инвестирование фиксированной суммы.&lt;/p&gt;
&lt;p&gt;Различать стоит три независимых правила:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Триггер:&lt;/strong&gt; на каком снижении разрешена дополнительная покупка.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Размер:&lt;/strong&gt; сколько денег выделяется каждой покупке.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Остановка:&lt;/strong&gt; когда новые покупки запрещаются и что происходит с уже открытой позицией.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Постоянный размер покупки не является классическим мартингейлом. Геометрическое увеличение размера похоже на него по нагрузке на капитал, но само по себе не гарантирует компенсацию прошлых потерь. Термин «контролируемый» здесь не используется как оценка качества: он имеет смысл только вместе с явными лимитами.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Почему мартингейл опасен.&lt;/strong&gt; Увеличение каждой следующей покупки наращивает экспозицию именно тогда, когда цена движется против позиции. При удвоении номиналов серия 100 → 200 → 400 → 800 требует уже 1500 единиц капитала, а следующая покупка — ещё 1600; это без комиссий. Конечный бюджет не позволяет продолжать такую последовательность бесконечно, а восстановление цены не гарантировано. На споте без заёмных средств можно потерять почти всю стоимость позиции; с плечом ликвидация может наступить ещё до запланированного уровня усреднения. Лимит покупок ограничивает выделяемый капитал, но не делает стратегию прибыльной и не гарантирует выход по заданной цене при разрыве котировок или недостаточной ликвидности. Приведённые ниже расчёты служат для анализа этих ограничений, а не являются торговой идеей, призывом запускать бота или инвестиционной рекомендацией.&lt;/p&gt;
&lt;h2 id=&quot;snachala-biudzhet-zatem-signal&quot;&gt;Сначала бюджет, затем сигнал&lt;/h2&gt;
&lt;p&gt;Пусть B — сумма базовой покупки в валюте котировки, S — сумма первой дополнительной покупки, m — множитель следующих покупок, N — максимальное число дополнительных покупок. Плеча нет; все суммы — номиналы покупок без комиссий.&lt;/p&gt;
&lt;p&gt;$$
C = B + S\sum_{k=0}^{N-1}m^k
$$&lt;/p&gt;
&lt;p&gt;При m ≠ 1:&lt;/p&gt;
&lt;p&gt;$$
C = B + S\frac{m^N-1}{m-1}
$$&lt;/p&gt;
&lt;p&gt;При m = 1 бюджет равен B + NS. Нулевая величина N означает отсутствие дополнительных покупок.&lt;/p&gt;
&lt;p&gt;Например, B = 100, S = 100, m = 2 и N = 4 требуют &lt;strong&gt;1600 единиц капитала&lt;/strong&gt;, хотя стартовая покупка составляет только 100. Для пяти одновременно заполненных серий потребуется 8000 — до комиссий и запаса ликвидности. Это арифметический сценарий, не прогноз рынка.&lt;/p&gt;
&lt;p&gt;Если предполагается реинвестирование прибыли, план нужно пересчитывать при каждом изменении базового размера. Иначе однажды проверенный лимит перестанет соответствовать реальной экспозиции.&lt;/p&gt;
&lt;h3 id=&quot;tri-nezavisimykh-limita&quot;&gt;Три независимых лимита&lt;/h3&gt;
&lt;p&gt;Бюджет серии &lt;code&gt;C&lt;/code&gt; — только номинал покупок. Для рабочего риск-гейта нужны ещё два ограничения:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Лимит серии:&lt;/strong&gt; &lt;code&gt;C &amp;lt;= C_series&lt;/code&gt;, где &lt;code&gt;C_series&lt;/code&gt; включает все дополнительные покупки, разрешённые одной позиции.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Лимит портфеля:&lt;/strong&gt; &lt;code&gt;R_reserved = Σ C_j &amp;lt;= R_portfolio&lt;/code&gt; для всех серий &lt;code&gt;j&lt;/code&gt;, которые могут быть заполнены одновременно.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Лимит ликвидности:&lt;/strong&gt; каждая заявка должна удовлетворять минимальному размеру, шагу количества и доступной глубине; остаток &lt;code&gt;R_portfolio - R_reserved&lt;/code&gt; не следует считать свободным для другой стратегии без общего резервного реестра.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Если вероятность одновременного заполнения неизвестна, для консервативного гейта используют сумму полных бюджетов, а не среднее историческое заполнение. &lt;code&gt;R_reserved&lt;/code&gt; включает quote cash, зарезервированные под незаполненную часть активных заявок; фактически исполненный notional учитывается отдельно. При частичном исполнении резерв уменьшают только после отмены остатка и подтверждённого terminal status (&lt;code&gt;canceled&lt;/code&gt;/&lt;code&gt;closed&lt;/code&gt;), а не сразу после получения частичного fill. Таймаут или перезапуск процесса не являются основанием считать резерв свободным.&lt;/p&gt;
&lt;p&gt;Важно: &lt;code&gt;C&lt;/code&gt; — бюджет покупок в quote currency без комиссий, а не максимальный убыток. Фактический убыток зависит от цены выхода, комиссий, проскальзывания, гэпа и ликвидности; для деривативов добавляется риск ликвидации. Даже полностью зарезервированный бюджет не задаёт нижнюю границу потерь.&lt;/p&gt;
&lt;p&gt;Для оценки чувствительности удобно считать прирост очередного ордера отдельно: &lt;code&gt;ΔC_k = S m^k&lt;/code&gt;. При &lt;code&gt;m &amp;gt; 1&lt;/code&gt; последний разрешённый ордер доминирует в бюджете; поэтому изменение &lt;code&gt;N&lt;/code&gt; на единицу часто опаснее, чем небольшая поправка расстояния между уровнями. Этот расчёт не содержит предположений о вероятности отскока.&lt;/p&gt;
&lt;h2 id=&quot;pochemu-sredniaia-tsena-ne-srednee-tsen-orderov&quot;&gt;Почему средняя цена — не среднее цен ордеров&lt;/h2&gt;
&lt;p&gt;При расходах c и ценах исполнения p количество купленного актива равно расходам, делённым на цену. Поэтому средняя цена взвешивается количествами, а не числом заявок:&lt;/p&gt;
&lt;p&gt;$$
Q = \sum_{i=0}^{N}\frac{c_i}{p_i},\qquad
\bar{p}=\frac{\sum_{i=0}^{N}c_i}{Q}
$$&lt;/p&gt;
&lt;p&gt;Рассмотрим только три исполненные покупки, не весь максимальный план:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Покупка&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Расход&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Цена&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Количество&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Базовая&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;100&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;100&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Дополнительная 1&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;100&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;90&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1,111111&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Дополнительная 2&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;200&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;80&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2,5&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Всего потрачено 400, куплено примерно 4,611111 единицы, средняя цена — &lt;strong&gt;86,746988&lt;/strong&gt;. Чтобы вернуться от 80 к этой цене, нужен рост примерно на 8,43%. Без комиссий это цена безубыточности, а не целевая прибыль.&lt;/p&gt;
&lt;p&gt;Если комиссия каждой покупки уплачена дополнительно в валюте котировки с долей f, а при продаже удерживается такая же доля выручки, цена безубыточности будет:&lt;/p&gt;
&lt;p&gt;$$
p_{BE}=\bar{p}\frac{1+f}{1-f}
$$&lt;/p&gt;
&lt;p&gt;При f = 0,001 получаем около 86,920656. Если комиссия удерживается в базовом активе или отдельном токене, формула учёта меняется. Проскальзывание учитывается фактическими ценами исполнения, а не обещанными уровнями сетки.&lt;/p&gt;
&lt;p&gt;При падении до 60 стоимость позиции составит около 276,67, а нереализованный убыток — 123,33 без комиссий. Средняя цена действительно снизилась; абсолютный риск при этом вырос.&lt;/p&gt;
&lt;h2 id=&quot;proveriaemyi-kal-kuliator-na-python&quot;&gt;Проверяемый калькулятор на Python&lt;/h2&gt;
&lt;p&gt;Код ниже не отправляет заявки и не является стратегией Freqtrade. Он проверяет арифметику плана и трёх гипотетических исполнений. Нужен только Python 3 со стандартной библиотекой.&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;from&lt;/span&gt;&lt;span&gt; decimal&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt; import&lt;/span&gt;&lt;span&gt; Decimal&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt; as&lt;/span&gt;&lt;span&gt; D&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; capital_plan&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;base&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; first&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; multiplier&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; count&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; type&lt;/span&gt;&lt;span&gt;(count)&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; is not&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; or not&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; &amp;lt;=&lt;/span&gt;&lt;span&gt; count&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; &amp;lt;=&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 100&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;        raise&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; ValueError&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;count must be an integer from 0 to 100&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    values&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; tuple&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;str&lt;/span&gt;&lt;span&gt;(x))&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt; for&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt; in&lt;/span&gt;&lt;span&gt; (base&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span&gt; first&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span&gt; multiplier))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color: #F07178;&quot;&gt; any&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;not&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;is_finite&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt; or&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; &amp;lt;=&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt; for&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt; in&lt;/span&gt;&lt;span&gt; values)&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;        raise&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; ValueError&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;sizes and multiplier must be finite and positive&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    base&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span&gt; first&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span&gt; multiplier&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span&gt; values&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    return&lt;/span&gt;&lt;span&gt; base&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: #F07178;&quot;&gt; sum&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        (first&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; *&lt;/span&gt;&lt;span&gt; multiplier&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; **&lt;/span&gt;&lt;span&gt; k&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt; for&lt;/span&gt;&lt;span&gt; k&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color: #F07178;&quot;&gt; range&lt;/span&gt;&lt;span&gt;(count))&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;assert&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; capital_plan&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 100&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 4&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; ==&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;1600&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;assert&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; capital_plan&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 100&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 4&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; ==&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;500&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;assert&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; capital_plan&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 100&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; ==&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;100&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;for&lt;/span&gt;&lt;span&gt; bad&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt; in&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 1.5&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; True&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 101&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    try&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;        capital_plan&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 100&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span&gt; bad)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    except&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; ValueError&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;        pass&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    else&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;        raise&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; AssertionError&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;invalid count accepted&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; breakeven_price&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;average&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; fee&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    average&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span&gt; fee&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;str&lt;/span&gt;&lt;span&gt;(average))&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;str&lt;/span&gt;&lt;span&gt;(fee))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; not&lt;/span&gt;&lt;span&gt; average&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;is_finite&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; or&lt;/span&gt;&lt;span&gt; average&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; &amp;lt;=&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;        raise&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; ValueError&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;average must be finite and positive&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; not&lt;/span&gt;&lt;span&gt; fee&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;is_finite&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; or not&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; &amp;lt;=&lt;/span&gt;&lt;span&gt; fee&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;        raise&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; ValueError&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;fee must be finite and in [0, 1)&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    return&lt;/span&gt;&lt;span&gt; average&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; *&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; +&lt;/span&gt;&lt;span&gt; fee)&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; /&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; -&lt;/span&gt;&lt;span&gt; fee)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;assert&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; breakeven_price&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;100&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; ==&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;100&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;assert&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; breakeven_price&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;86.7469879518&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;0.001&amp;quot;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;86.7469879518&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fills&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span&gt; [(&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;100&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;100&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;100&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;90&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;200&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;80&lt;/span&gt;&lt;span&gt;))]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;cost&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #F07178;&quot;&gt; sum&lt;/span&gt;&lt;span&gt;((cash&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt; for&lt;/span&gt;&lt;span&gt; cash&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span&gt; price&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt; in&lt;/span&gt;&lt;span&gt; fills)&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;0&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;quantity&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #F07178;&quot;&gt; sum&lt;/span&gt;&lt;span&gt;((cash&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; /&lt;/span&gt;&lt;span&gt; price&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt; for&lt;/span&gt;&lt;span&gt; cash&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span&gt; price&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt; in&lt;/span&gt;&lt;span&gt; fills)&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;0&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;average&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span&gt; cost&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; /&lt;/span&gt;&lt;span&gt; quantity&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fee&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;0.001&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;breakeven&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; breakeven_price&lt;/span&gt;&lt;span&gt;(average&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span&gt; fee)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;assert&lt;/span&gt;&lt;span style=&quot;color: #F07178;&quot;&gt; abs&lt;/span&gt;&lt;span&gt;(average&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;86.7469879518&amp;quot;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;0.000000001&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;assert&lt;/span&gt;&lt;span style=&quot;color: #F07178;&quot;&gt; abs&lt;/span&gt;&lt;span&gt;(breakeven&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;86.9206555953&amp;quot;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; D&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;0.000000001&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F07178;&quot;&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;capital=&lt;/span&gt;&lt;span style=&quot;color: #95E6CB;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;capital_plan&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 100&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 4&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: #95E6CB;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F07178;&quot;&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;average=&lt;/span&gt;&lt;span style=&quot;color: #95E6CB;&quot;&gt;{&lt;/span&gt;&lt;span&gt;average&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;:.6f&lt;/span&gt;&lt;span style=&quot;color: #95E6CB;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;; breakeven=&lt;/span&gt;&lt;span style=&quot;color: #95E6CB;&quot;&gt;{&lt;/span&gt;&lt;span&gt;breakeven&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;:.6f&lt;/span&gt;&lt;span style=&quot;color: #95E6CB;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Этот тест не проверяет исторические котировки, ликвидность или доходность. Он нужен для более узкого инварианта: риск-менеджер и стратегия должны одинаково понимать размер запланированной серии.&lt;/p&gt;
&lt;h2 id=&quot;kontur-ispolneniia-limit-do-dopolnitel-noi-pokupki&quot;&gt;Контур исполнения: лимит — до дополнительной покупки&lt;/h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot; &gt;&lt;code data-lang=&quot;mermaid&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;flowchart&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    A&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Новый закрытый бар&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;] --&amp;gt;&lt;/span&gt;&lt;span&gt; B&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Сверка позиций и заявок&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    B &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; C&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Есть неопределённое исполнение?&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    C &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Да&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; D&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Пауза и повторная сверка&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    C &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Нет&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; E&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Проверка уровня и номера покупки&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    E &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; F&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Хватает лимита серии и портфеля?&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    F &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Нет&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; G&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Запрет увеличения позиции&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    F &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Да&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; H&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Резервирование бюджета и заявка&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    H &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; I&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Запись фактического исполнения&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Здесь нужны два лимита: на отдельную серию и на весь портфель. Остаток свободных денег сам по себе не заменяет резерв: несколько ботов могут одновременно считать одни и те же средства доступными.&lt;/p&gt;
&lt;p&gt;Минимальная запись состояния содержит идентификатор серии, номер дополнительной покупки, уже исполненный объём, зарезервированную сумму и идентификатор заявки. После таймаута сначала выясняют судьбу заявки, а не немедленно отправляют новую. Частичное исполнение учитывают по фактическому объёму; перезапуск процесса не должен обнулять счётчик покупок.&lt;/p&gt;
&lt;p&gt;В Freqtrade увеличение позиции реализуется через &lt;code&gt;adjust_trade_position()&lt;/code&gt;. Это callback именно для position adjustment; его частота вызовов и поведение в live/dry-run отличаются от бэктеста. Условие вроде «цена ниже уровня» остаётся истинным несколько итераций подряд: без проверки состояния оно способно породить повторные покупки. Возвращаемые значения (stake/amount), ограничения биржи и конфигурационные лимиты зависят от установленной версии Freqtrade, поэтому implementation contract нужно сверять с документацией конкретной версии, а не только со stable-ссылкой. Точные параметры callback и ограничения числа дополнительных входов проверяйте по документации установленной версии.&lt;/p&gt;
&lt;p&gt;Отказ от дальнейшего усреднения &lt;strong&gt;не закрывает существующий риск&lt;/strong&gt;. Отдельная политика должна описывать выход, максимальную длительность сделки и аварийное отключение. Стоп-заявка тоже не гарантирует цену исполнения при гэпе. Здесь рассматривается спот без плеча; для деривативов дополнительно необходимы модель маржи, funding и риск ликвидации.&lt;/p&gt;
&lt;h2 id=&quot;kak-proveriat-strategiiu-a-ne-krasivuiu-krivuiu&quot;&gt;Как проверять стратегию, а не красивую кривую&lt;/h2&gt;
&lt;p&gt;До перебора параметров задайте протокол:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Разделите время.&lt;/strong&gt; Подбор параметров — на тренировочном периоде; выбор варианта — на валидационном; финальная проверка — на отдельном, ранее не использованном периоде. Повторный подбор по финальному отчёту превращает его в тренировочный.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Сравните одинаковый капитал.&lt;/strong&gt; Покупка на 100 с резервом 1500 и buy-and-hold на 1600 — разные режимы экспозиции. Покажите доходность на весь выделенный капитал, а не только на первую покупку.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Проверьте открытые позиции.&lt;/strong&gt; Высокая доля выигрышных закрытых сделок может соседствовать с большой плавающей просадкой. Нужна equity с переоценкой открытых позиций, а не только баланс завершённых циклов.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Учтите издержки.&lt;/strong&gt; Комиссии, спред, ограничения минимального ордера и шаг количества; отдельно — стрессовое проскальзывание и пропущенные исполнения.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Испытайте одновременное падение активов.&lt;/strong&gt; Число разных тикеров не гарантирует диверсификацию: в стрессовом режиме они могут одновременно запросить полный резерв.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Проверьте утечку будущего.&lt;/strong&gt; &lt;code&gt;lookahead-analysis&lt;/code&gt; в Freqtrade помогает обнаруживать часть подобных ошибок, но не доказывает прибыльность или отсутствие всех видов смещения. После него нужны обычный бэктест с реальными лимитами и dry-run.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Для итогового отчёта полезнее одного win rate четыре числа: максимальная просадка equity, максимальная занятость капитала, длительность самой долгой серии и результат на всём выделенном капитале после издержек. Добавьте число серий: редкие завершения дают мало независимых наблюдений.&lt;/p&gt;
&lt;h2 id=&quot;kliuchevye-vyvody&quot;&gt;Ключевые выводы&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Геометрическое увеличение покупок требует заранее посчитанного бюджета, даже если первая заявка мала.&lt;/li&gt;
&lt;li&gt;Снижение средней цены не означает снижения денежного риска.&lt;/li&gt;
&lt;li&gt;Ограничение количества покупок — не замена выходу и портфельному лимиту.&lt;/li&gt;
&lt;li&gt;Арифметический тест, исторический бэктест и dry-run отвечают на разные вопросы; ни один не гарантирует будущую прибыль.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Практический первый шаг — выписать B, S, m и N из своего исследовательского конфига и сравнить полный бюджет с доступным резервом при одновременном заполнении всех серий. Это материал об инженерной проверке рисков, а не рекомендация запускать усреднение на реальном счёте.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;pervoistochniki-i-materialy&quot;&gt;Первоисточники и материалы&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Оригинальное видео:&lt;/strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https://youtu.be/M1036x1Hobg&quot;&gt;DCA Martingale Trading Bot Explained — Risk Controls + Out-of-Sample Backtest&lt;/a&gt;. Результаты стратегии независимо не воспроизводились.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Документация callback:&lt;/strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https://www.freqtrade.io/en/stable/strategy-callbacks/#adjust-trade-position&quot;&gt;Freqtrade — Adjust trade position&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Проверка утечки будущего:&lt;/strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https://www.freqtrade.io/en/stable/lookahead-analysis/&quot;&gt;Freqtrade — Lookahead analysis&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Инженерные наработки:&lt;/strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https://github.com/xsa-dev&quot;&gt;github.com/xsa-dev&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Order Flow, Footprint и CVD в алготрейдинге: физика ликвидности и чтение микроструктуры рынка</title>
        <published>2026-10-08T00:00:00+00:00</published>
        <updated>2026-10-08T00:00:00+00:00</updated>
        
        <author>
          <name>Alexei Savin</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://xsa-dev.github.io/posts/order-flow-footprint-cvd-algo-trading/"/>
        <id>https://xsa-dev.github.io/posts/order-flow-footprint-cvd-algo-trading/</id>
        
        <content type="html" xml:base="https://xsa-dev.github.io/posts/order-flow-footprint-cvd-algo-trading/">&lt;p&gt;Большинство розничных трейдеров и начинающих квант-разработчиков смотрят на рынок через призму &lt;strong&gt;свечей (OHLCV)&lt;/strong&gt; и производных индикаторов (RSI, MACD, скользящие средние). Главная проблема такого подхода — &lt;strong&gt;запаздывание и потеря информации&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Свеча фиксирует только финальный результат интервала времени, скрывая главное: &lt;em&gt;какие объемы, по каким ценам и с какой агрессией проторговывались внутри бара&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Order Flow (поток ордеров)&lt;/strong&gt; — это фундаментальная физика биржи. Это регистрация реального взаимодействия между покупателями и продавцами в режиме реального времени.&lt;/p&gt;
&lt;p&gt;Разберем, как устроена биржевая ликвидность, как читать кластерный график (&lt;strong&gt;Footprint&lt;/strong&gt;), интерпретировать накопленную дельту (&lt;strong&gt;CVD&lt;/strong&gt;) и формализовать эти сигналы в алгоритмических стратегиях.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1-fizika-rynka-market-vs-limit-ordera-v-birzhevom-stakane-dom&quot;&gt;1. Физика рынка: Market vs Limit ордера в биржевом стакане (DOM)&lt;/h2&gt;
&lt;p&gt;Рыночная цена не движется сама по себе — ее двигает исключительно дисбаланс между агрессивными и пассивными заявками в &lt;strong&gt;Depth of Market (DOM)&lt;/strong&gt;:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;Сторона стакана&lt;/th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Ценовой уровень&lt;/th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Доступный объем&lt;/th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Роль участника&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;🔴 &lt;strong&gt;ASK (Sell Limit)&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;$65,010&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;12.5 BTC&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Пассивный продавец&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;🔴 &lt;strong&gt;ASK (Sell Limit)&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;$65,005&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;8.0 BTC&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Пассивный продавец&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;🔴 &lt;strong&gt;ASK (Sell Limit)&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;$65,000&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;4.2 BTC&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Best Ask (ближайшая ликвидность)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;⚡ &lt;strong&gt;SPREAD&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;—&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;—&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;Market BUY&lt;/strong&gt; выкупает ликвидность Ask&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;🟢 &lt;strong&gt;BID (Buy Limit)&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;$64,995&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;5.1 BTC&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Best Bid (ближайшая поддержка)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;🟢 &lt;strong&gt;BID (Buy Limit)&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;$64,990&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;10.0 BTC&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Пассивный покупатель&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;🟢 &lt;strong&gt;BID (Buy Limit)&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;$64,985&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;15.4 BTC&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Пассивный покупатель&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;kliuchevye-aksiomy-mikrostruktury&quot;&gt;Ключевые аксиомы микроструктуры:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Limit Orders (Пассивные):&lt;/strong&gt; добавляют ликвидность в стакан. Они формируют уровни поддержки/сопротивления и ждут, пока в них исполнятся другие участники.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Market Orders (Агрессивные):&lt;/strong&gt; забирают ликвидность из стакана. Только рыночные ордера двигают цену, «выедая» лимитные заявки на противоположной стороне.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deep vs Shallow Market:&lt;/strong&gt; на глубоком рынке крупный рыночный ордер сдвинет цену незначительно; на тонком (неликвидном) рынке даже средний объем пробьет несколько ценовых уровней (проскальзывание / slippage).&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;2-volume-footprint-klasternyi-rentgen-svechi&quot;&gt;2. Volume Footprint: кластерный рентген свечи&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Footprint&lt;/strong&gt; разбивает каждую свечу на ценовые уровни и показывает объем сделок, совершенных по цене &lt;strong&gt;Bid&lt;/strong&gt; (агрессивные продажи) и по цене &lt;strong&gt;Ask&lt;/strong&gt; (агрессивные покупки):&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;Уровень цены&lt;/th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Bid (Market Sell)&lt;/th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Ask (Market Buy)&lt;/th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Delta ($\Delta$)&lt;/th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Рыночная структура&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;$65,020&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;12&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;85&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;+73&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;🟢 &lt;strong&gt;Stacked Buying Imbalance&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;$65,015&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;5&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;42&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;+37&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;🟢 &lt;strong&gt;Stacked Buying Imbalance&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;$65,010&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;18&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;90&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;+72&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;🟢 &lt;strong&gt;Агрессор пробивает уровень&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;$65,005&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;50&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;48&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;-2&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Нейтральный баланс&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;$65,000&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;120&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;110&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;-10&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;🔵 &lt;strong&gt;Point of Control (POC / макс. объем)&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;chto-daet-footprint&quot;&gt;Что дает Footprint:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Delta ($\Delta$):&lt;/strong&gt; разница между покупками по Ask и продажами по Bid на конкретной цене:
$$\Delta = \text{Volume}_{\text{Ask}} - \text{Volume}_{\text{Bid}}$$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stacked Imbalance (Стек дисбалансов):&lt;/strong&gt; ситуация, когда 3 и более ценовых уровня подряд показывают многократный перевес покупателей или продавцов (обычно от 300% до 400%). Это маркер сильного импульса.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;3-dva-kliuchevykh-patterna-absorption-vs-initiation&quot;&gt;3. Два ключевых паттерна: Absorption vs Initiation&lt;/h2&gt;
&lt;p&gt;При анализе Footprint алгоритм ищет два фундаментальных состояния рынка:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot; &gt;&lt;code data-lang=&quot;mermaid&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;flowchart&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    subgraph&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; P1 &lt;/span&gt;&lt;span&gt;[&amp;quot;🛡️ Паттерн 1: Absorption &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Поглощение лимитным игроком&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;)&lt;/span&gt;&lt;span&gt;&amp;quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        direction TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        A1&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;Агрессивные Market SELL (Delta резко отрицательная)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        A2&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;Крупный Buy Limit на дне свечи впитывает весь объем&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        A3&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;Итог: Гигантский объем на дне, но цена НЕ падает&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        A4&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;🟢 Сигнал: Бычий разворот (Bullish Reversal)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        A1 &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;gt; A2 &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; A3 &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; A4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    subgraph&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; P2 &lt;/span&gt;&lt;span&gt;[&amp;quot;⚡ Паттерн 2: Initiation &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Инициация импульса&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;)&lt;/span&gt;&lt;span&gt;&amp;quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        direction TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        B1&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;Агрессивные Market BUY легко выносят тонкий стакан Ask&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        B2&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;Свеча закрывается на максимуме с устойчивой дельтой&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        B3&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;🟢 Сигнал: Истинный пробой и продолжение тренда&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        B1 &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;gt; B2 &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; B3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;4-cvd-cumulative-volume-delta-i-divergentsii&quot;&gt;4. CVD (Cumulative Volume Delta) и дивергенции&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;CVD (накопленная дельта объема)&lt;/strong&gt; суммирует дельту всех совершенных сделок с начала сессии или расчетного окна:&lt;/p&gt;
&lt;p&gt;$$\text{CVD}_t = \sum_{i=1}^{t} \Delta_i = \sum_{i=1}^{t} (\text{Vol}_{\text{Ask}, i} - \text{Vol}_{\text{Bid}, i})$$&lt;/p&gt;
&lt;h3 id=&quot;divergentsii-cvd-kak-indikator-istoshcheniia&quot;&gt;Дивергенции CVD как индикатор истощения:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Медвежья дивергенция (Bearish Absorption):&lt;/strong&gt; цена обновляет локальный максимум (Higher High), но CVD формирует более низкий максимум (Lower High) или резко падает. Это означает, что рост идет на тонком рынке без поддержки реальных покупок.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Бычья дивергенция (Bullish Absorption):&lt;/strong&gt; цена обновляет минимум (Lower Low), а CVD растет (Higher Low). Агрессивные продажи упираются в скрытые лимитные заявки крупного покупателя.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;5-volume-profile-poc-value-area-hvn-i-lvn&quot;&gt;5. Volume Profile: POC, Value Area, HVN и LVN&lt;/h2&gt;
&lt;p&gt;В то время как классический объем привязан к времени (Volume per Bar), &lt;strong&gt;Volume Profile&lt;/strong&gt; группирует объем по горизонтальным ценовым уровням (Volume at Price):&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;Ценовой уровень&lt;/th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Профиль объема&lt;/th&gt;&lt;th style=&quot;text-align: center&quot;&gt;Тип зоны&lt;/th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Структура ликвидности&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;$65,030&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;█&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;LVN&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Зона быстрого пролета (тонкая ликвидность)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;$65,020&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;██████&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;VA&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Value Area (торговля в балансе)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;$65,010&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;████████████████████&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;POC / HVN&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;Point of Control (максимальное принятие цены)&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;$65,000&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;██████████&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;VA&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Value Area (торговля в балансе)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;$64,990&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;█&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;strong&gt;LVN&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Зона отторжения цены&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;anatomiia-kliuchevykh-zon-volume-profile&quot;&gt;Анатомия ключевых зон Volume Profile:&lt;/h3&gt;
&lt;p&gt;В зависимости от концентрации объема алгоритм делит горизонтальный профиль на четыре базовых узла ликвидности:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;Уровень&lt;/th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Описание&lt;/th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Торговый смысл&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;POC (Point of Control)&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Ценовой уровень с максимальным объемом за период.&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Служит «магнитом» для цены и сильным уровнем ретеста.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;Value Area (VA)&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Диапазон цен, в котором прошло ~70% всего объема.&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Торговля внутри VA = баланс; выход за границы VA = направленный импульс.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;HVN (High Volume Node)&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Узлы высокой плотности объема.&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Зоны консолидации и принятия справедливой цены.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;LVN (Low Volume Node)&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Узлы низкой плотности объема.&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Уровни неликвидности, которые цена проскакивает с высокой скоростью.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;6-algoritmicheskaia-realizatsiia-raschet-delta-i-cvd-na-python&quot;&gt;6. Алгоритмическая реализация: расчет Delta и CVD на Python&lt;/h2&gt;
&lt;p&gt;Для количественных бэктестов и торговых ботов поток тиков (&lt;em&gt;Trade Prints / Time &amp;amp; Sales&lt;/em&gt;) агрегируется по тиковым флагам (&lt;code&gt;is_buyer_maker&lt;/code&gt;):&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;import&lt;/span&gt;&lt;span&gt; pandas&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt; as&lt;/span&gt;&lt;span&gt; pd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;import&lt;/span&gt;&lt;span&gt; numpy&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt; as&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; calculate_order_flow_metrics&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;trades_df&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;span&gt; pd&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;DataFrame)&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; pd&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;DataFrame:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;    Расчет дельты и CVD по потоку тиковых сделок биржи.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;    trades_df содержит: [&amp;#39;timestamp&amp;#39;, &amp;#39;price&amp;#39;, &amp;#39;quantity&amp;#39;, &amp;#39;is_buyer_maker&amp;#39;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;    # Если сделка совершена по инициативе покупателя (buyer is taker), это покупка по Ask&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;    # Если is_buyer_maker == True, значит покупатель выставил лимит, а продавец ударил по рынку (Sell)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    trades_df[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;#39;is_buy&amp;#39;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; = ~&lt;/span&gt;&lt;span&gt;trades_df[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;#39;is_buyer_maker&amp;#39;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    trades_df[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;#39;buy_vol&amp;#39;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;where&lt;/span&gt;&lt;span&gt;(trades_df[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;#39;is_buy&amp;#39;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span&gt; trades_df[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;#39;quantity&amp;#39;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 0.0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    trades_df[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;#39;sell_vol&amp;#39;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;where&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt;~&lt;/span&gt;&lt;span&gt;trades_df[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;#39;is_buy&amp;#39;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span&gt; trades_df[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;#39;quantity&amp;#39;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 0.0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    trades_df[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;#39;delta&amp;#39;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span&gt; trades_df[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;#39;buy_vol&amp;#39;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; -&lt;/span&gt;&lt;span&gt; trades_df[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;#39;sell_vol&amp;#39;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;    # Расчет кумулятивной дельты (CVD)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    trades_df[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;#39;cvd&amp;#39;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span&gt; trades_df[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;#39;delta&amp;#39;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;cumsum&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;    # Агрегация по 1-минутным барам&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    bars&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span&gt; trades_df&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;resample&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;#39;1min&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span&gt; on&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;#39;timestamp&amp;#39;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;agg&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;        &amp;#39;price&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;#39;first&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;#39;max&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;#39;min&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;#39;last&amp;#39;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;        &amp;#39;quantity&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;#39;sum&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;        &amp;#39;buy_vol&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;#39;sum&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;        &amp;#39;sell_vol&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;#39;sum&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;        &amp;#39;delta&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;#39;sum&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;        &amp;#39;cvd&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;#39;last&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    return&lt;/span&gt;&lt;span&gt; bars&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;kliuchevye-vyvody&quot;&gt;Ключевые выводы&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Цену двигают только агрессивные заявки:&lt;/strong&gt; рыночные покупки бьют по лимитным продажам (Ask), рыночные продажи — по лимитным покупкам (Bid).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Footprint дает опережающий сигнал:&lt;/strong&gt; паттерны &lt;em&gt;Absorption&lt;/em&gt; (поглощение) на ключевых уровнях позволяют заходить в позиции до того, как индикаторы успеют отреагировать.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CVD выявляет манипуляции и истощение:&lt;/strong&gt; расхождение между движением цены и накопленной дельтой защищает от ложных пробоев.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Volume Profile очерчивает карту боя:&lt;/strong&gt; POC и границы Value Area (VA) служат математически обоснованными таргетами для фиксации прибыли и выставления защитных стоп-приказов.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;pervoistochniki-i-materialy&quot;&gt;Первоисточники и материалы&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Автор курса и видеоматериал:&lt;/strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https://youtu.be/Rqu-AoD9BUo&quot;&gt;Mind Math Money — MASTER Order Flow Trading (Complete Guide)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Детальный конспект и cheat-sheet в базе знаний:&lt;/strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https://github.com/xsa-dev/obsidian-vault/blob/main/YouTube/Order-Flow-Trading-Course-MindMathMoney-2026.md&quot;&gt;Obsidian Vault: Order Flow Course Notes (GitHub)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Количественные репозитории:&lt;/strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https://github.com/xsa-dev&quot;&gt;github.com/xsa-dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Алгоритмический трейдинг на Polymarket: архитектура снайпера 5-минутных бинарных рынков через CLOB API</title>
        <published>2026-10-08T00:00:00+00:00</published>
        <updated>2026-10-08T00:00:00+00:00</updated>
        
        <author>
          <name>Alexei Savin</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://xsa-dev.github.io/posts/polymarket-clob-algo-trading-sniper/"/>
        <id>https://xsa-dev.github.io/posts/polymarket-clob-algo-trading-sniper/</id>
        
        <content type="html" xml:base="https://xsa-dev.github.io/posts/polymarket-clob-algo-trading-sniper/">&lt;p&gt;Рынки предсказаний (&lt;strong&gt;Prediction Markets&lt;/strong&gt;, в частности &lt;strong&gt;Polymarket&lt;/strong&gt;) переживают экспоненциальный рост объема торгов. В отличие от традиционных спотовых или фьючерсных рынков, здесь торгуются &lt;strong&gt;бинарные контракты&lt;/strong&gt; (&lt;em&gt;Binary Outcome Shares&lt;/em&gt;), цена которых колеблется в диапазоне от &lt;code&gt;$0.00&lt;/code&gt; до &lt;code&gt;$1.00&lt;/code&gt; и отражает вероятность наступления события:&lt;/p&gt;
&lt;p&gt;$$P(\text{Event}) \in [0, 1]$$&lt;/p&gt;
&lt;p&gt;С появлением ультракоротких 5-минутных рынков на криптовалюты (BTC, ETH, SOL, XRP «Будет ли цена выше $X в 14:05?») открылось окно возможностей для алгоритмического арбитража и снайпинга за счет временного лага между спотовыми/деривативными биржами и стаканом предсказаний.&lt;/p&gt;
&lt;p&gt;Разберем архитектуру торгового бота &lt;strong&gt;Strike Sniper&lt;/strong&gt; (исследованного Moon Dev), особенности работы с &lt;strong&gt;Polymarket CLOB API&lt;/strong&gt; и ключевые риски высокочастотного исполнения.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1-topologiia-arkhitektury-cross-exchange-price-discovery&quot;&gt;1. Топология архитектуры: Cross-Exchange Price Discovery&lt;/h2&gt;
&lt;p&gt;Снайпинг предсказательных рынков строится на сопоставлении двух источников данных:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot; &gt;&lt;code data-lang=&quot;mermaid&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;flowchart&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    subgraph&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; S1 &lt;/span&gt;&lt;span&gt;[&amp;quot;⚡ 1. Быстрый источник &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Hyperliquid L2 WebSocket&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;)&lt;/span&gt;&lt;span&gt;&amp;quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        direction TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        H1&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;Real-time спот/перп котировки (BTC, ETH, SOL)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        H2&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;Мгновенная регистрация импульса цены&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        H1 &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; H2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    S1 &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;==&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Референсная цена P_ref&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; S2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    subgraph&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; S2 &lt;/span&gt;&lt;span&gt;[&amp;quot;🎯 2. Стратегический движок &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Strike Sniper Logic&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;)&lt;/span&gt;&lt;span&gt;&amp;quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        direction TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        G1&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;Polymarket Gamma API: Strike Price K&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        G2&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;Сравнение: P_ref &amp;gt; K + Spread_safe?&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        G3&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;Расчет размера позиции (Share Sizing)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        G1 &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; G2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        G2 &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Да, вероятность YES растет&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; G3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    S2 &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;==&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Taker Order Intent &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; EIP&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;712&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; S3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    subgraph&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; S3 &lt;/span&gt;&lt;span&gt;[&amp;quot;🛡️ 3. Исполнение &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Polymarket CLOB API&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;)&lt;/span&gt;&lt;span&gt;&amp;quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        direction TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        C1&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;Central Limit Order Book (L2 стакан)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        C2&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;Лимитные / Taker заявки на YES / NO&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        C3&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;Event Logger + Circuit Breaker (Daily Stop-Loss)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        C1 &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;gt; C2 &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; C3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;2-mekhanika-birzhi-central-limit-order-book-clob&quot;&gt;2. Механика биржи: Central Limit Order Book (CLOB)&lt;/h2&gt;
&lt;p&gt;Polymarket использует не классический AMM (как Uniswap), а полноценную биржевую книгу лимитных ордеров (&lt;strong&gt;CLOB — Central Limit Order Book&lt;/strong&gt;) с поддержкой EIP-712 подписей:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;YES / NO токены:&lt;/strong&gt; каждый исход представлен ERC-1155 токеном. Покупка YES по цене &lt;code&gt;$0.65&lt;/code&gt; означает выплату &lt;code&gt;$1.00&lt;/code&gt; в случае победы (прибыль &lt;code&gt;$0.35&lt;/code&gt;) или &lt;code&gt;$0.00&lt;/code&gt; в случае проигрыша (убыток &lt;code&gt;$0.65&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Taker vs Maker:&lt;/strong&gt; снайпер чаще всего выступает как &lt;strong&gt;Taker&lt;/strong&gt; — выкупает ликвидность из стакана Ask, когда референсная цена на Hyperliquid уже ушла выше страйка, но лимитные заявки на Polymarket еще не успели переставиться.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Расчет количества долей (Shares):&lt;/strong&gt;
$$\text{Shares} = \frac{\text{Budget}}{\text{Best Ask Price}}$$&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;3-kolichestvennyi-kontur-na-python&quot;&gt;3. Количественный контур на Python&lt;/h2&gt;
&lt;p&gt;Пример архитектуры ядра снайпера для опроса цен и отправки ордера:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;import&lt;/span&gt;&lt;span&gt; time&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;import&lt;/span&gt;&lt;span&gt; requests&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;from&lt;/span&gt;&lt;span&gt; dataclasses&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt; import&lt;/span&gt;&lt;span&gt; dataclass&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E6C08A;&quot;&gt;@dataclass&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #59C2FF;&quot;&gt; MarketTarget&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    symbol&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; str&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    strike_price&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; float&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    token_id&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; str&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    end_time&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; int&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #59C2FF;&quot;&gt; PolymarketStrikeSniper&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    def&lt;/span&gt;&lt;span style=&quot;color: #F07178;&quot;&gt; __init__&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; clob_client&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; hyperliquid_feed&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt;        self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span&gt; clob_client&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt;        self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;feed&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span&gt; hyperliquid_feed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt;        self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;daily_pnl&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 0.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt;        self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;max_daily_loss&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; = -&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;50.0&lt;/span&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;  # Circuit Breaker: -$50 в день&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    def&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; evaluate_market&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; target&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;span&gt; MarketTarget&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; budget_usd&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; float&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 5.0&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;        # 1. Защита капитала (Circuit Breaker)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;daily_pnl&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; &amp;lt;=&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;max_daily_loss&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F07178;&quot;&gt;            print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;[ALERT] Daily Stop-Loss достигнут. Торги остановлены.&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;            return&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;        # 2. Получение быстрой цены с деривативной биржи&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        ref_price&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;feed&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;get_latest_mid_price&lt;/span&gt;&lt;span&gt;(target&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;symbol)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;        # 3. Получение лучшего аска в стакане Polymarket CLOB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        orderbook&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;get_order_book&lt;/span&gt;&lt;span&gt;(target&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;token_id)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        best_ask&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; float&lt;/span&gt;&lt;span&gt;(orderbook[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;#39;asks&amp;#39;&lt;/span&gt;&lt;span&gt;][&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;0&lt;/span&gt;&lt;span&gt;][&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;#39;price&amp;#39;&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;        # 4. Логика арбитражного входа: цена уверенно выше страйка, но контракт дешев&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        price_buffer&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span&gt; target&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;strike_price&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 0.0015&lt;/span&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;  # 0.15% буфер запаса&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;        if&lt;/span&gt;&lt;span&gt; ref_price&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span&gt; (target&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;strike_price&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; +&lt;/span&gt;&lt;span&gt; price_buffer)&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; and&lt;/span&gt;&lt;span&gt; best_ask&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 0.85&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            shares&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; int&lt;/span&gt;&lt;span&gt;(budget_usd&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; /&lt;/span&gt;&lt;span&gt; best_ask)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;            if&lt;/span&gt;&lt;span&gt; shares&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F07178;&quot;&gt;                print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;[EXECUTE] BUY &lt;/span&gt;&lt;span style=&quot;color: #95E6CB;&quot;&gt;{&lt;/span&gt;&lt;span&gt;shares&lt;/span&gt;&lt;span style=&quot;color: #95E6CB;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; shares @ $&lt;/span&gt;&lt;span style=&quot;color: #95E6CB;&quot;&gt;{&lt;/span&gt;&lt;span&gt;best_ask&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;:.2f&lt;/span&gt;&lt;span style=&quot;color: #95E6CB;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; (Ref: $&lt;/span&gt;&lt;span style=&quot;color: #95E6CB;&quot;&gt;{&lt;/span&gt;&lt;span&gt;ref_price&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;:.2f&lt;/span&gt;&lt;span style=&quot;color: #95E6CB;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;gt; Strike: $&lt;/span&gt;&lt;span style=&quot;color: #95E6CB;&quot;&gt;{&lt;/span&gt;&lt;span&gt;target&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;strike_price&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;:.2f&lt;/span&gt;&lt;span style=&quot;color: #95E6CB;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;)&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;                # Отправка taker-ордера через подпись EIP-712&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt;                self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;create_and_post_order&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                    token_id&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt;=&lt;/span&gt;&lt;span&gt;target&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;token_id&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                    price&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt;=&lt;/span&gt;&lt;span&gt;best_ask&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                    size&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt;=&lt;/span&gt;&lt;span&gt;shares&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                    side&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;BUY&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                )&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;4-podvodnye-kamni-i-riski-5-minutnogo-snaipinga&quot;&gt;4. Подводные камни и риски 5-минутного снайпинга&lt;/h2&gt;
&lt;p&gt;Высокая частота рынка создает серьезные скрытые издержки:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Turnover Drag (Частотный риск):&lt;/strong&gt; 4 актива каждые 5 минут генерируют до 48 торговых циклов в час. Без строгого математического преимущества (&lt;em&gt;Edge&lt;/em&gt;) серия из 3–4 убытков подряд быстро сжигает депозит.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Задержка разрешения рынка (Settlement Latency):&lt;/strong&gt; оракул (UMA / Chainlink) разрешает исход по фиксированному снепшоту цены. Разница в источниках цен (Binance vs Coinbase vs Hyperliquid) может привести к тому, что локальный индикатор показал победу, а оракул зафиксировал проигрыш.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Slippage и глубина стакана:&lt;/strong&gt; на 5-минутных контрактах ликвидность ограничена сотнями долларов. Попытка зайти крупным объемом мгновенно сдвигает цену до невыгодных &lt;code&gt;$0.95+&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;kliuchevye-vyvody&quot;&gt;Ключевые выводы&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Бинарные рынки — это вероятность, а не направление:&lt;/strong&gt; расчет строится вокруг вероятности $P &amp;gt; \text{Ask Price}$ с поправкой на дисконт риска.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Кросс-рыночный арбитраж:&lt;/strong&gt; скорость получения спотовых/перп тиков (Hyperliquid L2) является главным конкурентным преимуществом.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Обязательный Circuit Breaker:&lt;/strong&gt; алгоритмический лимит дневного убытка (&lt;code&gt;max_daily_loss&lt;/code&gt;) критически необходим для защиты от непредвиденных сбоев оракулов или задержек сети.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;pervoistochniki-i-materialy&quot;&gt;Первоисточники и материалы&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Автор исследования и демонстрация бота:&lt;/strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https://youtu.be/zrUQ-oE5ND4&quot;&gt;Moon Dev — Fable 5 Made Me a 5 Min Polymarket Trading Bot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Детальный конспект в базе знаний:&lt;/strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https://github.com/xsa-dev/obsidian-vault/blob/main/YouTube/Polymarket-Fable5-Strike-Sniper-MoonDev-2026.md&quot;&gt;Obsidian Vault: Polymarket Strike Sniper Notes (GitHub)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Количественные репозитории:&lt;/strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https://github.com/xsa-dev&quot;&gt;github.com/xsa-dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Reinforcement Learning в алготрейдинге: архитектура памяти состояний, Q-learning и стационарные признаки</title>
        <published>2026-10-07T00:00:00+00:00</published>
        <updated>2026-10-07T00:00:00+00:00</updated>
        
        <author>
          <name>Alexei Savin</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://xsa-dev.github.io/posts/rl-algo-trading-state-memory/"/>
        <id>https://xsa-dev.github.io/posts/rl-algo-trading-state-memory/</id>
        
        <content type="html" xml:base="https://xsa-dev.github.io/posts/rl-algo-trading-state-memory/">&lt;p&gt;Большинство попыток применить классическое машинное обучение (Supervised Learning) к финансовым рынкам разбиваются об одну фундаментальную проблему — &lt;strong&gt;нестационарность временных рядов&lt;/strong&gt;. Рыночный режим меняется, скользящие средние смещаются, а обученная на исторических ценах «монолитная» нейросеть начинает генерировать ложные сигналы.&lt;/p&gt;
&lt;p&gt;Вместо монолитных «черных ящиков» в количественном трейдинге все чаще применяются &lt;strong&gt;иерархические системы обучения с подкреплением (Reinforcement Learning)&lt;/strong&gt; на основе дискретной памяти состояний и стационарных признаков.&lt;/p&gt;
&lt;p&gt;Разберем архитектуру такого контура: от квантования рыночного опыта в «нейроны памяти» до взвешенного ансамблевого голосования (&lt;em&gt;Collective Mind&lt;/em&gt;).&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1-ierarkhicheskaia-arkhitektura-ot-neirona-k-ansambliu&quot;&gt;1. Иерархическая архитектура: от нейрона к ансамблю&lt;/h2&gt;
&lt;p&gt;Вместо одной сложной модели строится трехуровневая модульная иерархия:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot; &gt;&lt;code data-lang=&quot;mermaid&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;flowchart&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    CM&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;🧠 Collective Mind (Совет агентов)&amp;lt;br/&amp;gt;Взвешенное динамическое голосование&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    A1&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;📈 Агент 1: Trend Following&amp;lt;br/&amp;gt;(Свои веса &amp;amp; Q)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    A2&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;🔄 Агент 2: Mean Reversion&amp;lt;br/&amp;gt;(Свои веса &amp;amp; Q)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    A3&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;⚡ Агент 3: Volatility Breakout&amp;lt;br/&amp;gt;(Свои веса &amp;amp; Q)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    CM &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Агрегация весов P_win&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; A1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    CM &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Агрегация весов P_win&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; A2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    CM &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Агрегация весов P_win&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; A3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    DB&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;💾 База нейронов памяти (Q-Table)&amp;lt;br/&amp;gt;Квантованные инварианты опыта z_t&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    A1 &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Чтение / Запись опыта&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; DB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    A2 &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Чтение / Запись опыта&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; DB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    A3 &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Чтение / Запись опыта&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; DB&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Нейрон памяти (Memory Neuron):&lt;/strong&gt; элементарная единица опыта. Хранит квантованный ключ рыночной ситуации, предпринятое действие ($a \in {\text{Buy}, \text{Sell}, \text{Hold}}$), текущую $Q$-оценку, счетчик посещений и возраст записи.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Специализированный агент:&lt;/strong&gt; независимый модуль логики со своим фокусом (краткосрочный импульс, спред, фильтр волатильности).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Collective Mind (Коллективный разум):&lt;/strong&gt; управляющий контур, объединяющий решения агентов через взвешенное голосование, где вес каждого агента динамически пропорционален его исторической точности ($P_{\text{win}}$).&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;2-statsionarnye-priznaki-invariantnost-k-urovniu-tsen&quot;&gt;2. Стационарные признаки: инвариантность к уровню цен&lt;/h2&gt;
&lt;p&gt;Сырые цены закрытия и абсолютные индикаторы нестационарны. Если обучить модель на Bitcoin по $30,000, при цене $90,000 ее веса потеряют физический смысл.&lt;/p&gt;
&lt;p&gt;Решение — переход к &lt;strong&gt;стационарным z-score инвариантам&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;$$z_t = \frac{p_t - \mu_{\text{SMA}(k)}}{\sigma_{\text{StdDev}(k)}}$$&lt;/p&gt;
&lt;p&gt;Вектор состояния описывает не &lt;em&gt;«где находится цена»&lt;/em&gt;, а &lt;em&gt;«форму и аномалию движения»&lt;/em&gt; относительно локальной волатильности. Далее непрерывные значения квантуются в дискретные интервалы (бины). Например:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$z_{\text{RSI}} \in {\text{Oversold}, \text{Neutral}, \text{Overbought}}$&lt;/li&gt;
&lt;li&gt;$z_{\text{Spread}} \in {\text{Tight}, \text{Normal}, \text{Wide}}$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Благодаря квантованию пространство состояний сжимается с бесконечности до сотен тысяч обозримых ситуаций, которые накапливают статистический опыт.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;3-matematika-q-learning-i-balansirovka-redkikh-klassov&quot;&gt;3. Математика Q-Learning и балансировка редких классов&lt;/h2&gt;
&lt;p&gt;Обновление оценок ценности действия строится по уравнению Беллмана:&lt;/p&gt;
&lt;p&gt;$$Q(s, a) \leftarrow Q(s, a) + \alpha \cdot \left[ r + \gamma \cdot \max_{a’} Q(s’, a’) - Q(s, a) \right]$$&lt;/p&gt;
&lt;p&gt;где:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\alpha$ — скорость обучения (learning rate);&lt;/li&gt;
&lt;li&gt;$\gamma$ — фактор дисконтирования будущих наград;&lt;/li&gt;
&lt;li&gt;$r$ — немедленная рыночная награда (PnL с поправкой на проскальзывание и комиссию).&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;# Концептуальная логика обновления нейрона памяти&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #59C2FF;&quot;&gt; MemoryNeuron&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    def&lt;/span&gt;&lt;span style=&quot;color: #F07178;&quot;&gt; __init__&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; state_key&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; action&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt;        self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;state_key&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span&gt; state_key&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt;        self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;action&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span&gt; action&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt;        self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;q_value&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 0.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt;        self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;visits&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt;        self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;last_seen&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    def&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; update&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; reward&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; next_max_q&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; alpha&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;0.1&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; gamma&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;0.95&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;        # Балансировка: редкие состояния обновляются с повышенным весом&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        effective_alpha&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span&gt; alpha&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; /&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;1.0&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 0.01&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;visits)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        td_target&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span&gt; reward&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; +&lt;/span&gt;&lt;span&gt; gamma&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; *&lt;/span&gt;&lt;span&gt; next_max_q&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt;        self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;q_value&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; +=&lt;/span&gt;&lt;span&gt; effective_alpha&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; *&lt;/span&gt;&lt;span&gt; (td_target&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;q_value)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt;        self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;visits&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; +=&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Борьба с дисбалансом классов:&lt;/strong&gt; на рынке 70%+ времени идет боковик. Без балансировки редкие ситуации разворота тренда просто не успеют набрать статистику. Взвешивание через счетчик посещений позволяет системе адекватно оценивать редкие критические режимы.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;4-pruning-pamiati-i-adaptivnyi-exploration&quot;&gt;4. Pruning памяти и адаптивный Exploration&lt;/h2&gt;
&lt;p&gt;Чтобы база нейронов памяти не раздувалась, применяются два механизма:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Pruning (Отсечение):&lt;/strong&gt; нейроны с околонулевыми счетчиками посещений за длительный период или стабильно отрицательным $Q$ удаляются, освобождая память и очищая стратегию от устаревших аномалий.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Эволюционный $\varepsilon$-Greedy:&lt;/strong&gt; в спокойные периоды система эксплуатирует накопленный опыт ($\varepsilon \to 0$), а при резких скачках волатильности (режим сменился) уровень исследования повышается.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;kliuchevye-vyvody&quot;&gt;Ключевые выводы&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Квантование + z-score&lt;/strong&gt; превращают нестационарные рыночные котировки в долговечные признаки.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Иерархия (Память → Агенты → Совет)&lt;/strong&gt; защищает от сбоев отдельных стратегий за счет взвешенного ансамбля.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Детерминированный Q-learning&lt;/strong&gt; на понятных состояниях прозрачнее и устойчивее к оверфиттингу, чем глубокие черные ящики.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;pervoistochniki-i-materialy&quot;&gt;Первоисточники и материалы&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Автор исследования:&lt;/strong&gt; Yevgeniy Koshtenko (MQL5 / MetaTrader 5 Research)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Заметки и детальный конспект статьи:&lt;/strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https://github.com/xsa-dev/obsidian-vault/blob/main/Articles/RL-System-AlgoTrading-MQL5-RU.md&quot;&gt;Obsidian Vault: RL System AlgoTrading (GitHub)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Количественные репозитории:&lt;/strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https://github.com/xsa-dev&quot;&gt;github.com/xsa-dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
</feed>
