Новая версия платформы MetaTrader 5 build 2980: Push-уведомления о торговых операциях - страница 54

 
fxsaber #:

В этом коде для компилятора все однозначно - вызывается string-перегрузка.

Примерно понял логику компилятора - увидел целочисленный datetime (пусть и вторым параметром).

Тогда чем datetime лучше, чем color или enum?

enum ENUM { e=0 };
void f(datetime) { Print( __FUNCSIG__); }
void f(color   ) { Print( __FUNCSIG__); }
void f(ENUM    ) { Print( __FUNCSIG__); }
void OnStart()
{
    f(0);
}

Результат: void f(datetime)

 
A100 #:

Тогда чем datetime лучше, чем color или enum?

Приоритетом.

 
fxsaber #:

Приоритетом.

0 - это int. Согласно документации:

"вместо типа int можно использовать тип color (по 4 байта), а вместо типа long допустим тип datetime (занимают по 8 байт)"

Т.е. вместо 0 можно сразу подставить color, а чтобы вместо 0 подставить datetime - его нужно сначала к long привести

 

Добрый день!

Build 3041, есть 3 проблемы:

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

1.1 При изменении входной формулы ситуация аналогичная, подгружается из кэша, но по новой формуле, форвард игнорируется(

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

3. Иногда при тестировании советника на кастомных графиках, если обновить версию советника (терминал при этом всегда работает), только обновить папку в навигаторе, чтобы переинициализировать.

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

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

2021.09.17 03:18:51.349 BTCUSDT: symbol to be synchronized
2021.09.17 03:18:51.349 BTCUSDT: symbol synchronized, 3880 bytes of symbol info received
2021.09.17 03:18:51.349 BTCUSDT: history synchronization started
2021.09.17 03:18:51.573 BTCUSDT: history synchronization error [apply error]
2021.09.17 03:18:51.573 BTCUSDT: load 6.03 Mb of history data to synchronize in 0:00:00.223
2021.09.17 03:18:51.573 BTCUSDT: history synchronized from 2020.01.01 to 2021.09.16
2021.09.17 03:18:51.573 prepare for shutdown
2021.09.17 03:18:51.591 BTCUSDT: rates base receive error
2021.09.17 03:18:51.591 unexpected end of testing
 

При запуске тестера на кастомном символе выходит такая ошибка. Билд 3041. 

Графики все показываются. Хотелось бы более понятное сообщение вместо "history check timeout", чтобы понять причину.


 

В нескольких последних билдах сломали импорт библиотек (уже не в первый раз, к сожалению).

В библиотеке прописана функция:

bool OrderBook_MarketBookGet(string symbol, MqlBookInfo &bookArrayOut[]) export

В эксперте при попытке её вызвать:

  MqlBookInfo bookArray[];
  OrderBook_MarketBookGet(_Symbol, bookArray);

Получаем ошибку:

Cannot find 'OrderBook_MarketBookGet' in 'OrderBookMS.ex5'
unresolved import function call

На билде 2988 работает нормально.

Из библиотеки экспортится еще куча функций, в частности, нижеследующая, и они работают:

typedef void (*pOnBookEvent)(const string &symbol);
void OrderBook_Init(pOnBookEvent ptr, const string folder, const bool common, const int offset) export

Проблема возникает, судя по всему, из-за параметра-массива (или из-за того, что это массив структур).

 

Что-то сломали в MqlCalendarValue. Build 3042.

Проверочный скрипт:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- код страны для Европейского союза по стандарту ISO 3166-1 Alpha-2
   string EU_code = "EU";
//--- получим все значения событий по Европейскому союзу
   MqlCalendarValue values[];
//--- зададим границы диапазона, из которого берем события
   datetime date_from = D'01.01.2018'; // берем все события с 2018 года
   datetime date_to = 0;              // 0 означает все известные события, даже те, что не наступили еще
//--- запросим историю события по Европейскому союзу с 2018 года
   if(CalendarValueHistory(values, date_from, date_to, EU_code))
     {
      PrintFormat("Получены значения событий по country_code=%s: %d",
                  EU_code, ArraySize(values));
      //--- уменьшим размер массива для вывода в Журнал
      ArrayResize(values, 10);
      //--- выведем значения событий в Журнал
      ArrayPrint(values);
      //---      
      for(int v_idx = 0; v_idx < 10; v_idx++)
        {
         MqlCalendarValue curr_val = values[v_idx];
         ::Print("\n---== Value description ==---");
         ::PrintFormat("   Id: %I64u", curr_val.id);
         ::PrintFormat("   Event id: %I64u", curr_val.event_id);
         ::PrintFormat("   Time: %s", ::TimeToString(curr_val.time));
         ::PrintFormat("   Period: %s", ::TimeToString(curr_val.period));
         ::PrintFormat("   Revision: %I32d", curr_val.revision);
         ::PrintFormat("   Actual value: %I64d", curr_val.actual_value);
         ::PrintFormat("   Previous value: %I64d", curr_val.prev_value);
         ::PrintFormat("   Revised previous value: %I64d", curr_val.revised_prev_value);
         ::PrintFormat("   Forecast value: %I64d", curr_val.forecast_value);
         ::PrintFormat("   Impact type: %s", ::EnumToString(curr_val.impact_type));
        }
     }
   else
     {
      PrintFormat("Ошибка! Не удалось получить события по стране country_code=%s", EU_code);
      PrintFormat("Код ошибки: %d", GetLastError());
     }
  }


