Разработка инструментария для анализа Price Action (Часть 33): Инструмент на основе теории свечного диапазона
Содержание
Введение
Волатильность – главный язык рынка. Прежде чем развернется любой осциллятор и прежде чем отреагирует большинство трендовых фильтров, цена уже успевает ясно показать свое намерение через расстояние, которое она проходит в пределах одного бара. Внезапное расширение диапазона часто указывает на агрессивное участие крупных игроков; затяжное сжатие, напротив, говорит о том, что ликвидность сокращается в ожидании следующего движения. Аналогичным образом, бар, который целиком остается внутри предыдущего бара, указывает на временную неопределенность, тогда как бар, поглощающий предыдущий диапазон, отражает решительный поток ордеров. Эти модели поведения очевидны, но их редко оформляют в виде надежного процесса, пригодного для машинной обработки.
В этой статье представлена система Candle-Range Theory (CRT) – компактный фреймворк, который относит каждую завершенную свечу к одной из четырех взаимоисключающих категорий:
- Large-Range (LR) – истинный диапазон свечи превышает заданный множитель ее недавнего Average True Range (ATR);
- Small-Range (SR) – диапазон свечи меньше нижнего множителя ATR, что указывает на сжатие;
- Inside Bar (IB) – весь диапазон свечи остается в пределах диапазона от максимума до минимума ее непосредственного предшественника;
- Outside Bar (OB) – в ходе формирования свеча выходит и выше предыдущего максимума, и ниже предыдущего минимума, поглощая предыдущий диапазон.
Вместо того чтобы предлагать еще один непрозрачный индикатор, CRT доносит эти четко определенные концепции через компактный и готовый к практическому применению набор инструментов для MetaTrader 5:
- CRangePattern.mqh – класс, реализованный только в заголовочном файле, который классифицирует свечу за константное время. Ему нужны только четыре ценовых массива (open, high, low, close), он возвращает логические флаги для каждого паттерна и не использует динамическую память.
- CRT Indicator.mq5 – индикатор, накладываемый на график и выделяющий свечи LR, SR, IB и OB с помощью полупрозрачных прямоугольников и при необходимости стрелок. Цвета, прозрачность, символы стрелок и размеры являются полностью настраиваемыми, поэтому визуальный слой аккуратно встраивается в любой существующий шаблон графика, не упираясь в лимит платформы в восемь буферов.
- CRT Expert Advisor.mq5 – модуль алертов, который работает исключительно по закрытым барам и тем самым обеспечивает сигналы без перерисовки. Он позволяет выбрать, какие паттерны будут вызывать всплывающие окна, звуки или push-уведомления, и при необходимости автоматически подключает индикатор, чтобы визуальные и звуковые сигналы оставались синхронизированными во время реальной торговли или визуального тестирования.
Все компоненты компилируются без предупреждений в MetaTrader 5, начиная со сборки 4180, и соответствуют режиму #property strict. Они копируют только небольшое окно истории, необходимое для расчета ATR, поэтому нагрузка на процессор остается незначительной даже на высокочастотных графиках. Поскольку система обрабатывает данные строго в момент закрытия каждой свечи, ее результаты остаются стабильными на разных таймфреймах, символах и в разных режимах тестирования.
У этого руководства четыре цели:
- дать точные математические определения LR, SR, IB и OB;
- показать, как интегрировать класс CRangePattern в любой индикатор, советник или скрипт;
- объяснить решения по реализации, благодаря которым сопутствующий индикатор остается легковесным, не мерцает и совместим со сложными шаблонами графиков;
- показать, как советник формирует алерты, корректно работающие в тестере, что позволяет полноценно оценивать сигналы CRT как на истории, так и в реальном времени.
К концу статьи у вас будет компактная, но расширяемая система, которая превращает базовую волатильность в понятную и пригодную к практическому использованию информацию, подготовленную для дискреционного анализа, автоматической торговли или дальнейших исследований.
Преимущества набора инструментов Candle-Range Theory:
| Преимущество | Описание | Практический эффект |
|---|---|---|
| Точные определения | LR, SR, IB и OB рассчитываются по явным формулам на основе ATR и соотношений между ценами. | Устраняет неоднозначность; каждая свеча относится к одной и только одной категории. |
| Логика без перерисовки | Все расчеты выполняются по только что закрытому бару; позже значения не пересчитываются. | Сигналы остаются стабильными при обновлении графика, оптимизации и реальной торговле. |
| Минимальный объем данных | Индикатор копирует только ATR_Period + 3 бара; советник – столько же. | Снижает расход оперативной памяти и ускоряет прогоны в Strategy Tester. |
| Отображение без буферов | Визуальные элементы рисуются с помощью графических объектов, а не буферов индикатора. | Позволяет обойти лимит MetaTrader в восемь буферов; совместим со сложными шаблонами. |
| Гибкость настройки | Цвета, прозрачность, символы стрелок, период ATR и множители largeMult и smallMult задаются пользователем. | Легко адаптируется к любому личному или корпоративному стилю оформления графиков. |
| Модульная архитектура | Класс, индикатор и советник – это независимые файлы, которые взаимодействуют через четко определенные интерфейсы. | Разработчики могут встроить этот класс в другие проекты или заменить индикатор без рефакторинга. |
| Соблюдение строгого режима (#property strict) | Все исходные файлы компилируются без ошибок с директивой #property strict на сборках 4180 и выше. | Обеспечивает максимальную совместимость с будущими сборками MetaTrader. |
| Нормализация по ATR | Пороговые значения диапазона автоматически подстраиваются под волатильность инструмента. | Настройки можно надежно переносить между Forex, CFD, криптовалютами, индексами и фьючерсами. |
Обзор стратегии
Теория диапазона свечей относит каждую завершенную свечу к одной и только одной из четырех категорий. Свеча, истинный диапазон которой значительно превышает недавнюю волатильность, помечается как Large-Range (LR), а свеча, диапазон которой сжимается до доли от обычного, – как Small-Range (SR). Если весь диапазон от максимума до минимума нового бара помещается внутри диапазона предыдущего бара, он классифицируется как Inside Bar (IB); если же он выходит за пределы как предыдущего максимума, так и предыдущего минимума, он помечается как Outside Bar (OB). В следующих разделах разбираются статистические основы и точные правила, по которым определяется каждый из этих четырех паттернов.
Истинный диапазон (TR)
Истинный диапазон (True Range) – это предложенная Уайлдером мера базовой волатильности. Он охватывает полное ценовое движение за период, включая любые гэпы, определяя максимальную из следующих величин:
- текущий максимум минус текущий минимум;
- текущий максимум минус предыдущее закрытие, по модулю;
- текущий минимум минус предыдущее закрытие, по модулю.
TR = max( Highₜ – Lowₜ, │Highₜ – Closeₜ₋₁│, │Lowₜ – Closeₜ₋₁│ )
Используя True Range вместо простой разницы между максимумом и минимумом, мы полностью учитываем ночные гэпы, благодаря чему оценка волатильности остается согласованной для всех инструментов и торговых сессий.
Средний истинный диапазон (Average True Range, ATR)
Сам по себе True Range без контекста мало что говорит: 25 пипсов на EURUSD – это много, а 25 пипсов на XAUUSD – почти ничто. Теория диапазона свечей учитывает это, нормализуя True Range каждого периода относительно среднего по последним N значениям, сглаживая резкие всплески и давая стабильный ориентир для оценки волатильности.
// Simple arithmetic ATR double ATR(const int shift,const int period, const double &H[],const double &L[],const double &C[]) { double sum = 0.0; for(int i = shift; i < shift + period; ++i) sum += MathMax(H[i]-L[i], MathMax(MathAbs(H[i]-C[i+1]), MathAbs(C[i+1]-L[i]))); return sum / period; }
На практике CRT использует простое арифметическое среднее, а не экспоненциальное сглаживание Уайлдера, потому что такой подход быстрее, прозрачнее и вполне достаточен для классификации ценового поведения. По умолчанию используется окно в 14 баров, соответствующее стандартной настройке ATR.
Множители диапазона – пороговые значения
Два пользовательских множителя превращают ATR в пороговые значения для классификации:- largeMult (по умолчанию 1,5);
- smallMult (по умолчанию 0,5).
// ---- User-defined ATR multipliers -------------------------------------- input double largeMult = 1.5; // Bars ≥ 1.5 × ATR are flagged “Large-Range” input double smallMult = 0.5; // Bars ≤ 0.5 × ATR are flagged “Small-Range”Эти параметры отвечают на два вопроса:
- Насколько больше среднего должен быть бар, чтобы считаться необычно большим?
- Насколько маленьким должен быть бар, чтобы мы считали его сжатым?
Выражение этих порогов в единицах ATR обеспечивает возможность применять CRT на разных символах, таймфреймах и при разных режимах волатильности.
Бары Large-Range – признак резкой активности участников
Свеча классифицируется как Large-Range, если ее истинный диапазон равен или превышает выбранный множитель (largeMult) текущего ATR.// ---- Large-Range (LR) test --------------------------------------------- bool isLargeRange = (trueRange >= largeMult * atrCurrent);
Столь крупный диапазон обычно возникает при значительной активности участников, нередко вызванной запланированными новостями или крупными сделками. Такие крупные бары обычно предвещают либо начало устойчивого направленного движения, либо финальную капитуляцию предыдущего тренда. В обоих случаях это очень информативные события: "что" именно произошло (аномально широкий диапазон) совершенно ясно, даже если "почему" это произошло (публикация отчетности, макроданные, принудительные ликвидации) не всегда очевидно.
Бары Small-Range (SR) – сжатие волатильности
И напротив, свеча классифицируется как Small-Range, если ее истинный диапазон не превышает выбранную долю (smallMult) текущего ATR. Устойчивое сжатие обычно указывает на снижение ликвидности, хеджирование дилеров или сбалансированную книгу ордеров.
// ---- Small-Range (SR) test --------------------------------------------- bool isSmallRange = (trueRange <= smallMult * atrCurrent);
Рынки редко остаются спокойными бесконечно; скопления баров SR часто обозначают паузу перед новым расширением диапазона, поэтому они особенно полезны в стратегиях пробоя и стрэддл-стратегиях.
Inside Bars (IB) – сжатие диапазона и неопределенность
Свеча классифицируется как Inside Bar, когда весь ее диапазон укладывается в диапазон предыдущей свечи, то есть ее максимум ниже предыдущего максимума, а минимум выше предыдущего минимума.
// Inside-Bar test for the candle at 'shift' (e.g., shift = 1 → just-closed bar) bool isInsideBar = (High[shift] < High[shift + 1]) && // current high is lower than previous high (Low[shift] > Low[shift + 1]); // current low is higher than previous low
Что касается свеч Outside-Bar, такие бары указывают на мощный поток ордеров – часто на охоту за стоп-лоссами, принудительную ликвидацию или агрессивное накопление/распределение. Поскольку рынок проходит в обе стороны относительно предыдущей свечи, бары OB как бы сжимают несколько слоев стопов в рамках одной сессии. Это часто приводит либо к устойчивому развороту, если доминирует поглощение, либо к ускорению исходного тренда, если ликвидность пробоя быстро исчерпывается.
Взаимоисключаемость и иерархия
Эти четыре категории задуманы как взаимоисключающие: свеча может соответствовать не более чем одному определению.
- Если свеча попадает в LR или SR, приоритет имеют правила, основанные на величине диапазона.
- Если ни условие LR, ни условие SR не выполнены, система проверяет IB.
- И только если условие IB не выполнено, система проверяет OB.
Такая иерархия устраняет смысловые пересечения и делает последующую логику, такую как алерты и визуальная разметка, однозначной.
Временная дисциплина – обработка по закрытому бару
CRT анализирует только последнюю завершенную свечу (бар 1), игнорируя пока еще формирующийся бар (бар 0). Это гарантирует сигналы без перерисовки: то, что вы видите в реальном времени, точно соответствует тому, что показал бы тест на исторических данных.
От исходных данных к практическим сигналам
Классифицируя каждый бар как одно из четырех состояний, CRT предоставляет:
- бинарный поток сигналов для автоматизированных стратегий (флаги true/false для каждой категории);
- визуальный язык для дискреционной торговли (цветовая маркировка баров и стрелки);
- систему триггеров для алертов и дополнительных фильтров (тренд, сессия, объем).
Разбор кода
Набор инструментов Candle-Range Theory намеренно построен по модульному принципу. Каждый компонент – заголовочный файл, индикатор и советник – выполняет одну четко определенную задачу и взаимодействует с остальными через минимальный интерфейс. В этом разделе исходный код разбирается в том же порядке, в котором его выполняет MetaTrader. При этом объясняются назначение каждого крупного блока и причины выбора именно такой реализации.
CandleRangeTheory.mqh – механизм классификации
Заголовочный файл начинается с директивы #property strict, которая включает современную проверку типов и убирает послабления, характерные для старых версий компилятора. Сразу после этого объявляется класс CRangePattern. Его открытые поля – atrPeriod, largeMult и smallMult – используются как параметры времени выполнения, а не как жестко заданные константы. Благодаря этому любой скрипт, в котором заголовок подключен, может менять поведение класса без его перекомпиляции. Четыре логических флага – isLarge, isSmall, isInside и isOutside – образуют выходной интерфейс. После возврата из Calculate() ровно один из этих флагов будет иметь значение true; вызывающей программе не потребуется никаких дополнительных вычислений, чтобы понять, что произошло на анализируемой свече.
#property strict // enforce modern type checking #ifndef __CANDLE_RANGE_THEORY_MQH__ #define __CANDLE_RANGE_THEORY_MQH__ class CRangePattern { public: int atrPeriod; // ATR length double largeMult,smallMult; // LR / SR thresholds bool isLarge,isSmall, isInside,isOutside; // output flags double atr,trueRange,bodyRange;
Конструктор задает практичные значения по умолчанию – ATR из четырнадцати периодов, большой множитель 1,5 и малый множитель 0,5, – а затем вызывает закрытый вспомогательный метод Reset(), который приводит все поля результатов в известное состояние. Использование вспомогательного метода позволяет избежать дублирования кода; одна и та же процедура вызывается и в конструкторе, и в начале каждого расчета.
private: void Reset() { isLarge=isSmall=isInside=isOutside=false; atr=trueRange=bodyRange=0.0; } public: CRangePattern() // default parameters { Reset(); atrPeriod=14; largeMult=1.5; smallMult=0.5; }
Сам метод Calculate() намеренно сделан лаконичным. Сначала метод проверяет, достаточно ли доступной истории (bars < atrPeriod + sh + 2), потому что и ATR, и истинный диапазон должны опираться как минимум на один бар перед оцениваемым баром. Истинный диапазон и диапазон тела рассчитываются в соответствии с определением Уайлдера, что гарантирует совместимость с любым стандартным значением ATR – как из этого скрипта, так и из внешнего индикатора.
bool Calculate(const int sh, const double &H[],const double &L[], const double &O[],const double &C[], const int bars) { Reset(); if(bars < atrPeriod + sh + 2) // enough candles? return false; // true range of target candle trueRange = MathMax(H[sh]-L[sh], MathMax(MathAbs(H[sh]-C[sh+1]), MathAbs(C[sh+1]-L[sh]))); bodyRange = MathAbs(O[sh]-C[sh]);
Цикл расчета ATR выполняется ровно atrPeriod раз. Поскольку предыдущая проверка истории уже гарантирует, что i + 1 не выходит за допустимые пределы, внутреннее условие && i+1 < bars было бы избыточным и поэтому опущено. Удаление этой проверки упрощает выполнение кода и убирает лишнее ветвление, повышая производительность на высокочастотных данных без ущерба для безопасности.
double sum = 0.0; for(int i = sh; i < sh + atrPeriod; ++i) // exactly atrPeriod { double tr = MathMax(H[i]-L[i], MathMax(MathAbs(H[i]-C[i+1]), MathAbs(C[i+1]-L[i]))); sum += tr; } atr = sum / atrPeriod;
После вычисления среднего значения функция классифицирует свечу. Если истинный диапазон превышает верхний множитель, isLarge получает значение true; если он опускается ниже нижнего множителя, значение true получает isSmall. На втором уровне оценивается положение относительно максимума и минимума предыдущей свечи и устанавливается isInside либо isOutside в зависимости от результата. Поскольку все четыре флага взаимоисключающие, дополнительные проверки не требуются, и функция возвращает true, подтверждая успешное завершение.
if(trueRange >= largeMult*atr) isLarge = true; else if(trueRange <= smallMult*atr) isSmall = true; if(H[sh] < H[sh+1] && L[sh] > L[sh+1]) isInside = true; else if(H[sh] > H[sh+1] && L[sh] < L[sh+1]) isOutside = true; return true; } #endif
CRT Indicator.mq5 – визуальное представление
В файле индикатора буферы вообще не используются; вместо этого он полностью опирается на графические объекты. Отказ от буферов позволяет скрипту обойти лимит MetaTrader в восемь буферов и оставить трейдеру возможность сочетать эту разметку с другими индикаторами. При инициализации входные значения из диалога Inputs напрямую записываются в открытые поля внутреннего экземпляра CRangePattern с именем pat. Больше ничего глобально не хранится, поэтому изменение параметра в MetaTrader приводит к полной повторной инициализации, а не к частичному переносу состояния.
#property indicator_chart_window #include <CandleRangeTheory.mqh> input int ATR_Period = 14; ... CRangePattern pat; int OnInit() { pat.atrPeriod = ATR_Period; pat.largeMult = LargeXATR; pat.smallMult = SmallXATR; return(INIT_SUCCEEDED); }
OnCalculate() вызывается всякий раз, когда MetaTrader считает, что появились новые данные. Сначала функция проверяет, есть ли на графике как минимум atrPeriod + 3 баров: два дополнительных нужны потому, что цикл ATR требует один бар перед текущим, а Calculate() сам обращается к свече со сдвигом + 1. В четыре локальных массива (H, L, O, C) копируется только небольшой фрагмент истории такого размера. Затем каждый массив помечается как серия, чтобы индекс 0 всегда соответствовал последнему бару.
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { const int need = pat.atrPeriod + 3; if(rates_total < need) return rates_total; double H[],L[],O[],C[]; ArrayResize(H,need); ArraySetAsSeries(H,true); ArrayResize(L,need); ArraySetAsSeries(L,true); ArrayResize(O,need); ArraySetAsSeries(O,true); ArrayResize(C,need); ArraySetAsSeries(C,true); CopyHigh (_Symbol,_Period,0,need,H); CopyLow (_Symbol,_Period,0,need,L); CopyOpen (_Symbol,_Period,0,need,O); CopyClose(_Symbol,_Period,0,need,C);
После подготовки данных вызывается pat.Calculate(1, …). Передача сдвига, равного единице, гарантирует, что анализ выполняется по последнему закрытому бару, а не по еще формирующейся свече. Если в результате классификации не установлен ни один флаг, то есть свеча не относится ни к large, ни к small, ни к inside, ни к outside, функция сразу завершается, а график остается без изменений. Если паттерн обнаружен, индикатор задает параметры отображения: цвет прямоугольника задается через значения ARGB, что позволяет управлять прозрачностью, а код и цвет стрелки выбираются в соответствии с настройками пользователя.
if(!pat.Calculate(1,H,L,O,C,need)) return rates_total; uint rClr = 0; // rectangle colour (ARGB) int aCode = 221; // ● default arrow color aClr = clrYellow; if(pat.isLarge) { bool bull = (C[1] > O[1]); rClr = ColorToARGB(bull?clrLime:clrRed,Opacity); aCode = bull ? 233 /*▲*/ : 234 /*▼*/; aClr = bull ? clrLime : clrRed; } else if(pat.isSmall) { rClr = ColorToARGB(clrYellow,Opacity); } else if(pat.isInside) { rClr = ColorToARGB(clrAqua,Opacity); } else if(pat.isOutside) { rClr = ColorToARGB(clrMagenta,Opacity);} else return rates_total; // nothing to draw
При создании прямоугольника используются две временные координаты: открытие бара со сдвигом 2 и открытие бара со сдвигом 1; таким образом охватывается вся длительность целевой свечи. Максимум и минимум целевой свечи задают вертикальные границы. Свойству OBJPROP_FILL присваивается значение true, поэтому прямоугольник отображается как полупрозрачный блок, а не как пустая рамка. Затем при необходимости стрелка размещается чуть выше или ниже свечи со смещением, масштабируемым по ATR, чтобы она оставалась заметной на инструментах с сильно различающимся размером тика. И прямоугольник, и стрелка получают в имени временную метку открытия свечи, благодаря чему их имена становятся уникальными, а скрипт может удалять прежние дубликаты перед созданием новых объектов.
datetime tClosed = iTime(_Symbol,_Period,1); string tagR = "CRT_RECT_"+(string)tClosed; string tagA = "CRT_ARW_" +(string)tClosed; ObjectDelete(0,tagR); // avoid duplicates ObjectCreate(0,tagR,OBJ_RECTANGLE,0, iTime(_Symbol,_Period,2),H[1], tClosed,L[1]); ObjectSetInteger(0,tagR,OBJPROP_COLOR,rClr); ObjectSetInteger(0,tagR,OBJPROP_FILL,true); ObjectSetInteger(0,tagR,OBJPROP_BACK,true); double y = (aCode==233 ? H[1]+0.2*pat.atr : L[1]-0.2*pat.atr); ObjectCreate(0,tagA,OBJ_ARROW,0,tClosed,y); ObjectSetInteger(0,tagA,OBJPROP_ARROWCODE,aCode); ObjectSetInteger(0,tagA,OBJPROP_COLOR,aClr); return rates_total; }
CandleRangeTheory.mq5 – генерация алертов
Советник использует тот же заголовочный файл и, следовательно, ту же детерминированную логику классификации. При инициализации он повторяет тот же шаг передачи параметров, который используется в индикаторе. Кроме того, он проверяет, работает ли он в тестере стратегий без визуализации; если да, то такие GUI-функции, как Alert() или PlaySound(), не вызываются, что предотвращает ошибки времени выполнения при пакетной оптимизации.
#include <CandleRangeTheory.mqh> input bool Push_Alerts = false; ... CRangePattern pat; const bool NonVisualTest = (bool)MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_VISUAL_MODE); int OnInit() { pat.atrPeriod = ATR_Period; pat.largeMult = LargeXATR; pat.smallMult = SmallXATR; return INIT_SUCCEEDED; }
Когда советник подключен к реальному графику или запущен в визуальном тесте, он использует iCustom() для автоматической загрузки индикатора. Информация об успешной загрузке или ошибке записывается в журнал на вкладке "Эксперты". При деинициализации все хэндлы индикатора освобождаются вручную, чтобы избежать утечек памяти и загромождения графика.
int indHndl = INVALID_HANDLE; int OnInit() { ... if(!NonVisualTest) { indHndl = iCustom(_Symbol,_Period,"CRT Indicator", ATR_Period,LargeXATR,SmallXATR); if(indHndl != INVALID_HANDLE) ChartIndicatorAdd(0,0,indHndl); } return INIT_SUCCEEDED; } void OnDeinit(const int reason) { if(indHndl != INVALID_HANDLE) IndicatorRelease(indHndl); }
Основная логика сосредоточена в OnTick(). Советник запоминает время открытия свечи со сдвигом 1 и не выполняется повторно, пока это значение не изменится, что гарантирует ровно одну проверку на каждую завершенную свечу независимо от частоты тиков. Затем копируется компактный блок истории; на этот раз массивы явно переводятся в режим таймсерий, чтобы соответствовать требованиям CRangePattern. Если классификация выявляет активный паттерн, советник формирует понятное текстовое сообщение, в которое входят символ, таймфрейм и обнаруженная категория. Всплывающие окна, звуковые сигналы и push-уведомления отправляются в соответствии с настройками пользователя, но только если это допустимо в текущей среде выполнения.
datetime lastDone = 0; void OnTick() { datetime tClosed = iTime(_Symbol,_Period,1); if(tClosed == lastDone) return; // already processed lastDone = tClosed; const int need = pat.atrPeriod + 3; double H[],L[],O[],C[]; ArrayResize(H,need); ArraySetAsSeries(H,true); ArrayResize(L,need); ArraySetAsSeries(L,true); ArrayResize(O,need); ArraySetAsSeries(O,true); ArrayResize(C,need); ArraySetAsSeries(C,true); CopyHigh (_Symbol,_Period,0,need,H); CopyLow (_Symbol,_Period,0,need,L); CopyOpen (_Symbol,_Period,0,need,O); CopyClose(_Symbol,_Period,0,need,C); if(!pat.Calculate(1,H,L,O,C,need)) return; string sig; if(pat.isLarge) sig="Large-Range bar"; else if(pat.isSmall) sig="Small-Range bar"; else if(pat.isInside) sig="Inside bar"; else if(pat.isOutside) sig="Outside bar"; if(sig=="") return; string msg = _Symbol+" "+EnumToString(_Period)+" "+sig; Print("[CRT-EA] ",msg); if(!NonVisualTest) Alert(msg); if(Push_Alerts) SendNotification(msg); }
По всему советнику используются необязательные отладочные сообщения, которые кратко сообщают о таких событиях, как успешное подключение индикатора или недостаток истории. Поскольку эти сообщения зависят от флага DebugLog, рабочая версия может функционировать без лишнего шума, тогда как в режиме разработки или исследования можно включить полную диагностику.
input bool DebugLog = true; if(DebugLog) PrintFormat("[CRT-EA] Attached on %s %s (tester=%d)", _Symbol,EnumToString(_Period), (int)MQLInfoInteger(MQL_TESTER));
Набор инструментов не использует статическое или глобальное изменяемое состояние, если не считать объектов, явно необходимых для работы. Все динамические объекты, созданные на графике, либо автоматически удаляются MetaTrader при удалении родительского индикатора, либо явно удаляются в коде. Здесь нет постоянных массивов, которые росли бы со временем; каждый тик запускает копирование и классификацию фиксированного объема, а их временная сложность не зависит от длины графика. Поэтому система без доработок масштабируется от недельных графиков до секундных баров и не рискует со временем терять производительность.
// inside any function needing history const int need = pat.atrPeriod + 3; double H[need], L[need], O[need], C[need]; // stack allocation in C++17 style // (or ArrayResize + quick release when the function exits)
Тестирование и результаты
В этом разделе мы рассмотрим результаты тестирования в реальном времени.
GIF-анимация ниже показывает пятиминутный график Step Index в реальном времени, на котором работает CRT_EA. По мере закрытия каждого бара на графике появляются цветные прямоугольники, маркеры и стрелки, показывающие, сжимается ли волатильность, расширяется ли она, и поглощает ли текущая свеча предыдущий диапазон полностью. Тихие и узкие свечи категории Inside-Bar собираются в кластеры, а затем внезапно появляется широкодиапазонная свеча, сигнализирующая о всплеске моментума. При этом каждая свеча мгновенно сопоставляется с текущим ATR и классифицируется заново, так что вы получаете непрерывную цветовую картину рыночной энергии без какой-либо перерисовки прошлых баров. Такое отображение в реальном времени позволяет без труда увидеть, когда рынок сжимается, когда выходит из сжатия и как каждый бар вписывается в цикл волатильности большего масштаба.

| Класс | Цвет прямоугольника | Стрелка/маркер | Значение |
|---|---|---|---|
| Бар Large-Range (LR) | Синяя рамка | Зеленый цвет для бычьего сигнала и красный для медвежьего. | Аномально широкий диапазон - диапазон ≥ largeMult × ATR |
| Бар Small-Range (SR) | Желтая рамка | Маленькая желтая точка | Сжатый диапазон - диапазон ≤ smallMult × ATR |
| Бар Inside-Bar (IB) | Бирюзовая рамка | Бирюзовая точка | Максимум < предыдущий максимум **и** минимум > предыдущий минимум |
| Бар Outside-Bar (OB) | Пурпурная рамка | Пурпурная точка | Максимум > предыдущий максимум и минимум < предыдущий минимум |
- График Step Index
- График Crash 1000 Index
- График Boom 1000 Index
Заключение
Набор инструментов Candle-Range Theory представляет собой полноценное модульное решение для анализа диапазона в MetaTrader 5.
- CRangePattern – компактный автономный класс, который без перерисовки определяет бары Large-Range, Small-Range, Inside и Outside.
- CRT_Indicator – наносит сигналы на график с помощью цветных рамок и стрелок, чтобы их можно было сразу считывать визуально.
- CRT_EA – преобразует те же сигналы в алерты или автоматические ордера.
Все параметры – период ATR, малые и большие множители, правила алертов – полностью настраиваются, благодаря чему система адаптируется к любому символу, таймфрейму и режиму волатильности. Поскольку логика распознавания отделена от слоев визуализации и исполнения, ее можно расширять или встраивать в сканеры, панели управления и полноценные торговые системы при минимальном изменении кода.
Набор инструментов предназначен для учебных целей и перед любым запуском на реальном счете должен быть протестирован на демо-счете. Сочетайте его объективные сигналы по диапазону со своими правилами отбора сделок и управления рисками, чтобы эта методика соответствовала вашей общей стратегии.
При таком использовании система Candle-Range Theory помогает быстро, ясно и уверенно выявлять события волатильности, визуализировать их и реагировать на них.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/18911
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Популяционные алгоритмы оптимизации: строим защиту от читеров
Как создать и оптимизировать торговую систему на основе циклов (Detrended Price Oscillator — DPO)
Моделирование рынка: Первые шаги на SQL в MQL5 (I)
Разработка инструментария для анализа Price Action (Часть 32): Модуль распознавания свечных паттернов на Python (II) – Распознавание с помощью Ta-Lib
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования