Простите, если кого-то дернул не по делу :(
Такой код в секции инициализации решает проблему с вертикальными линиями. Но не решает проблему с исчезновением линий индикатора после перезапуска метатрейдера и прокручивания графика.
int bars = iBars(_Symbol, PERIOD_CURRENT); PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,bars); PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,bars); PlotIndexSetInteger(4,PLOT_DRAW_BEGIN,bars); PlotIndexSetInteger(5,PLOT_DRAW_BEGIN,bars);
Почему-то при перезапуске снова вызывается onCalculate с prev_calculated=0. Значение моей глобальной переменной удваивается!!! Иногда утраивается. Иногда не сразу! Закономерности понять не смог. Пипец.
Специально глобальной её сделал, чтобы при новом вызове onCalculate старое значения использовать, а тут такая подстава!
Ээээээх, затянется моё написание программы на несколько недель. А ведь сегодня планировал дописать...
Пожалуйста не проигнорируйте, если кто знает - скажите, что сделать, чтоб такого ***ца не было. Спасибо!!!
#property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property indicator_chart_window int count = 0; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ 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(prev_calculated==0) count+=1000; else count++; printf(count); //--- return value of prev_calculated for next call return(rates_total); }
1. Обязательно читать справку OnCalculate и особенно
Примечание
***
Если с момента последнего вызова функции OnCalculate() ценовые данные были изменены (была загружена более глубокая история или были заполнены пропуски истории), то значение входного параметра prev_calculated будет установлено в нулевое значение самим терминалом.
***
Необходимо использовать связь между значением, возвращаемым функцией OnCalculate(), и вторым входным параметром prev_calculated. Параметр prev_calculated при вызове функции содержит значение, которое вернула функция OnCalculate() на предыдущем вызове. Это позволяет реализовать экономные алгоритмы расчета пользовательского индикатора с тем, чтобы избежать повторных расчетов для тех баров, которые не изменились с предыдущего запуска этой функции.
2. Помнить, что нет никакого строгого правила вроде: "при запуске OnCalculate должно вызываться один (два, три) раза". Почему? Потому что смотреть п.1.
Лучший вариант для закрепления материала: запустить пример (прикрепить вручную на график)
//+------------------------------------------------------------------+ //| Indicator 1.mq5 | //| Copyright 2021, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property indicator_chart_window #property indicator_buffers 0 #property indicator_plots 0 //--- input parameters input int Input1=9; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ 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[]) { //--- Print("rates_total: ",IntegerToString(rates_total),", prev_calculated: ",IntegerToString(prev_calculated)); //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
в торговый день и в выходной

- www.mql5.com
Есть какой-то способ узнать какие данные были загружены: время тиков, например?
На выходных проблема тоже была, значит данные могут загрузиться в любое время. Загрузка хотя бы одного нового тика в истории приводит к обнулению prev_calculated насколько я понял.
***
Есть какой-то способ узнать какие данные были загружены: время тиков, например?
***
Нет. Ибо индикатору это совсем не нужно.
***
На выходных проблема тоже была, значит данные могут загрузиться в любое время. Загрузка хотя бы одного нового тика в истории приводит к обнулению prev_calculated насколько я понял.
Нет и не бывает никаких проблем. Ничего Вы не поняли. Проблема возникает у тех, кто упорно не читает документацию и не запускает предложенные примеры. Читать пост выше п.1. и п.2.
Нет и не бывает никаких проблем. Ничего Вы не поняли. Проблема возникает у тех, кто упорно не читает документацию и не запускает предложенные примеры. Читать пост выше п.1. и п.2.
Зачем же вы так категоричны :(
Всегда в документацию обращаюсь, если что-то не понятно. Функция OnCaltulate - первая с которой я ознакомился перед тем как начать писать индикатор. Что показывает пример я понимаю.
На выходных новых тиков по валютной паре GBPJPY не поступает. RatesTotal вроде тоже не менялось (запущу на следующих выходных и проверю). Но при этом prev_calculated обнулилось при перезапуске. Отсюда я сделал вывод, что загрузились пропуски истории (возможно несколько тиков).
Зачем же вы так категоричны :(
Всегда в документацию обращаюсь, если что-то не понятно. Функция OnCaltulate - первая с которой я ознакомился перед тем как начать писать индикатор. Что показывает пример я понимаю.
На выходных новых тиков по валютной паре GBPJPY не поступает. RatesTotal вроде тоже не менялось (запущу на следующих выходных и проверю). Но при этом prev_calculated обнулилось при перезапуске. Отсюда я сделал вывод, что загрузились пропуски истории (возможно несколько тиков).
Естественное поведение: при первом запуске или при подкачке истории prev_calculated равно нулю. Это нормальное и правильное поведение индикатора. При этом может подряд идти несколько входов в OnCalculate и при этом prev_calculated будет равно нулю.
Для индикатора не Важно какие Вы делаете выводы - в индикаторе главное экономично рассчитывать нулевой бар или же выполнить пересчет всего индикатора при prev_calculated равным 0.
Очень часто применяемая конструкция:
int limit=prev_calculated-1; if(prev_calculated==0) limit=0; for(int i=limit; i<rates_total; i++) { }

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Создаю индикатор под бинарные опционы.
В нём планирую сделать 2 ленты боллинджера с периодом 20 и 100 соответственно. Ещё стохастик. Расчёт угла между импульсом и скользящей средней. И ещё несколько параметров.
Пишу под себя с нуля, сделал расчёт 2 скользящих средних и появились какие-то глюки.
Код прикладываю, помогите пожалуйста. Не знаю, я накосячил (код небольшой) или это глюки терминала?