Обсуждение статьи "Разработка передовых торговых систем (ПТС): Реализация Order Blocks в индикаторе"
Добрый день, Мендоса.
Спасибо за эти усилия.
Мой вопрос заключается в следующем ; поскольку мы используем функцию 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[])//
Зачем нам создавать новые массивы и переставлять их?
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[])//
Зачем нам создавать новые массивы и переставлять их?
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 }
И так в четырёх соседних функциях.
Привет, вы абсолютно правы. Я ошибался, думая, что NormalizeDouble работает по ссылке. На самом деле она возвращает округленное значение, и чтобы переменная приняла это значение, нужно явно присвоить его ей. Прошу прощения за это; думаю, я понял это, когда писал код, и так это и закрепилось. Мне очень жаль. Я использую NormalizeDouble скорее для предосторожности, хотя не думаю, что это существенно влияет на проверку того, был ли смягчен блок бычьего ордера (на основе моего тестирования). Спасибо, что указали на это. Мы могли бы назначить "price = NormalizeDouble(price, _Digits)" напрямую или удалить эту строку, поскольку нормализация, похоже, не оказывает существенного влияния на проверку.
Здравствуйте, Ахмед, большое спасибо за ваш комментарий. Вы правы. Нет необходимости создавать новые массивы, потому что функция OnCalculate уже предоставляет нам все данные, готовые к использованию. В свое время я сделал это по привычке, но лучше всего работать непосредственно с теми данными, которые уже есть. Кстати, если вам нужен самый актуальный код, я оставлю его здесь. В этом новом коде используются массивы, которые уже есть по умолчанию, логика обнаружения блоков заказа та же.
Здравствуйте, Ахмед, большое спасибо за ваш комментарий. Вы правы. Нет необходимости создавать новые массивы, потому что функция OnCalculate уже предоставляет нам все данные, готовые к использованию. В свое время я сделал это по привычке, но лучше всего работать непосредственно с теми данными, которые уже есть. Кстати, если вам нужен самый актуальный код, я оставлю его здесь. В этом новом коде используются массивы, которые уже есть по умолчанию, логика обнаружения блоков заказа та же.
Есть еще одна причина для создания отдельных массивов. Если вы решите встроить эту логику в советник, то не будет функции OnCalculate. Также если вы захотите сделать мультивалютную или мультитаймфреймовую версию, то вам понадобится несколько массивов или несколько дементоров, и 90% работы уже сделано.
Мой вопрос заключается в том, почему большинство разработчиков превращают данные во временные ряды? Я преобразовал советник MQ4 в MQ5 и не знал, что временные ряды доступны, поэтому я сохранил все массивы как нулевые базы, а не как временные ряды.Я обнаружил, что это значительно облегчает жизнь, поскольку существует соответствие 1 к 1 между данными и вспомогательными массивами, больше не нужно сбрасывать, изменять размер и снова сбрасывать для временных рядов, только изменение размера и, наконец, самое главное, только 1 система нумерации баров. Для тех функций Metaquotes, которые настаивают на временных рядах, я делаю обратную индексацию при вызове.
Здравствуйте, я только что скачал ваш исходник, версия 1, скомпилировал и применил к графику EURUSD H4 и ничего не появилось. Я зашел в панель свойств, ничего не менял и закрыл, а png появился. Только зеленые бары, без красных, и когда они начинаются, они не заканчиваются. Есть предложения?Я скачал Part2 из обсуждения выше, и там были в целом те же проблемы, но с тремя более новыми. Проблемы старт-стоп-зеленый-красный были очевидны. Кроме того, похоже, были разные критерии, так как количество полос не совсем совпадает. Кроме того, я попытался изменить зеленый цвет на clrLime, и он изменился, но точно не Lime.
Кроме того, как вы делаете анимацию. Вы используете тестер стратегий? Я спрашиваю, потому что не могу заставить тестер стратегий правильно отображаться на экране при тестировании советника в визуальном режиме или при тестировании индикатора.Привет, Никель,
Я прилагаю немного измененную версию вашей части 2.
Я добавил ErrorDescription(errornumber), который находится в STDLIB.EX5, чтобы расширить ваши различные сообщения об ошибках. По какой-то причине я не мог поместить импорт непосредственно в индикатор, поэтому моим обходным решением было включить его в файл включения BlockOrder Common.mqh, где он работает для меня. Можете ли вы запустить индикатор через Google Translate, чтобы преобразовать текст на английский?
Я также добавил номер версии, 2.01, в программу. Используя define, я добавил номер версии в качестве префикса для RectangleCreate, чтобы можно было запускать версии 1 и 2 вместе, хотя я не изменял версию 1.
В качестве предложения, вы могли бы рассчитать скользящее среднее по объемам и отобразить его в нижней части экрана. Я предполагаю, что потребуется некоторая десятичная корректировка.
С нетерпением жду вашего следующего обновления
CapeCoddah
Есть еще одна причина для создания отдельных массивов. Если вы решите встроить логику в советник, то не будет функции OnCalculate. Также если вы захотите сделать мультивалютную или мультитаймфреймовую версию, то вам понадобится несколько массивов или несколько дементоров, и 90% работы уже сделано.
Мой вопрос заключается в том, почему большинство разработчиков превращают данные во временные ряды? Я конвертировал советник MQ4 в MQ5 и не знал, что временные ряды доступны, поэтому я сохранил все массивы как нулевые базы, а не как временные ряды.Я обнаружил, что это значительно облегчает жизнь, поскольку существует соответствие 1 к 1 между данными и вспомогательными массивами, больше не нужно сбрасывать, изменять размер и снова сбрасывать для временных рядов, только изменение размера и, наконец, самое главное, только 1 система нумерации баров. Для тех функций Metaquotes, которые настаивают на временных рядах, я делаю обратную индексацию при вызове.
Привет , CapeCoddah, В моем случае я обычно использую массивы в виде временных рядов для работы с ценовыми данными или индикаторами, в основном для удобства и по привычке. Однако я понимаю, что это не всегда лучшая причина для их использования. Для индикаторов зачастую практичнее работать с массивами, основанными на нулях, поскольку они упрощают управление индексами и снижают необходимость в постоянной повторной инициализации или изменении размера. В моем случае при программировании индикатора блоков ордеров я решил использовать временные ряды, потому что именно так я изначально структурировал получение блоков ордеров.
Здравствуйте, я только что скачал ваш исходник, версия 1, скомпилировал и применил к графику EURUSD H4, но ничего не появилось. Я зашел в панель свойств, ничего не менял, закрыл и появился png. Только зеленые полосы, никаких красных, и когда они начинаются, они не заканчиваются. Есть предложения?Я скачал Part2 из обсуждения выше, и там были в целом те же проблемы, но с тремя более новыми. Проблемы старт-стоп-зеленый-красный были очевидны. Кроме того, похоже, были разные критерии, так как количество полос не совсем совпадает. Кроме того, я попытался изменить зеленый цвет на clrLime, и он изменился, но точно не Lime.
Кроме того, как вы делаете анимацию. Вы используете тестер стратегий? Я спрашиваю, потому что не могу заставить тестер стратегий правильно отображаться на экране при тестировании советника в визуальном режиме или при тестировании индикатора.Что касается первой проблемы, я думаю, это может быть связано с тем, что индикатор неправильно загружает данные. Обычно это происходит при смене графика или открытии нового. Однако если речь идет о графике, который уже использовался, стоит разобраться, почему не получаются блоки ордеров. В этом случае было бы полезно включить в код отладочные (Print) сообщения, чтобы выявить проблему.
Что касается второй проблемы, когда рисуются только бычьи блоки ордеров, то это может быть связано с тем, что пара EURUSD на таймфрейме H4 в настоящее время находится на максимумах 600-700 свечей. В этом контексте возможно, что все медвежьи блоки ордеров были смягчены, поэтому они и не отображаются на графике.
Что касается изменения критериев, я уменьшил некоторые булевы переменные в коде. Тем не менее, при необходимости не составит труда снова ввести эти условия.
Что касается цветов, то в последней версии, которую я выложил в комментариях, к цветам прямоугольников блока ордеров применяется прозрачность. Возможно, именно поэтому цвета визуально не совпадают с цветами предыдущих версий. Наконец, что касается анимации, я не совсем понял, что вы имеете в виду. Не могли бы вы подробнее объяснить, что вы имеете в виду под анимацией в данном контексте?
Привет , CapeCoddah, В моем случае я обычно использую массивы в виде временных рядов для работы с ценовыми данными или индикаторами, в основном для удобства и по привычке. Однако я понимаю, что это не всегда лучшая причина для их использования. Для индикаторов зачастую практичнее работать с массивами, основанными на нулях, поскольку они упрощают управление индексами и снижают необходимость в постоянной повторной инициализации или изменении размера. В моем случае при программировании индикатора блоков ордеров я решил использовать временные ряды, потому что именно так я изначально структурировал получение блоков ордеров.
Когда я изменял размеры массивов в MQ4, я обнаружил, что нужно установить временные ряды для массива в false, изменить размер и сбросить временные ряды в true. Поскольку я не использую это в MQ5, я не знаю, уместно ли это по-прежнему.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Разработка передовых торговых систем (ПТС): Реализация Order Blocks в индикаторе:
В этой статье мы узнаем, как создать индикатор, который обнаруживает, рисует и предупреждает о смягчении ордер-блоков (ОВ). Также мы подробно рассмотрим, как идентифицировать эти блоки на графике, устанавливать точные предупреждения и визуализировать их положение с помощью прямоугольников, чтобы лучше понять поведение цены. Данный индикатор станет ключевым инструментом для тех, кто следует концепциям Smart Money Concepts и методологии Inner Circle Trader.
Ордер-блоки, как следует из названия, представляют собой области на графике, где ордера ожидают активации.
Обычно это происходит, когда крупный участник рынка, например финансовое учреждение, хочет войти в рынок со значительной позицией, но ликвидности не хватает для исполнения всего ордера без передвижения рынка. Согласно основному закону спроса и предложения, когда мы исполняем часть своего ордера, цена растет очень быстро (в случае покупок) в поисках продавцов, заинтересованных в предложении ликвидности для завершения сделки.
Поскольку крупный участник не может исполнить весь свой ордер сразу, не вызвав значительного движения цены, он распределяет свои ордера на более мелкие. Таким образом, можно завершить сделку без резкого движения цены до того, как мы закончим позиционирование.
Исходя из данной концепции, мы можем определить эти области на графике, поскольку они являются местами, где возник сильный дисбаланс между спросом и предложением (либо покупкой, либо продажей). Далее мы рассмотрим три способа определения этих областей и как реализовать их в коде.
Автор: Niquel Mendoza