Библиотеки: EAToMath - страница 9

 
Пакетная работа с MT5-Тестером в мат. режиме.
Пакетная работа с MT5-Тестером в мат. режиме.
  • www.mql5.com
Из различных вариантов автоматизации MT5-Тестера ниже будет использованы наработки этой . Из двух реализаций ( EAToMath и MathTicker ) мат. режима ниженаписанное актуально для EAToMath-советников
 

Я использую код ниже, чтобы получить дату начала и дату окончания.

// onInit  
void FromToDate (datetime &From, datetime &To) 
  {
    string Str;
    MTTESTER :: GetSettings (Str);
    To = StringToTime(StringBetween(Str,"ToDate=","\r\n"));  
    From = StringToTime(StringBetween(Str,"FromDate=","\r\n"));
  }

Поскольку в математическом режиме даты выглядят так: 1970.01.01 00:00:00, логика работы с этими значениями дает сбой.


Знаете ли вы способ обойти эту проблему?

 
Enrique Dangeroux #:

Я использую код ниже, чтобы получить дату начала и дату окончания.

Вы пытаетесь сторонним скриптом получить from/to-значения EAToMath-советника, который сейчас находится в Тестере?


Тогда так.

#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/ru/code/26132
#include <fxsaber\EAToMath\Data_Tester.mqh> // https://www.mql5.com/ru/code/61283

DATA_TESTER GetEAToMath_Inputs( const string Settings )
{
  string sTechData = NULL;

#define MACROS_MULTI \
  INPUT(inTechData0) \
  INPUT(inTechData1) \
  INPUT(inTechData2)

#define TOSTRING2(A) #A

#define INPUT(A) sTechData += MTTESTER::GetValue(Settings, TOSTRING2(A));
  MACROS_MULTI
#undef INPUT

#undef TOSTRING2
#undef MACROS_MULTI

  return(DATA_TESTER::FromString(sTechData));
}

void OnStart()
{
  string Settings;
  
  if (MTTESTER::GetSettings(Settings))
  {
    const DATA_TESTER DataTester = GetEAToMath_Inputs(Settings);
    
    Print(DataTester.Symbol.Get()); // Symbol.
    Print2(DataTester);    
  }
}

template <typename T>
void Print2( const T &Value )
{
  T Array[1]; Array[0] = Value; ArrayPrint(Array);
}
 
fxsaber #:

Вы пытаетесь сторонним скриптом получить from/to-значения EAToMath-советника, который сейчас находится в Тестере?


Тогда так.

Нет, я пытаюсь получить значения «от/до» в советнике EA(toMath), который сейчас находится в тестере.

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

// Math
[Tester]
Expert=Tester.ex5
Symbol=EURUSD
Period=M1
Optimization=0
Model=3
[TesterInputs]
...

// Every tick
"[Tester]
Expert=Tester.ex5
Symbol=EURUSD
Period=M1
Optimization=0
Model=4
FromDate=2024.12.06
ToDate=2025.12.06
ForwardMode=0
Deposit=100000
Currency=EUR
ProfitInPips=1
Leverage=500
ExecutionMode=0
OptimizationCriterion=6
Visual=0
[TesterInputs]
...

Я изучу, как скрипт, размещенный в https://www.mql5.com/ru/blogs/post/765306, может каким-то образом дать мне то, что мне нужно.

 
Enrique Dangeroux #:

Нет, я пытаюсь получить значения «от/до» в советнике EA(toMath), который сейчас находится в тестере.

#include <fxsaber\EAToMath\EAToMath.mqh> // https://www.mql5.com/ru/code/61283

void OnInit()
{
  if (!MQLInfoInteger(MQL_OPTIMIZATION))
    ; // Здесь нужно получить данные?
}

void OnTick() {}
double OnTester() { return(0); }
 
fxsaber # :
Да
 
Enrique Dangeroux #:
Да
#include <fxsaber\EAToMath\EAToMath.mqh> // https://www.mql5.com/ru/code/61283

bool GetSettings( string &Settings )
{
  const bool Res = MTTESTER::GetSettings(Settings);
  
  if (Res && ((int)MTTESTER::GetValue(Settings, "Model") == 3))
  {
    // https://www.mql5.com/ru/forum/490718/page9#comment_58682948
    const DATA_TESTER DataTester = GetEAToMath_Inputs(Settings); 
    
    const int Pos = StringFind(Settings, "\n[TesterInputs]");
    string Settings2 = StringSubstr(Settings, 0, Pos);
    
    MTTESTER::SetValue(Settings2, "Symbol", DataTester.Symbol.Get());
    
    MTTESTER::SetValue(Settings2, "FromDate", TimeToString(DataTester.From, TIME_DATE));
    MTTESTER::SetValue(Settings2, "ToDate", TimeToString(DataTester.To, TIME_DATE));
    
    MTTESTER::SetValue(Settings2, "Deposit", (string)DataTester.Deposit);
    
    Settings = Settings2 + StringSubstr(Settings, Pos);
  }
  
  return(Res);
}

