Обновление платформы MetaTrader 4 build 670: виртуальный хостинг, web-запросы и работа с сигналами из MQL-программ - страница 38

 
Renat:
Переходите на МТ5, где и спреды есть и история детальная и тестер на голову выше МТ4.
Ну это понятно, вопрос был немного в другом... Место-то для чего-то зарезервировано...
 
Если в индикаторе в OnCalculate осуществляется return(0), то это не означает, что при следующем вызове значение prev_calculated должно равняться нулю? Я полагал, что означает.
 
Для того, чтобы программно запросить и получить данные индикатора на нестандартном таймфрейме, недостаточно иметь сформированный (и обновляемый в реальном режиме) файл истории, необходимо ещё и открыть автономный график. Это серьёзно ограничивает возможности разработки без использования dll.
 
Y.A.K._:
Для того, чтобы программно запросить и получить данные индикатора на нестандартном таймфрейме, недостаточно иметь сформированный (и обновляемый в реальном режиме) файл истории, необходимо ещё и открыть автономный график. Это серьёзно ограничивает возможности разработки без использования dll.
Мне это тоже не нравится.
 

Прошу объяснить, я неправильно понимаю, или это неточное описание, или это баг в текущей версии:

Функции обработки событий

Необходимо отметить связь между значением, возвращаемым функцией OnCalculate() и вторым входным параметром prev_calculated. Параметр prev_calculated при вызове функции содержит значение, которое вернула функция OnCalculate() на предыдущем вызове. Это позволяет реализовать экономные алгоритмы расчета пользовательского индикатора с тем, чтобы избежать повторных расчетов для тех баров, которые не изменились с предыдущего запуска этой функции.

Для этого обычно достаточно вернуть значение параметра rates_total, которое содержит количество баров при текущем вызове функции. Если с момента последнего вызова функции OnCalculate() ценовые данные были изменены (подкачана более глубокая история или были заполнены пропуски истории), то значение входного параметра prev_calculated будет установлено в нулевое значение самим терминалом.

Код:

#property strict
#define __VERSION__ "0.001"
#property version  __VERSION__
#property description "Индикатор исследует динамику изменения значения переменной prev_calculated"
#property description "29.08.2014"
#property indicator_chart_window

int I;

int OnInit()
{
   I=0;
   return(INIT_SUCCEEDED);
}

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[])
{
   if (I<5)
   {
      I++;
      return(0);
   }
   return(rates_total);
}

Скрины:

1.

2.

 

провозился кучу времени, пытаясь понять почему у меня не работает ObjectGetValueByTime.

оказывается в справке указано неверное число параметров. три вместо четырёх. https://docs.mql4.com/ru/objects/objectgetvaluebytime

как это достало... 

 
Y.A.K._:

Прошу объяснить, я неправильно понимаю, или это неточное описание, или это баг в текущей версии:

Функции обработки событий

Код:

#property strict
#define __VERSION__ "0.001"
#property version  __VERSION__
#property description "Индикатор исследует динамику изменения значения переменной prev_calculated"
#property description "29.08.2014"
#property indicator_chart_window

int I;

int OnInit()
{
   I=0;
   return(INIT_SUCCEEDED);
}

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[])
{
   if (I<5)
   {
      I++;
      return(0);
   }
   return(rates_total);
}



неправильное понимание для чего нужно rates_total
 
evillive:

неправильное понимание для чего нужно rates_total

Безаппеляционно.

Если бы prev_calculated действительно возвращал результат OnCalculate  на предыдущем вызове, то не было бы необходимости вводить ещё одну переменную, чтобы знать, что рассчёт на предыдущем вызове не состоялся из-за неготовности необходимых данных.

 
Y.A.K._:

Безаппеляционно.

Если бы prev_calculated действительно возвращал результат OnCalculate  на предыдущем вызове, то не было бы необходимости вводить ещё одну переменную, чтобы знать, что рассчёт на предыдущем вызове не состоялся из-за неготовности необходимых данных.

prev_calculated как раз правильно работает, а вот rates_total из-за return(0); - не обновляется. И где здась баг?
 

Первый параметр rates_total содержит количество баров, доступных индикатору для расчета, и соответствует количеству баров, доступных на графике.

Боюсь, мы с Вами не договоримся.

В общем-то я решил свою локальную задачу, тем не менее остаюсь при своём мнении, что фраза в справке

Параметр prev_calculated при вызове функции содержит значение, которое вернула функция OnCalculate() на предыдущем вызове.

не соответствует действительности.