Новая версия платформы MetaTrader 5 build 2007: Экономический календарь, MQL5-программы в виде сервисов - страница 32

 

При вызове функции iCustom() если ошибиться в параметрах пользовательского индикатора и подставить целый параметр (int) в том месте, где должна была находится string вызывает:

2019.03.18 19:41:19.332 2019.01.01 00:00:00   Access violation at 0x000000013FC7B9A6 write to 0x0000000000000010

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

input int Range = 0; // 0..10

double OnTester()
{
  uchar Data[];

  return(FrameAdd(__FILE__ + " " + _Symbol + " " + (string)_Period, 0, MathRand(), Data)); // Отправили данные в mqd-файл Терминала.
}

#define TOSTRING(A) #A + " = " + (string)(A) + "  "

void OnTesterPass()
{
  ulong Pass;
  string Name;
  long ID;
  double Value;

  while (FrameNext(Pass, Name, ID, Value)) // Прочли очередной проход из mqd-файла.
    Print(TOSTRING(Pass) + TOSTRING(Name) + TOSTRING(Value)); // Вывели данные mqd-файла
}

void OnTesterDeinit()
{
  ChartClose();
}

int OnInit()
{
  if (!MQLInfoInteger(MQL_TESTER) && FrameFirst()) // Удалось инициализировать mqd-файл.
    OnTesterPass();
    
  return(MQLInfoInteger(MQL_OPTIMIZATION) ? INIT_SUCCEEDED : INIT_FAILED);
}


В Терминале в логе будет

Pass = 1  Name = Test2.mq5 EURUSD 1  Value = 19574.0  
Pass = 7  Name = Test2.mq5 EURUSD 1  Value = 19574.0  
Pass = 8  Name = Test2.mq5 EURUSD 1  Value = 19574.0  
Pass = 2  Name = Test2.mq5 EURUSD 1  Value = 20070.0  
Pass = 9  Name = Test2.mq5 EURUSD 1  Value = 19574.0  
Pass = 10  Name = Test2.mq5 EURUSD 1  Value = 20070.0  
Pass = 3  Name = Test2.mq5 EURUSD 1  Value = 20762.0  
Pass = 5  Name = Test2.mq5 EURUSD 1  Value = 21311.0  
Pass = 4  Name = Test2.mq5 EURUSD 1  Value = 27672.0  
Pass = 0  Name = Test2.mq5 EURUSD 1  Value = 22264.0  
Pass = 6  Name = Test2.mq5 EURUSD 1  Value = 17980.0  


Автоматически будет создан файл Files\Tester\Test2.EURUSD.M1.0.mqd. Если затем оптимизировать на GBPUSD M1, будет такая же реакция, только везде вместо EURUSD будет GBPUSD.


Так вот после GBPUSD в Терминале невозможно запуском этого советника прочитать данные из Files\Tester\Test2.EURUSD.M1.0.mqd. Можно запустить хоть на GBPCAD, но будут выводиться данные только самого свежего mqd-файла. Соответственно, полностью теряется функционал хранимых mqd-файлов.


Просьба поправить следующим образом. Если есть Test2.EURUSD.M1.0.mqd, то давать его считывать, если произведен запуск советника в Терминале только на EURUSD M1 с именем Test2.

Точно так же, если есть Test123.AUDCAD.M5.0.mqd, то давать его считывать, если произведен запуск советника в Терминале только на AUDCAD M5 с именем Test123.


mqd-файлы удобны тем, что их можно перенести на другую машину (или выйти из фрейм-режима) и продолжить анализ результатов оптимизации. Сейчас, к сожалению, описанный выше баг не дает нормально сделать это.


ЗЫ А лучше всего сделать перегрузку

bool FrameFirst( const string FileName ); // Инициализирует указатель начала проходов в соответствующем mqd-файле.
 
fxsaber:

...

ЗЫ А лучше всего сделать перегрузку

bool FrameFirst( const string FileName ); // Инициализирует указатель начала проходов в соответствующем mqd-файле.

Вот так было бы очень удобно.

 

В МЕ теперь показывается прогресс компиляции в процентах - порадовало, спасибо, а то у меня есть советник, компенсирующийся более 3 часов и очень хотелось понимать, сколько ещё ждать его компиляцию.

Раз появляются новые функции для работы с массивом, то быть можно как то реализовать быструю функцию на удаление всех не уникальных значений в массиве, в том числе содержащие строки?

 
Aleksey Vyazmikin:

В МЕ теперь показывается прогресс компиляции в процентах - порадовало, спасибо, а то у меня есть советник, компенсирующийся более 3 часов и очень хотелось понимать, сколько ещё ждать его компиляцию.

Раз появляются новые функции для работы с массивом, то быть можно как то реализовать быструю функцию на удаление всех не уникальных значений в массиве, в том числе содержащие строки?

3 ЧАСА? Это священный грааль 80 левела?

 
Alexey Kozitsyn:

3 ЧАСА? Это священный грааль 80 левела?

Да не, это просто база разных комбинаций листов дерева.

Что то типа такого:

                  if(Test_P==6629)if(Povtor_Type_H1< 0 && TimeH>=10.5 && Polozhenie_M1>=0 && TimeH< 21.5 && Levl_Low_W1s1>=-4.5 && Levl_Close_H1s1>=-3.5 && Povtor_Type_M15>=0) CalcTest=CalcTest+1; //(0.17840376 0.46948357 0.35211268)
                  if(Test_P==6630)if(Povtor_Type_H1<0 && TimeH>=10.5 && Polozhenie_M1>=0 && TimeH<21.5 && Levl_Low_W1s1>=-4.5 && Levl_Close_H1s1<-3.5) CalcTest=CalcTest+1; //(0.09230769 0.54358974 0.36410256)
                  if(Test_P==6631)if(Povtor_Type_H1>=0 && Levl_Down_DC>=-7.5 && Povtor_Low_M15>=1.5 && TimeH< 21.5 && Levl_Close_H1s1N< 2.5 && Levl_first_MN1>=-0.5 && DonProcVisota_M15>=6.5 && Levl_High_H4s1< 2.5) CalcTest=CalcTest+1; //(0.55797101 0.35507246 0.08695652)
                  if(Test_P==6632)if(Povtor_Type_H1>=0 && Levl_Down_DC>=-7.5 && Povtor_Low_M15>=1.5 && TimeH< 21.5 && Levl_Close_H1s1N< 2.5 && Levl_first_MN1>=-0.5 && DonProcVisota_M15>=6.5 && Levl_High_H4s1>=2.5) CalcTest=CalcTest+1; //(0.40939597 0.41610738 0.17449664)

Таких строк порядка 43к, ну и доп логика ещё на 2к строк (не считая дополнительных классов). Не знаю, почему так долго и нормально ли это...

 
Aleksey Vyazmikin:

Да не, это просто база разных комбинаций листов дерева.

Что то типа такого:

Таких строк порядка 43к, ну и доп логика ещё на 2к строк (не считая дополнительных классов). Не знаю, почему так долго и нормально ли это...

Нарежьте функции на множество более мелких и сократите время компиляции в разы и десятки раз.

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

 
Aleksey Vyazmikin:

Да не, это просто база разных комбинаций листов дерева.

Что то типа такого:

Таких строк порядка 43к, ну и доп логика ещё на 2к строк (не считая дополнительных классов). Не знаю, почему так долго и нормально ли это...

Оу... А... сколько выполняется расчет тика советником не замеряли?

 
Renat Fatkhullin:

Нарежьте функции на множество более мелких и сократите время компиляции в разы и десятки раз.

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

Так 8 условий && это разве много, мне что их бить типа так для ускорения компиляции?

if(Test_P==6631)if(Povtor_Type_H1>=0 ) if ( Levl_Down_DC>=-7.5) if (Povtor_Low_M15>=1.5 ) if ( TimeH< 21.5 ) if ( Levl_Close_H1s1N< 2.5 ) if ( Levl_first_MN1>=-0.5 ) if ( DonProcVisota_M15>=6.5 ) if ( Levl_High_H4s1< 2.5) CalcTest=CalcTest+1; //(0.55797101 0.35507246 0.08695652)

А на само качество компиляции это влияет, т.е. как быстро будет исполняться код в зависимости от синтаксиса его изложения?

 
Renat Fatkhullin:

Нарежьте функции на множество более мелких и сократите время компиляции в разы и десятки раз.

Инлайн не пашет?

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