Индикатор рисовальщик иногда дает сбой

 
Всем добрых суток. Сегодня взялся за изучение MQL4, и решил написать индикатор, который рисует вертикальную линию на той свече, которая соответствует переходу OsMA через 0.
Но почему то он иногда дает сбой и рисует на той свече, где пересечение 0 не состоялось, не могу понять где я ошибся, помогите.
//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
extern color BoxColor=Red;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
   return(0);
//---
   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[])
  {
//---
      int limit;
   int counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars-- ;
   limit=Bars-counted_bars;
   for(int i=0; i<limit; i++)
      if((iOsMA(NULL,0,12,26,9,PRICE_CLOSE,i+1) > 0 && iOsMA(NULL,0,12,26,9,PRICE_CLOSE,i) < 0) || 
      (iOsMA(NULL,0,12,26,9,PRICE_CLOSE,i) > 0 && iOsMA(NULL,0,12,26,9,PRICE_CLOSE,i+1) < 0))
      {
         string name="inBar"+TimeToStr(Time[i]);
         ObjectDelete(name);
         ObjectCreate(name,OBJ_VLINE,0,Time[i],0);
         //ObjectSet(name,OBJPROP_BACK,true);
         //ObjectSet(name,OBJPROP_COLOR,BoxColor);
      }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Файлы:
5.PNG  37 kb
xvwgut.PNG  44 kb
 

Случайно не походу работы (пока стоял на графике) начал рисовать? 

Если на нулевой, не сформированной свече будет выполнено это условие перехода, он нарисует линию. НО удалить он ее сможет только если условие будет опять выполняться, т.е. если условие уже перестало выполняться - линия останется. 

И посмотрите что вместо IndicatorCounted(), Bars, Time[i] ->  есть prev_calculated, rates_total, time[]. Не нужно находить то что и так передается в функцию.

 
Galina Bobro:

Случайно не походу работы (пока стоял на графике) начал рисовать? 

Если на нулевой, не сформированной свече будет выполнено это условие перехода, он нарисует линию. НО удалить он ее сможет только если условие будет опять выполняться, т.е. если условие уже перестало выполняться - линия останется. 

И посмотрите что вместо IndicatorCounted(), Bars, Time[i] ->  есть prev_calculated, rates_total, time[]. Не нужно находить то что и так передается в функцию.


да, в условии добавил к смещению +1 и все прекратилось, спасибо
А насчет функций не понял, где про них прочитать? В справке поиска нет

 
RomanRott:


А насчет функций не понял, где про них прочитать? В справке поиска нет

Вверху сайта есть поиск. Функция с вашего кода. 

Вот описание в документации - ссылка

//+------------------------------------------------------------------+
//| 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[])
  {

----------------------

И ошибка не в смещении, а в условии - нужно удалять если условие не выполнено, а создавать линию только если выполнено условие. Т.е. ObjectDelete должен быть не в условии, а else

 
Galina Bobro:

Вверху сайта есть поиск. Функция с вашего кода. 

Вот описание в документации - ссылка

----------------------

И ошибка не в смещении, а в условии - нужно удалять если условие не выполнено, а создавать линию только если выполнено условие. Т.е. ObjectDelete должен быть не в условии, а else


Хм, когда перенес в else ObjectDelete(name) компилятор начал ругаться на то, что name не определена, она ведь в if'е определяется, а условие может быть не выполнено и удалять нечего

 
RomanRott:

Хм, когда перенес в else ObjectDelete(name) компилятор начал ругаться на то, что name не определена, она ведь в if'е определяется, а условие может быть не выполнено и удалять нечего


о, Боги... ну не диктовать же вам каждую строчку что писать в коде. Вы же кажется изучать хотели, могли бы уже знать(или узнать) что делать если объявление переменной не там. 

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

 

И начнем с того, что если работать со сдвигом (не брать нулевой бар), то удаление вообще бесполезное

 
Galina Bobro:

о, Боги... ну не диктовать же вам каждую строчку что писать в коде. Вы же кажется изучать хотели, могли бы уже знать(или узнать) что делать если объявление переменной не там. 

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


А проверять получается через ObjectFind или как?

 
RomanRott:

А проверять получается через ObjectFind или как?

Да, через него. 

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