Почему исчезают пользовательские индикаторы?

 
Присоедияняю пользовательский индикатор к графику. Все отлично работает на различных интервалах времени. Потом, обычно при выборе другого периода графика просто исчезает кривая индикатора с графика, хотя в закладке "список индикаторов" этого графика исчезнувший индикатор присутствует. В журнале и логах никаких сообщений об ошибках нет.
Почему такое может случаться???
 
например, пересчитанные значения оказались за пределами видимости графика. недавно разбирал один такой кастом-индикатор. проблема оказалась в том, что стояла проверка if (prevtime==Time[0])...
 
Если можно поподробнее,
1.-чем определяются пределы видимости графика(количеством баров или временными рамками..???)
2. Почему условие if (prevtime==Time[0]) некорректно -(запрашиваемое значение оператора или переменной не существует на каком либо баре???.. )
 
1. пределы видимости графика определяются и начальным-конечным барами на странице(это и есть временные рамки), и диапазоном цен на странице.
2. это условие корректно до тех пор, пока Вы не проскроллитесь назад до упора и не получите новую порцию данных. Вам придёт ещё, скажем, 200 баров, а условие сработает так, как Вы и предполагаете. если Вы производите пересчёт индикатора только в начале каждого бара, то при подкачке следующей порции Вы получите смещение индикаторного массива как раз на эту порцию. это условие лучше ставить в экспертах, но не в индикаторах
 
if (prevtime==Time[0]) некорректно


Этого условия недостаточно. Надо проверять и общее кол-во баров на графике.

 if (prevtime==Time[0] && prevbars==Bars) 



а в кастом индикаторах можно и более чистый вариант использовать:

int cbars=IndicatorCounted();
if(cbars<1) { // были структурные изменения в истории графика, надо все с начала 
              // пересчитать



IndicatorCounted() специально введен чтобы гарантированно распознавать серьезные изменения
в истории графика (например: после подкачки, после импорта или любых изменений в History Center).

 
..А что если IndicatorCounted()==0 это означает, что были серьезные структурные изменения в графике??
-с вариантом <0 вроде разобрались в "Борьба с неграмотностью!!!"
(вот цитата из ответа:
1. если возвращаемое значение меньше 0, то это либо катастрофа, либо переполнение счётчика баров (более 2 миллиардов - какое там максимальное целое положительное число?)
это условие тянется из первых наработок. считайте этот атавизм паранойей и спокойно убирайте это условие. )

Вот фрагмент кода индикатора:
int start()
{
datetime DayTime[];
double DayLowes[],DayHighes[];
int limit;
int k=0;
int counted_bars=IndicatorCounted();
ArrayCopySeries(DayTime,MODE_TIME,Symbol(),PERIOD_D1);
ArrayCopySeries(DayLowes,MODE_LOW,Symbol(),PERIOD_D1);
ArrayCopySeries(DayHighes,MODE_HIGH,Symbol(),PERIOD_D1);
//---- check for possible errors
if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
//---- midle counted
for(int i=0; i<limit; i++)
{if(Time[i]<DayTime[k]) k++;
int j=k+1;
ind_buffer[i]=(DayLowes[j]+DayHighes[j])/2;}

return(0);
}

Скажите почему индикатор может пропадать после смены периода графика, и акурат появляться заново после выбора периода графика D1 ???
 
Неужели все знатоки MQL умывают руки?

Вся фишка в том что на убогом языке Метастока этот индикатор пишется в две строчки -и при этом все работает недвусмысленно однозначно;
А здесь приходиться развозить все на страницу- все по взрослому: описание переменных, циклы, массивы, -класно вопросов нет!! Вот если бы еще также стабильно работало ..
 
много раз уже говорили, если хотите, чтобы Вам кто-то помог, оформите ПОЖАЛУЙСТА исходный текст должным образом! в тегах pre
 
Дубль два

..А что если IndicatorCounted()==0 это означает, что были серьезные структурные изменения в графике??
-с вариантом <0 вроде разобрались в "Борьба с неграмотностью!!!"
(вот цитата из ответа:
1. если возвращаемое значение меньше 0, то это либо катастрофа, либо переполнение счётчика баров (более 2 миллиардов - какое там максимальное целое положительное число?)
это условие тянется из первых наработок. считайте этот атавизм паранойей и спокойно убирайте это условие. )


Вот фрагмент кода индикатора:

int start()
{
datetime DayTime[];
double DayLowes[],DayHighes[];
int limit;
int k=0;
int counted_bars=IndicatorCounted();
ArrayCopySeries(DayTime,MODE_TIME,Symbol(),PERIOD_D1);
ArrayCopySeries(DayLowes,MODE_LOW,Symbol(),PERIOD_D1);
ArrayCopySeries(DayHighes,MODE_HIGH,Symbol(),PERIOD_D1);
//---- check for possible errors
if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
//---- midle counted
for(int i=0; i<limit; i++)
{if(Time[i]<DayTime[k]) k++;
int j=k+1;
ind_buffer[i]=(DayLowes[j]+DayHighes[j])/2;}

return(0);
}



Скажите почему индикатор может пропадать после смены периода графика, и акурат появляться заново после выбора периода графика D1 ???

 
Дубль два


Просьба вставлять оригинал кода, а не его урезанную и отформатированную копию.
Ситуация очень проста: если хотите чтобы Вам помогли, сделайте все так, чтобы желающий
помочь не тратил время на разбор искореженного кода. Это правило работает в любой области.
 
Вопросов нет.

Индикатор серидины цены предыдущего дня:

//+------------------------------------------------------------------+
//|                                                        Midday.mq4 |
//|                                Copyright © 2004, .co. |
//|                                     http://                             |
//+------------------------------------------------------------------+
#property  copyright "Copyright © 2004, .co ."
#property  link      "http://                                      "
//---- indicator settings
#property  indicator_chart_window
#property  indicator_buffers 1
#property  indicator_color1  Violet
//---- indicator parameters

//---- indicator buffers
double     ind_buffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init(string Midday="H1")
  {
//---- 2 additional buffers are used for counting.
   IndicatorBuffers(3);
//---- drawing settings
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1);
   SetIndexDrawBegin(0,0);
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+0);
//---- 1 indicator buffers mapping
   if(!SetIndexBuffer(0,ind_buffer))
      Print("cannot set indicator buffers!");
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("Midday("+Midday+")");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Midday function                                                   |
//+------------------------------------------------------------------+
int start()
  {
   datetime DayTime[];
   double DayLowes[],DayHighes[];
   int limit;
   int k=0;
   int counted_bars=IndicatorCounted();
   ArrayCopySeries(DayTime,MODE_TIME,Symbol(),PERIOD_D1);
   ArrayCopySeries(DayLowes,MODE_LOW,Symbol(),PERIOD_D1);
   ArrayCopySeries(DayHighes,MODE_HIGH,Symbol(),PERIOD_D1);
//---- check for possible errors
   if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//---- Midday counted 
   for(int i=0; i<limit; i++)
      {if(Time[i]<DayTime[k]) k++;
      int j=k+1;
      ind_buffer[i]=(DayLowes[j]+DayHighes[j])/2;}

   return(0);
  }
//+------------------------------------------------------------------+