iCustom - первый вызов

 
Суть в следующем - в советнике через iCustom возвращаются  значение индикатора - цены сигнала на покупку (продажи) в буфере.
Задача: как отсечь "устаревший" по времени сигнал который вернул iCustom во время первого вызова, т.е. по историческим данным?
 

Вы ведь запрашиваете данные на каком-то конкретном баре. Значит уже в этот момент (еще до получения результата) нужно понимать, насколько актуальные данные будут получены. Таким образом, это не проблема iCustom, а проблема подхода к его использованию.

Если нужно получить данные по сформированному бару (индекс 1 и более), то достаточно определить факт наличия нового бара.

Если получить нужно данные по текущему бару (индекс 0), то решений достаточно много, в зависимости от того, какова сама стратегия.

Ну а универсальное решение  - запоминать время последнего полученного значения.

Обработчик события "новый бар"
Обработчик события "новый бар"
  • www.mql5.com
Язык программирования MQL5 позволяет решать задачи на совершенно новом уровне. Даже те задачи, которые уже вроде имеют решения, благодаря объектно-ориентированному программированию могут подняться на качественно новый уровень. В данной статье специально взят простой пример проверки появления нового бара на графике, который был преобразован в достаточно мощный и универсальный инструмент. Какой? Читайте в статье.
 
Ihor Herasko:

Вы ведь запрашиваете данные на каком-то конкретном баре. Значит уже в этот момент (еще до получения результата) нужно понимать, насколько актуальные данные будут получены. Таким образом, это не проблема iCustom, а проблема подхода к его использованию.

Если нужно получить данные по сформированному бару (индекс 1 и более), то достаточно определить факт наличия нового бара.

Если получить нужно данные по текущему бару (индекс 0), то решений достаточно много, в зависимости от того, какова сама стратегия.

Ну а универсальное решение  - запоминать время последнего полученного значения.

я всегда запрашиваю 0-й бар в iCustom. Но в буфере уже есть цена сигнала. И проблема в том, что я не знаю во сколько она появилась, тик назад или час. Справедливо только при инициализации советника

 
Peter Vorobyev:

я всегда запрашиваю 0-й бар в iCustom. Но в буфере уже есть цена сигнала. И проблема в том, что я не знаю во сколько она появилась, тик назад или час. Справедливо только при инициализации советника

Для начала, сравните iTime этого бара с TimeCurrent.

Дождитесь подгрузки истории.

И только потом смотрите индикаторы.

 
Andrey Khatimlianskii:

Для начала, сравните iTime этого бара с TimeCurrent.

Дождитесь подгрузки истории.

И только потом смотрите индикаторы.

вы не поняли сути проблемы.

 
Peter Vorobyev:

я всегда запрашиваю 0-й бар в iCustom. Но в буфере уже есть цена сигнала. И проблема в том, что я не знаю во сколько она появилась, тик назад или час. Справедливо только при инициализации советника

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

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

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

Алгоритм генерации тиков в тестере стратегий терминала MetaTrader 5
Алгоритм генерации тиков в тестере стратегий терминала MetaTrader 5
  • www.mql5.com
MetaTrader 5 позволяет во встроенном тестере стратегий моделировать автоматическую торговлю с помощью экспертов на языке MQL5. Такое моделирование называется тестированием экспертов, и может проводиться с использованием многопоточной оптимизации и одновременно по множеству инструментов. Для проведения тщательного тестирования требуется генерировать тики на основе имеющейся минутной истории. В статье дается подробное описание алгоритма, по которому генерируются тики для исторического тестирования в клиентском терминале MetaTrader 5.
 
Ihor Herasko:

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

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

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

Ну речь идет о стороннем индикаторе. Как раз второй вариант - рабочий 

вариант решения:

Объявляем две переменные для хранения цены сигнала

price1 - текущая цена

price2 - прошлая цена

Напомню время сигнала нам не известно.


При инициализации советника сохраняем признак инициализации и сохраняем первую цену сигнала сразу в обе переменные  price1 и  price2 

Сделка открывается при  price1 <> price2 . Произойдет это после получения цены нового сигнала

 
Peter Vorobyev:

вы не поняли сути проблемы.

Ага.

Тогда запоминайте время появления сигнала в другом буфере этого же индикатора.

Или к исходникам нет доступа?

 
Andrey Khatimlianskii:

Тогда запоминайте время появления сигнала в другом буфере этого же индикатора.

Нет, тоже не выйдет, это нужно держать запущенный индикатор все время.

Тогда вариант с тиками и моделированием, да. Делал что-то похожее когда-то.

 
Peter Vorobyev:
Суть в следующем - в советнике через iCustom возвращаются  значение индикатора - цены сигнала на покупку (продажи) в буфере.
Задача: как отсечь "устаревший" по времени сигнал который вернул iCustom во время первого вызова, т.е. по историческим данным?

запомнить предыдущее значение и работать только по сменившемуся предыдущему

тогда вообще будет не важно - первый или второй вызов

например

Ind=iCustom....

if( prevInd!=Ind )

{

работаем

}

prevInd=Ind;

Ну в OnInit вставим строчку

Ind=iCustom....

 
Peter Vorobyev:
Суть в следующем - в советнике через iCustom возвращаются  значение индикатора - цены сигнала на покупку (продажи) в буфере.
Задача: как отсечь "устаревший" по времени сигнал который вернул iCustom во время первого вызова, т.е. по историческим данным?

Очень просто. Первый вызов производится в функции OnInit()

И все!!!

Причина обращения: