Если в индикаторе в 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
Если бы prev_calculated действительно возвращал результат OnCalculate на предыдущем вызове, то не было бы необходимости вводить ещё одну переменную, чтобы знать, что рассчёт на предыдущем вызове не состоялся из-за неготовности необходимых данных.
Если бы prev_calculated действительно возвращал результат OnCalculate на предыдущем вызове, то не было бы необходимости вводить ещё одну переменную, чтобы знать, что рассчёт на предыдущем вызове не состоялся из-за неготовности необходимых данных.
prev_calculated как раз правильно работает, а вот rates_total из-за return(0); - не обновляется. И где здась баг?
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Переходите на МТ5, где и спреды есть и история детальная и тестер на голову выше МТ4.
Для того, чтобы программно запросить и получить данные индикатора на нестандартном таймфрейме, недостаточно иметь сформированный (и обновляемый в реальном режиме) файл истории, необходимо ещё и открыть автономный график. Это серьёзно ограничивает возможности разработки без использования 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
как это достало...
Прошу объяснить, я неправильно понимаю, или это неточное описание, или это баг в текущей версии:
Функции обработки событий
Код:
#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
неправильное понимание для чего нужно rates_total
Безаппеляционно.
Если бы prev_calculated действительно возвращал результат OnCalculate на предыдущем вызове, то не было бы необходимости вводить ещё одну переменную, чтобы знать, что рассчёт на предыдущем вызове не состоялся из-за неготовности необходимых данных.
Безаппеляционно.
Если бы prev_calculated действительно возвращал результат OnCalculate на предыдущем вызове, то не было бы необходимости вводить ещё одну переменную, чтобы знать, что рассчёт на предыдущем вызове не состоялся из-за неготовности необходимых данных.
Первый параметр rates_total содержит количество баров, доступных индикатору для расчета, и соответствует количеству баров, доступных на графике.
Боюсь, мы с Вами не договоримся.
В общем-то я решил свою локальную задачу, тем не менее остаюсь при своём мнении, что фраза в справке
Параметр prev_calculated при вызове функции содержит значение, которое вернула функция OnCalculate() на предыдущем вызове.
не соответствует действительности.