Des problèmes ont été découverts lors des tests de rétroaction et nous n'arrivons pas à trouver la cause fondamentale ! - page 5

 
jollydragon:

. Je ne vois toujours pas la disparition des pics. Comment le "réinitialiser" ?

Vous pouvez le réinitialiser soit en changeant d'horizon temporel.

ou

ouvrir la fenêtre de saisie de l'indicateur et cliquer sur OK

 

GumRai2015.05.14 21:51#

You can re-initialise by either changing timeframes

or

ouvrir la fenêtre de saisie de l'indicateur et cliquer sur OK


Après avoir essayé, je comprends que c'est la même signification que j'ai dit que l'emplacement des pics change. Correct ?

CherGumRai,

 
WHRoeder:

Pour chaque itération, (sauf la première,) Fish1 est la valeur de l'élément de tampon précédent, mais vous ne l'initialisez pas à ExtBuffer1[limit].

Donc, pour l'itération initiale (lorsque limite == barres), vous définissez ExtBuffer1[0] = 1.1*ExtBuffer1[1] .

Mais pour les ticks suivants (lorsque limite == 1), vous définissez ExtBuffer1[0] = 1.1*0.00001 .

Cher WHRoeder,

Merci beaucoup et je vois le problème un peu mieux avec votre direction.

Cependant, il se peut que j'aie encore besoin de quelques questions pour clarifier davantage :

1. Vous pouvez voir que "double Fish1=0.00001 ; " est défini au début et en dehors de toutes les fonctions.

Il devrait donc s'agir d'une variable globale et je comprends qu'elle a été assignée au dernier ExBuffer1[0] même si un nouveau tic-tac ultérieur arrive.

Ou alors, elle revient automatiquement à "0.00001" à chaque fois qu'un nouveau tick arrive ?

2. Maintenant que chaque barre est peinte différemment avec un seul tick ou de nombreux ticks ultérieurs, pourquoi puis-je voir le repeint de ..., bar[8], ..., ou bar[1], dans un graphique M1 en direct sans aucune interruption ?

3. Pourquoi les emplacements des pics sont-ils modifiés après avoir été rafraîchis ?

4. Pourquoi puis-je voir certains pics (environ 959870576) formés beaucoup, beaucoup moins que"EMPTY_VALUE" (2147483647) dans les graphiques M1 en direct ?

5. Si une nouvelle barre sort, le tampon ExtBuffer1[0] précédent sera remplacé par le tampon ExtBuffer1[1] automatiquement. Est-ce exact ?

6. Comment éviter toute ré-initialisation ou ré-affichage potentiel ?

Je suis peut-être encore confus sur certains points critiques et j'ai besoin de votre grande patience pour m'aider ! J'apprécierais beaucoup si vous pouviez m'aider à répondre aux questions une par une !

 

CherWHRoeder,GumRai,

J'ai mis à jour mon indicateur comme le code ci-dessous selon ma compréhension après avoir lu vos messages à nouveau.

Après l'avoir utilisé pour le back testing, le résultat est beaucoup plus cohérent avec l'indicateur. Cependant, il y a encore 2 problèmes. Veuillez vous référer aux captures d'écran ci-dessous.

1. Le trading a lieu après 4 signaux de l'indicateur au début du premier ordre.

2. Il y a toujours un changement d'ordre qui se produit 4 barres avant le signal de l'indicateur.

Le code de l'indicateur est mis à jour ci-dessous.

#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.50"
#property strict
#property  indicator_separate_window
#property  indicator_buffers 2

extern int    period=35;
extern double smooth=0.3;

datetime       lastAlertTime;
double         ExtBuffer0[];
double         ExtBuffer1[];
double         ExtValue[];
double         Value1=0,Buffer0_1=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   IndicatorBuffers(3);
   SetIndexBuffer(0,ExtBuffer0); SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1,clrWhiteSmoke);
   SetIndexBuffer(1,ExtBuffer1); SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,1,clrGoldenrod);
   SetIndexBuffer(2,ExtValue);
   IndicatorShortName(" Solar Joy   ^v^  ");
   ArraySetAsSeries(ExtBuffer0,true);
   ArraySetAsSeries(ExtBuffer1,true);
   ArraySetAsSeries(ExtValue,true);

   SetIndexDrawBegin(1,period);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(rates_total<=period)    return(0);

   int    i,limit;
   double price,MinL,MaxH;

   if(prev_calculated<rates_total-1) limit=rates_total-period-1;
   else                              limit=1;

   for(i=limit-1; i>=0; i--)
     {
      MaxH = High[iHighest(NULL,0,MODE_HIGH,period,i)];
      MinL = Low[iLowest(NULL,0,MODE_LOW,period,i)];
      price=(High[i]+Low[i])/2;
      if(limit==1)
        {
         Value1=ExtValue[1];
         Buffer0_1=ExtBuffer0[1];
        }
      ExtValue[i]=(1-smooth)*(2*(price-MinL)/(MaxH-MinL)-1.0) + smooth*Value1;
      ExtValue[i]=MathMin(MathMax(ExtValue[i],-0.999),0.999); // Value=Value>0.999?0.999:Value<-0.999?-0.999:Value;
      ExtBuffer0[i]=(1-smooth)*MathLog((1+ExtValue[i])/(1-ExtValue[i]))+smooth*Buffer0_1;
      Value1=ExtValue[i];
      Buffer0_1=ExtBuffer0[i];
      if(ExtBuffer0[i]>0) ExtBuffer1[i]=3;
      else ExtBuffer1[i]=-3;
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+

 
jollydragon:

1. Vous pouvez voir que "double Fish1=0.00001 ; " est défini au début et en dehors de toutes les fonctions.

Il devrait donc s'agir d'une variable globale et je comprends qu'elle a été assignée à la dernière ExBuffer1[0] même si un nouveau tic-tac subséquent survient.

Ou bien il revient automatiquement à "0.00001" à chaque fois qu'un nouveau tick arrive ?

Non et non. Quelle partie de " mais vous ne l'initialisez pas à ExtBuffer1[limit]" n'était pas claire ?
if(prev_calculated<rates_total-1){ limit=rates_total-period-1; Fish1=0.00001;       }
else                             { limit=1;                    Fish1=ExtBuffer0[1]; }
for(i=limit-1; i>=0; i--)
  {
   ExtBuffer1[i]=1.1*Fish1;
   Fish1=ExtBuffer1[i];
   if(Fish1>=EMPTY_VALUE)
      Fish1=1;
  }

Personnellement, je pense que les arguments rates_total/prev_calculated/OnCalculate sont une abomination puisque les graphiques/buffers sont des séries temporelles, et je le ferais à l'ancienne :
int counted = IndicatorCounted();
limit = Bars - MathMax(counted, period-1); // Lookback period-1
Fish1 = counted == 0 ? 0.00001 : ExtBuffer0[limit];
for(i=limit-1; i>=0; i--)