Le changement de TF est un problème - page 5

 

Voici un indicateur :

//+------------------------------------------------------------------+
//|                                                    Shabl_ind.mq4 |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "eevviill"
#property link      "http://alievtm.blogspot.com"
#property version   "1.42"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property  indicator_color1 clrLightBlue
#property  indicator_color2 clrRed
#property  indicator_width1 2
#property  indicator_width2 2

input string   arr_set="Arrow settings";
input int      arrow_indent=22;
input int      up_arrow_code=233;
input int      down_arrow_code=234;

double         up_arr[];
double         down_arr[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,up_arr);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,up_arrow_code);
   SetIndexLabel(0,"UP arrow");

   SetIndexBuffer(1,down_arr);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,down_arrow_code);
   SetIndexLabel(1,"DOWN arrow");

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Shabl_ind                                                        |
//+------------------------------------------------------------------+
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[])
  {
   int i,limit=0;
//---
   if(rates_total<=20)
      return(0);
//--- last counted bar will be recounted
   if(prev_calculated==0)
      limit=rates_total-1;
   if(prev_calculated>0)
      limit=rates_total-prev_calculated+1;
   Comment("rates_total=",rates_total,"; prev_calculated=",prev_calculated,"; limit=",limit);
//--- Shabl_ind counted in the 1-st buffer
   datetime temp;
   for(i=0; i<limit; i++)
     {
      temp=time[i];
      if(close[i]>close[i+1])
         up_arr[i]=low[i]-arrow_indent*Point; //up arrow
      if(close[i]<close[i+1])
         down_arr[i]=high[i]+arrow_indent*Point; //down arrow
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+

Notez seulement que, selon vos conditions, l'indicateur peut tirer les deux tampons sur la barre zéro.

Dossiers :
 
Karputov Vladimir:

Voici un indicateur :

Veuillez noter que, selon vos conditions, l'indicateur peut tirer les deux tampons à zéro bar.

Pour éviter d'utiliser deux tampons, il faut remettre à zéro l'autre tampon lorsqu'il est plein.

      if(close[i]>close[i+1])
       {
        down_arr[i] = EMPTY_VALUE;
        up_arr[i]=low[i]-arrow_indent*Point; //up arrow
       }
      if(close[i]<close[i+1])
       {
        up_arr[i] = EMPTY_VALUE;
        down_arr[i]=high[i]+arrow_indent*Point; //down arrow
       }
 
Vasyl Nosal:
Avez-vous un code de solution ?

Comme beaucoup d'autres, j'ai plus d'une solution à votre question. Parce que les indicateurs peuvent être différents en nuances (les tâches qu'ils effectuent/code/intervalles de calcul, en général, de nombreux facteurs).

 
Karputov Vladimir:

Voici un indicateur :

Notez juste que selon vos conditions, l'indicateur peut tirer les deux tampons à zéro barre.

Vous vous foutez tous de moi ou vous n'avez vraiment aucune idée du problème ?

Voici votre indicateur lorsque vous changez de TF sur un historique non chargé.

:)))))))))))))))))))))))))))))))))))))))))))

 
Dina Paches:

Comme beaucoup d'autres, j'ai plus d'une solution à votre question. Parce que les indicateurs peuvent être différents en nuances (les tâches qu'ils effectuent/code/intervalles de calcul, en général, de nombreux facteurs).

Bla bla bla...
 
Vasyl Nosal:

Vous vous moquez tous de moi ou vous n'avez vraiment aucune idée du problème ?

Voici votre indicateur pour le changement de TF sur l'historique déchargé.

:)))))))))))))))))))))))))))))))))))))))))))

Pouvez-vous nous dire quelles manipulations vous avez utilisées pour obtenir une image aussi intéressante ? Et j'espère que vous serez plus réticent à l'avenir.

Ajouté : J'ai mentionné ci-dessus que vous devez penser au contenu des tampons d'indicateurs vous-même lorsque vous pompez l'historique :

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Le changement de TF est un problème

Karputov Vladimir, 2015.12.07 10:09

Vous avez deux variables à votre disposition : prev_calculated et rates_total. En contrôlant le chargement de l'historique (avec prev_calculated==0), vous devez réfléchir à ce qu'il faut faire avec les tampons des indicateurs - le comportement habituel dans ce cas est d'assimiler le chargement de l'historique au premier événement de chargement des indicateurs.

Mais vous l'avez ignoré pour une raison quelconque et n'avez pas voulu faire de modifications.

Quoi qu'il en soit voici la version 1.43 (voici mes corrections et celles d'Alexey Viktorov) :

Forum sur le trading, les systèmes de trading automatisés et le testeur de stratégie

Changement de TF - problème

Alexey Viktorov, 2015.12.07 12:52

Si vous voulez éviter de dessiner deux tampons, vous devez remettre un tampon à zéro lorsqu'il est plein.

      if(close[i]>close[i+1])
       {
        down_arr[i] = EMPTY_VALUE;
        up_arr[i]=low[i]-arrow_indent*Point; //up arrow
       }
      if(close[i]<close[i+1])
       {
        up_arr[i] = EMPTY_VALUE;
        down_arr[i]=high[i]+arrow_indent*Point; //down arrow
       }

:

//+------------------------------------------------------------------+
//|                                                    Shabl_ind.mq4 |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "eevviill"
#property link      "http://alievtm.blogspot.com"
#property version   "1.43"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property  indicator_color1 clrLightBlue
#property  indicator_color2 clrRed
#property  indicator_width1 2
#property  indicator_width2 2

input string   arr_set="Arrow settings";
input int      arrow_indent=22;
input int      up_arrow_code=233;
input int      down_arrow_code=234;

double         up_arr[];
double         down_arr[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,up_arr);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,up_arrow_code);
   SetIndexLabel(0,"UP arrow");

   SetIndexBuffer(1,down_arr);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,down_arrow_code);
   SetIndexLabel(1,"DOWN arrow");

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Shabl_ind                                                        |
//+------------------------------------------------------------------+
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[])
  {
   int i,limit=0;
//---
   if(rates_total<=20)
      return(0);
//--- last counted bar will be recounted
   if(prev_calculated==0)
     {
      limit=rates_total-1;
      ArrayInitialize(up_arr,EMPTY_VALUE);
      ArrayInitialize(down_arr,EMPTY_VALUE);
     }
   if(prev_calculated>0)
      limit=rates_total-prev_calculated+1;
   Comment("rates_total=",rates_total,"; prev_calculated=",prev_calculated,"; limit=",limit);
//--- Shabl_ind counted in the 1-st buffer
   for(i=0; i<limit; i++)
     {
      if(close[i]>close[i+1])
        {
         down_arr[i]=EMPTY_VALUE;
         up_arr[i]=low[i]-arrow_indent*Point; //up arrow
        }
      if(close[i]<close[i+1])
        {
         up_arr[i]=EMPTY_VALUE;
         down_arr[i]=high[i]+arrow_indent*Point; //down arrow
        }
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
Dossiers :
 
Karputov Vladimir:

Pouvez-vous nous dire quelles manipulations vous utilisez pour obtenir une image aussi intéressante ? Et j'espère que vous serez plus discret dans votre langage à partir de maintenant.

J'ouvre un graphique d'une paire de devises que je n'ai jamais ouvert auparavant. M1, par exemple. Je joins votre indicateur. Je le change en M5.

Alors j'avais raison ? Nous devons réinitialiser les tampons des flèches ?

 
Vasyl Nosal:

mql4

Non. Voilà avec ton dessin sur une paire où il n'y avait pas d'histoire.

Qu'est-ce que c'est ?

if(i>Bars-20) i=Bars-20;

Comme je le pensais, la boucle est corrompue en interne. De plus, puisque dans le corps de la boucle vous accédez à la barre précédente ([i+1]), vous devez commencer le calcul au plus tôt à partir de la deuxième barre de l'historique (en comptant à partir de la gauche). Et les tampons doivent être remplis à chaque barre TOUS, pas seulement une. Eh bien, ou les initialiser au préalable dans OnInit().

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[])
{
   int nStartBar = rates_total - MathMax(prev_calculated, 2);

   for(int i = nStartBar; i >= 0; i--)
   {
      if(Close[i] > Close[i+1])
      {
         up_arr[i] = Low[i] - arrow_indent * _Point; //up arrow
         down_arr[i] = 0;
      }
         
      if(Close[i] < Close[i+1])
      {
         up_arr[i] = 0;
         down_arr[i] = High[i] + arrow_indent * _Point; //down arrow
      }
   }

   return(rates_total);
}
 
Karputov Vladimir:

Bref, voici la version 1.43 (mes corrections et cellesd'Alexey Viktorov ici) :


:

Vladimir, pourquoi faites-vous cela dans OnCalculate() ? Je veux dire les deux dernières lignes - réinitialisation des tableaux. Les deux tampons sont calculés sur chaque barre, c'est une action inutile.

if(prev_calculated==0)
{
   limit=rates_total-1;
   ArrayInitialize(up_arr,EMPTY_VALUE);
   ArrayInitialize(down_arr,EMPTY_VALUE);
}
 
Sergei Vladimirov:

QU'EST-CE QUE C'EST ?

Comme je le pensais, la boucle est corrompue en interne. En outre, étant donné que dans le corps de la boucle, vous accédez à la barre précédente ([i+1]), le calcul ne doit pas commencer avant la deuxième barre de l'historique (en comptant à partir de la gauche). Et les tampons doivent être remplis à chaque barre TOUS, pas seulement une. Eh bien, ou les initialiser au préalable dans OnInit().

C'est tout ? Il n'y a pas de problème ?