Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 567

 
PolarSeaman:

Il donne toujours des coups de pied.

vous avez[i+1], vous devez vérifier +2 de plus

En général, vous devriez faire quelque chose comme ceci

limit=(rates_total<cb || cb<=0) ? rates_total-1 : cb;
if (limit<=0) return(0);
 
Ihor Herasko:

Parce que le chèque est fondamentalement faux. Disons que Bars rapporte 1000 et que cb rapporte également 1000. Puis dans la boucle, à la première itération, j'obtiens la valeur 1000. Dans la première condition du corps de la boucle :

Deux sorties hors du tableau à la fois : accès à une barre d'indice 1000 et à une barre d'indice 1001. Par exemple, si le graphique comporte 1000 barres, la première barre a l'indice 0 et la dernière l'indice 999.

Plus loin dans le corps de la boucle, on trouve une référence aux barres encore plus lointaines de l'histoire :

Tout cela doit être pris en compte lors de la vérification initiale.

Pour une vérification correcte, voir l'exemple de la fonction IndicatorCounted() dans la référence MQL4. Seulement maintenant, IndicatorCounted() devrait être remplacé par le partage de rates_total (c'est Bars) et prev_calculated (c'est IndicatorCounted()).

Merci, je l'ai trouvé,

 int counted_bars=IndicatorCounted(); 
     if(counted_bars>0) counted_bars--;

À quoi dois-je le comparer ? Dans l'exemple, il commence par unelimite.

 limit=Bars-counted_bars;

A quoi dois-je comparer ce "cb" ?

 
PolarSeaman:

Merci, je l'ai trouvé,

À quoi dois-je le comparer ? Dans l'exemple, cela commence par lalimite.

à quoi dois-je comparer ce "cb" ?

Si vous voulez limiter le nombre de barres sur lesquelles les données de l'indicateur sont affichées, vous feriez mieux de procéder de cette façon :

int GetRecalcIndex(int& total, const int ratesTotal, const int prevCalculated)
{
   total = ratesTotal - 2 - barsig;                                                                         
                                                   
   if (cb > 0 && cb < total)
      total = MathMin(cb, total);                      
                                                   
   if (prevCalculated < ratesTotal - 1)                     
   {       
      InitializeBuffers();    // Это функция, которая должна заново инициализировать все индикаторные буфера, т. к. имеем дело с первой загрузкой индикатора или подкачкой истории
      return (total);
   }
   
   return (MathMin(ratesTotal - prevCalculated, total));                            
}

Utilisez comme suit :

int total;   
int limit = GetRecalcIndex(total, rates_total, prev_calculated);                                

for (int i = limit; i >= 0; --i)
{
  ...
}
La valeur totale est l'indice de la barre la plus profonde de l'historique, à laquelle on peut accéder en fonction des valeurs des paramètres de l'indicateur.
 
Taras Slobodyanik:

vous avez[i+1], vous devez vérifier +2 de plus

En général, vous devriez faire quelque chose comme ceci

Je l'ai fait de cette façon, mais il est dit ...array out of range in 'HiLo.mq4' (122,15).

Que dois-je vérifier en ajoutant +2 ?


 
Ihor Herasko:

Si vous souhaitez limiter le nombre de barres sur lesquelles les données de l'indicateur sont affichées, il est préférable de le faire :

Utilisez comme suit :

La valeur du total est l'indice de la barre la plus profonde de l'historique, qui peut être appelée en fonction des valeurs des paramètres de l'indicateur.

Le compilateur jure.

InitializeBuffers' - fonction non définie HiLo.mq4 161 7

et il n'y a rien au sujet de cette fonction dans l'aide
 
PolarSeaman:

Le compilateur se plaint de

InitializeBuffers' - fonction non définie HiLo.mq4 161 7

Et il n'y a rien sur cette fonction dans l'aide

J'ai écrit dans le commentaire que c'est une fonction qui devrait initialiser tous les tampons d'indicateurs. Il s'agit d'une fonction personnalisée. Je l'ai comme ça :

void InitializeBuffers()
{
   ArrayInitialize(g_indValues, EMPTY_VALUE);
   ArrayInitialize(g_tempBuffer, EMPTY_VALUE);
}

Vous en aurez un différent car les tampons sont différents. Si l'indicateur fonctionne avec des objets graphiques, vous devez les supprimer tous ici, car le dessin initial des relevés doit être fait.

 
Ihor Herasko:

J'ai écrit dans le commentaire que c'est une fonction pour initialiser tous les tampons d'indicateurs. Il s'agit d'une fonction personnalisée. Je l'ai comme ça :

Vous en aurez un différent, car les tampons sont différents. Si l'indicateurfonctionne avec des objets graphiques, vous devez les supprimer tous ici, car le dessin initial des relevés doit être fait.

Merci, mais rien n'a changé ....tableau hors limites dans 'HiLo.mq4' (130,15)

. Qu'est-ce qui ne va pas ?

#property copyright "Copyright ©  november 2015"
#property strict 

#property indicator_chart_window
#property indicator_buffers 6

#property indicator_color1 RoyalBlue       //DodgerBlue
#property indicator_color2 Crimson         //OrangeRed
#property indicator_color3 Black  //White
#property indicator_color4 Black  //White
#property indicator_color5 Black            //White
#property indicator_color6 Black         //Red

#property indicator_width1 2
#property indicator_width2 2

#property indicator_style3 STYLE_DOT
#property indicator_style4 STYLE_DOT

input int    p        = 10;    // Период
input int    s        = 5;     // Угол наклона
input double distance = 2.0;   // Ширина канала
input bool   showBb   = false;  // Границы канала
input bool   showCl   = true;  // Центральная линия
input int    barsig   = 1;     // Сигнальная свеча (номер)
input int    arrots   = 0;    // Стрелка (отступ)
input int    arrsz    = 0;     // Стрелка (размер)
input int    ATR      = 1000;  // Период ATR
input int    cb       = 1000;  // Сколько свечей в истории

double fx1[],fx2[],hp[];
double z1,z2,ki;
int fs;

double upper[],lower[];
double upar[],dnar[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- indicator buffers mapping
IndicatorBuffers(7);
SetIndexBuffer(0,fx1);
SetIndexBuffer(1,fx2);
SetIndexBuffer(2,lower);
SetIndexBuffer(3,upper);
SetIndexBuffer(4,upar);
SetIndexBuffer(5,dnar);
SetIndexBuffer(6,hp);


SetIndexStyle (4,DRAW_ARROW,0,arrsz);
SetIndexArrow (4,233);
SetIndexStyle (5,DRAW_ARROW,0,arrsz);
SetIndexArrow (5,234);

   if(showBb)
   {SetIndexStyle(2,DRAW_LINE);
    SetIndexStyle(3,DRAW_LINE);
   }
   else
   {SetIndexStyle(2,DRAW_NONE);
    SetIndexStyle(3,DRAW_NONE);
   }
   
    if(showCl)
   {SetIndexStyle(0,DRAW_LINE);
    SetIndexStyle(1,DRAW_LINE);
   }
   else
   {SetIndexStyle(0,DRAW_NONE);
    SetIndexStyle(1,DRAW_NONE);
   }

SetIndexEmptyValue(0,0.0);
SetIndexEmptyValue(1,0.0);

//---
   return(INIT_SUCCEEDED);
  }
  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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;
//   limit=(rates_total<cb || cb<=0) ? rates_total-2 : cb;
//if (limit<=0) return(0);
 int total;   
 limit = GetRecalcIndex(total, rates_total, prev_calculated);                                

for (int i = limit; i >= 0; --i)
{ 
  
  
   SetIndexDrawBegin(0,Bars-cb);
   SetIndexDrawBegin(1,Bars-cb);

double avg;

ki=2.0/(p+1);

for (i=cb; i>=0; i--) {fx1[i]=Close[i];}

for (int m=0; m<=s; m++)
{
z1=fx1[0];
for (i=0; i<=cb; i++) {z1=z1+(fx1[i]-z1)*ki; hp[i]=z1;}

z2=fx1[cb];
for (i=cb; i>=0; i--) {z2=z2+(fx1[i]-z2)*ki; fx1[i]=(hp[i]+z2)/2;}
}

fs=0;
for (i=cb; i>=0; i--)
{
if (fx1[i]>fx1[i+1]) fs=1;
if (fx1[i]<fx1[i+1]) {if (fs==1) fx2[i+1]=fx1[i+1]; fs=2;}
if (fs==2) fx2[i]=fx1[i]; else fx2[i]=0.0;

avg = iATR(NULL,0,ATR, i+10);
upper[i] = hp[i] + distance*avg;
lower[i] = hp[i] - distance*avg;

if(Close[i+1+barsig]<upper[i+1+barsig] && Close[i+barsig]>upper[i+barsig])
 dnar[i] = High[i]+arrots*Point; else dnar[i] = EMPTY_VALUE;
 
if(Close[i+1+barsig]>lower[i+1+barsig] && Close[i+barsig]<lower[i+barsig])
 upar[i] = Low[i]-arrots*Point; else upar[i] = EMPTY_VALUE; 
}
}
//--- return value of prev_calculated for next call
   return(rates_total);
  }
  

