Зачем из MQL убрали стандартные функции? - страница 2

 
gdtt:

Этого недостаточно.

этот вариант в большинстве случаев подойдет

Спасибо помогает, но только со второй попытки почему-то, т.е. при запуске получение котировки всё-таки не гарантированно, но это уже результат - спасибо.

Не удалось синхронизировать серии для GBPUSD таймфрейм 16408 число попыток 100
 
double iCloseMQL4(string symbol,int tf,int index){
   if(index < 0) return(-1);
   double Arr[];
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   BarsSinh(symbol,timeframe);
   if(CopyClose(symbol,timeframe, index, 1, Arr)>0) return(Arr[0]);
   else {Print ("Ошибка Copy");return(-1);}
}
Т.е. я вашу функцию вставил, а ей  нужно время на исполнение наверно.
 
zfs:

Спасибо помогает, но только со второй попытки почему-то, т.е. при запуске получение котировки всё-таки не гарантированно, но это уже результат - спасибо.

Если вы в блоке инициализации пытаетесь получить данные (в том числе рассчитать индикаторы) я рекомендую вставить "засыпание" на несколько секунд.

если все правильно рассчитать работу это не сильно затормозит, а имеющие данные загрузиться в память успеют.

 
Interesting:

Если вы в блоке инициализации пытаетесь получить данные (в том числе рассчитать индикаторы) я рекомендую вставить "засыпание" на несколько секунд.

если все правильно рассчитать работу это не сильно затормозит, а имеющие данные загрузиться в память успеют.

В индикаторах это не действует:

Примечание:

Функцию Sleep() нельзя вызывать из пользовательских индикаторов, так как индикаторы выполняются в интерфейсном потоке и не должны его тормозить. В функцию встроена проверка состояния флага остановки эксперта каждую 0.1 секунды. 

Если в блоке инициализации что-то не получилось ничего страшного, можно попробовать ещё на следующем тике или временном интервале.
 
Не ждите в ините, а используйте отложенную инициализацию.

То есть, в онтике или онкалкулейте проверяйте флаг полной инициализации и не занимайтесь работой, пока не проверите наличие всех данных. Нет данных, выходите из расчетов до следующего вызова.

Это же элементарно.
 
Renat:
Не ждите в ините, а используйте отложенную инициализацию.

То есть, в онтике или онкалкулейте проверяйте флаг полной инициализации и не занимайтесь работой, пока не проверите наличие всех данных. Нет данных, выходите из расчетов до следующего вызова.

Это же элементарно.

Элементарно было в Четверке, когда были встроенные функции прекрасно работавшие и занимающие не более строчки. Сейчас же целую программу написали)

Зациклил просто эту функцию в ините и получился результат со второго раза - наверно это тоже отложенная инициализация.

Наверно стоит что-то подправить в этой функции синхронизации, раз 100 попыток всегда безуспешны, а 101 даёт результат.

Всем спасибо.

 
Вы что-то путаете. В четверке данные из ниоткуда никто не выдает, поведение такое же.
 
iClose(NULL,1440,1) 

Получаю в четверке значение всегда, ни одного сбоя не видел

double CloseD1;

int OnInit()
{
  CloseD1=iCloseMQL4(_Symbol,1440,1);
}

double iCloseMQL4(string symbol,int tf,int index){
   if(index < 0) return(-1);
   double Arr[];
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   BarsSinh(symbol,timeframe);
   if(CopyClose(symbol,timeframe, index, 1, Arr)>0) return(Arr[0]);
   else {Print ("Ошибка Copy");return(-1);}
}

ENUM_TIMEFRAMES TFMigrate(int tf){
   switch(tf)
     {
      case 0: return(PERIOD_CURRENT);
      case 1: return(PERIOD_M1);
      case 5: return(PERIOD_M5);
      case 15: return(PERIOD_M15);
      case 30: return(PERIOD_M30);
      case 60: return(PERIOD_H1);
      case 240: return(PERIOD_H4);
      case 1440: return(PERIOD_D1);
      case 10080: return(PERIOD_W1);
      case 43200: return(PERIOD_MN1);
      
      case 2: return(PERIOD_M2);
      case 3: return(PERIOD_M3);
      case 4: return(PERIOD_M4);      
      case 6: return(PERIOD_M6);
      case 10: return(PERIOD_M10);
      case 12: return(PERIOD_M12);
      case 16385: return(PERIOD_H1);
      case 16386: return(PERIOD_H2);
      case 16387: return(PERIOD_H3);
      case 16388: return(PERIOD_H4);
      case 16390: return(PERIOD_H6);
      case 16392: return(PERIOD_H8);
      case 16396: return(PERIOD_H12);
      case 16408: return(PERIOD_D1);
      case 32769: return(PERIOD_W1);
      case 49153: return(PERIOD_MN1);      
      default: return(PERIOD_CURRENT);
     }}

//+------------------------------------------------------------------+
//| Аналог Bars(), не требует предварительной синхронизации истории  |
//| Вход  : symbol - символ в терминале                              |
//|         timeframe - таймфрейм                                    |
//| Выход : нет                                                      |
//| Прим. : нет                                                      |
//+------------------------------------------------------------------+
int BarsSinh( string symbol,ENUM_TIMEFRAMES  timeframe ){
  SynhronizeSeries( symbol,  timeframe );
  return( Bars( symbol, timeframe ));
}
//+------------------------------------------------------------------+
//| Произвести синхронизацию таймсерии с историей                    |
//| Вход  : symbol - символ в терминале                              |
//|         tf     - таймфрейм                                       |
//| Выход : нет                                                      |
//| Прим. : нет                                                      |
//+------------------------------------------------------------------+
bool SynhronizeSeries( string symbol, ENUM_TIMEFRAMES tf ){
  int fail_cnt=0;
  if( Bars(symbol, tf ) > 0 )return(true);
  while(!IsStopped() && fail_cnt <  100 ){
  //--- wait for timeseries build
    int fail2_cnt = 0;
    while(!SeriesInfoInteger(symbol,tf,SERIES_SYNCHRONIZED
/*SERIES_SYNCRONIZED*/) && !IsStopped()){
      fail2_cnt++;
      Sleep(5);
      if( fail2_cnt>1000)break;
      
    }
      //--- ask for built bars
    datetime times[1];
    if( Bars(symbol, tf ) > 0 )return(true);
    int copied=CopyTime(symbol,tf,0,1,times);
    if( copied <= 0){         //--- no more than 100 failed attempts
      fail_cnt++;
      Sleep(10);
    }
  }
  Print("Не удалось синхронизировать серии для "+symbol+" таймфрейм "+IntegerToString(tf) + " число попыток "+IntegerToString( fail_cnt) );
  //Print("Can not to sinhronize series for "+symbol+" timeframe "+SPeriod(tf) + " num of attemps "+IntegerToString( fail_cnt) );
  return(false);
}

void OnTimer(){

 CloseD1=iCloseMQL4(_Symbol,1440,1);//Print(CloseD1);


}
 
получаю иногда.
 
Выдает ошибка Сopy и не удается синхронизизировать таймфрейм число попыток 100. В чем моя ошибка?
Причина обращения: