Особенности языка mql4, тонкости и приёмы работы - страница 14

 
Замечание разработчикам.


https://docs.mql4.com/ru/basis/types/integer


В стандарте C++ гарантируется размер только типа char. Длины остальных типов специфичны для реализации. Таблица соответствия некорректна и может приводить к неопределённому поведению.

Целые типы - Типы данных - Основы языка - Справочник MQL4
Целые типы - Типы данных - Основы языка - Справочник MQL4
  • docs.mql4.com
Целые типы представлены в языке MQL4 одиннадцатью видами. Некоторые из типов могут использоваться вместе с другими, если этого требует логика программы, но при этом необходимо иметь ввиду правила преобразования типов. В таблице приведены характеристики каждого типа. Кроме того, в...
 
Комментарии, не относящиеся к этой теме, были перенесены в "Вопросы от начинающих MQL4 MT4 MetaTrader 4".
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2018.12.01 11:15

Супер-тормозная конструкция
string Str[];
const int handle = FileOpen(FileName, FILE_READ | FILE_ANSI | FILE_TXT);  

FileReadArray(handle, Str);

Файл 40Мб из 1 миллиона строк считывает 18 секунд.


Тот же результат на выходе, но сделанный иначе

  uchar Bytes[];
  const int handle = FileOpen(FileName, FILE_READ | FILE_BIN);
  
  FileReadArray(handle, Bytes);

  string Str[];
  StringSplit(CharArrayToString(Bytes), '\n', Str);

выполняется уже за 0.5 секунды.


 

Перегрузил 16Gb RAM задачами. По итогу Хром завис, MT5 c запущенной Оптимизацией - без проблем. Но интереснее - MT4.

Индикаторы остались пахать, а советники из-за отсутствия проверки результата ArrayResize остановились из-за "out of range".

Не всегда хочется проверять ArrayResize, но вот подтверждение, что отсутствие этой проверки может остановить, например, боевой советник на VPS.


Вот только чего понять не могу, как получилось "out of range", если ArrayResize был ранее сделан с большим Reserve?

 
fxsaber:

Перегрузил 16Gb RAM задачами. По итогу Хром завис, MT5 c запущенной Оптимизацией - без проблем. Но интереснее - MT4.

Индикаторы остались пахать, а советники из-за отсутствия проверки результата ArrayResize остановились из-за "out of range".

Не всегда хочется проверять ArrayResize, но вот подтверждение, что отсутствие этой проверки может остановить, например, боевой советник на VPS.


Вот только чего понять не могу, как получилось "out of range", если ArrayResize был ранее сделан с большим Reserve?

влёгкую :-) в большей части языков/систем так.

Reserve выделил(получил) виртуальную память, а когда физическая кончилась, то при обращении к памяти свободной страницы ненашлось. Получилось исключение процессора, которое после череды обработок вылилось в out-of-range

кстати то что MT вообще не завалился подтверждает качество изготовления :-)

 

Жестко ошибался на тему сортировки ордеров в истории. Сортировка по времени закрытия не всегда, к сожалению.

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

#property strict

void OnStart()
{
  datetime time = INT_MAX;
  
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
      if (OrderCloseTime() > time)
      {
        Print(time);
        OrderPrint();
        
//        break;
      }
      
      time = OrderCloseTime();
    }
}


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

Как и загадка, как получается, что ордера могут быть не отсортированы по времени? Задаю этот вопрос, потому как выкладывал кастомный тестер в КБ. И логично, раз ордер попал в историю, то запись о нем там позже тех, что попали раньше. Как можно перетряхнуть эту логику - не ясно совсем.

Возможно, ордера хранятся на разных MT5-серверах, а потом при синхронизации такая ерунда выходит. Надеюсь, что это баг Терминала, а не торгового MT4-сервера. Ну и хотелось бы, чтобы в MTтакого не происходило со сделками.

 
fxsaber:

Жестко ошибался на тему сортировки ордеров в истории. Сортировка по времени закрытия не всегда, к сожалению.

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


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

Как и загадка, как получается, что ордера могут быть не отсортированы по времени? Задаю этот вопрос, потому как выкладывал кастомный тестер в КБ. И логично, раз ордер попал в историю, то запись о нем там позже тех, что попали раньше. Как можно перетряхнуть эту логику - не ясно совсем.

Возможно, ордера хранятся на разных MT5-серверах, а потом при синхронизации такая ерунда выходит. Надеюсь, что это баг Терминала, а не торгового MT4-сервера. Ну и хотелось бы, чтобы в MTтакого не происходило со сделками.

Сортировку в истории счёта пробовали менять?

 
Artyom Trishkin:

Сортировку в истории счёта пробовали менять?

Не влияет на результат.

 
Artyom Trishkin:

Сортировку в истории счёта пробовали менять?

Да, не должно влиять. Влияет только количество ордеров в закладке "История счета". За этим приходится следить.

 
fxsaber:

Не влияет на результат.

Время закрытия позиции выдает сервер. 

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