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

 
fxsaber #:

Если создать полностью рабочий код строк на 20, то шансы на позитивный исход будут больше. А так - никто даже смотреть не будет.

Сервис. Билд 4000 строит график, 4016 - нет

Файлы:
 
Oleksii Chepurnyi #:

Сервис. Билд 4000 строит график, 4016 - нет

Подтверждаю. CustomTicksAdd возвращает ноль с нулевой ошибкой в b4016. В b4000 пашет правильно.

Приложенный код воспроизводит ошибку.

 
fxsaber #:

Приложенный код воспроизводит ошибку.

Лучше писать лаконичный вариант - быстрее разобраться. Например, по этой ошибке.

void OnStart()
{
  MathSrand((int)TimeLocal());
  const string Symb = "TEST" + (string)MathRand();
  
  MqlTick Tick[1];
    
  if (CustomSymbolCreate(Symb, NULL, _Symbol) && SymbolSelect(Symb, true) && SymbolInfoTick(_Symbol, Tick[0]))
  {
    Print(CustomTicksAdd(Symb, Tick)); // 0
    Print(_LastError); // 0
  }
}

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

 

Непонятны скоростные результаты компилятора. В частности, самописный инлайн (rule) сильно уступает автоматическому инлайну (rule2).

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

Машинное обучение в трейдинге: теория, модели, практика и алготорговля

fxsaber, 2023.10.11 22:11

Там много, что может быть. Скрипт приложен, ниже его часть с функциями.

bool Rule0( const vector<double> &x ) { return(x[3] > x[4]); }
bool Rule1( const vector<double> &x ) { return(x[0] < x[4]); }
bool Rule2( const vector<double> &x ) { return(x[1] >= x[0]); }
bool Rule3( const vector<double> &x ) { return(x[3] == x[4]); }
bool Rule4( const vector<double> &x ) { return(x[0] != x[4]); }
bool Rule5( const vector<double> &x ) { return(x[1] >= x[0]); }
bool Rule6( const vector<double> &x ) { return(x[3] <= x[4]); }
bool Rule7( const vector<double> &x ) { return(x[0] < x[4]); }
bool Rule8( const vector<double> &x ) { return(x[1] >= x[0]); }
bool Rule9( const vector<double> &x ) { return(x[3] <= x[4]); }

bool rule3( const int n, const vector<double> &x )
{
  typedef bool (*RULE)( const vector<double>& );
  static const RULE Rules[] = {Rule0, Rule1, Rule2, Rule3, Rule4, Rule5, Rule6, Rule7, Rule8, Rule9,
                               Rule0, Rule1, Rule2, Rule3, Rule4, Rule5, Rule6, Rule7, Rule8, Rule9,
                               Rule0, Rule1, Rule2, Rule3, Rule4, Rule5, Rule6, Rule7, Rule8, Rule9,
                               Rule0, Rule1, Rule2, Rule3, Rule4, Rule5, Rule6, Rule7, Rule8, Rule9,
                               Rule0, Rule1, Rule2, Rule3, Rule4, Rule5, Rule6, Rule7, Rule8, Rule9,
                               Rule0, Rule1, Rule2, Rule3, Rule4, Rule5, Rule6, Rule7, Rule8, Rule9,
                               Rule0, Rule1, Rule2, Rule3, Rule4, Rule5, Rule6, Rule7, Rule8, Rule9,
                               Rule0, Rule1, Rule2, Rule3, Rule4, Rule5, Rule6, Rule7, Rule8, Rule9,
                               Rule0, Rule1, Rule2, Rule3, Rule4, Rule5, Rule6, Rule7, Rule8, Rule9,
                               Rule0, Rule1, Rule2, Rule3, Rule4, Rule5, Rule6, Rule7, Rule8, Rule9};

  return(Rules[n](x));
}

#define BENCH(A)                                                              \
  StartTime = GetMicrosecondCount();                                          \
  A;                                                                          \
  Print(#A + " - " + (string)(GetMicrosecondCount() - StartTime) + " mcs");

void OnStart()
{
  const vector<double> x = {1, 2, 3, 4, 5};
  int Tmp = 0;

  ulong StartTime;

  BENCH(for (uint i = 1e8; (bool)i--;) Tmp += rule(i % 100, x));
  BENCH(for (uint i = 1e8; (bool)i--;) Tmp += rule2(i % 100, x));
  BENCH(for (uint i = 1e8; (bool)i--;) Tmp += rule3(i % 100, x));
//  BENCH(for (uint i = 1e8; (bool)i--;) Tmp += rule(i % 100, x));  // Если добавить эту строку, то выше rule замедлится.
//  BENCH(for (uint i = 1e8; (bool)i--;) Tmp += rule2(i % 100, x)); // Если добавить эту строку, то выше rule2 замедлится.
//  BENCH(for (uint i = 1e8; (bool)i--;) Tmp += rule3(i % 100, x)); // Если добавить эту строку, то выше rule3 замедлится.

  Print(Tmp);
}


Результат.

for (uint i = 1e8; (bool)i--;) Tmp += rule(i % 100, x) - 505436 mcs
for (uint i = 1e8; (bool)i--;) Tmp += rule2(i % 100, x) - 261261 mcs
for (uint i = 1e8; (bool)i--;) Tmp += rule3(i % 100, x) - 709846 mcs


Тут совершенно непонятно, что замеряется - см. выделенные комментарии. Якобы сильно быстрее rule2.

 
fxsaber #:

Непонятны скоростные результаты компилятора. В частности, самописный инлайн (rule) сильно уступает автоматическому инлайну (rule2).

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

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

Поэтому упрощенные синтетические тесты часто обманывают.

 
MetaQuotes:

В пятницу 29 сентября 2023 года будет выпущена обновленная версия MetaTrader 5. В ней мы внесли ряд улучшений в новый торговый отчет и веб-терминал.

Очень приятно видеть улучшения в функционале Trading Report , но если задуматься, то действительно ли отсутствие именно такого красивого отчета ранее стало фактором, сформировавшим отставание Metatrader от TradingView в части популярности у широкого круга розничных трейдеров???

Если вы возьмете и проанализируете  1000 наиболее популярных каналов  Youtube, то к удивлению обнаружите что маркетинговый разрыв примерно 20:1,  т.е. на 20ть учебно-образовательных роликов с использованием TradingView приходится 1 ролик с использованием терминалов Metatrader(4./5). Ограничьте исследование топовыми каналами форексных проп.компаний (@ftmo etc) и обучающих трейдинговых школ (@ICT etc), то вы вообще не встретите роликов с применением терминалов Metatrader или это будут очень единичные случаи -  здесь условно можно считать что у топовых каналов разрыв достигает 100:1.

 

В чем же причина столь сильного отставания популярности Metatrader  от TradingView?

Ответ достаточно прост: сам терминал Metatrader   не содержит встроенного функционала "Market Replay", а прилагающийся StrategyTester настолько ограничен в части использования для указанных целей, что не представляет собой никакой альтернативы для розничных трейдеров.

По сути текущая ситуация - это результат недооценки на стороне MQ  важности образовательной части индустрии , образовательного контента,  и эту упущение необходимо признать и поставить в планы разработки необходимые функциональные улучшения;  вариантов адресации данной проблемы по сути всего два.

 

Вариант-1: Доработать функционал продукта  "StrategyTester", сделав его более гибким и настраиваемым в визуальной его части, то есть добавить:

  • панель управления для ручного открытия сделок и управления открытыми позициями,
  • режим многооконности как на пользовательском уровне, так и на программном уровне (в т.ч. работу функций ChartFisrt, ChartNext и поддержку отрисовки объектов на заданном по ChartID графике );
  • поддержку объектов  типа "Economic Calendar", "News" с  автоматическим наполнением их историческими данными, соответствующими по времени (с дискретизацией 1 минуты);
  • поддержку буфера событий ChartEvents и функции OnChartEvent() для обеспечения возможностей тестирования в связке с комплексными советниками по управлению рисками сделок и торгового счета.

 

Вариант-2: Создать функционал "Market Replay" непосредственно в терминале MT5, то есть добавить в терминал:

  • новое новую 4ю панель управления  "Market Replay" и/или пользовательское меню и , в которых обеспечить возможность задать стартовую дату, режим (Все окна терминала/ Активное окно) и остальные необходимые  параметры для "MarketReplay" ;
  • новый набор программных функций для управления режимом "Market Replay" из советников, в том же объеме как и у пользовательского интерфейса;
  • поддержку объектов  типа "Economic Calendar", "News" с  автоматическим наполнением их историческими данными, соответствующими по времени в "Market Replay" (лучше даже конвертировать их в отдельно стоящие окнами, как было сделано ранее с "Market");
  • возможность дообогашения историческими данными (M1 Bars, Ticks)  любых символов в терминале, с ограничением на редактирование  в 1 год от текущей системной даты (это позволит адресовать проблему ограниченности срока хранения исторических данных уровня М1/Ticks на МТ5 серверах форекс- брокеров);
  • вывод торговых ордеров, открытых в "Market Replay" на закладке "History" c признаком "Replay", с одновременной генерацией для них Transaction-событий  и срабатывания функции OnTradeTransaction().

 

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

1) данная тема достаточно давно известна - имеется множество топиков на форуме с обсуждением недостатков системы тестирования;

