Новая версия платформы MetaTrader 5 build 4040: Улучшения и исправления - страница 12

 
fxsaber #:

Указатель - не объект же.

Наличие указателя, как и объектов, нарушает правило POD (Plain Old Data) структуры.

Запись структуры с указателем - не проблема. Проблема в чтении такой структуры, где вы получите опасный/невалидный указатель.

Сложные объекты надо сериализировать самостоятельно.

 
Renat Fatkhullin #:

Проблема в чтении такой структуры, где вы получите опасный/невалидный указатель.

Прописывать NULL туда возможно для совместимости?
 

Нахожусь курсором в ME в методе класса. Как узнать область видимости этого метода: private/protected/public.

ALT+M подходит только для классов с малым количеством методов.

 
Renat Fatkhullin # :

Наличие указателя, как и объектов, нарушает правило POD (Plain Old Data) структуры.

Запись структуры с указателем - не проблема. Проблема в чтении такой структуры, где вы получите опасный/невалидный указатель.

Сложные объекты надо сериализировать самостоятельно.

Это верно.

Не могли бы вы добавить средства для создания сериализатора GENERIC для объектов структуры/класса?

Я думаю конкретно о каком-то механизме отражения. Но если у вас есть другое практическое решение, было бы неплохо.

Спасибо.

Static Reflection and Serialization in C++
Static Reflection and Serialization in C++
  • technicallydeclined.com
While C++ is extremely powerful, it lacks a lot of the creature comforts that higher-level languages provide. One of these features that is not currently supported in the current standard revision (as of C++ 20) is “reflection”. Reflection is defined as “the ability of a process to examine, introspect, and modify its own structure and...
 
fxsaber #:

Указатель - не объект же.

это не скалярный тип данных и sizeof() к нему не применим. 

указатель в MQL не эквивалент указателю C void *;  

 
Maxim Kuznetsov #:

это не скалярный тип данных и sizeof() к нему не применим. 

указатель в MQL не эквивалент указателю C void *;  

Это все условности.

FileSave - указатели пишутся, как четыре нулевых байта. FileLoad - указатели делаются NULL. union - аналогично. Штатные же функции. Что захотели разработчики, то и сделали.


Как пример реализации хотелок - ArrayPrint. Спокойно указатели показывает.

 

Билд 4065 - в отчете тестера потерялись названия. В HTML отчете тоже.

 
b4068, слабая оптимизация HistorySelect и последующих History-функций.
#define TOSTRING(A) #A + " = " + (string)(A) + " "

#define BENCH(A)                                                             \
{                                                                            \
  const ulong StartTime = GetMicrosecondCount();                             \
  A;                                                                         \
  Print(#A + " - " + (string)(GetMicrosecondCount() - StartTime) + " mcs."); \
}

void History1()
{
  if (HistorySelect(0, INT_MAX))  
    for (int i = 0; i < 1e8; i++)
      HistoryOrderGetTicket(0);
}

void History2()
{
  for (int i = 0; i < 1e8; i++)
    if (HistorySelect(0, INT_MAX))
      HistoryOrderGetTicket(0);
}

void Random()
{
  if (HistorySelect(0, INT_MAX))  
    for (int i = 0; i < 1e8; i++)
      MathRand();
}

void OnStart()
{
  if (HistorySelect(0, INT_MAX))
    Print(TOSTRING(HistoryDealsTotal()) + TOSTRING(HistoryOrdersTotal()));
    
  BENCH(History1());
  BENCH(History2());
  BENCH(Random());
}


Результат.

HistoryDealsTotal() = 239374 HistoryOrdersTotal() = 587311 
History1() - 493262 mcs.
History2() - 5031796 mcs.
Random() - 254657 mcs.


History2 на порядок медленнее History1, т.к. HistorySelect каждый раз заново строит таблицу, когда может этого не делать, т.к. количество сделок/ордеров не меняется от вызова к вызову. Вариант, что брокер изменил поле какой-то сделки/ордера, рассматривать не стоит.


Дорогой Random оказался быстрее History1. Значит HistoryOrderGetTicket работает много медленнее чтения элемента из массива.

Просьба поднять производительность History-функций в терминале.

Строка для поискаOshibka 082.

 
Последняя релизная версия MT5.

1. Скомпилировать следующий скрипт.

//#property script_show_inputs

input int a=0;

void OnStart()
{
  Print((string)a);
}
2. Запустить терминал и в нём скомпилированный скрипт. Он без запросов сразу выдаст в лог число.
3. Раскомментировать первую строку скрипта и пересобрать.
4. Он снова без запросов сразу выдаст в лог число.
5. Если терминал перезапустить или обновить в навигаторе со списком скриптов при запуске скрипта он уже выдаст окно ввода для int a.

Это баг или фича?
 
traveller00 #:
Это баг или фича?

Это издавна происходят такие чудеса:

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

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

A100, 2015.10.30 17:44

У меня получается int и string (MT5\1204\32). Попробуйте еще раз - иногда если присоединить к графику сразу после редактирования и компиляции то может выполнить предыдущий вариант (до редактирования).

Пора бы уже и исправить