int GetRecalcIndex(int& total, const int ratesTotal, const int prevCalculated)
{
   total = ratesTotal - 2 - barsig;                                                                         
                                                   
   if (cb > 0 && cb < total)
      total = MathMin(cb, total);                      
                                                   
   if (prevCalculated < ratesTotal - 1)                     
   {       
      InitializeBuffers();    // Это функция, которая должна заново инициализировать все индикаторные буфера, т. к. имеем дело с первой загрузкой индикатора или подкачкой истории
      return (total);
   }
   
   return (MathMin(ratesTotal - prevCalculated, total));                            
}

void InitializeBuffers()
{
   ArrayInitialize(fx1, EMPTY_VALUE);
   ArrayInitialize(fx2, EMPTY_VALUE);
   ArrayInitialize(lower, EMPTY_VALUE);
   ArrayInitialize(upper, EMPTY_VALUE);
   ArrayInitialize(upar, EMPTY_VALUE);
   ArrayInitialize(dnar, EMPTY_VALUE);
   ArrayInitialize(hp, EMPTY_VALUE);
}
 
PolarSeaman:

Merci, mais rien n'a changé. Qu'est-ce qu'il y a ?

Bien sûr, le résultat ne changera pas. Après tout, vous n'avez pas supprimé la raison principale (la boucle cb). Cette boucle est organisée de manière incorrecte :

for (i=cb; i>=0; i--)

Elle doit être retirée et remplacée par la boucle de limite. Dans les deux endroits.

 
Ihor Herasko:

Bien sûr, le résultat ne changera pas. Après tout, vous n'avez pas supprimé la raison principale (la boucle cb). Cette boucle est organisée de manière incorrecte :

Elle doit être retirée et remplacée par la boucle de limite. Dans les deux endroits.

Il existe 3 boucles de ce type. Je les ai remplacés et le terminal s'est accroché.

 

Je l'ai fait, il ne gèle pas et ne plante pas, mais il y a 3 valeurs dans le premier tampon (fx2) : prix, 0.0 et 164874239.218492.

sell_1_B=NormalizeDouble(iCustom(Symbol(),0,"HiLo",1,1),Digits);

Si la valeur sell_1_B!=EMPTY_VALUE et sell_1_B!=0, cela ne signifie pas qu'il y a un prix.

Comment obtenir un signal ?