Фазы рынка
Используйте сведения о рыночных фазах в логике и исследовании стратегии.
Начало работы
В OnInit зарегистрируйте context.MarketPhases().Create(symbol). В OnBar читайте handle.Current и сначала проверяйте Status == Ready. Это общий C# runtime тестера и Launcher. Defaults — воспроизводимая отправная точка, не универсально правильные настройки.
Create объявляет историю без OnBar подписки. Основной ключ уже подписан; дополнительные callbacks требуют context.Runtime.SubscribeOnBar(key). Одинаковые регистрации переиспользуют handle; до 32 разных handles.
// Fields: MarketPhaseAnalyzer? _phase;
// OnInit:
_phase = context.MarketPhases().Create(context.Parameters.SymbolKey);
// OnBar:
var phase = _phase!.Current;
if (phase.Status != MarketPhaseStatus.Ready) return;
bool up = phase.Phase == MarketPhase.Up;
bool breakout = (phase.Events & MarketPhaseEvents.BreakoutUp) != MarketPhaseEvents.None;Три уровня результата
Phase: Up, Down, Range, Transition. Regime: SteadyUp/SteadyDown, VolatileUp/VolatileDown, QuietRange, Range, VolatileRange, Transition. Events — совместимые flags Compression/Expansion, BreakoutUp/Down, ImpulseUp/Down, PullbackUp/Down. Все уровни вычисляются одновременно.
PullbackUp — откат вниз внутри Up; PullbackDown — откат вверх внутри Down. Transition не прогнозирует разворот. Snapshot содержит Features, Confidence, AsOfUtc, LastClosedBarUtc, AvailableBars, RequiredBars, MethodVersion. Confidence — согласие правил, не вероятность прибыли или accuracy.
Настройки и разные таймфреймы
Lookback=32 и BaselinePeriod=128 допустимы в 8..4096; VolatilityPeriod=14 — в 2..4096. RequiredBars=max(Lookback+1, BaselinePeriod+VolatilityPeriod+1)+PhaseSmoothingBars−1: default 147, пример ниже 217. Настройки immutable, ключи копируются; не меняйте основной SymbolKey.
TrendEfficiencyThreshold=0.30, RangeEfficiencyThreshold=0.25: 0 < range < trend < 1. TrendFitThreshold=0.45 в (0,1); TrendDisplacementAtr=1.5 и TrendSlopeAtr=0.02 положительны. PhaseSmoothingBars=5 в 1..32: фаза — самая частая из последних пяти решений (при равенстве — самая недавняя), это убирает одно-двухбарные переключения ценой запаздывания примерно на два бара. CompressionRatio=0.75 в (0,1), ExpansionRatio=1.50 >1. BreakoutBufferAtr=0.10 ≥0, ImpulseAtr=2.50 и PullbackAtr=0.50 >0. Неверные options отклоняются.
В OnInit создайте отдельные handles m5/h1; ниже _fast и _slow — поля MarketPhaseAnalyzer?. В OnBar отфильтруйте m5 и проверьте готовность обоих. H1 обновляется только после закрытия h1.
var source = context.Parameters.SymbolKey;
var fastKey = new SymbolKey(source.Exchange, source.Market, source.Symbol, TimeFrames.m5);
var slowKey = new SymbolKey(source.Exchange, source.Market, source.Symbol, TimeFrames.h1);
_fast = context.MarketPhases().Create(fastKey);
_slow = context.MarketPhases().Create(slowKey, new MarketPhaseOptions
{
Lookback = 48, BaselinePeriod = 192, VolatilityPeriod = 20,
TrendEfficiencyThreshold = 0.50m, TrendFitThreshold = 0.65m, ExpansionRatio = 1.75m
});
context.Runtime.SubscribeOnBar(fastKey);
// In OnBar: read both .Current snapshots and require both Status == Ready.Готовность и история
WarmingUp — недостаточно баров, Stale — после конца последнего бара прошёл полный период, InvalidData — плохой OHLCV/пропуск/дубликат в окне, Unavailable — нет модельного времени. Любой not-ready даёт Unknown, не Range. Required=false позволяет WarmingUp, но не создаёт данные.
Clock — Global.Now без wall-clock fallback. Учитывается только OpenTime+duration <= cursor, включая точную границу закрытия. Текущий бар и будущее исключены. Одинаковые бары/settings/cursor дают одинаковый результат; исправленные бары пересчитываются. Fixed-duration m1..w2; None, M1/M3/M6/Y1 и секундные ТФ не поддерживаются.
Цены положительны, high/low охватывают open/close, volume неотрицателен. Пропуски не заполняются. При агрегировании host-ом каждый m1 исходник всего окна должен присутствовать; грубых свечей без m1 недостаточно. Читайте Current по релевантному закрытому бару: проверка большого TF просматривает RequiredBars × минуты TF.
Обязательные требования фаз регистрируются при инициализации и включаются в общий прогрев Launcher до начала торговли. Неизвестные пропуски сохраняют состояние недоступности; подтверждённое отсутствие торгов не создаёт свечей. Происхождение загруженных синтетических сценариев проверяется по метаданным и хешу; произвольный IKline сам по себе не удостоверяет источник.
Метод и ограничения
ER — abs(endpoint displacement)/sum(abs(close changes)); r² и signed slope регрессии close, нормированный на простой recent ATR. TR=max(high-low,abs(high-prevClose),abs(low-prevClose)). Recent TR/prevClose сравнивается с непересекающимся preceding baseline. Wilder smoothing и RSI не используются.
RelativeVolume=last volume/mean preceding Lookback volumes; null при нулевом знаменателе. Не выбирает Phase/Regime. Confidence ограничен: trend0.85, range0.75, transition0.15, flat0; при отсутствии предыдущего объёма или доминирующем скачке ≥65% пути максимум0.35. Это эвристика, не прогноз.
PhaseProbability — откалиброванная вероятность того, что следующие 12 закрытых баров реализуют сообщённую фазу (тренд: закрытие сдвинулось хотя бы на 0,5 ATR в его сторону при эффективности пути не ниже 0,60; боковик: эффективность не выше 0,30 в пределах high/low последних Lookback баров; иначе переход).
Передача в RiskSizingRequest.Confidence — явная политика стратегии, требующая отдельной A/B-проверки; автоматической рекомендации sizing нет. Это вероятность правильной фазы, а не прибыльной сделки. Калибровка phase-probability-v1: 14 пар Binance Futures за 2019–2024, проверка на 2025–2026 (ECE 0,013). Числа близки к частоте самих фаз: около 0,03–0,04 у роста и падения, 0,35–0,45 у боковика, 0,46–0,55 у перехода.
Null, если снимок не Ready, настройки не по умолчанию или бар короче 5 минут либо длиннее суток.
MethodVersion=ohlcv-rules-v2 (с 3 октября 2026: мягче пороги тренда и сглаживание; PhaseSmoothingBars=1 с порогами 0.45/0.60/2 повторяет v1). Существующий market-phase-demo ONNX — отдельный пример, не этот сервис. Частоты фаз на истории не являются точностью. Проверка устойчивости берёт эпизоды по этим фазам, а график показывает их полосами (Графики → Фазы рынка на графике); связь с риском, адаптивные секунды и автоматические загрузки — отдельные задачи.
API для агентов и Copilot
list_strategy_api → get_strategy_api_doc(type=MarketPhaseService, member=Create) и get_strategy_api_doc(type=MarketPhaseOptions) возвращают типы и реальные XML docs/defaults. Затем компилируйте generated C#. Текущий каталог и runtime reference доступны существующим установкам; старый prebuilt RAG index не гарантирует новый материал, fallback knowledge-файлы не сидируются автоматически.
Offline: MarketPhaseClassifier.Analyze(bars, asOfUtc, barDuration, options), IReadOnlyList<IKline> в хронологическом UTC-порядке с фиксированным шагом. Pure API ничего не загружает. Прямых Python/Node/Java SDK bindings пока нет.
Выбор анализатора
Описать закрытую структуру цены: Нативные OHLCV-правила либо Gaussian. Confidence — эвристика; posterior модели не откалиброван.
Исследовать H1/H4/D1 с 2020 с доступными тогда параметрами: Явный HistoricalExpanded, годовая версия по времени закрытого решения.
Воспроизвести прежний эксперимент: Замороженный ExpandedFeatures (доступен с 2024) либо точный сохранённый ResearchExpert. Это отдельные режимы, не HistoricalExpanded.
Сопоставить вход со старшим фоном: Явный MTF Context: рабочий ТФ задаёт решение, старший — только последний полностью закрытый контекст. Несогласие допустимо.
Оценить фильтр входов: Парное A/B стратегии с замороженными настройками и одинаковыми риском и costs. Цвет фазы или высокий score сами по себе не торговый сигнал.
Нативный анализатор — отправная точка. Сохранённый исследовательский эксперт выбирается явно для каждого инструмента/handle через MarketStateResearchExperts.GetCatalog(); универсального победителя нет. Готовый Direction-эксперт может отказаться от решения; недоступные входы эксперта сохраняют нативное направление. Вспомогательные оценки риска/исходов отделены от направления. Сохранённые отрицательные результаты остаются ограничениями, не рекомендациями. Эксперт пока несовместим с Context и HistoricalExpanded.
Исторический Expanded и подробности на графике
Контекстное меню графика → «Анализатор фаз» → «Исторические расширенные признаки (walk-forward, экспериментально)». HistoricalExpanded содержит 15 неизменяемых годовых моделей: H1/H4/D1 × начало применения 2020–2024. Runtime выбирает последнюю доступную версию на время **закрытого решения**, не по дате компьютера. Fit, selection и calibration заканчиваются до применения; будущая версия не меняет прошлые результаты.
Последняя версия действует до обновления банка. Неподдержанный ТФ, отсутствие версии или нехватка истории дают явные причины Unavailable/WarmingUp, без скрытой подмены замороженной Expanded-моделью 2024. Контекст W1 для этого режима недоступен: выберите поддерживаемый H1/H4/D1 либо отключите контекст.
D1 требует как минимум **147 полных закрытых дней** измерений. При истории только с 2020-01-01 первые месяцы 2020 не готовы; replay/профиль могут потребовать больше. Дата доступности модели сама по себе не означает готовности.
CalibratedCurrentDirectionProbability — прошлый class-conditional Beta(1,1) estimate совпадения raw argmax с внешним текущим ценовым proxy: (correct+1)/(support+2). При поддержке класса менее 8 решений либо пользовательском DirectionFilter значение отсутствует. Это отдельно от эвристического confidence, некалиброванного posterior, продолжения и прибыльности сделки.
Обучение использует ETHBTC/LTCBTC/BNBBTC Spot; перенос на BTCUSDT не подтверждён. Банк реконструирует ранее исследованную историю, а не новую независимую проверку точности. Neutral отображается как Transition и остаётся Uncertain/Unknown в CurrentRegime, не установленным Range. См. [обучение и ограничения](../../../../docs/port/evidence/historical-expanded/README.md).
В OnInit регистрируйте CreateAdvanced(symbol, new MarketStateOptions { Horizons = new[] { new MarketStateHorizon { TimeFrame = TimeFrames.h1 } }, Model = new MarketRegimeModelOptions { DirectionModel = MarketStateDirectionModel.HistoricalExpanded } }, required: false). Проверяйте статус горизонта и версию/cutoff HistoricalModel. Настройки графика не меняют уже зарегистрированную стратегию.
Подробности открываются только на подписи внизу участка (курсор справки) либо при клавиатурном фокусе. Движение по свечам их не открывает. Прокручиваемая подсказка описывает решение на начало видимого участка; Escape закрывает её. Локальная детализация свечей не меняет таймфрейм анализа.
Честное A/B стратегии
Проверка 1–15 октября 2026 на четырёх инструментах и H1/H4: четыре улучшения, два ухудшения, два равенства; только 0–13 сделок на вариант. Это offline reference-стратегия с настоящим ядром фаз, а не проверка движка заявок приложения. Устойчивое улучшение не доказано. Протокол и все результаты: docs/port/evidence/phase-strategy-ab/README.md.
Сравнивайте одну стратегию без gate входов (A) и с ним (B). Gate управляет только **новыми входами**; сопровождение позиций, стопы и выходы выполняются независимо при любом статусе анализатора. Unknown, прогрев и пропуски не означают Range. Зафиксируйте политику новых входов при них до проверки тестового периода.
Данные, даты, капитал, риск на сделку, sizing, комиссии, проскальзывание и исполнение должны совпадать. Модели, инструменты, ТФ и пороги выбирайте только на train/selection, затем заморозьте до test и удалите пересекающиеся будущие цели на границах. Подбор лучшего эксперта на test превращает этот участок в selection.
Покажите чистый результат после costs, просадку, экспозицию, число сделок, заблокированные входы, готовность/покрытие gate, разбивку по инструментам/периодам и версии настроек. Сохраняйте отрицательные и неустойчивые результаты. Меньше сделок или лучшее совпадение меток ещё не доказывают улучшение стратегии. Established означает прохождение операционных критериев, не сертификат точности или прибыли.
Текущий режим и политика входов
Каждый горизонт возвращает CurrentRegime рабочего ТФ: Unavailable, Uncertain, Transition либо Established. Established означает прохождение операционных порогов, а не доказанную точность. Unknown или неопределённый Neutral не устанавливают Range. Context может менять направление графика, но CurrentRegime продолжает описывать рабочий ТФ.
MarketStatePolicy.Evaluate(snapshot, new MarketStateEntryPolicy { RequireEstablishedRegime = true }) возвращает AllowNewEntries и Reasons. Gate включается явно и ограничивает только новые входы. MinimumCurrentDirectionProbability требует применимой текущей калибровки; posterior или confidence её не заменяют. Позиции, стопы, выходы и заявки остаются решениями стратегии.
Связанные команды
Команды в палитре
Команды доступны по названию через палитру команд; их доступность зависит от текущего проекта и состояния операции.
xtester.chartConfigureMarketPhasesxtester.chartHideMarketPhasesxtester.chartShowMarketPhasesxtester.chartToggleMarketPhases