Ter o problema da Moving Average com fio enquanto criava a EA. - página 3

 
angreeee:
notei novamente, mesmo quando eu o executei a partir de 2009 na data atual (04.2014), a diferença entre o MA no gráfico e o ima no backtest ainda é de 0,10, então acho que a questão persiste. Farei minha própria função de substituição do iMa se todas as outras falharem. icustom ainda retorna apenas zeros no gráfico D1 mesmo a partir de 2009 e funcionando bem no gráfico H4.
Confirmei anteriormente que há um problema com o modo SMMA, acho que você já relatou isso ao Service Desk ? Outros modos me parecem bem.
 

analisando como funciona o indicador demédia móvel personalizado eu entendo porque existem problemas como esse.

Cada média móvel é contada de forma não crua contando o próximo quadro de média móvel do quadro anterior de média móvel em vez de apenas contar os quadros necessários (neste caso 370) para a equação. Dessa forma, se 1 quadro de MA estiver incorreto, tudo o que se segue será também. Quanto mais longe do quadro de erro, menor será o erro. Poderia até funcionar corretamente se todos os quadros desde o início fossem contados corretamente, mas notei algumas vezes que o iMA no início reporta zeros (tenho um procedimento para descartar leituras erradas de MA, mas o próprio iMA não o faz) e esses zeros provavelmente também são levados em consideração ao contar os próximos quadros do iMA a partir dos quadros anteriores do iMA.
É por isso que quando comecei os testes anteriores em 2013 a diferença era maior, em 2012 era menor do que quando comecei em 2013, start=2011 ainda menor, e assim por diante. A diferença ainda era visível mesmo quando comecei os back-testes a partir de 2009, portanto é um problema sério.

 
angevoyageur:
Confirmei anteriormente que há um problema com o modo SMMA, acho que você já relatou isso ao Service Desk ? Outros modos me parecem bem.

im terminei de escrever meu próprio procedimento de substituição do iMA para que eu possa documentar e entender completamente o assunto. (não apenas por comparação visual, como feito neste tópico).

Os resultados do ima, minha substituição ima e os resultados médios móveis personalizados estarão disponíveis no log para comparação.

PS. Se você confirmar o erro, estou relatando agora. (acrescentarei um novo comentário neste tópico quando o problema for relatado). O site (ou minha internet) funciona muito lentamente no momento, então estou tendo problemas até mesmo para chegar à página do Service Desk.
 
ok, é relatado.
 

Pensei que outros tipos de MA também fossem afetados, mas fiz mais testes e o SSMA parece ser o único afetado, como você disse.

mas notei o problema do iCustom. Roteiro para testar os problemas do SSMA e do iCustom:

#property version     "1.1"
#property description "MA TEST"

#include <Trade/Trade.mqh>

   #define  MAGICMA  20131002

double Bid;
double Ask;

   int ma_temp;
   int custom_ma_temp;
   double ma_buffer[20];
   double ima2_buffer[510];
   double ima2[510];

input int ma_period = 370;
input ENUM_TIMEFRAMES ma_tf = PERIOD_D1;
input ENUM_MA_METHOD ma_method = MODE_SMMA;
input ENUM_APPLIED_PRICE ma_price = PRICE_OPEN;
   
   
   
double OnTester()
{
    double custommax = TesterStatistics(STAT_EQUITY_DDREL_PERCENT);
    return (custommax);
}
   CTrade  trade;
   
  void OnTick()
  {
   MqlTick last_tick;
   if(SymbolInfoTick(Symbol(),last_tick))
     {
      Bid = last_tick.bid;
      Ask = last_tick.ask;
     }
   start();
  }
  
int OnInit()
  {
   trade.SetExpertMagicNumber(MAGICMA);
   int deviation=99;
   trade.SetDeviationInPoints(deviation);
   trade.SetAsyncMode(false);

   return(0);
  }  
  
      
      
      
void trend1()
{

   double ma;

   ma_temp=iMA(Symbol(),ma_tf,ma_period,0,ma_method,ma_price);
   CopyBuffer(ma_temp,0,0,1,ma_buffer);
   ma=ma_buffer[0];
   Alert("ma=", ma);

   custom_ma_temp=iCustom(Symbol(),ma_tf,"Examples\\Custom Moving Average", ma_period, 0, ma_method,ma_price);
   CopyBuffer(custom_ma_temp,0,0,1,ma_buffer);
   ma=ma_buffer[0];  
   Alert("custom ma=", ma);

}

      


void start()
{
         trend1();
}
Arquivos anexados:
 
angreeee:

analisando como funciona o indicador de média móvel personalizado eu entendo porque existem problemas como esse.

