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

 
fxsaber #:
режиме в виртуальном окружении индикаторные советники будут тоже работать.
Как бы вы, автор, это реализовали? Нужно ли реализовывать функции типа CopyClose, iBarShift, iOpen и т.д.? Как заставить индикатор работать в виртуальной среде наиболее ресурсосберегающим и быстрым способом?
 
hini #:
Как бы вы, автор, это реализовали? Нужно ли реализовывать функции типа CopyClose, iBarShift, iOpen и т.д.? Как заставить индикатор работать в виртуальной среде наиболее ресурсосберегающим и быстрым способом?
Я бы не делал это в мат. режиме. А в обычном торговом режиме просто торговать в виртуале.
 
fxsaber #:
Я бы не делал это в мат. режиме. А в обычном торговом режиме просто торговать в виртуале.
Тогда в математическом режиме нет возможности тестировать стратегии, использующие индикаторы.
 
hini #:
Тогда в математическом режиме нет возможности тестировать стратегии, использующие индикаторы.
Верно.
 
Добавлены бары.
#define EATOMATH_RATES _RATES(RatesM1, 100, PERIOD_M1) // Добавление баров.
#include <fxsaber\EAToMath\EAToMath.mqh> // https://www.mql5.com/ru/code/61283

void OnTick()
{
  MqlRates Rates[];
  
  if ((RatesM1.Copy(0, 5, Rates) > 0) && // Получили пять свежих баров.
      (!MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_VISUAL_MODE)))
    ArrayPrint(Rates);  
}

double OnTester() { return(AccountInfoDouble(ACCOUNT_BALANCE)); }



Можно одновременно добавлять несколько таймфреймов.

#define EATOMATH_RATES            \
  _RATES(RatesM1, 100, PERIOD_M1) \
  _RATES(RatesH1, 100, PERIOD_H1) \
  _RATES(RatesD1, 100, PERIOD_D1)
#include <fxsaber\EAToMath\EAToMath.mqh> // https://www.mql5.com/ru/code/61283


В примере 100 - это количество последних баров.

 
fxsaber #:
Добавлены бары.
Насколько сильно включение этой функции повлияет на производительность?
 
hini #:
Насколько сильно включение этой функции повлияет на производительность?
У этого советника есть такая функция.
bool GetHighLow( MqlRates &Rates, const int NumBar = 1 )
{
#ifdef EATOMATH_RATES // _RATES(RatesD1, 2, PERIOD_D1)
  const bool Res = RatesD1.Copy(NumBar, Rates); // https://www.mql5.com/ru/forum/490718/page11#comment_59389352
#else // #ifdef EATOMATH_RATES
  MqlRates TmpRates[1];

  const bool Res = (CopyRates(_Symbol, PERIOD_D1, NumBar, 1, TmpRates) > 0);

  if (Res)
    Rates = TmpRates[0];
#endif // #ifdef EATOMATH_RATES #else

  return(Res);
}


И еще этот кусок.