int OnInit()
{
  if (MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_OPTIMIZATION))
  {
    string Settings;
    
    if (GetSettings(Settings))
      Print(Settings);
  }
  
  return(INIT_FAILED);
}

void OnTick() {}
double OnTester() { return(0); }
 
fxsaber #:


Результат:

// Math
[Tester]
Expert=Tester.ex5
Symbol=EURUSD
Period=M1
Optimization=0
Model=4
FromDate=2024.12.06
ToDate=2025.12.06
ForwardMode=0
Deposit=100000
Currency=EUR
ProfitInPips=1
Leverage=500
ExecutionMode=0
OptimizationCriterion=6
Visual=
0 
[TesterInputs]
...

Идеальная копия настроек модели 4.

Вы лучшие. Спасибо.

 
fxsaber #:

Вы можете это сделать так.

Я использую следующие библиотеки в одном советнике:

-MT4Orders
-Virtual
-BestInterval
-EAtoMath

Я постоянно сталкиваюсь с ошибками/предупреждениями при переопределении макросов. Приведённый ниже код устранил все ошибки, однако избавиться от предупреждений не удаётся.

Есть ли требование размещать включения в определённом порядке?

int  OnTesterInit()   { return EAToMath.OnTesterInit() || OnTesterInitOriginal(); }
void OnTesterDeinit() { EAToMath.OnTesterDeinit();      OnTesterDeinitOriginal(); }
void OnTesterPass()   { EAToMath.OnTesterPass();        OnTesterPassOriginal();   }

double OnTester()     { EAToMath.OnTester();            return OnTesterOriginal(); }
void   OnTick()       { EAToMath.OnTick();              OnTickOriginal(); }


#define OnTester       OnTesterOriginal
#define OnTick         OnTickOriginal
#define OnTesterInit   OnTesterInitOriginal
#define OnTesterDeinit OnTesterDeinitOriginal
#define OnTesterPass   OnTesterPassOriginal


 
Enrique Dangeroux #:
Я использую следующие библиотеки в одном советнике:

-MT4Orders
-Virtual
-BestInterval
-EAtoMath

Я постоянно сталкиваюсь с ошибками/предупреждениями при переопределении макросов. Приведённый ниже код устранил все ошибки, однако избавиться от предупреждений не удаётся.

Есть ли требование размещать включения в определённом порядке?

Вот такая последовательность у меня не вызывает конфликтов.

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define ORDER_COMMISSION 0 // Задание комиссии (OrderCommission() = OrderLots() * (ORDER_COMMISSION)), включая динамический вариант.
#include <fxsaber\EAToMath\EAToMath.mqh> // https://www.mql5.com/ru/code/61283

#define BESTINTERVAL_ONTESTER // Критерий оптимизации - прибыль лучшего интервала.
#include <fxsaber\BestInterval\BestInterval.mqh> // https://www.mql5.com/ru/code/22710

void OnTick() {}
double OnTester() { return(0); }


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

В BestInterval.mqh заменить код, что закомментирован, на код, что ниже.


1.

/*
#ifdef OnTester
  #undef OnTester
#endif // OnTester 
*/

#ifdef OnTester
  #ifndef __EATOMATH__
    #undef OnTester
  #endif // #ifndef __EATOMATH__
#endif // OnTester


2.

/*
#define OnTester OldOnTester3
*/

#ifdef OnTester
  #ifdef __EATOMATH__    
    #define OnTesterOriginal_EAToMath OldOnTester3 //OnTesterOriginal_BestInterval
  #else // #ifdef __EATOMATH__
    #define OnTester OldOnTester3 // OnTesterOriginal_BestInterval  
  #endif // #ifdef __EATOMATH__ #else
#else // #ifdef OnTick
  #define OnTester OldOnTester3 // OnTesterOriginal_BestInterval
#endif // #ifdef OnTick #else


3.

/*
#define OnTick OldOnTick2
*/

#ifdef OnTick
  #ifdef __EATOMATH__    
    #define OnTickOriginal_EAToMath OldOnTick2 // OnTickOriginal_BestInterval
  #else // #ifdef __EATOMATH__
    #define OnTick OldOnTick2 // OnTickOriginal_BestInterval  
  #endif // #ifdef __EATOMATH__ #else
#else // #ifdef OnTick
  #define OnTick OldOnTick2 // OnTickOriginal_BestInterval
#endif // #ifdef OnTick #else