И ругань компилятора:

'test_value_history.mq5'        test_value_history.mq5  1       1
'id' is not a member of 'MqlCalendarValue' type test_value_history.mq5  35      49
'curr_val' - objects are passed by reference only       test_value_history.mq5  35      40
'event_id' is not a member of 'MqlCalendarValue' type   test_value_history.mq5  36      55
'curr_val' - objects are passed by reference only       test_value_history.mq5  36      46
'time' is not a member of 'MqlCalendarValue' type       test_value_history.mq5  37      63
'curr_val' - parameter conversion not allowed   test_value_history.mq5  37      54
'period' is not a member of 'MqlCalendarValue' type     test_value_history.mq5  38      65
'curr_val' - parameter conversion not allowed   test_value_history.mq5  38      56
'revision' is not a member of 'MqlCalendarValue' type   test_value_history.mq5  39      55
'curr_val' - objects are passed by reference only       test_value_history.mq5  39      46
'actual_value' is not a member of 'MqlCalendarValue' type       test_value_history.mq5  40      59
'curr_val' - objects are passed by reference only       test_value_history.mq5  40      50
'prev_value' is not a member of 'MqlCalendarValue' type test_value_history.mq5  41      61
'curr_val' - objects are passed by reference only       test_value_history.mq5  41      52
'revised_prev_value' is not a member of 'MqlCalendarValue' type test_value_history.mq5  42      69
'curr_val' - objects are passed by reference only       test_value_history.mq5  42      60
'forecast_value' is not a member of 'MqlCalendarValue' type     test_value_history.mq5  43      61
'curr_val' - objects are passed by reference only       test_value_history.mq5  43      52
'impact_type' is not a member of 'MqlCalendarValue' type        test_value_history.mq5  44      70
'curr_val' - parameter conversion not allowed   test_value_history.mq5  44      61
 
Denis Kirichenko #:

Что-то сломали в MqlCalendarValue. Build 3042.

Топорно как-то с билдами.

void OnStart()
{  
  MqlCalendarValue Value;
  
  Value.time = 0;
/*
  'time' is not a member of 'MqlCalendarValue' type
  '0' - parameter passed as reference, variable expected
  'operator=' - object required
  '0' - illegal operation use
*/  
}  
 

MT5 b3042, ME b3042

Скрипт

void OnStart()
  {
   int i = 1 / (int)MathAbs(0.0);      //Compilation OK
   Print(1 / (int)MathAbs(0.0));       //ME crash on "generating code: 74%"
  }

Компилирую по F7 - при "generating code: 74%" ME аварийно закрывается (в  metaeditor.log про это ничего нет). Терминал работает нормально.

Если откомпилировать без строчки Print(.... - компилируется ОК.


MetaTrader 5 x64 build 3042 started for MetaQuotes Software Corp.
Windows 7 Service Pack 1 build 7601, Intel Core i5-2520M  @ 2.50GHz
Файлы:
 
mktr8591 #:

MT5 b3042, ME b3042

Скрипт

Компилирую по F7 - при "generating code: 74%" ME аварийно закрывается (в  metaeditor.log про это ничего нет). Терминал работает нормально.

Если откомпилировать без строчки Print(.... - компилируется ОК.

Интересно, какие еще выражения вычисляются на этапе компиляции...

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