Discussão do artigo "LifeHack para traders: preparemos "fast-food" de indicadores" - página 8

 
Rashid Umarov:

PS: Executei a amostra padrão do MACD no USDJPY M30 2017.02.01-2018.01.18 "Todos os ticks" (como no artigo) MetaQuotes-Demo.

Como você pode caber em 8 segundos? Especialmente em 1 segundo?

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Discussão do artigo "LifeHack for trader: cozinhar fast food a partir de indicadores"

fxsaber, 2018.01.26 11:06 AM.

Não fiz nada. Execute-o como está. Nos registros acima, todos os dados a serem reproduzidos. Seu resultado deve ser completamente o mesmo que o meu em termos de lucro. E, em termos de desempenho, não muito diferente.

 
Rashid Umarov:
É mesmo? Quando você afirmar que encontrou um erro ou um problema em meu artigo pelo qual fui pago, com certeza vou verificar. Enquanto isso, não vamos dizer "vamos". Porque você está fazendo parecer que está sendo paternalista.
 
fxsaber:

Criou o MACD SaMple a partir da entrega em suas configurações. E de onde vem o EURO no saldo, não é essa a questão?

E o tempo de teste ainda é muito maior do que o seu.

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
 

No período de tempo do artigo, em EURUSD,M30 e 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

O tempo de teste difere duas vezes. E não se trata de 8 ou 1 segundo.

Se você comparar os balanços, sim, há uma pequena diferença nos números, mas ela não é perceptível no gráfico.

 
Vasiliy Sokolov:

Na verdade, a descrição desse tópico é vista aqui em um plano ligeiramente diferente:

  • Milhares de indicadores já foram escritos, acessados via iCustom com alocação de buffers/handles apropriados e assim por diante. Essa é uma história lenta e que consome muitos recursos;
  • Um indicador pode ser implementado como uma função pura dentro de um Expert Advisor - nesse caso, o valor necessário será calculado muito mais rapidamente e exigirá menos memória.

A ideia é escrever algum tipo de interface que permita o acesso unificado a qualquer indicador personalizado , mas se o indicador for implementado como uma função pura separada, a referência será feita a essa função em vez do identificador. Como resultado, obtemos uma boa aceleração e, ao mesmo tempo, não perdemos o acesso a nenhum indicador arbitrário. Esse é um tópico interessante, eu até o abordaria.

Experimente, é interessante ver se vale a pena. Eu gostaria de uma abordagem desse tipo: tiramos OnCalculate do indicador, modificamos um pouco com um novo nome, adicionamos ao código do indicador e agora podemos usar essa função como uma função de bibilio, passando parâmetros do Expert Advisor para ela. Certo?
 
Rashid Umarov:
...Eu gostaria de uma abordagem desse tipo: retiramos OnCalculate do indicador, modificamos ligeiramente com um novo nome, adicionamos ao código do indicador e agora podemos usar essa função como uma função de bibilio, passando parâmetros do Expert Advisor para ela. Certo?
Precisamos pensar na implementação. Agora é difícil dizer como isso pode ser feito.
 
Rashid Umarov:
Experimente, é interessante ver se vale a pena. Eu gostaria de uma abordagem desse tipo: retiramos OnCalculate do indicador, modificamos um pouco com um novo nome, adicionamos ao código do indicador e agora podemos usar essa função como uma função de bibilio, passando parâmetros do Expert Advisor para ela. Certo?

Fiz isso para iRSIOnArray(), que não está no mql5. Ela funciona no indicador. Para chamá-la a partir do Expert Advisor, não é necessário fazer isso de forma tão direta.

//+------------------------------------------------------------------+
//| Índice de Força Relativa na matriz|
//+------------------------------------------------------------------+
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;
//--- verificar a contagem de taxas
   if(period<1 || rates_total-begin<period) return(0);
//--- salvar sinalizadores as_series
   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);
     }
//--- cálculos preliminares
   int pos=prev_calculated-1;
   if(pos<=period)
     {
      //--- os primeiros valores do RSIPeriod do indicador não são calculados
      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);
        }
      //--- calcular o primeiro valor visível
      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)));
      //--- preparar o valor da posição para o cálculo principal
      pos=period+1;
     }
//--- o loop principal de cálculos
   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));
     }
//--- restaurar sinalizadores as_series
   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);
  }
//+------------------------------------------------------------------+
 

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Discussão do artigo "LifeHack para trader: cozinhar fast food a partir de indicadores"

Rashid Umarov, 2018.01.26 11:30 AM

Fiz o MACD SaMple a partir do fornecimento em suas configurações. De onde vem o EURO na balança, não é esse o ponto?

Essa não é a questão. EUR a partir daqui


E o tempo de teste ainda é muito maior do que o seu.

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

Aqui está meu registro com suas configurações

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


Por que é 3,5 vezes mais rápido para mim (o cache foi removido pela recompilação antes do backtest) - eu não sei. Configuração

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-2700 K  @ 3.50 GHz, Memory: 10147 / 16301 Mb, Disk: 3 / 29 Gb, GMT+2

Vamos descobrir os motivos! Acho que isso é muito importante. Não tenho um HDD (somente SSD). Talvez esse seja o problema. Mas isso é MUITO ruim para o MT5. O computador é muito antigo, com certeza tem cinco anos. É por isso que ele é estranho.

 
Vladimir Karputov:

Os tempos de teste são duas vezes mais diferentes. E não se trata de 8 ou 1 segundo.

Mostre as linhas de configuração do registro de inicialização do Terminal.

 
fxsaber:

Não sei por que tenho uma execução 3,5 vezes mais rápida (cache removido pela recompilação antes do backtest). Configuração

Vamos descobrir os motivos! Acho que isso é muito importante. Não tenho um HDD (somente SSD). Talvez esse seja o problema. Mas, nesse caso, isso é MUITO ruim para o MT5. O computador é muito antigo, com certeza tem cinco anos. É por isso que ele é estranho.

Este é o meu computador, sem SSD

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

Dei uma olhada em todas as postagens - o número de ticks é o mesmo

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