void OnTick()
{
  static MqlRates Rates;

  const datetime CurTime = TimeCurrent();
  const int Total = OrdersTotal();

#ifdef EATOMATH_RATES
  static const datetime NullTime = (CurTime / (24 * 3600) + 1) * (24 * 3600); if (CurTime < NullTime) return;
#endif // #ifdef EATOMATH_RATES
// ....


Смысл сравнивать только не в мат. режиме.


EATOMATH_RATES выключен.

2026.03.13 23:56:52   [2026.03.17 17:09:13.167] EAToMath.mqh 1382: XAUUSD: 2025.01.01 - 2026.03.14, 1 Year 2 Months 13 Days, 62 078 689 ticks.
2026.03.13 23:56:52   [2026.03.17 17:09:13.167] EAToMath.mqh 1387: TotalTime = 00:00:17.998, Performance = 3.45 Ticks (millions)/sec.


EATOMATH_RATES включен.

2026.03.13 23:56:52   [2026.03.17 17:10:47.259] EAToMath.mqh 1382: XAUUSD: 2025.01.01 - 2026.03.14, 1 Year 2 Months 13 Days, 62 078 689 ticks.
2026.03.13 23:56:52   [2026.03.17 17:10:47.259] EAToMath.mqh 1387: TotalTime = 00:00:16.841, Performance = 3.69 Ticks (millions)/sec.


Возможно, в других сценариях разница будет заметнее.

Препарируем торговый советник - 2.
Препарируем торговый советник - 2.
  • 2026.03.16
  • www.mql5.com
На этот раз для исследования возьмем советник второго по продаваемости (в этом месяце)  автора в Маркете. В режиме по реальным тикам он выглядит так. TesterReport показывает сильное влияние
 
fxsaber #:


EATOMATH_RATES выключен.

EATOMATH_RATES включен.

Возможно, в других сценариях разница будет заметнее.

Странное сравнение - получается, что накладные расходы на создание временного массива структур MqlRates (на каждом вызове, т.к. не static) и копирование элемента при отключенном EATOMATH_RATES ухудшает производительность по сравнению с включенным EATOMATH_RATES. А вопрос наверно был про то, насколько EATOMATH_RATES замедляет код по сравнению, когда нет альтернативных накладных расходов.
 
Stanislav Korotky #:
ухудшает производительность по сравнению с включенным EATOMATH_RATES.
Там погрешность (иногда огромная).
 
Stanislav Korotky #:
насколько EATOMATH_RATES замедляет код по сравнению, когда нет альтернативных накладных расходов.
Отвечать будет этот советник.
#property tester_no_cache

#define EATOMATH_ONLY_SYMBOLINFOTICK       // Не создается виртуальное окружение - только SymbolInfoTick

#define EATOMATH_RATES _RATES(RatesM1, PERIOD_M1)
#define RATES_SPREAD_OFF // https://www.mql5.com/ru/forum/505987/page10#comment_59402020
#include <fxsaber\EAToMath\EAToMath.mqh> // https://www.mql5.com/ru/code/61283

sinput uint inStartBar = 0;
sinput uint inCountBar = 1;
sinput uint inMaxAmountCalc = 5;
input int inRange = 0;

double gSum = 0;

double GetSum( const MqlRates &Rates )
{
  return(Rates.open + Rates.high + Rates.low + Rates.close);
}

void OnTick()
{
  static const datetime NullTime = (TimeCurrent() / (24 * 3600) + 1) * (24 * 3600); if (TimeCurrent() < NullTime) return;  
  
  static MqlRates Rates[];
  
#ifdef EATOMATH_RATES
  const int Size = RatesM1.Copy(inStartBar, inCountBar, Rates);
#else // #ifdef EATOMATH_RATES
  const int Size = CopyRates(_Symbol, PERIOD_M1, inStartBar, inCountBar, Rates);
#endif // #ifdef EATOMATH_RATES #else

  // Вычисляем не более inMaxAmountCalc баров.
  for (int i = MathMax(Size - (int)inMaxAmountCalc, 0); i < Size; i++)
    gSum += GetSum(Rates[i]);
}

double OnTester() { return(gSum); }


Берем длительность (в секундах) самого короткого выполнения оптимизационного прохода - из штатного лога оптимизатора.

 inCountBar Без EAToMath.mqh EAToMath.mqh EAToMAth.mqh+EATOMATH_RATES EAToMAth.mqh, мат. режим
 1 2.222 2.861 2.730 0.651
 5 2.471
3.089
3.051
1.009
 10 2.674
3.269
3.529
1.329
 15 2.803
3.438
3.666
1.612
 50 4.340
5.023
4.651

2.508

 100 6.559 7.222 6.063  3.993

Действительно, по какой-то причине включение EATOMATH_RATES ускоряет работу с барами при задействованном EAToMath.mqh. Это происходит на очень малых значениях запрашиваемых баров, и на больших.

Ну и при больших inCountBars скорость выше, чем у чистого CopyRates без чего-либо.


Результаты самого правого столбца предсказуемы - мат. режим.