English 中文 Deutsch 日本語
preview
Разработка инструментария для анализа движения цен (Часть 24): Инструмент количественного анализа Price Action

Разработка инструментария для анализа движения цен (Часть 24): Инструмент количественного анализа Price Action

MetaTrader 5Торговые системы |
50 0
Christian Benjamin
Christian Benjamin

Содержание



Введение

Большинство трейдеров, торгующих по движению цены, опираются на характерные свечные формации, такие как пин-бары, доджи, паттерны поглощения и свечи марубозу. Эти свечи используют для выявления изменений в рыночных настроениях и поиска потенциальных разворотов или движений продолжения. Ручной поиск таких сигналов на десятках графиков отнимает много времени и легко приводит к пропускам.

Чтобы решить эту задачу, мы разработали для MetaTrader 5 советник Price Action Quantification Analysis. Этот советник:

  1. автоматически анализирует заданное количество последних баров на предмет четырех широко признанных паттернов движения цены;
  2. отмечает каждый обнаруженный паттерн на графике стрелками и метками, давая четкие визуальные ориентиры;
  3. выдает алерт и записывает движение следующего бара в пунктах, помогая оценить силу сигнала;
  4. предоставляет встроенную статистику тестирования на исторических данных, рассматривая каждый паттерн как "сделку" и вычисляя общий процент успешных срабатываний.

В следующих разделах мы разберем структуру советника, пройдемся по его настраиваемым параметрам и покажем, как показатели его эффективности могут сделать ваш подход к торговле по движению цены более точным. Давайте начнем с конкретных свечных паттернов, которые отслеживает этот советник, — разберем строение каждой свечи и расчеты, с помощью которых они определяются.

Свечные паттерны

  • Пин-бары

Пин-бар – это одна свеча с маленьким телом и длинным хвостом, то есть тенью. Когда вы видите такую свечу, это означает, что цена пыталась далеко уйти в одну сторону, но затем была отброшена обратно.

В медвежьем пине-баре длинная верхняя тень показывает, что покупатели не смогли удержать цену наверху и инициативу перехватили продавцы.

Рис. 1. Медвежий пин-бар

У бычьего пин-бара длинная нижняя тень, что указывает на вмешательство покупателей и разворот инициативы вверх.

Рис. 2. Бычий пин-бар

Цвет свечи может дополнительно усиливать сигнал. В медвежьем пин-баре красное (или черное) тело выглядит убедительнее, потому что свеча закрывается ниже цены открытия, что указывает на доминирование продавцов. Для бычьего пин-бара зеленое (или белое) тело усиливает сигнал, поскольку свеча закрывается выше цены открытия, отражая давление покупателей. Однако форма пин-бара и длина его хвоста важнее, чем один только цвет. Чтобы считать такой сигнал надежным, ищите хвост, который как минимум в два-три раза длиннее тела, обращайте внимание на всплески объема в момент резкого отбоя цены и проверяйте, сформировался ли пин-бар рядом с известными уровнями поддержки или сопротивления. Эти дополнительные шаги помогают отличать настоящие развороты от обычных теней.

Логика определения

  • Вычислите candleBody, topShadow и bottomShadow.
  • Должно выполняться условие candleBody > minBodyPoints * _Point.

Медвежий пин-бар:

topShadow >= wickToBodyRatio * candleBody

bottomShadow < smallWickCap * candleBody

Бычий пин-бар:

bottomShadow >=  wickToBodyRatio * candleBody

topShadow < smallWickCap * candleBody

// 1. Calculate parts
double candleBody   = MathAbs(closePrice - openPrice);
double topShadow    = highPrice - MathMax(openPrice, closePrice);
double bottomShadow = MathMin(openPrice, closePrice) - lowPrice;

// 2. Minimum body check
if(candleBody > minBodyPoints * _Point)
{
   // Bearish pin bar
   if(topShadow >= wickToBodyRatio * candleBody
      && bottomShadow < smallWickCap * candleBody)
      Print("Bearish Pin Bar detected");

   // Bullish pin bar
   else if(bottomShadow >= wickToBodyRatio * candleBody
           && topShadow < smallWickCap * candleBody)
      Print("Bullish Pin Bar detected");
}

  • Доджи

Доджи формируется, когда цены открытия и закрытия свечи практически совпадают. Такой паттерн указывает на рыночную неопределенность, а его направленность определяется предшествующим трендом. Различия в длине верхней и нижней теней образуют фигуры, напоминающие знак плюса, крест или перевернутый крест.

Рис. 3. Доджи

Логика определения

  1. Вычислите candleBody, fullRange, topShadow и bottomShadow.
  2. Должно выполняться условие candleBody ≤ maxDojiRatio * fullRange.
  3. Должны выполняться условия topShadow > candleBody и bottomShadow > candleBody.
// 1. Calculate body and range
double candleBody   = MathAbs(closePrice - openPrice);
double fullRange    = highPrice - lowPrice;
double topShadow    = highPrice - MathMax(openPrice, closePrice);
double bottomShadow = MathMin(openPrice, closePrice) - lowPrice;

// 2. Tiny body test
if(candleBody <= fullRange * maxDojiRatio)
{
   // 3. Both shadows must extend beyond the body
   if(topShadow > candleBody && bottomShadow > candleBody)
      Print("Doji detected");
}
  • Свечные паттерны поглощения

Существует два типа паттернов поглощения: бычье поглощение и медвежье поглощение.

Бычье поглощение

Этот разворотный паттерн из двух свечей появляется, когда нисходящий тренд или консолидация подходят к концу. Сразу за небольшой медвежьей свечой формируется более крупная бычья, которая полностью перекрывает тело предыдущей. Размер второй свечи показывает, что покупатели полностью перехватили инициативу у продавцов, и часто знаменует начало сильного восходящего движения.

Рис. 4. Бычье поглощение

Медвежье поглощение

Это зеркальный паттерн. За небольшой бычьей свечой следует более крупная медвежья, которая полностью поглощает тело предыдущей. Этот паттерн указывает на то, что продавцы перехватили инициативу, и может сигнализировать о начале сильного нисходящего движения.

Bearish Engulfing

Рис. 5. Медвежье поглощение

Логика определения

Вычислите prevBody = |prevClose - prevOpen|, currBody = |close - open|.

Должно выполняться условие currBody > prevBody.

Бычье поглощение:

  • prevClose < prevOpen
  • openPriceprevClose
  • closePriceprevOpen

Медвежье поглощение:

  • prevClose > prevOpen
  • openPrice ≥ prevClose
  • closePrice ≤ prevOpen
// 1. Compute body sizes
double prevBody = MathAbs(prevClose - prevOpen);
double currBody = MathAbs(closePrice - openPrice);

// 2. Must be larger than previous
if(currBody > prevBody)
{
   // Bullish engulfing
   if(prevClose < prevOpen
      && openPrice <= prevClose
      && closePrice >= prevOpen)
      Print("Bullish Engulfing detected");

   // Bearish engulfing
   else if(prevClose > prevOpen
           && openPrice >= prevClose
           && closePrice <= prevOpen)
      Print("Bearish Engulfing detected");
}

  • Свеча марубозу


Рис. 6. Марубозу

Свеча марубозу выделяется длинным телом и почти полным отсутствием теней. Цены открытия и закрытия охватывают почти весь диапазон свечи, что указывает на решительные действия участников рынка. Существует три варианта марубозу, и у каждого есть бычья и медвежья версия:

Полная марубозу

Бычья: Открытие на минимуме, закрытие на максимуме Покупатели ведут цену от начала и до конца.

Медвежья: Открытие на максимуме, закрытие на минимуме. Продавцы доминируют на протяжении всей сессии.

Открытая марубозу

Бычья: Открытие на минимуме, закрытие немного ниже максимума (с небольшой верхней тенью). Покупатели сразу перехватывают инициативу.

Медвежья: Открытие на максимуме, закрытие немного выше минимума (с небольшой нижней тенью). С самого начала сессии инициативой владеют продавцы.

Закрытая марубозу

Бычья: Закрытие на максимуме, открытие немного выше минимума (с небольшой нижней тенью). К закрытию давление покупателей нарастает.

Медвежья: Закрытие на минимуме, открытие немного ниже максимума (с небольшой верхней тенью). К закрытию давление продавцов усиливается.

Логика определения

  • Вычислите candleBody, fullRange, topShadow и bottomShadow.
  • Должно выполняться условие candleBody ≥ marubozuRatio * fullRange.
  • Должны выполняться условия topShadow ≤ (1 – marubozuRatio) * fullRange и bottomShadow ≤ (1 – marubozuRatio) * fullRange.
  • Если closePrice > openPrice, свеча считается бычьей; в противном случае – медвежьей.

// 1. Calculate parts
double candleBody   = MathAbs(closePrice - openPrice);
double fullRange    = highPrice - lowPrice;
double topShadow    = highPrice - MathMax(openPrice, closePrice);
double bottomShadow = MathMin(openPrice, closePrice) - lowPrice;

// 2. Body covers most of the range
if(candleBody >= marubozuRatio * fullRange)
{
   // 3. Shadows must be small
   double maxWick = (1 - marubozuRatio) * fullRange;
   if(topShadow <= maxWick && bottomShadow <= maxWick)
   {
      // 4. Bullish or bearish
      if(closePrice > openPrice)
         Print("Bullish Marubozu detected");
      else
         Print("Bearish Marubozu detected");
   }
}



Разбор советника на MQL5

Выше показана схема, иллюстрирующая работу советника на графике MetaTrader 5. Ниже результаты сведены в таблицу – каждое значение представляет собой процентное изменение. Когда мы приступили к созданию данного советника, нашей главной целью было автоматизировать поиск ключевых свечных паттернов, на которые трейдеры часто опираются при принятии торговых решений, таких как пин-бары, доджи, паттерны поглощения и марубозу. Мы хотели, чтобы советник объективно анализировал недавнее движение цены, точно распознавал эти паттерны и давал на графике четкие визуальные сигналы, а также статистическую обратную связь об эффективности каждого паттерна.

Для этого мы начали с определения входных параметров, которые обеспечивают гибкость анализа. К ним относятся количество анализируемых баров (InpLookbackBars), минимальный размер тела в пунктах (InpMinBodySizePts) для отсечения незначимых свечей, а также соотношение тени и тела (InpWickBodyRatio) для распознавания пин-баров. Мы также добавили параметр периода ATR для оценки рыночной волатильности, которая может влиять на правила распознавания паттернов.

// Input parameters for customization
input int    InpLookbackBars   = 200;   // Bars to scan
input int    InpMinBodySizePts = 10;    // Min body size (points)
input double InpWickBodyRatio  = 2.0;   // Min wick-to-body ratio
input int    InpATRPeriod      = 14;    // ATR period

На этапе инициализации (OnInit) мы настроили массивы для хранения рассчитанных данных по каждому бару, таких как размер тела, верхняя и нижняя тени, полный диапазон и значения ATR. Мы также настроили эти массивы как таймсерии, чтобы эффективно обрабатывать недавние бары. Кроме того, мы подготовили небольшой буфер для отслеживания недавних сигналов, что впоследствии помогает анализировать успешность паттернов.

int OnInit()
  {
   ArraySetAsSeries(Body,true);
   ArraySetAsSeries(UpperWick,true);
   ArraySetAsSeries(LowerWick,true);
   ArraySetAsSeries(TotalRange,true);
   ArraySetAsSeries(ATR,true);
   ArrayResize(Body, InpLookbackBars+2);
   ArrayResize(UpperWick, InpLookbackBars+2);
   ArrayResize(LowerWick, InpLookbackBars+2);
   ArrayResize(TotalRange, InpLookbackBars+2);
   ArrayResize(ATR, InpLookbackBars+2);

   for(int i=0;i<5;i++)
      g_history[i]="";

   return(INIT_SUCCEEDED);
  }
Основная логика сосредоточена в функции OnTick, которая выполняется на каждом новом рыночном тике. Чтобы избежать лишних вычислений, мы добавили проверку, которая по временным меткам позволяет выполнять обработку только один раз на каждом новом баре. Когда обнаруживается новый бар, мы вызываем функцию AnalyzeAndDraw, которая выполняет основной анализ.
void OnTick()
  {
   static datetime lastTime=0;
   datetime current = iTime(_Symbol, _Period, 0);
   if(current == lastTime)
      return; // Only process once per new bar
   lastTime = current;
   AnalyzeAndDraw();
  }

Внутри AnalyzeAndDraw мы сначала удаляем все предыдущие графические объекты, чтобы не загромождать график. Затем мы проходим по последним барам, чтобы вычислить ключевые параметры свечи: размер тела (абсолютную разницу между ценами открытия и закрытия), верхнюю тень (максимум минус максимальная из цен открытия и закрытия), нижнюю тень (минимальная из цен открытия и закрытия минус минимум) и полный диапазон (максимум минус минимум). Мы также копируем значения ATR, чтобы учитывать волатильность при распознавании паттернов.

void AnalyzeAndDraw()
  {
   int bars = MathMin(InpLookbackBars, (int)SeriesInfoInteger(_Symbol,_Period,SERIES_BARS_COUNT));

   ObjectsDeleteAll(0,0,OBJ_ARROW);
   ObjectsDeleteAll(0,0,OBJ_LABEL);

   for(int i=0; i<bars; i++)
     {
      double op = iOpen(_Symbol,_Period,i);
      double cl = iClose(_Symbol,_Period,i);
      double hi = iHigh(_Symbol,_Period,i);
      double lo = iLow(_Symbol,_Period,i);

      // Calculate candlestick components
      Body[i]       = MathAbs(cl-op);
      UpperWick[i]  = hi - MathMax(op,cl);
      LowerWick[i]  = MathMin(op,cl) - lo;
      TotalRange[i] = hi - lo;
     }

   // Copy ATR buffer
   if(CopyBuffer(iATR(_Symbol,_Period,InpATRPeriod),0,0,bars,ATR)<=0)
      return; // Exit if ATR data not available

Затем мы применяем правила распознавания паттернов. Например, чтобы выявить пин-бар, мы проверяем, есть ли у свечи маленькое тело и длинная тень, а также превышает ли соотношение тени к телу заданный порог.

  • медвежий пин-бар: длинная верхняя тень >= соотношение × тело, короткая нижняя тень;
  • бычий пин-бар: длинная нижняя тень >= соотношение × тело, короткая верхняя тень

Сначала мы отсекаем слишком маленькие тела свечей, требуя выполнения условия Body > minPts. Затем мы требуем, чтобы одна тень была как минимум в InpWickBodyRatio раз длиннее тела, а противоположная оставалась меньше 50% длины тела.

// assume Body[i], UpperWick[i], LowerWick[i] already computed
if(InpShowPinBar && Body[i] > InpMinBodySizePts*_Point)
{
   // Bearish: towering upper wick, stubby lower wick
   if( UpperWick[i] > Body[i]*InpWickBodyRatio
       && LowerWick[i] < Body[i]*0.5 )
      type = "Bearish Pin Bar";

   // Bullish: towering lower wick, stubby upper wick
   else if( LowerWick[i] > Body[i]*InpWickBodyRatio
            && UpperWick[i] < Body[i]*0.5 )
      type = "Bullish Pin Bar";
}

В качестве доджи мы ищем свечи с минимальным телом относительно порога, заданного в пунктах, и с тенями, указывающими на возможную рыночную неопределенность.

  • Body <= DojiBodyRatio × totalRange;
  • обе тени больше тела (чтобы подтвердить наличие теней).

Мы ограничиваем размер тела, например 10% полного диапазона (InpDojiBodyRatio). Требование, чтобы каждая тень была больше тела, отсеивает свечи типа "волчок", у которых почти нет теней.

// TotalRange[i] = high – low
if(InpShowDoji
   && Body[i] <= TotalRange[i] * InpDojiBodyRatio    // body tiny vs full range
   && UpperWick[i] > Body[i]                         // upper shadow present
   && LowerWick[i] > Body[i])                        // lower shadow present
   type = "Doji";

Паттерны поглощения предполагают сравнение текущей свечи с предыдущей: мы проверяем, находятся ли цена открытия и цена закрытия предыдущей свечи по разные стороны тела текущей и полностью ли текущая свеча поглощает предыдущую.

  • Бычье поглощение: предыдущий бар был медвежьим, цена открытия текущего бара ≤ цене закрытия предыдущего, цена закрытия текущего бара ≥ цене открытия предыдущего и currBody > prevBody
  • Медвежье поглощение: предыдущий бар был бычьим, цена открытия текущего бара ≥ цене закрытия предыдущего, цена закрытия текущего бара ≤ цене открытия предыдущего и currBody > prevBody

double po = iOpen(_Symbol,_Period,i+1),
       pc = iClose(_Symbol,_Period,i+1);
double prevBody = MathAbs(pc - po),
       currBody = Body[i];

if(InpShowEngulfing && currBody > prevBody)
{
   // Bullish: current body engulfs prior’s
   if(pc < po && op <= pc && cl >= po)
      type = "Bullish Engulfing";
   // Bearish: current body engulfs prior’s
   else if(pc > po && op >= pc && cl <= po)
      type = "Bearish Engulfing";
}

Для свечей марубозу мы проверяем, покрывает ли тело большую часть полного диапазона, что указывает на сильный моментум.

  • Body >=  MarubozuBodyRatio × totalRange (например, >= 90%);
  • обе тени <= (1 - MarubozuBodyRatio) × totalRange.

if(InpShowMarubozu
   && Body[i] >= TotalRange[i] * InpMarubozuBodyRatio
   && UpperWick[i] <= TotalRange[i] * (1 - InpMarubozuBodyRatio)
   && LowerWick[i] <= TotalRange[i] * (1 - InpMarubozuBodyRatio))
{
   type = (cl > op) ? "Bullish Marubozu" : "Bearish Marubozu";
}

Каждый раз, когда обнаруживается паттерн, мы увеличиваем счетчики общего числа сигналов и успешных срабатываний. Под "успешным срабатыванием" мы понимаем ситуацию, когда следующая свеча движется в ожидаемом направлении, что дает хотя бы базовую оценку надежности паттерна.

if(type!="")
{
    lastIdx = i;
    lastCl = cl;
    lastIsBuy = (StringFind(type,"Bullish")>=0);
    latestSignal = type;

    g_totalSignals++;
    double nextC = iClose(_Symbol,_Period,i-1);
    if(lastIsBuy && nextC>cl)
        g_totalWins++;
    if(!lastIsBuy && nextC<cl)
        g_totalWins++;

    DrawPattern(i, type, lastIsBuy);
    break;
}

Чтобы сделать эти сигналы наглядными, мы с помощью функции DrawPattern рисуем на графике стрелки вверх или вниз и добавляем метки с типом паттерна. Мы также генерируем алерты, чтобы сразу получать уведомления при появлении паттерна.

void DrawPattern(int idx, const string type, bool isBuy)
  {
   datetime t = iTime(_Symbol,_Period,idx);
   double y = iHigh(_Symbol,_Period,idx) + 15*_Point;
   string an = StringFormat("PAQ_%s_%d",type,idx);
   ObjectCreate(0,an,OBJ_ARROW,0,t,y);
   ObjectSetInteger(0,an,OBJPROP_ARROWCODE,isBuy?233:234);
   ObjectSetInteger(0,an,OBJPROP_COLOR,isBuy?clrLime:clrRed);
   string lbl = an+"_lbl";
   ObjectCreate(0,lbl,OBJ_LABEL,0,t,y-25*_Point);
   ObjectSetString(0,lbl,OBJPROP_TEXT,type);
   ObjectSetInteger(0,lbl,OBJPROP_COLOR,isBuy?clrLime:clrRed);
  }
На протяжении всей разработки мы стремились сделать советник гибким и информативным. Поэтому мы добавили буфер истории паттернов для хранения последних сигналов, а в конце тестирования на исторических данных или при удалении советника выводим статистику эффективности: общее количество сигналов, число успешных срабатываний и их процент. Это помогает нам оценить, насколько эффективна наша логика распознавания паттернов в долгосрочной перспективе.
void OnDeinit(const int reason)
  {
   double rate = g_totalSignals>0 ? 100.0*g_totalWins/g_totalSignals : 0.0;
   PrintFormat("[PAQ] Backtest completed: Signals=%I64d Wins=%I64d WinRate=%.1f%%",
               g_totalSignals, g_totalWins, rate);
  }

В итоге этот советник был создан как сочетание логики распознавания свечных паттернов, визуальных индикаторов и средств отслеживания эффективности. Наша цель состояла в том, чтобы создать автоматизированную систему, которая упрощает часто трудоемкий поиск паттернов и при этом дает четкие визуальные сигналы и статистику эффективности, помогая принимать более обоснованные торговые решения.


Результат

Давайте посмотрим, как наш советник показал себя и в реальном времени, и при тестировании на исторических данных. Во-первых, на диаграмме ниже показан паттерн медвежьего поглощения, обнаруженный советником в реальных рыночных условиях. Хорошо видно, что это корректный сигнал: медвежья свеча полностью поглощает предыдущую бычью.

Рис. 7. Медвежье поглощение

Далее показан медвежий пин-бар, который советник также успешно обнаружил. Это корректно распознанный пин-бар, что демонстрирует точность инструмента при определении свечных паттернов.

Рис. 8. Медвежий пин-бар

Наконец, рассмотрим результаты тестирования на исторических данных. Советник корректно распознает паттерны и записывает название каждого обнаруженного паттерна в журнал.

Рис. 9 Тестирование на исторических данных


Заключение

Из результатов предыдущего раздела видно, что наш советник надежно распознает четыре ключевых свечных паттерна. Это поможет и начинающим, и опытным трейдерам выявлять формации, которые бывает трудно распознать невооруженным глазом. В моих тестах на исторических данных и в испытаниях на реальном рынке советник корректно отмечал каждый паттерн. Хотя ни одна система не идеальна и некоторые сигналы могут не отработать, этот советник не предназначен для отсеивания каждого ложного сигнала. Вместо этого он служит для трейдеров еще одним точным инструментом при анализе движения цены. Сверившись с этими сигналами, трейдеры смогут также применять собственные методы подтверждения, прежде чем открывать длинную или короткую позицию.

В целом советник отлично справляется со своей основной задачей – распознаванием паттернов. Я уверенно рекомендую его как инструмент, точно распознающий четыре целевые формации. Вы можете настроить входные параметры под свою стратегию. Буду рад вашим отзывам о том, что еще можно улучшить, по вашему мнению.

Дата Название инструмента  Описание Версия  Обновления  Примечания
01/10/24 Chart Projector Скрипт для наложения эффекта призрака на движение цены за предыдущий день 1.0 Первоначальная версия Инструмент номер 1
18/11/24 Analytical Comment Предоставляет информацию за предыдущий день в табличном формате, а также прогнозирует будущее направление рынка 1.0 Первоначальная версия Инструмент номер 2
27/11/24 Analytics Master Регулярное обновление рыночных показателей каждые два часа  1.01 Вторая версия Инструмент номер 3
02/12/24 Analytics Forecaster  Регулярное обновление рыночных показателей каждые два часа с интеграцией с Telegram 1.1 Третья версия Инструмент номер 4
09/12/24 Volatility Navigator Советник анализирует рыночные условия с помощью полос Боллинджера, RSI и ATR 1.0 Первоначальная версия Инструмент номер 5
19/12/24 Mean Reversion Signal Reaper  Анализирует рынок и генерирует сигналы, используя стратегию возврата к среднему  1.0  Первоначальная версия  Инструмент номер 6 
9/01/25  Signal Pulse  Анализирует несколько таймфреймов 1.0  Первоначальная версия  Инструмент номер 7 
17/01/25  Metrics Board  Панель с кнопками для анализа  1.0  Первоначальная версия Инструмент номер 8 
21/01/25 External Flow Аналитика с помощью внешних библиотек 1.0  Первоначальная версия Инструмент номер 9 
27/01/25 VWAP Взвешенная по объему средняя цена   1.3  Первоначальная версия  Инструмент номер 10 
02/02/25  Heikin Ashi  Сглаживание тренда и идентификация сигналов разворота  1.0  Первоначальная версия  Инструмент номер 11
04/02/25  FibVWAP  Генерация сигналов с помощью анализа Python  1.0  Первоначальная версия  Инструмент номер 12
14/02/25  RSI DIVERGENCE  Дивергенция цены и RSI  1.0  Первоначальная версия  Инструмент номер 13 
17/02/25  Parabolic Stop and Reverse (PSAR)  Автоматизация стратегии PSAR 1.0 Первоначальная версия  Инструмент номер 14
20/02/25  Скрипт Quarters Drawer  Нанесение уровней четвертей на график  1.0  Первоначальная версия  Инструмент номер 15 
27/02/25  Intrusion Detector Обнаружение и оповещение о достижении ценой уровней четвертей 1.0   Первоначальная версия Инструмент номер 16 
27/02/25  TrendLoom Tool Панель мультитаймфреймового анализа 1.0 Первоначальная версия Инструмент номер 17
11/03/25  Quarters Board  Панель с кнопками для включения/отключения уровней четвертей  1.0  Первоначальная версия Инструмент номер 18
26/03/25  ZigZag Analyzer  Построение линий тренда с помощью индикатора ZigZag  1.0  Первоначальная версия  Инструмент номер 19 
10/04/25  Correlation Pathfinder Построение графиков корреляции валютных курсов с использованием библиотек Python. 1.0 Первоначальная версия  Инструмент номер 20 
23/04/25 Market Structure Flip Detector Tool Поиск разворотов рыночной структуры 1.0  Первоначальная версия  Инструмент номер 21
08/05/25  Correlation Dashboard  Корреляции между разными парами 1.0 Первоначальная версия Инструмент номер 22 
13/05/25 Currency Strength Meter  Измеряет силу валюты по нескольким валютным парам с ее участием 1.0 Первоначальная версия Инструмент номер 23 
21/05/25 PAQ Analysis Tool  Обнаруживает свечные паттерны 1.0  Первоначальная версия Инструмент номер 24 

Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/18207

Прикрепленные файлы |
Особенности написания Пользовательских Индикаторов Особенности написания Пользовательских Индикаторов
Написание пользовательских индикаторов в торговой системе MetaTrader 4
Разработка инструментария для анализа движения цен (Часть 26): Инструмент для работы с несколькими паттернами – пин-баром, паттернами поглощения и дивергенцией RSI Разработка инструментария для анализа движения цен (Часть 26): Инструмент для работы с несколькими паттернами – пин-баром, паттернами поглощения и дивергенцией RSI
В соответствии с нашей целью – разрабатывать практические инструменты для анализа движения цены – в этой статье рассматривается создание советника, который выявляет пин-бары и паттерны поглощения и использует дивергенцию RSI для подтверждения перед формированием торговых сигналов.
Особенности написания экспертов Особенности написания экспертов
Написание и тестирование экспертов в торговой системе MetaTrader 4.
Разработка инструментария для анализа движения цен (Часть 23): Индикатор силы валют Разработка инструментария для анализа движения цен (Часть 23): Индикатор силы валют
Знаете, что на самом деле определяет направление валютной пары? Его определяет сила каждой отдельной валюты. В этой статье мы будем измерять силу валюты, анализируя все пары, в которых она присутствует. Это позволит прогнозировать движение этих пар, исходя из относительной силы входящих в них валют. Читайте дальше, чтобы узнать больше.