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

 
Rashid Umarov:

PS Все таки прогнал стандартный MACD Sample на USDJPY M30 2017.02.01-2018.01.18  "Все тики" (как в статье) MetaQuotes-Demo.

Как можно уложиться в 8 секунд? Тем более в 1 секунду?

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

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

fxsaber, 2018.01.26 11:06

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

 
Rashid Umarov:
Серьезно? Когда вы заявите что нашли ошибку или проблему в моей статье за которую мне заплатили деньги, я обязательно это проверю. А пока давайте без "давайте". Потому что от вас сейчас это выглядит как откровенное заступничество
 
fxsaber:

Сделал MACD SaMple из поставки на ваших настройках. А откуда EURO в балансе, не в этом ли дело?

И время тестирования все таки значительно превышает ваше.

2018.01.26 13:34:10.520 Core 1  authorized (agent build 1755)
2018.01.26 13:34:10.522 Tester  EURUSD,M1 (MetaQuotes-Demo): testing of Experts\Examples\MACD\MACD Sample.ex5 from 2017.09.01 00:00 to 2018.01.26 00:00

2018.01.26 13:34:16.792 Core 1  EURUSD,M1 (MetaQuotes-Demo): generating based on real ticks
2018.01.26 13:34:16.792 Core 1  EURUSD,M1: testing of Experts\Examples\MACD\MACD Sample.ex5 from 2017.09.01 00:00 to 2018.01.26 00:00 started with inputs:
2018.01.26 13:34:16.792 Core 1    InpLots=0.1
2018.01.26 13:34:16.792 Core 1    InpTakeProfit=50
2018.01.26 13:34:16.792 Core 1    InpTrailingStop=30
2018.01.26 13:34:16.792 Core 1    InpMACDOpenLevel=3
2018.01.26 13:34:16.792 Core 1    InpMACDCloseLevel=2
2018.01.26 13:34:16.792 Core 1    InpMATrendPeriod=26


2018.01.26 13:25:46.482 Core 1  final balance 10168.90 USD
2018.01.26 13:25:46.482 Core 1  EURUSD,M1: 9753093 ticks, 147480 bars generated. Environment synchronized in 0:00:02.610. 
Test passed in 0:00:19.062 (including ticks preprocessing 0:00:02.078).
2018.01.26 13:25:46.482 Core 1  EURUSD,M1: total time from login to stop testing 0:00:21.672 (including 0:00:02.610 for history data synchronization)
2018.01.26 13:25:46.482 Core 1  600 Mb memory used including 44 Mb of history data, 256 Mb of tick data
 

На временном промежутке из статьи, на EURUSD,M30 и USDJPY,M30

MACD Sample One value at a time.mq5:

final balance 100180.01 USD
EURUSD,M30: 26390728 ticks, 12510 bars generated. Environment synchronized in 0:00:00.125. Test passed in 0:00:41.016 (including ticks preprocessing 0:00:02.328).
EURUSD,M30: total time from login to stop testing 0:00:41.141 (including 0:00:00.125 for history data synchronization)
756 Mb memory used including 1.88 Mb of history data, 512 Mb of tick data

final balance 99523.31 USD
USDJPY,M30: 29801706 ticks, 11837 bars generated. Environment synchronized in 0:00:00.032. Test passed in 0:01:00.937 (including ticks preprocessing 0:00:02.735).
USDJPY,M30: total time from login to stop testing 0:01:00.969 (including 0:00:00.032 for history data synchronization)
819 Mb memory used including 1.88 Mb of history data, 576 Mb of tick data


MACD Sample 4 to 5 MQL4 style.mq5:

final balance 100192.51 USD
EURUSD,M30: 26390728 ticks, 12510 bars generated. Environment synchronized in 0:00:00.140. Test passed in 0:01:37.969 (including ticks preprocessing 0:00:02.329).
EURUSD,M30: total time from login to stop testing 0:01:38.109 (including 0:00:00.140 for history data synchronization)
755 Mb memory used including 1.88 Mb of history data, 512 Mb of tick data

final balance 99550.10 USD
USDJPY,M30: 29801706 ticks, 11837 bars generated. Environment synchronized in 0:00:00.031. Test passed in 0:01:51.328 (including ticks preprocessing 0:00:02.500).
USDJPY,M30: total time from login to stop testing 0:01:51.359 (including 0:00:00.031 for history data synchronization)
819 Mb memory used including 1.88 Mb of history data, 576 Mb of tick data

Время тестов отличается в два раза. И это ни как не 8 или 1 секунда. 

Если сравнить балансы - то да, различия есть небольшое в цифрах, но на графике это не заметно.

 
Vasiliy Sokolov:

На самом деле здесь видится описание этой темы немного в иной плоскости:

  • Уже написаны тысячи индикаторов, доступ к которым осуществляется через iCustom c выделением соответствующих буферов/хендлов и проч. проч. Это медленная и ресурсоемкая история;
  • Индикатор может быть реализован в виде чистой функции внутри эксперта - нужное значение в этом случае будет рассчитываться гораздо быстрей и требовать меньше памяти.

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

Попробуйте, интересно посмотреть - стоит ли овчинка выделки. Хотелось бы подхода такого типа - выдираем из индикатора OnCalculate, слегка модифицируем под новым именем, добавляем в код индикатора и теперь можем дергать эту функцию как бибилиотечную, передавая в неё параметры из советника. Так?
 
Rashid Umarov:
...Хотелось бы подхода такого типа - выдираем из индикатора OnCalculate, слегка модифицируем под новым именем, добавляем в код индикатора и теперь можем дергать эту функцию как бибилиотечную, передавая в неё параметры из советника. Так?
Нужно подумать над реализацией. Сейчас сложно сказать как это может быть.
 
Rashid Umarov:
Попробуйте, интересно посмотреть - стоит ли овчинка выделки. Хотелось бы подхода такого типа - выдираем из индикатора OnCalculate, слегка модифицируем под новым именем, добавляем в код индикатора и теперь можем дергать эту функцию как бибилиотечную, передавая в неё параметры из советника. Так?

Делал так для iRSIOnArray(), которой нет в mql5. В индикаторе работает. Для вызова из советника нужно делать всё же не так в лоб.

//+------------------------------------------------------------------+
//| Relative Strength Index on array                                 |
//+------------------------------------------------------------------+
template<typename T>
int RSIOnArray(const int rates_total,
               const int prev_calculated,
               const int begin,
               const int period,
               const T &price[],
               double &buffer_pos[],
               double &buffer_neg[],
               double &buffer_rsi[])
  {
   int   i;
   T     diff;
//--- check for rates count
   if(period<1 || rates_total-begin<period) return(0);
//--- save as_series flags
   bool as_series_price=ArrayGetAsSeries(price);
   bool as_series_rsi=ArrayGetAsSeries(buffer_rsi);
   if(as_series_price)
      ArraySetAsSeries(price,false);
   if(as_series_rsi)
     {
      ArraySetAsSeries(buffer_rsi,false);
      ArraySetAsSeries(buffer_pos,false);
      ArraySetAsSeries(buffer_neg,false);
     }
//--- preliminary calculations
   int pos=prev_calculated-1;
   if(pos<=period)
     {
      //--- first RSIPeriod values of the indicator are not calculated
      buffer_rsi[0]=0.0;
      buffer_pos[0]=0.0;
      buffer_neg[0]=0.0;
      T SumP=0.0;
      T SumN=0.0;
      for(i=1; i<=period; i++)
        {
         buffer_rsi[i]=0.0;
         buffer_pos[i]=0.0;
         buffer_neg[i]=0.0;
         diff=price[i]-price[i-1];
         SumP+=(diff>0 ? diff : 0);
         SumN+=(diff<0 ?-diff : 0);
        }
      //--- calculate first visible value
      buffer_pos[period]=double(SumP/period);
      buffer_neg[period]=double(SumN/period);
      
      buffer_rsi[period]=100.0-(100.0/(1.0+buffer_pos[period]/(buffer_neg[period]>0 ? buffer_neg[period] : DBL_MIN)));
      //--- prepare the position value for main calculation
      pos=period+1;
     }
//--- the main loop of calculations
   for(i=pos;i<rates_total && !IsStopped();i++)
     {
      diff=price[i]-price[i-1];
      buffer_pos[i]=(buffer_pos[i-1]*(period-1)+(diff>0.0 ? diff : 0.0))/period;
      buffer_neg[i]=(buffer_neg[i-1]*(period-1)+(diff<0.0 ?-diff : 0.0))/period;
      buffer_rsi[i]=100.0-100.0/(1+buffer_pos[i]/(buffer_neg[i]>0 ? buffer_neg[i] : DBL_MIN));
     }
//--- restore as_series flags
   if(as_series_price) ArraySetAsSeries(price,true);
   if(as_series_rsi)
     {
      ArraySetAsSeries(buffer_rsi,true);
      ArraySetAsSeries(buffer_pos,true);
      ArraySetAsSeries(buffer_neg,true);
     }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Не в этом дело. EUR отсюда


И время тестирования все таки значительно превышает ваше.

2018.01.26 13:34:10.520 Core 1  authorized (agent build 1755)
2018.01.26 13:34:10.522 Tester  EURUSD,M1 (MetaQuotes-Demo): testing of Experts\Examples\MACD\MACD Sample.ex5 from 2017.09.01 00:00 to 2018.01.26 00:00

2018.01.26 13:34:16.792 Core 1  EURUSD,M1 (MetaQuotes-Demo): generating based on real ticks
2018.01.26 13:34:16.792 Core 1  EURUSD,M1: testing of Experts\Examples\MACD\MACD Sample.ex5 from 2017.09.01 00:00 to 2018.01.26 00:00 started with inputs:
2018.01.26 13:34:16.792 Core 1    InpLots=0.1
2018.01.26 13:34:16.792 Core 1    InpTakeProfit=50
2018.01.26 13:34:16.792 Core 1    InpTrailingStop=30
2018.01.26 13:34:16.792 Core 1    InpMACDOpenLevel=3
2018.01.26 13:34:16.792 Core 1    InpMACDCloseLevel=2
2018.01.26 13:34:16.792 Core 1    InpMATrendPeriod=26


2018.01.26 13:25:46.482 Core 1  final balance 10168.90 USD
2018.01.26 13:25:46.482 Core 1  EURUSD,M1: 9753093 ticks, 147480 bars generated. Environment synchronized in 0:00:02.610. 
Test passed in 0:00:19.062 (including ticks preprocessing 0:00:02.078).
2018.01.26 13:25:46.482 Core 1  EURUSD,M1: total time from login to stop testing 0:00:21.672 (including 0:00:02.610 for history data synchronization)
2018.01.26 13:25:46.482 Core 1  600 Mb memory used including 44 Mb of history data, 256 Mb of tick data

Вот мой лог с Вашими настройками

EURUSD,M1 (MetaQuotes-Demo): generating based on real ticks
EURUSD,M1: testing of Experts\Examples\MACD\MACD Sample.ex5 from 2017.09.01 00:00 to 2018.01.26 00:00 started with inputs:
  InpLots=0.10
  InpTakeProfit=50
  InpTrailingStop=30
  InpMACDOpenLevel=3
  InpMACDCloseLevel=2
  InpMATrendPeriod=26

final balance 10000168.90 USD
EURUSD,M1: 9753093 ticks, 147480 bars generated. Environment synchronized in 0:00:00.031. Test passed in 0:00:06.302.
EURUSD,M1: total time from login to stop testing 0:00:06.333 (including 0:00:00.031 for history data synchronization)
571 Mb memory used including 44 Mb of history data, 256 Mb of tick data


Почему у меня в 3.5 раза быстрее выполняется (кеширование убрано перекомпиляцией перед бэктестом) - не знаю. Конфигурация

2018.01.26 11:45:38.151 Terminal        Alpari Limited MT5 x64 build 1755 started (Alpari Limited)
2018.01.26 11:45:38.151 Terminal        Windows 7 Service Pack 1 (build 7601) x64, IE 9, Intel Core i7-2700K  @ 3.50GHz, Memory: 10147 / 16301 Mb, Disk: 3 / 29 Gb, GMT+2

Давайте выяснять причины! Думаю, это очень важно. У меня нет HDD (только SSD). Возможно, в этом дело. Но тогда это ОЧЕНЬ плохо для MT5. Комп очень древний - пять лет точно есть. Поэтому странно.

 
Vladimir Karputov:

Время тестов отличается в два раза. И это ни как не 8 или 1 секунда. 

Покажите строки конфигурации из лога запуска Терминала.

 
fxsaber:

Почему у меня в 3.5 раза быстрее выполняется (кеширование убрано перекомпиляцией перед бэктестом) - не знаю. Конфигурация

Давайте выяснять причины! Думаю, это очень важно. У меня нет HDD (только SSD). Возможно, в этом дело. Но тогда это ОЧЕНЬ плохо для MT5. Комп очень древний - пять лет точно есть. Поэтому странно.

Вот мой комп, никакого  SSD

MetaTrader 5 x64 build 1755 started (MetaQuotes Software Corp.)
Windows 10 (build 16299) x64, IE 11, UAC, Intel Core i7  920 @ 2.67GHz, Memory: 6613 / 12277 Mb, Disk: 156 / 270 Gb, GMT+3

Посмотрел во всех постах - количество тиков совпадает

2018.01.26 13:25:46.482 Core 1  final balance 10168.90 USD
2018.01.26 13:25:46.482 Core 1  EURUSD,M1: 9753093 ticks, 147480 bars generated. Environment synchronized in 0:00:02.610. 
Test passed in 0:00:19.062 (including ticks preprocessing 0:00:02.078).
2018.01.26 13:25:46.482 Core 1  EURUSD,M1: total time from login to stop testing 0:00:21.672 (including 0:00:02.610 for history data synchronization)
2018.01.26 13:25:46.482 Core 1  600 Mb memory used including 44 Mb of history data, 256 Mb of tick data
Причина обращения: