Обсуждение статьи "LifeHack для трейдера: готовим фастфуд из индикаторов" - страница 12

 
fxsaber:

Стандартные индикаторы (только о них речь в статье) кешируются элементарно! Потому что известны все входные параметры.

Тяжело только универсальную хеш-функцию написать. Но в статье она не требовалась. Там простейший случай рассматривается. И даже для него хеш-функция отсутствует.

MACD Sample 4 to 5 MQL4 style.mq5


Без кеширования

i = 0 Pass = 0 OnTester = 15.070 s.: Count = 9753093, 647186.0 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 14.969 s.: Count = 9753093, 651552.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


С тупым кешированием

i = 0 Pass = 0 OnTester = 11.073 s.: Count = 9753093, 880799.5 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 11.007 s.: Count = 9753093, 886080.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


На 25% быстрее, если не мудрить (в лоб). Критика "неэффективности" представленного подхода оправдана.

 
Код покажете?
 
Rashid Umarov:
Код покажете?
template <typename T>
struct HANDLE
{
private:  
  int Handle;
  
  T Inputs;

public:  
  HANDLE() : Handle(INVALID_HANDLE)
  {
  }
  
  bool operator ==( const T &Inputs2 ) const
  {
    return(this.Inputs == Inputs2);
  }
  
  void operator =( const T &Inputs2 )
  {
    this.Inputs = Inputs2;
  }
  
  int GetHandle()
  {
    return((this.Handle != INVALID_HANDLE) ? this.Handle : (this.Handle = this.Inputs.GetHandle()));
  }
};

template <typename T>
int GetHandle( HANDLE<T> &Handles[], const T &Inputs )
{
  const int Size = ArraySize(Handles);
  
  for (int i = 0; i < Size; i++)
    if (Handles[i] == Inputs)
      return(Handles[i].GetHandle());

  ArrayResize(Handles, Size + 1);
  Handles[Size] = Inputs;
  
  return(Handles[Size].GetHandle());
}

struct MACD
{
  string             symbol;
  ENUM_TIMEFRAMES    period;
  int                fast_ema_period;
  int                slow_ema_period;
  int                signal_period;
  ENUM_APPLIED_PRICE applied_price;
  
  MACD( void )
  {
  }
  
  MACD( const string             &isymbol,
        const ENUM_TIMEFRAMES    &iperiod,
        const int                &ifast_ema_period,
        const int                &islow_ema_period,
        const int                &isignal_period,
        const ENUM_APPLIED_PRICE &iapplied_price ) : 
        symbol((isymbol == NULL) || (isymbol == "") ? _Symbol : isymbol),
        period(iperiod == PERIOD_CURRENT ? ::Period() : iperiod),
        fast_ema_period(ifast_ema_period),
        slow_ema_period(islow_ema_period),
        signal_period(isignal_period),
        applied_price(iapplied_price)     
  {
  }
  
  int GetHandle( void ) const
  {
    return(::iMACD(this.symbol, this.period, this.fast_ema_period, this.slow_ema_period, this.signal_period, this.applied_price));
  }
  
  bool operator ==( const MACD &Inputs ) const
  {
    return((this.symbol == Inputs.symbol) &&
           (this.period == Inputs.period) &&
           (this.fast_ema_period == Inputs.fast_ema_period) &&
           (this.slow_ema_period == Inputs.slow_ema_period) &&
           (this.signal_period == Inputs.signal_period) &&
           (this.applied_price == Inputs.applied_price));
  }  
};

struct MA
{
  string             symbol;
  ENUM_TIMEFRAMES    period;
  int                ma_period;
  int                ma_shift;
  ENUM_MA_METHOD     ma_method;
  ENUM_APPLIED_PRICE applied_price;
  
  MA( void )
  {
  }
  
  MA( const string             &isymbol,
      const ENUM_TIMEFRAMES    &iperiod,
      const int                &ima_period,
      const int                &ima_shift,
      const ENUM_MA_METHOD     &ima_method,
      const ENUM_APPLIED_PRICE &iapplied_price ) :
      symbol((isymbol == NULL) || (isymbol == "") ? _Symbol : isymbol),
      period(iperiod == PERIOD_CURRENT ? ::Period() : iperiod),
      ma_period(ima_period),
      ma_shift(ima_shift),
      ma_method(ima_method),
      applied_price(iapplied_price)
  {
  }
  
  int GetHandle( void ) const
  {
    return(::iMA(this.symbol, this.period, this.ma_period, this.ma_shift, this.ma_method, this.applied_price));
  }
  
  bool operator ==( const MA &Inputs ) const
  {
    return((this.symbol == Inputs.symbol) &&
           (this.period == Inputs.period) &&
           (this.ma_period == Inputs.ma_period) &&
           (this.ma_shift == Inputs.ma_shift) &&
           (this.ma_method == Inputs.ma_method) &&
           (this.applied_price == Inputs.applied_price));
  }  
};

// MT5-вариант iMACD.
int iMACD2( const string             symbol,
            const ENUM_TIMEFRAMES    period,
            const int                fast_ema_period,
            const int                slow_ema_period,
            const int                signal_period,
            const ENUM_APPLIED_PRICE applied_price )
{
  static HANDLE<MACD> Handles[];  
  const MACD Inputs(symbol, period, fast_ema_period, slow_ema_period, signal_period, applied_price);
  
  return(GetHandle(Handles, Inputs));
}            

// MT5-вариант iMA.
int iMA2( const string             symbol,
          const ENUM_TIMEFRAMES    period,
          const int                ma_period,
          const int                ma_shift,
          const ENUM_MA_METHOD     ma_method,
          const ENUM_APPLIED_PRICE applied_price )
{
  static HANDLE<MA> Handles[];  
  const MA Inputs(symbol, period, ma_period, ma_shift, ma_method, applied_price);
  
  return(GetHandle(Handles, Inputs));
}            


В IndicatorsMQL4.mqh добавить вышеприведенный код и сделать следующие изменения

   int handle=iMACD2(symbol,timeframe,fast_ema_period,slow_ema_period,signal_period,applied_price);
//...
   int handle=iMA2(symbol,timeframe,ma_period,ma_shift,ma_method,applied_price);
 
Rashid Umarov:
Хотелось бы подхода такого типа - выдираем из индикатора OnCalculate, слегка модифицируем под новым именем, добавляем в код индикатора и теперь можем дергать эту функцию как бибилиотечную, передавая в неё параметры из советника. Так?

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

Надо немного поизгаляться с макросами и прочими особенностями. Все индикаторы такое решение не покроет. Но большинство должно закрыть.

 

Попытка восстановления:

Выкладываю свою версию измерения. За базовую версию советника был взят MACD Sample One value at a 5. В него были внесены небольшие изменения. Т.к. все значения индикаторов собираются в одном месте было не сложно сделать простую макроподстановку: Выводы думаю очевидны: при вызове индикаторов в MQL4 режиме, скорость ниже на 40%.

 
Yuriy Koptsev:


вы посмотрите в /результаты/.. открывается -устанавливается стоп-затем трал перетягивает его


вот смотрите, участок графика. и отчет по этому месту. как же он так при ATR * 0.5 (ATR = 80пп) выставляет стоп в 150 пунктов почти по иным лотам? при такой настройке стоп НИКОГДА не должен быть дальше примерно 40 пунктов от цены открытия лота... и только когда  подтянется выше этого уровня, будет трейлиться по нему уже.
Файлы:
 
Не успел прочесть.
 
Обновились блин....
 
 
Vasiliy Sokolov:

Попытка восстановления:

Выкладываю свою версию измерения. За базовую версию советника был взят MACD Sample One value at a 5. В него были внесены небольшие изменения. Т.к. все значения индикаторов собираются в одном месте было не сложно сделать простую макроподстановку: Выводы думаю очевидны: при вызове индикаторов в MQL4 режиме, скорость ниже на 40%.

Вы можете восстановить (отредактировать) свой пост:

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

Обсуждение статьи "LifeHack для трейдера: готовим фастфуд из индикаторов"

Vasiliy Sokolov, 2018.01.29 10:43

Попытка восстановления:

Выкладываю свою версию измерения. За базовую версию советника был взят MACD Sample One value at a 5. В него были внесены небольшие изменения. Т.к. все значения индикаторов собираются в одном месте было не сложно сделать простую макроподстановку: Выводы думаю очевидны: при вызове индикаторов в MQL4 режиме, скорость ниже на 40%.


- у Вас был красивый код и описание результатов замеров.

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