2) имеется даже ряд отдельно стоящих платных продуктов, которые имитируют терминал Metatrader  со строенным функционалом "Market Replay" - просто загуглите  "forex tester" для того чтобы выйти на сайты таких продуктов;

3) в рамках портала "MQL5" имеются я отдельные варианты реализации "обходных решений"  - так например уважаемый пользователь fxsaver представлял ранее библиотеку "Virtual", а трейдер Daniel Jose не так давно   настрогал аж 16 статей на тему создания подобного функционала.

Т.о. это тоже подвтержедение значимости проблемы  - никто не стал бы в здравом уме тратить столько сил на разработку альтернативных решений/продуктов, если бы проблема отсутствия удобного "Market Replay" не была столь значимой.

Однако представленные "обходные решения" типа разработок от Daniel Jose слишком  сложны и недоступны для широких масс, именно поэтому решение проблемы должно быть "платформенное" и "системное" - то есть на уровне самого терминала МТ5.

 

Кажется есть проблема с типом color.

clrNONE по справке равна -1. Но если задать переменной color это значение, то условие (clrNONE > -1) - это сейчас всегда true, (clrNONE == -1)  - это false.

void OnInit()
{
  Print("clrNONE = ", clrNONE, " int=", (int)clrNONE);
  testColor();
  testColor(clrRed);
}

void testColor(color clrLine = clrNONE)
{
  if(clrLine > -1)              // разве условие (clrNONE > -1) - это true ?
  {
    Print("clrLine = ", clrLine, " int=", (int)clrLine);
  }

Вывод в MetaEditor

Вывод в терминале:


 
Vasiliy Pushkaryov #:

Кажется есть проблема с типом color.

clrNONE по справке равна -1. Но если задать переменной color это значение, то условие (clrNONE > -1) - это сейчас всегда true, (clrNONE == -1)  - это false.

Вывод в MetaEditor

Вывод в терминале:


false это 0 , всё иное это true

операции сравнения < <= > >= кроме эквивалентности == != для типа color не определены и использовать их нельзя

 
Vasiliy Pushkaryov #:
(clrNONE == -1)  - это false

Почему false?

void OnInit()
{
  testColor();
  testColor(clrRed);
}
void testColor(color clrLine = clrNONE)
{
  bool flag = clrLine != clrNONE;
  if(flag)
  Print("flag = ", flag, ", ", bool(clrNONE == -1), ", clrLine = ", clrLine, ", int = ", (int)clrLine);
}

Результат:


 

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

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

Vasiliy Pushkaryov, 2023.10.12 10:53

Кажется есть проблема с типом color.

clrNONE по справке равна -1. Но если задать переменной color это значение, то условие (clrNONE > -1) - это сейчас всегда true, (clrNONE == -1)  - это false.

void OnInit()
{
  Print("clrNONE = ", clrNONE, " int=", (int)clrNONE);
  testColor();
  testColor(clrRed);
}

void testColor(color clrLine = clrNONE)
{
  if(clrLine > -1)              // разве условие (clrNONE > -1) - это true ?
  {
    Print("clrLine = ", clrLine, " int=", (int)clrLine);
  }

Вывод в MetaEditor

Вывод в терминале:


У вас ошибка от усталости. Выделено красненьким…

условие (clrLine > -1) - это true!!!