Обсуждение статьи "Разработка передовых торговых систем (ПТС): Реализация Order Blocks в индикаторе"

 

Опубликована статья Разработка передовых торговых систем (ПТС): Реализация Order Blocks в индикаторе:

В этой статье мы узнаем, как создать индикатор, который обнаруживает, рисует и предупреждает о смягчении ордер-блоков (ОВ). Также мы подробно рассмотрим, как идентифицировать эти блоки на графике, устанавливать точные предупреждения и визуализировать их положение с помощью прямоугольников, чтобы лучше понять поведение цены. Данный индикатор станет ключевым инструментом для тех, кто следует концепциям Smart Money Concepts и методологии Inner Circle Trader.

Ордер-блоки, как следует из названия, представляют собой области на графике, где ордера ожидают активации.

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

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

Исходя из данной концепции, мы можем определить эти области на графике, поскольку они являются местами, где возник сильный дисбаланс между спросом и предложением (либо покупкой, либо продажей). Далее мы рассмотрим три способа определения этих областей и как реализовать их в коде.

Автор: Niquel Mendoza

 

Добрый день, Мендоса.

Спасибо за эти усилия.

Мой вопрос заключается в следующем ; поскольку мы используем функцию OnCalculate:

int OnCalculate(const int rates_total,

const int prev_calculated,

const datetime &time[],// TimeSeries of Open times

const double &open[], // Временной ряд цен открытия

const double &high[],// Временная серия высоких цен

const double &low[],// Временная серия низких цен

const double &close[],// Временная серия цен закрытия

const long &tick_volume[],// Временная серия тикового объема

const long &volume[],// Временная серия цен баров

const int &spread[])//


Зачем нам создавать новые массивы и переставлять их?

 
Ahmed Fouad Abdellatief функцию OnCalculate:

int OnCalculate(const int rates_total,

const int prev_calculated,

const datetime &time[],// Временной ряд времени открытия

const double &open[], // Временной ряд цен открытия

const double &high[],// Временной ряд высоких цен

const double &low[],// Временной ряд низких цен

const double &close[],// Временной ряд цен закрытия

const long &tick_volume[],// Временная серия тикового объема

const long &volume[],// Временной ряд цен баров

const int &spread[])//


Зачем нам создавать новые массивы и переставлять их?

Здравствуйте, Ахмед, большое спасибо за ваш комментарий. Вы правы. Нет необходимости создавать новые массивы, потому что функция OnCalculate уже предоставляет нам все данные, готовые к использованию. В свое время я сделал это по привычке, но лучше всего работать непосредственно с теми данными, которые уже есть. Кстати, если вам нужен самый актуальный код, я оставлю его здесь. В этом новом коде используются массивы, которые уже есть по умолчанию, логика определения блоков порядка та же.
 
Niquel Mendoza #:
datetime  mitigados_alcsitas(double price, const double &lowArray[], const  datetime &Time[], datetime start, datetime end)
 {
  int startIndex = iBarShift(_Symbol, PERIOD_CURRENT, start);
  int endIndex = iBarShift(_Symbol, PERIOD_CURRENT, end);

  NormalizeDouble(price, _Digits);
  for(int i = startIndex - 2 ; i >= endIndex + 1 ; i--)
   {
    if(price > lowArray[i])
     {
      return Time[i]; //si encuentra que si hubo retorna el tiempo de la vela donde hubo la mitigacion
      Print("el orderblock tuvo mitigaciones", TimeToString(end));
     }
   }

  return 0; //En caso no se haya encontrado  niguna mitigacion retorna 0
 }

И так в четырёх соседних функциях.

 
trader6_1 #:

И так далее по четырем соседним функциям.

Привет, вы абсолютно правы. Я ошибался, думая, что NormalizeDouble работает по ссылке. На самом деле она возвращает округленное значение, и чтобы переменная приняла это значение, нужно явно присвоить его ей. Прошу прощения за это; думаю, я понял это, когда писал код, и так это и закрепилось. Мне очень жаль. Я использую NormalizeDouble скорее для предосторожности, хотя не думаю, что это существенно влияет на проверку того, был ли смягчен блок бычьего ордера (на основе моего тестирования). Спасибо, что указали на это. Мы могли бы назначить "price = NormalizeDouble(price, _Digits)" напрямую или удалить эту строку, поскольку нормализация, похоже, не оказывает существенного влияния на проверку.

 
Большое спасибо, спасибо, что поделились. Переходите к следующей части.