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

 

Я обновил библиотеку BestInterval. Внесенные изменения также уточнили, что BestInterval необходимо включать ПОСЛЕ MathtoEA, а не ПЕРЕД ней, как это было раньше. Это привело к тому, что предупреждение стало ошибкой.

Приведенный ниже код компилируется только со строкой, выделенной желтым цветом.

#define EATOMATH_FULL_CONTROL       // Custom OnT functions.
#define OnTickOriginal_EAToMath    OnTickOriginal
 #include <fxsaber\EAToMath\EAToMath.mqh> // https://www.mql5.com/ru/code/61283

EATOMATH EAToMath;

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

double  OnTester () { EAToMath.OnTester (); return (OnTesterOriginal()); }
 void  OnTick () { EAToMath.OnTick (); }
#define OnTester OnTesterOriginal
 #define OnTick OnTickOriginal
 #define OnTesterInit OnTesterInitOriginal

//#define BESTINTERVAL_ONTESTER // Optimization criterion - profit of the best interval. 
//#include <fxsaber\BestInterval\BestInterval.mqh>

void OnTick() {}
double   OnTester () { return ( 1 ); } // Your original function.
int OnTesterInit() { return(INIT_SUCCEEDED); } // Ваша оригинальная функция.

При использовании параметра BestInterval эта желтая строка конфликтует (предупреждение) с патчем #3 и переопределениями для EATOMATH_FULL_CONTROL, как показано на скриншоте ниже.

Я пытался отладить причину, однако, несмотря на все макросы и переопределения, я в растерянности. Можете ли вы привести рабочий пример EAToMath + EATOMATH_FULL_CONTROL + BestInterval?

 
Enrique Dangeroux #:

EAToMath + EATOMATH_FULL_CONTROL

Используете этот режим, чтобы можно было пользоваться своей функцией OnTesterInit?
 
fxsaber #:
Are you using this mode so that you can use your OnTesterInit function?
Да, OnTest*, и самое главное, OnTesterPass.
 

Я "решил" проблему, отказавшись от использования параметра BestInterval в режиме BESTINTERVAL_ONTESTER и вручную рассчитав оптимальный интервал согласно приведенному ниже коду. Не знаю, почему я не догадался об этом раньше. Это решает проблему с режимами onTick и OnTester и работает так же хорошо.

double OnTester ()
  {
  
    BESTINTERVAL BestInterval; 

    VIRTUAL::SelectByHandle(1);   // 1 == EAToMath virtual

    int total = OrdersHistoryTotal();  // MT4Orders history count
    if (total <= 0)
    {
       Print("No virtual orders in history");
       return 0;
    }
    
    DEAL dDeals[];
    ArrayResize(dDeals, total);
    
    int amount = 0;
    for (int i = 0; i < total; i++)
    {
       if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
          continue; // failed to select
   
       DEAL deal;
    
       deal.Profit = OrderProfit() + OrderSwap() + OrderCommission();
    
       deal.OpenTime = (datetime)OrderOpenTime();

       deal.Lots = OrderLots();
    
       dDeals[amount++] = deal;
    }

    ArrayResize(dDeals, amount);

    BestInterval.Set(dDeals);
  
    Print (BestInterval.ToString());    
    const  int AmountIntervals = 1 ; // How many worst trading intervals to discard
  
    for ( int i = 0 ; i < AmountIntervals; i++)
      if (BestInterval.DeleteWorseInterval()) // If something was thrown out 
       Print (BestInterval.ToString());        // Print the received trade data 
     else 
       break ;   
       
}
 
Enrique Dangeroux #:

Можете ли вы привести рабочий пример EAToMath + EATOMATH_FULL_CONTROL + BestInterval?

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

#define EATOMATH_FULL_CONTROL      // Самостоятельное прописывание OnT-функций.
#include <fxsaber\EAToMath\EAToMath.mqh> // https://www.mql5.com/ru/code/61283

EATOMATH EAToMath;

int OnTesterInit() { return(EAToMath.OnTesterInit() || OnTesterInitOriginal_EAToMath()); }
void OnTesterDeinit() { EAToMath.OnTesterDeinit(); }
void OnTesterPass() { /* EAToMath.OnTesterPass(); */ OnTesterPassOriginal_EAToMath(); }

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

// #define
#define OnTester OnTesterOriginal_EAToMath
#define OnTick OnTickOriginal_EAToMath

// https://www.mql5.com/ru/forum/490718/page10#comment_58697873
#define OnTesterInit OnTesterInitOriginal_EAToMath
#define OnTesterPass OnTesterPassOriginal_EAToMath

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

// Originals
void OnTick() {}
double OnTester() { return(0); }
int OnTesterInit() { return(INIT_SUCCEEDED); }
void OnTesterPass() {}