Вопрос к разработчикам МТ. Глюк или я чего-то не понимаю?

 

Что-то раньше писал программы и не замечал, как и многие, очевидного.

Первый момент.

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

Написал небольшой скрипт по выбору времени нулевого бара всех таймсерий по одному символу.

#property copyright "Dmitry Sumsky"
#property link      "Skype:dmitry-maxi"
#property version   "1.00"
#property strict
#property script_show_inputs

input    string      _symbol     =  "";         // Symbol (если пусто, то текущий)
string   symbol;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
//---
   RefreshRates();
   symbol=(_symbol==""?_Symbol:_symbol); 
   Comment("0 бар по символу ",symbol,
      "\n","M1 = ",TimeToString(iTime(symbol,PERIOD_M1,0)),sTimeFile(PERIOD_M1),
      "\n","M5 = ",TimeToString(iTime(symbol,PERIOD_M5,0)),sTimeFile(PERIOD_M5),
      "\n","M15 = ",TimeToString(iTime(symbol,PERIOD_M15,0)),sTimeFile(PERIOD_M15),
      "\n","M30 = ",TimeToString(iTime(symbol,PERIOD_M30,0)),sTimeFile(PERIOD_M30),
      "\n","H1 = ",TimeToString(iTime(symbol,PERIOD_H1,0)),sTimeFile(PERIOD_H1),
      "\n","H4 = ",TimeToString(iTime(symbol,PERIOD_H4,0)),sTimeFile(PERIOD_H4),
      "\n","D1 = ",TimeToString(iTime(symbol,PERIOD_D1,0)),sTimeFile(PERIOD_D1),
      "\n","W1 = ",TimeToString(iTime(symbol,PERIOD_W1,0)),sTimeFile(PERIOD_W1),
      "\n","MN1 = ",TimeToString(iTime(symbol,PERIOD_MN1,0)),sTimeFile(PERIOD_MN1));
   return;
}
//+------------------------------------------------------------------+
string sTimeFile(ENUM_TIMEFRAMES TF)
{
   string text; int handle;
   handle=FileOpenHistory(symbol+(string)TF+".hst",FILE_BIN|FILE_READ|FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_ANSI);
   if(handle<0) return("  Ошибка работы с файлом "+(string)GetLastError());
   text="  Файл создан "+TimeToString((datetime)FileGetInteger(handle,FILE_CREATE_DATE),TIME_DATE|TIME_SECONDS)
       +"  обновлен "+TimeToString((datetime)FileGetInteger(handle,FILE_MODIFY_DATE),TIME_DATE|TIME_SECONDS);
   FileClose(handle);
   return(text);
}

Можете сами попробовать.

При первом запуске видим просто хрень в комментарии. Первый запуск

При втором все нормализовалось второй запуск скрипта

Если файла какого-то ТФ не было на момент первого запуска скрипта, то он может и появится, а может и нет. Следовательно и последующие запросы значений будут кривые, пока терминал не соизволит записать эту таймсерию...

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

Это так и должно работать???

Второй момент.

Заметил, что OnTimer() бывает запустится, а бывает и нет.

Записал туда простую функцию вывода в комментарий локального времени компьютера

Переключил ТФ и часики пропали и не появляются, переключил снова - могут появиться, а могут и нет.

Запуск таймера в OnInit() стоит на 1 сек. В OnDeinit() пробовал и ставить (как по умолчанию) удаление таймера и удалял эту функцию - не помогает...

Это тоже нормально???

 

История тех ТФ, по которым не открыты графики, терминалом не поддерживаются в автоматическом режиме. Они могут быть закачаны по запросу. Для этого нужно обратиться к нужному ТФ/символу при помощи любой из функций "i" и ждать, пока история не появится. Правда, сколько ждать, никому не известно, т. к. функций прямого контроля готовности данных не существует. Для себя сделал такой костыль:

bool IsTFDataReady(const string strSymbol, const ENUM_TIMEFRAMES eTF)
{
   ResetLastError();
   iTime(strSymbol, eTF, 1);
   return GetLastError() == ERR_NO_ERROR;
}

Он в большинстве случаев работает, но не гарантирует 100% правильности контроля.

 

А что делать с OnTimer?

Как заставить его работать, если он по каким-либо причинам не запустился, да и как программно проверить, что он не работает, чтобы его запустить повторно, если советник стоит на офф-лайновом графике без тиков или на валютной паре, на которой перестали по каким-либо причинам (выходной или пара USDRUR ночью), тики?

 

И, вообще, почему надо изобретать какие-то костыли, если это могут сделать сами разработчики МТ?

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

Например, сделать отдельную функцию по запросу значения таймсерии и добавить в функции "i..." iTime(string symbol,int period,int shift,bool НовыеДанные=false). Если false, то по старому. Если true, то сначала происходит обновление таймсерий данного символа и тф, а потом выдается результат...

 
Dmitry Sumsky:

И, вообще, почему надо изобретать какие-то костыли, если это могут сделать сами разработчики МТ?

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

Например, сделать отдельную функцию по запросу значения таймсерии и добавить в функции "i..." iTime(string symbol,int period,int shift,bool НовыеДанные=false). Если false, то по старому. Если true, то сначала происходит обновление таймсерий данного символа и тф, а потом выдается результат...

Ну так сделайте себе. Язык MQL даёт вам все карты в руки. Разработчики не обязаны подстраиваться под все "хотелки" многомилионной армии пользователей - каждому не угодишь.
Людям дали мощный инструмент, и в разных руках он приносит разные результаты. В ваших - глюк-на-косяке, в других - чёткая бесперебойная работа. Каждый выбирает свой путь: одни - делать, другие - ныть и страдать.

 

Ну-да, ну-да.

Это просто отмазка.

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

 
Dmitry Sumsky:

Ну-да, ну-да.

Это просто отмазка.

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

Отмазка у вас о вашей некомпетентности - это у вас ничего не работает. Это вам никто ничего за вас не сделал. Сделали для вас, но вам нужно "за вас". Продолжайте плакать :)

 

"Добрый" админ.

Я вопрос задаю разработчикам МТ, а не новоиспеченному админу.

Как ты программируешь - я знаю. Поэтому чья бы корова мычала.

 

Dmitry Sumsky:

... Пусть это будет работать несколько медленнее, но любой пользователь ...

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

 
Alexey Viktorov:

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

ну поэтому и предложил вариант true/false.

нужна скорость - false, нужны свежие данные - true

)))

 
Так на счет OnTimer кто-нибудь что-нибудь скажет?