Problème de moyenne mobile câblée lors de la création d'une EA...

 

qu'est-ce que je fais mal ?

il y a une capture d'écran d'une partie du code responsable de la moyenne mobile. J'ai remplacé toutes les variables par des valeurs afin que vous puissiez voir les paramètres. L'autre capture d'écran montre la différence dans le dessin de la MA et de l'indicateur MA jeté sur le graphique (ou plutôt les 4 types de ceux-ci).

Le bleu clair est en fait le Smoothed et est loin d'être proche de la MA générée dans le testeur.
La plus proche de la MA générée est Simple, pourtant elle ne correspond pas à celle-ci.

Mais qu'est-ce qui se passe ?

Dossiers :
ma_problem1.png  154 kb
ma_problem2.png  80 kb
 
angreeee:

qu'est-ce que je fais mal ?

il y a une capture d'écran d'une partie du code responsable de la moyenne mobile. J'ai remplacé toutes les variables par des valeurs pour que vous puissiez voir les paramètres. L'autre capture d'écran montre la différence dans le dessin de la MA et de l'indicateur MA jeté sur le graphique (ou plutôt les 4 types de ceux-ci).

Le bleu clair est en fait le Smoothed et est loin d'être proche de la MA générée dans le testeur.
La plus proche de la MA générée est Simple, mais elle ne correspond pas à celle-ci.

Mais qu'est-ce qui se passe ?

Et quelle valeur avez-vous obtenue ? Je ne la vois nulle part.
 
angevoyageur:
Et quelle valeur avez-vous obtenue ? Je ne la vois nulle part.

comparez les 2 fenêtres. celle de gauche est la MA générée par le testeur de stratégie. elle va exactement entre les trades. à droite, vous avez tous les types de MA370 (SMA, EMA, SSMA, et LWMA) et aucune d'entre elles ne correspond à la MA 370 de gauche. la SSMA est la bleue claire et est loin d'être proche de la MA générée dans le back-test.

Je joins une autre capture d'écran avec l'ajout d'une ligne d'alerte de débogage de la valeur actuelle de la variable "ma" (affichage de la dernière valeur de la MA dans le journal, et à droite la dernière valeur de la MA 370 lissée bleu clair "projetée" sur le graphique).

J'ai remarqué que les MA sur le graphique se réfèrent au prix de clôture alors que le code ma se réfère au prix d'ouverture, mais comme j'ai changé les moyennes mobiles sur le graphique, cela ne les a pas changées visuellement de manière significative. elles sont toujours les mêmes que sur la capture d'écran ci-jointe.

Dossiers :
ma_problem3.png  142 kb
 
Il fonctionne bien, mais lorsque je l'ai débogué, j'ai remarqué que la MA générée est totalement différente de ce qu'elle devrait être. Je sais que je fais quelque chose de mal, mais je ne sais toujours pas ce que c'est. Je joins une autre capture d'écran des paramètres de l'ea lissée en bleu clair, pour que vous ayez une image complète.
Dossiers :
ma_problem4.png  66 kb
 
La MA la plus similaire que j'ai trouvée est la Smoothed MA 220, capture d'écran jointe. Cela n'a aucun sens, :( mais c'est peut-être un indice...
Dossiers :
ma_problem5.png  57 kb
 

J'ai isolé le problème dans un EA séparé.

#property copyright   "Grzegorz Korycki"
#property version     "1.0"
#property description "MA TEST"


#include <Trade/Trade.mqh>

   #define  MAGICMA  20131002

double Bid;
double Ask;

   
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()
{

   int ma_temp;
   double ma_buffer[20];

   double ma;
   ma_temp=iMA(Symbol(),PERIOD_D1,370,0,MODE_SMMA,PRICE_OPEN);
   CopyBuffer(ma_temp,0,0,1,ma_buffer);
   ma=ma_buffer[0];
   
   Alert("ma=", ma);

}

      


void start()
{
   trend1();
}

La paire testée est GBP/NZD.
Dossiers :
ma_test.mq5  2 kb
 

Le problème devient de plus en plus étrange. Lorsque je teste l'EA ci-dessus depuis 2012, il donne des résultats légèrement différents pour la MA (dans le journal, vous pouvez voir la valeur réelle) que lorsque je le teste depuis 2013. Aucun d'entre eux n'est proche de la SSMA de 370 indiquée sur le graphique.

Peut-être que c'est quelque chose dans mon initialisation qui fait que l'EA se comporte comme ça ?

y compris les captures d'écran. Remarquez que les lignes tracées sont à des niveaux différents lorsque l'on compare les deux captures d'écran et qu'il s'agit du même EA.

Dossiers :
 

Il s'agit d'une erreur de base : les éléments ne sont pas indexés comme dans les séries temporelles (ordre inverse).

Pour corriger cela, il faut appeler cette fonction...

ArraySetAsSeries(ma_buffer,true);
 
figurelli:

Il s'agit d'une erreur de base : les éléments ne sont pas indexés comme dans les séries temporelles (ordre inverse).

Pour corriger cela, vous devez appeler cette fonction...

Quand je l'ajoute, j'obtiens :

cannot be used for static allocated array       ma_test.mq5     50      4

mais je n'utilise qu'une seule image de ce tableau. est-ce important ? Et pourquoi cet avertissement ?

Après avoir ajouté cette ligne, rien n'a changé (l'avertissement et les back-tests indiquent que l'ajout de cette ligne n'a eu aucun effet).

la documentation indique qu'elle ne doit être utilisée qu'avec des constantes :

[...]

const datetime &time[],

[...]

ArraySetAsSeries(time,true); 

et mon ma_buffer est un tableau variable :

 double ma_buffer[20];
 
angreeee:

Quand je l'ajoute, j'obtiens :

mais je n'utilise qu'une seule image de ce tableau. Est-ce important ? Et pourquoi cet avertissement ?

Après avoir ajouté cette ligne, rien n'a changé (l'avertissement et les back-tests indiquent que l'ajout de cette ligne n'a eu aucun effet).

Vous avez raison si vous ne copiez qu'une seule image, et ce n'est pas la cause première (votre déclaration de ma_buffer[20] a détourné mon attention de ce fait).

Cependant, je vous suggère de déplacer la ligne ci-dessous vers Init() et le handle vers global, car c'est vraiment une source de problèmes (après avoir fait cela, veuillez le tester à nouveau).

ma_temp=iMA(Symbol(),PERIOD_D1,370,0,MODE_SMMA,PRICE_OPEN);
 
figurelli:

Vous avez raison si vous ne copiez qu'une seule image, et ce n'est pas la cause première (votre déclaration de ma_buffer[20] a détourné mon attention sur ce fait).

Cependant, je vous suggère de déplacer la ligne ci-dessous vers Init() et le handle vers global, car c'est vraiment une source de problèmes (après avoir fait cela, veuillez le tester à nouveau).

j'ai modifié le script selon vos directives et le problème persiste toujours :(

maintenant ça ressemble à ça :

#property copyright   "Grzegorz Korycki"
#property version     "1.0"
#property description "MA TEST"


#include <Trade/Trade.mqh>

   #define  MAGICMA  20131002

double Bid;
double Ask;

   int ma_temp;
   double ma_buffer[20];

   
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);
   ma_temp=iMA(Symbol(),PERIOD_D1,370,0,MODE_SMMA,PRICE_OPEN);


   return(0);
   }  
  
      
      
      
void trend1()
{

   double ma;
   CopyBuffer(ma_temp,0,0,1,ma_buffer);
   ma=ma_buffer[0];
   
   Alert("ma=", ma);
}

void start()
{
         trend1();

}

peut-être que quelqu'un peut créer un projet d'EA comment il créerait un tel générateur de valeur MA et je pourrais comparer les deux - le tester et isoler l'erreur. (si quelqu'un a quelques minutes à perdre)

Je vais vérifier dans une seconde et répondre si le problème est le même sur d'autres paires ou si c'est seulement cette paire, car c'est très étrange.

Raison: