После вопросов что и где появляется третья часть: когда. Но здесь важно сразу убрать неправильное ожидание. Когда — это не вопрос в духе когда запускать оптимизацию и не календарь пересчета. В этой теме когда — это утверждение, которое появляется после нормального ТЗ и расчета: когда именно стратегия работала, когда не работала, при каких состояниях рынка, при каких параметрах, при каких PM и при каких метриках.
Если что отвечает за объект оптимизации, а где отвечает за область данных, то когда отвечает за фактическое поведение найденных вариантов. Это слой результата. Он показывает не просто лучший PnL, а карту: в каких состояниях выбранное правило давало прибыль, в каких давало убыток, где метрика росла, где падала, где PM помогал, где портил, и похоже ли все это на закономерность.
Именно поэтому когда показывает качество подготовленного ТЗ. Если ТЗ было собрано нормально, после расчета можно ответить: когда работало правило EMA, когда работал RSI, когда фильтр был полезен, когда PM давал преимущество, когда метрики подтверждали друг друга. Если таких ответов нет, значит ТЗ не дало исследовательской карты. Оно дало таблицу.
Когда — это карта фактической работы
Частая ошибка — смотреть на результат как на одну строку: вот параметры, вот прибыль, вот просадка, вот победитель. Но стратегия не работает одной строкой. Она работает внутри набора состояний. Поэтому вопрос когда должен разрезать результат на участки: когда правило включалось, когда давало входы, когда входы становились прибыльными, когда становились убыточными, когда фильтр улучшал выборку, а когда просто удалял неудобные сделки.
Например, фраза EMA-фильтр помог слишком грубая. Нужно понимать, в каких состояниях он помог. Помогла ли зона `C > EMA(100)`? Или только зона `C > EMA(100)` рядом со средней? Или только фаза возврата к EMA после отклонения? Или только периоды `80..120`, а дальше результат исчезал? Это разные ответы, и каждый из них говорит о разном качестве идеи.
Поэтому когда — это не новый индикатор и не отдельная кнопка. Это таблица соответствий между тем, что мы выбрали в вопросе что, тем, какие зоны описали в вопросе где, и тем, что реально произошло после расчета. Если в ТЗ был параметр, по нему должен быть ответ когда он работал. Если в ТЗ была зона, по ней должен быть ответ когда она давала прибыль и когда давала убыток.
Когда для каждого правила
Любое правило, попавшее в оптимизацию, должно получить свою карту когда. Иначе непонятно, было ли оно полезно или просто случайно оказалось рядом с хорошим результатом.
-
`entry_rule` — нужно понять, когда сам вход имел смысл: после каких состояний рынка он давал благоприятное движение, на каких горизонтах появлялся `MFE`, где сразу возникал `MAE`, и не держится ли прибыль на одном коротком участке истории.
—
`EMA_rule` — нужно проверить, когда работали стороны и периоды EMA: выше или ниже средней, рядом или далеко от нее, в фазе удаления или возврата, на каких периодах результат сохранялся, а на каких исчезал.
—
`RSI_rule` — нужно смотреть, когда работали зоны RSI: ниже `30`, между `30` и `50`, выше `70`, при росте RSI или при падении. Один и тот же вход при RSI, который падает, и при RSI, который уже разворачивается, может быть разными событиями.
—
`MACD_rule` — нужно разделять знак MACD, знак гистограммы, расширение и сжатие гистограммы. Если результат есть только в моменте пересечения, но исчезает в соседних фазах, это одна картина. Если работает целая зона ускорения или затухания, это другая картина.
—
`ATR_rule` и `NATR_rule` — нужно понимать, когда стратегия жила в низкой, средней и высокой волатильности. Прибыль в высокой волатильности и убыток в низкой могут означать, что стратегия торгует движение. Обратная картина может означать, что ей нужен спокойный рынок.
—
`ADX_rule` — нужно смотреть, когда работала сила движения. `ADX > 25` сам по себе не говорит направление, поэтому ответ когда должен быть связан с направлением через `+DI`, `-DI`, EMA или другое правило стороны.
—
`AROON_rule` — нужно проверять, когда имела значение свежесть максимума или минимума. Если стратегия работает только после свежего экстремума, это другой режим, чем работа в старой затухающей зоне.
—
`DOP_rule` или дополнительный фильтр — нужно отдельно понять, когда он реально улучшал выборку, а когда просто уменьшал количество входов. Фильтр может выглядеть полезным, но если он отсекает почти все и оставляет несколько удачных сделок, это не доказательство.
Для каждого такого правила нужен не общий вывод индикатор работает, а карта условий: при каких параметрах, в каких зонах, на каких горизонтах и с каким числом входов появлялся результат. Без этого нельзя понять, что найдено: закономерность или случайное совпадение.
Когда правило можно сравнивать
Отдельный момент: не каждое правило можно честно сравнивать сразу после расчета. Если один вариант EMA дает `800` входов, другой дает `40`, а третий дает `5`, то простое сравнение PnL между ними почти бессмысленно. У них разная выборка, разная площадь данных, разная частота включения условия и разная вероятность случайного результата.
Поэтому ответ когда должен показывать не только где правило заработало, но и когда его вообще имело смысл сравнивать. Для этого нужны минимальные условия: достаточное число входов, понятное покрытие истории, не слишком редкие включения состояния, сопоставимые зоны и нормальная реакция цены после входа. Если правило не проходит эти условия, его результат можно сохранить как наблюдение, но нельзя ставить рядом с нормальными кандидатами как равного участника.
Именно здесь становится видно, был ли толк от правила. Если EMA-фильтр отсекает половину входов, но улучшает `MFE/MAE`, снижает просадку и сохраняет достаточное число сделок, значит он мог дать полезную область. Если он просто оставил несколько удачных сделок и убрал почти всю историю, то это не фильтр с торговым смыслом, а способ случайно сузить выборку.
Когда была прибыль и когда был убыток
После построения карты где каждый результат нужно разделять на прибыльные и убыточные состояния. Это важнее, чем просто увидеть итоговый плюс. Итоговый плюс может быть суммой нескольких разных явлений: одна зона стабильно зарабатывает, другая стабильно теряет, третья почти нулевая, а PM случайно вытянул общий результат.
Поэтому для каждой области данных нужно смотреть минимум три группы:
—
`when_profit` — состояния, где стратегия давала прибыль после комиссий и издержек. Здесь важно смотреть не только сумму, но и число сделок, распределение прибыли, `MFE`, восстановление после просадки и устойчивость соседних параметров.
—
`when_loss` — состояния, где стратегия давала убыток. Это не мусорная информация, а часть карты. Если понятно, когда стратегия теряет, можно ограничивать торговлю, менять PM или вообще убрать эту область из рабочей логики.
—
`when_flat` — состояния, где стратегия не давала выраженного результата. Такие зоны опасны тем, что в одном прогоне они могут выглядеть чуть лучше, в другом чуть хуже, а трейдер начинает приписывать им смысл.
Пример с EMA можно записать просто. `C > EMA(100)` само по себе еще ничего не говорит. Нужно увидеть, что, например, зона `C > EMA(100)` и `distance < 0.5 ATR` давала прибыль на возврате, а зона `C > EMA(100)` и `distance > 1.5 ATR` давала убыток из-за поздних входов. Вот это уже ответ когда. Не EMA работает, а конкретная часть состояния работает.
Когда PM помогал, а когда мешал
То же самое относится к управлению позицией. PM нельзя оценивать только по одному победившему варианту. Если у нас есть диапазон PM, например варианты `20..30`, нужно смотреть не только какой вариант победил, а как ведет себя вся группа.
Если из `20..30` работает один вариант, а остальные дают плохой результат, это подозрительно. Возможно, найден случайный параметр, который подстроился под прошлую форму сделок. Если же большая часть вариантов внутри диапазона ведет себя похоже, а различия умеренные, это уже лучше. Значит, PM не держится на одном точном числе.

Для PM полезно делить результат так:
—
`PM_profit_cluster` — группа PM-вариантов, где большая часть параметров дает прибыль. Это сильнее, чем один лучший вариант, потому что показывает область решений.
—
`PM_loss_cluster` — группа PM-вариантов, где большинство параметров убыточны. Это сигнал, что выбранная логика выхода плохо совпадает с входом или рыночным состоянием.
—
`PM_single_peak` — один красивый PM-вариант без соседей. Такой результат нужно считать подозрительным, пока он не подтвержден на других участках и активах.
—
`PM_regime_match` — состояние, где конкретное семейство PM совпадает с поведением цены. Например, trailing может лучше работать на импульсе, а фиксированный take — в коротком возврате к средней.
Если PM был `20..30`, вопрос когда должен отвечать: когда работала большая часть диапазона, когда работала меньшая часть, когда победитель был одиноким пиком, а когда рядом были похожие рабочие варианты. Без этого трейдер видит только лучший выход, но не понимает, устойчив ли он.
Когда росли и падали метрики
Метрика тоже должна иметь карту когда. Если мы смотрим только итоговый `score`, мы не знаем, за счет чего он вырос. Возможно, вырос PnL, но одновременно выросла просадка. Возможно, улучшился recovery factor, но число сделок стало слишком маленьким. Возможно, profit factor красивый, но стратегия стала зависеть от одной сделки.
Нужно смотреть направление изменения метрик:
—
`PnL` — когда росла прибыль и не была ли она связана с одним узким параметром или одним активом;
—
`MaxDD` — когда просадка уменьшалась, а когда снижение просадки покупалось ценой исчезновения сделок;
—
`RecoveryFactor` — когда стратегия лучше восстанавливалась после просадки, а когда восстановление было случайным из-за малой выборки;
—
`ProfitFactor` — когда соотношение прибыли к убытку улучшалось, и не было ли это следствием удаления большинства убыточных сделок слишком жестким фильтром;
—
`entries_count` — когда число сделок оставалось достаточным, а когда фильтр делал выборку слишком редкой;
—
`MFE/MAE` — когда после входа появлялось благоприятное отклонение, а когда сделка сначала уходила в боль и только потом иногда спасалась PM;
—
`neighbor_stability` — когда соседние параметры подтверждали результат, а когда вся прибыль держалась на одной точке.
Хороший результат не обязан быть лучшим по каждой метрике. Но у него должна быть логика. Если PnL растет, просадка умеренная, recovery factor не разваливается, число сделок не исчезает, а соседи ведут себя похоже, это один тип результата. Если PnL максимальный, но просадка огромная, соседей нет, сделок мало и все держится на одном активе, это другой тип результата.
Когда показывает качество ТЗ
Вопрос когда фактически проверяет, насколько качественно были заданы что и где. Если в ТЗ были названы параметры, зоны, фильтры, PM и метрики, после расчета можно разложить результат по каждому из этих элементов. Если разложить нечего, значит ТЗ было слишком общим.
Хорошее ТЗ после расчета дает ответы:
— когда работал вход — в каких состояниях рынка и на каких горизонтах после входа появлялось благоприятное движение;
— когда работал фильтр — какие зоны он улучшал, какие портил и сколько входов удалял;
— когда работал индикатор — какие периоды, стороны, расстояния и фазы давали осмысленную выборку;
— когда работал PM — какие семейства и диапазоны совпадали с поведением сделки;
— когда росла метрика — за счет чего улучшался результат и какие штрафы не давали выбрать опасный вариант;
— когда результат исчезал — какие изменения параметров, зон, активов или издержек ломали найденную область.
Если таких ответов нет, то итоговая таблица может быть красивой, но исследовательской ценности у нее мало. Она не говорит, что было найдено. Она говорит только, какая строка победила внутри плохо описанного пространства.
Случайность или закономерность
После того как карта когда построена, появляется главный вопрос: найденный результат был случайностью или закономерностью. На одном активе это почти невозможно доказать честно. Можно увидеть красивый участок, хорошую метрику и устойчивых соседей, но все равно остается риск, что это совпадение именно на этой истории.
Поэтому следующий шаг — проверять не просто другой период, а другие активы. Причем переносить нужно не слепо параметры, а состояния, которые были собраны в вопросе где и проверены в вопросе когда. Если стратегия работала в состоянии `цена выше EMA`, `возврат к средней`, `расстояние до EMA меньше 0.5 ATR`, `волатильность средняя`, `ADX подтверждает движение`, то именно это состояние нужно искать на другом активе.
Рабочая стратегия, если она действительно описывает рыночное поведение, должна проявляться на разных активах, где есть похожие состояния данных. Не обязательно одинаковым PnL, не обязательно с тем же количеством сделок и не обязательно с абсолютно теми же стопами и тейками. Но характер должен быть похожим: похожие активные состояния, похожая реакция цены после входа, похожий знак преимущества, похожая устойчивость соседних параметров. Если на другом активе все исчезает полностью, это повод считать первый результат подозрительным.
Здесь важно не требовать идеального совпадения. У разных активов разная волатильность, ликвидность, размер шага цены и характер движения. Поэтому стопы, тейки и некоторые PM-параметры могут немного смещаться. Но это смещение должно иметь ограничитель. Если на одном активе нужен take `0.5 ATR`, на другом `8 ATR`, а на третьем вообще работает только противоположная логика, это уже не переносимость, а новая подгонка.
Упрощенно повторяемость можно считать через долю активов, где найденное состояние подтвердилось: `repeatability_rate = confirmed_assets / tested_assets`. Но считать нужно не абстрактно стратегию на другом активе, а конкретную подпись состояния: индикаторы, стороны, фазы, расстояния, волатильность, фильтры, PM и метрики. Если на `7` из `10` активов похожее состояние дает похожий знак результата и допустимое отклонение по числу сделок, это уже один разговор. Если из `10` активов сработал только один, а остальные молчат или дают противоположный результат, это другой разговор.
Ограничитель отклонения
Чтобы не обмануть себя переносом на другие активы, в ТЗ должен быть задан ограничитель отклонения. Он говорит, насколько результат на другом активе может отличаться от исходного, чтобы мы еще считали его похожим поведением, а не новой случайной находкой.
Примеры таких ограничителей:
— `state_overlap_min` — минимальная доля совпадающих активных состояний. Если на первом активе работала зона возврата к EMA, на другом активе должна быть похожая зона, а не совершенно другой режим.
—
`entries_deviation_limit` — допустимое отклонение числа сделок или доли входов. Если на одном активе зона дает `500` входов, а на другом при похожей истории дает `5`, сравнение может быть слабым.
—
`metric_deviation_limit` — допустимое отклонение ключевых метрик. Не нужно требовать одинаковый PnL, но знак результата, просадка, recovery factor и MFE/MAE не должны разваливаться полностью.
-
`pm_parameter_deviation_limit` — допустимое отклонение стопов, тейков и trailing-параметров. PM может адаптироваться к волатильности, но не должен превращаться в отдельную стратегию под каждый актив.
—
`neighbor_stability_required` — на другом активе должны быть рабочие соседи параметров. Если переносится только одна точка, это снова подозрительный пик.
—
`cost_sensitivity_limit` — результат не должен умирать от реалистичных комиссий и проскальзывания. Если переносимость есть только без издержек, ее нет.
Такие ограничения не делают результат научным доказательством в строгом смысле. Но они резко снижают риск назвать закономерностью то, что было просто удачным выбором одного актива, одного периода и одного параметра.
Как это выглядит в ТЗ
В ТЗ вопрос когда должен быть записан как карта проверки результата. Не надо писать посмотреть когда стратегия работает. Нужно указать, по каким элементам будет строиться карта когда и какие признаки считаются подтверждением.
—
`when_map_by_rule = required` — для каждого правила входа, фильтра и индикатора строится карта, где видно, в каких состояниях оно давало прибыль, убыток или нейтральный результат.
—
`when_map_by_zone = required` — каждая зона из вопроса где получает свой результат: число входов, покрытие истории, прибыль/убыток, `MFE`, `MAE`, просадку и устойчивость соседей.
—
`when_map_by_pm = required` — PM оценивается не по одному победителю, а по кластерам параметров: где работает большинство, где меньшинство, где есть одинокий пик.
—
`when_map_by_metric = required` — для ключевых метрик фиксируется, когда они росли, когда падали и не противоречили ли друг другу.
—
`profit_loss_split = required` — прибыльные, убыточные и нейтральные состояния разделяются, чтобы итоговый плюс не скрывал слабые зоны.
—
`cross_asset_check = required` — найденные активные состояния проверяются на других активах, а не только на другом куске того же графика.
— `
state_signature = indicator_state + distance + phase + volatility + trend + timeframe` — переносится не красивая строка параметров, а описание состояния рынка, в котором стратегия работала.
—
`state_overlap_min = X%` — задается минимальное совпадение активных состояний между активами, чтобы результат считался похожим.
—
`allowed_pm_deviation = Y% or ATR_normalized_range` — стопы, тейки и trailing могут смещаться, но только в заранее заданных пределах.
—
`randomness_check = required` — итоговая оценка должна отвечать, похоже ли найденное поведение на повторяемую закономерность или на случайный выбор в большом пространстве вариантов.
Такой блок делает когда не разговором после таблицы, а обязательной частью исследования. Мы заранее знаем, что после расчета будем спрашивать не только сколько заработали, но и когда именно заработали, где потеряли, какие правила дали вклад и переносится ли это поведение на другие активы.
Итог
Вопрос когда в этой серии — это не вопрос про запуск оптимизации. Это утверждение, которое должно появиться после качественного ТЗ и расчета: стратегия работала тогда-то, в таких-то состояниях, на таких-то правилах, с такими-то PM, при таких-то метриках, а в других состояниях давала убыток или не имела преимущества.
Если что задает объект, где задает область данных, то когда показывает, нашли ли мы то, что искали. Он связывает параметры, зоны, прибыль, убыток, PM, метрики и переносимость между активами. Именно здесь становится видно, была ли оптимизация исследованием или просто поиском красивой строки.
Главный финальный вопрос после когда звучит так: это случайность или закономерность. Ответ появляется не из одной лучшей строки, а из повторяемости состояний, похожего поведения на других активах, устойчивых соседей параметров, ограниченного отклонения PM и нормальной реакции цены после входа. Если этого нет, результат может быть красивым, но называть его рабочей стратегией рано.
Следующий логичный шаг — собрать что, где и когда в техническое задание стратегии. Потому что хорошее ТЗ должно не только описывать правила до расчета, но и заранее задавать, какие ответы мы обязаны получить после расчета.
Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.