Cada média móvel é contada de forma não crua contando o próximo quadro de média móvel do quadro anterior de média móvel em vez de apenas contar os quadros necessários (neste caso 370) para a equação. Dessa forma, se 1 quadro de MA estiver incorreto, tudo o que se segue será também. Quanto mais longe do quadro de erro, menor será o erro. Poderia até funcionar corretamente se todos os quadros desde o início fossem contados corretamente, mas notei algumas vezes que o iMA no início reporta zeros (tenho um procedimento para descartar leituras erradas de MA, mas o próprio iMA não o faz) e esses zeros provavelmente também são levados em consideração ao contar os quadros seguintes do iMA a partir dos quadros anteriores do iMA.
É por isso que quando comecei os testes anteriores em 2013 a diferença era maior, em 2012 era menor do que quando comecei em 2013, start=2011 ainda menor, e assim por diante. A diferença ainda era visível mesmo quando comecei os back-testes a partir de 2009, portanto é um problema sério.

Eu não vejo o problema. O iMA está bem codificado para o desempenho. Se um iMA informa um 0, é porque você não tem dados (ou dados suficientes). A propósito, existe apenas um problema com o SMMA, não sei por quê, mas não pode ser devido a esta implementação "incremental", pois está funcionando bem para outro modo.
 
angevoyageur:
I don't see the problem. iMA is well coded for performance. If an iMA report a 0 it's because you don't have data (or enough data). By the way there is only a problem with SMMA, I don't know why, but it cannot be due to this "incremental" implementation as it's working well for other mode.

Sim, você está certo, seria muito mais lento. Mas o fato é que esta forma de contar mais alguns quadros vazios (zeros) no início resultaria em problemas como este. (é por isso que o iMA SSMA é sempre menor, não maior do que o SSMA acual) Eu sei que eu não verifico o que o iMA retorna, é por isso que eu recebo zeros no início ao invés de lidar corretamente com a falta de informações necessárias, mas essa é uma questão diferente.

Com TFs menores, há muito mais quadros analisados e o problema pode ser diluído com o tempo. A cada novo quadro o ima SSMA se aproxima cada vez mais do verdadeiro SSMA, então quanto mais barras passam, menos visível é o problema, é por isso que acho que ninguém notou isso antes. O mesmo problema que eu encontrei com 370 SSMA e PERÍODO_12H PERÍODO_8H, etc.

Se você tiver tempo, por favor, verifique a função iCustom. Eu anexei o código fonte para testá-lo facilmente. Verifique qualquer TF inferior que o PERIOD_D1 - iCustom funciona bem e retorne os mesmos valores que o iMA. No PERIOD_D1 são sempre zeros para iCustom, enquanto o iMA ainda reporta alguns valores.

O curioso é que quando você usa SSMA no máximo PERIOD_H12 tanto iMA como iCustom indicador de "média móvel personalizada" relatam valores defeituosos. (teste a partir de 2014.01 para ver a diferença)

O erro tem que estar em algum lugar aqui: (formar média móvel personalizada)

void CalculateSmoothedMA(int rates_total,int prev_calculated,int begin,const double &price[])
  {
   int i,limit;
//--- first calculation or number of bars was changed
   if(prev_calculated==0)
     {
      limit=InpMAPeriod+begin;
      //--- set empty value for first limit bars
      for(i=0;i<limit-1;i++) ExtLineBuffer[i]=0.0;
      //--- calculate first visible value
      double firstValue=0;
      for(i=begin;i<limit;i++)
         firstValue+=price[i];
      firstValue/=InpMAPeriod;
      ExtLineBuffer[limit-1]=firstValue;
     }
   else limit=prev_calculated-1;
//--- main loop
   for(i=limit;i<rates_total && !IsStopped();i++)
      ExtLineBuffer[i]=(ExtLineBuffer[i-1]*(InpMAPeriod-1)+price[i])/InpMAPeriod;
//---
  }


Observe que o primeiro valor é contado da mesma forma que no procedimento SMA:

void CalculateSimpleMA(int rates_total,int prev_calculated,int begin,const double &price[])
  {
   int i,limit;
//--- first calculation or number of bars was changed
   if(prev_calculated==0)// first calculation
     {
      limit=InpMAPeriod+begin;
      //--- set empty value for first limit bars
      for(i=0;i<limit-1;i++) ExtLineBuffer[i]=0.0;
      //--- calculate first visible value
      double firstValue=0;
      for(i=begin;i<limit;i++)
         firstValue+=price[i];
      firstValue/=InpMAPeriod;
      ExtLineBuffer[limit-1]=firstValue;
     }
   else limit=prev_calculated-1;
//--- main loop
   for(i=limit;i<rates_total && !IsStopped();i++)
      ExtLineBuffer[i]=ExtLineBuffer[i-1]+(price[i]-price[i-InpMAPeriod])/InpMAPeriod;
//---
  }

como primeiro valor = (x1 + x2 + x3 + ... + xn) / n

que é a equação "bruta" para a média móvel simples, mas não a média móvel alisada

talvez seja essa a razão da questão?

 

desse site:

https://mahifx.com/indicators/smoothed-moving-average-smma

O primeiro valor para a Média Móvel Suavizada é calculado como uma Média Móvel Simples (SMA):

SOMA1=SUM (FECHAR, N)

SMMA1 = SOMA1/ N

A segunda e subsequentes médias móveis são calculadas de acordo com esta fórmula:

SMMA (i) = (SUM1 - SMMA1+CLOSE (i))/ N

Onde:

SUM1 - é a soma total dos preços de fechamento para N períodos;
SMMA1 - é a média móvel suavizada da primeira barra;
SMMA (i) - é a média móvel suavizada da barra atual (exceto a primeira barra);
CLOSE (i) - é o preço de fechamento atual;
N - é o período de alisamento.

Portanto, acho que o iMa e as médias móveis personalizadas o fazem da maneira correta. Mas cálculos como esse produzem os erros que encontramos resultando em enormes diferenças, dependendo dos períodos testados. É totalmente inaceitável para uma EA que está baseando seus negócios na média móvel. Acho que terei que eliminar o Smoothed MA por esse motivo do meu EA, pois ele produz resultados errados durante os testes de retaguarda. Mesmo que teste a partir do ano 2000 e acerte, os clientes podem testar a partir de 2013 e dizer "ele elimina a conta", porque eles receberão outro SSMA além do que eu recebi.

Mais uma cotação:
A SMMA dá aos preços recentes um peso igual aos preços históricos. O cálculo leva em conta todas as séries de dados disponíveis em vez de se referir a um período fixo.

É por isso que é diferente a cada vez que o período de testes de retaguarda muda.

Indicators
Indicators
  • mahifx.com
Moving averages are commonly used to identify trends and reversals as well as identifying support and resistance levels. Moving averages such the WMA and EMA, which are more sensitive to recent prices (experience less lag with price) will turn before an SMA. They are therefore more suitable for dynamic trades, which are reactive to short term...
 
angreeee:

Por favor, não responda dentro da citação. Como você vê, quando eu quero citar você, agora está vazia.

O algoritmo é bom para a SMMA, você tem que começar em algum lugar. Mas você aponta a origem do problema, já que o SMMA é construído sobre o valor anterior, é sensível à condição de início. Como você não tem a mesma vela de partida em um gráfico ao vivo e com o testador de estratégia que explica os diferentes valores.

O mesmo se aplica à EMA, depois de uma segunda verificação (em D1) agora também tenho valores diferentes, como para o SMMA.

 
angreeee:

desse site:

https://mahifx.com/indicators/smoothed-moving-average-smma

O primeiro valor para a Média Móvel Suavizada é calculado como uma Média Móvel Simples (SMA):

SOMA1=SUM (FECHAR, N)

SMMA1 = SOMA1/ N

A segunda e subsequentes médias móveis são calculadas de acordo com esta fórmula:

SMMA (i) = (SUM1 - SMMA1+CLOSE (i))/ N

Onde:

SUM1 - é a soma total dos preços de fechamento para N períodos;
SMMA1 - é a média móvel suavizada da primeira barra;
SMMA (i) - é a média móvel suavizada da barra atual (exceto a primeira barra);
CLOSE (i) - é o preço de fechamento atual;
N - é o período de alisamento.

Portanto, acho que o iMa e as médias móveis personalizadas o fazem da maneira correta. Mas cálculos como esse produzem os erros que encontramos resultando em enormes diferenças, dependendo dos períodos testados. É totalmente inaceitável para uma EA que está baseando seus negócios na média móvel. Acho que terei que eliminar o Smoothed MA por esse motivo do meu EA, pois ele produz resultados errados durante os testes de retaguarda. Mesmo que teste a partir do ano 2000 e acerte, os clientes podem testar a partir de 2013 e dizer "ele elimina a conta", porque eles receberão outro SSMA além do que eu recebi.

Obrigado pelo link. Isso confirma meu post anterior. É muito interessante, pois nunca presto atenção a tais coisas.

Ao verificar o algoritmo do EMA também é sensível a tal questão, não sei por que meu primeiro teste obteve os mesmos valores.

Razão: