Копирование данных для индикатора

 

Давно столкнулся с проблемой копирования данных. Сделал индикатор , работает, да вот только не всегда как хотелось бы идеально. Индикатор мультивалютный и потому необходимо копировать значение цен нескольких валютных пар. В тестере всё происходит замечательно. Но вот в реалтай возникают моменты когда неудаётся скопировать данные. Полистал справку и обратил внимание,  Если интервал запрашиваемых данных полностью находится вне доступных данных на сервере, то функция возвращает -1. В случае если запрашиваются данные за пределами TERMINAL_MAXBARS (максимальное количество баров на графике), функция также вернет -1.      Тоесть получается что копирование будет происходить нормально если график инструмента запущен и на графике есть доступная история. Решил попробовать, вставил в индикатор блок открытия чарта, после этого выполняю копирование и уже после этого удаляю график.  Запускаю индикатор всё отлично, быстро открываются а потом закрываются графики и расчёт происходит правильно и нормально. Тоесть с технической стороны вроде решение нашёл. Но есть некрасивые моменты. Так как графики открываются/закрываются програмно то визуально это происходит с затормаживанием и я бы сказал с подвисанием терминала. Начал думать дальше. Ок, есть объект чарт. По сути тотже график и можно его расположить так чтобы его и видно небыло координаты задать с минусом например. так вот интересно в таком варианте будет ли аналогия наличия истории как на графике?... просто если эффект будет аналогичный то объекты можно и не удалять пока индикатор работает. Кто как справляется с подобными моментами , расскажите посоветуйте.

 
OnTimer() вам в помощь. Запускать копирование до тех пор пока не загрузится. По крайней мере другово я не нашел
 
Evgeny Raspaev:
OnTimer() вам в помощь. Запускать копирование до тех пор пока не загрузится. По крайней мере другово я не нашел

100 циклов не помогало

int c=0;
      while(c!=100)
        {
         SymClose[i].Inity(framme);
         c=CopyClose(Symbols[i],TF,1,framme+1,SymClose[i].close);
         if(c==framme+1) break;
         c++;
         //if( c<(framme+1)) Print("не удалось скопировать (((( символ "+Symbols[i]);  
        }

, правда не в таймере, а просто в цикле. задержку в индюке нельзя сделать а с таймером не научился пользоваться, может подскажешь простейший пример?

 
Anatolii
int OnInit()
  {
      if(Corekt()==false)
        {
         Print("Tried to sync");
         EventSetTimer(1);
        }
      if(Corekt()==true)
        {
         Print("Successful synchronization");
        }

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(Corekt()==true)
     {
     Print("Successful Synronization");
     EventKillTimer();
     }
   Print("Tried to sync");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Corekt()
  {
   double aver[];
   int Hendel=iMA(Symbol(),Period(),5,0,MODE_EMA,PRICE_CLOSE);
   int CountAver1=CopyBuffer(Hendel,0,0,5000,aver[]);
   if(CountAver1<=0)
     {
      Print("download history ",Symbol());
      return(false);
     }
     
   return(true);
  }
 
Evgeny Raspaev:


спасибо за пример, попробую может шустрее и без проблем получится.

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