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

 
revers45:

То есть предлагаете уже две истины:

1. МТ5 предназначен для круглосуточной или хотябы для ежедневной работы.
2. Перед программированием необходима ручная подготовка API.

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

Тролить будете в другом месте, дуболомам не собираюсь ничего объяснять.

Пришли спросили, не устраивает ответ, ищите сами.

 

Господа, неужели сложно запросить все что нужно, после неполучения результата на данном тике выйти из расчетов, чтобы на очередных тиках дождаться штатной подгрузки всех данных, получить все данные и продолжить работу?

Это же очень просто. Система работает правильно - любой запрос отсутствующих данных вызывает фоновую подгрузку и возвращает результат "пока нет запрошенных данных". Нужно просто выйти из расчетов и на следующем тике сделать новый запрос  и по получению данных продолжить расчеты.

 
Urain:... и не писать коды автогеном через жопу.
Так не делать, да?) В индикаторах тиков нет, есть калькуляции, значение не приходит даже через час, требуется инициализация чарта руками и после инициализация индикатора.
 
чтоб получить одну цифру)
 
о многовалютниках можно забыть)
 
у меня открыт часовик, я запрашиваю дневку, я на основании этого графика могу вычислить эту стоимость, а терминал нет
 
zfs:
... В индикаторах тиков нет, есть калькуляции, значение не приходит даже через час, требуется инициализация чарта руками и после инициализация индикатора.

Из справки:

Событие Calculate генерируется только для индикаторов сразу после посылки события Init и при любом изменении ценовых данных. Обрабатывается функцией OnCalculate. 

Выделенное красным это и есть тики, плюс всякие другие изменения.. 
 
В инструкции многое что написано, а тут факт налицо. Значение индикатора меняется, а эти данные не получить через тик, а только после двойной ручной инициализации.
 
zfs:
В инструкции многое что написано, а тут факт налицо. Значение индикатора меняется, а эти данные не получить через тик, а только после двойной ручной инициализации.

Никакой ручной инициализации не нужно. Ренат Вам уже дважды в этой ветке писал как нужно поступать.

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//--- получаем данные
   double Arr[1];
   if(CopyClose(symbol,timeframe,index,1, Arr)!=1) return(0);
   ... остальной код ...
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }

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

 
zfs:

Накатал такой скриптик

void OnStart()
  {
   Print(" === Start ===");
   datetime dt_start,dt_end;
   datetime dt_buf[];
   dt_start=TimeLocal();

   Print("Текущий ТФ");
   CopyTime(_Symbol,PERIOD_CURRENT,SERIES_SERVER_FIRSTDATE,dt_start,dt_buf);
   ArraySetAsSeries(dt_buf,true);
   Print("От "+dt_buf[0]);
   ArraySetAsSeries(dt_buf,false);
   Print("До "+dt_buf[0]);
   ArraySetAsSeries(dt_buf,true);
   Print("Элементов в массиве "+ArraySize(dt_buf));
   ArrayFree(dt_buf);
   dt_end=TimeLocal();
   Print("потратил "+TimeToString(dt_end-dt_start,TIME_SECONDS));

   Print("М1 ТФ");
   CopyTime(_Symbol,PERIOD_M1,SERIES_SERVER_FIRSTDATE,dt_start,dt_buf);
   ArraySetAsSeries(dt_buf,true);
   Print("От "+dt_buf[0]);
   ArraySetAsSeries(dt_buf,false);
   Print("До "+dt_buf[0]);
   ArraySetAsSeries(dt_buf,true);
   Print("Элементов в массиве "+ArraySize(dt_buf));
   ArrayFree(dt_buf);
   dt_end=TimeLocal();
   Print("потратил "+TimeToString(dt_end-dt_start,TIME_SECONDS)+" сек");

   Print("AUDNZD М1 ТФ");
   CopyTime("AUDNZD",PERIOD_M1,SERIES_SERVER_FIRSTDATE,dt_start,dt_buf);
   ArraySetAsSeries(dt_buf,true);
   Print("От "+dt_buf[0]);
   ArraySetAsSeries(dt_buf,false);
   Print("До "+dt_buf[0]);
   ArraySetAsSeries(dt_buf,true);
   Print("Элементов в массиве "+ArraySize(dt_buf));
   ArrayFree(dt_buf);
   dt_end=TimeLocal();
   Print("потратил "+TimeToString(dt_end-dt_start,TIME_SECONDS)+" сек");

   Print(" === Finish ===");
  }

От CopyTime 0 не дождался, дергает историю без всяких дополнительных синхронизаций.

Но. Если на текущем ТФ время редко до 2 сек доходит (первый запуск, потом на раз выдергивает), то на другом символе (любой символ вместо AUDNZD вписываем и смотрим) время достигало 14 сек. Загадывать такой запас слипом, чтобы дожидаться искусственной синхронизации... ну хз.

Все символы не проверял, и насколько будет быстрее, если открыть/закрыть чарт, тоже.

Однако, Urain прав - надо делать приблуду подготовки терминала.

Upd только если все символы дёрнуть по всем тф, боюсь, оперативки то и не хватит )

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