Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 567

 
PolarSeaman:

Es tritt immer noch aus.

Sie haben[i+1], Sie müssen +2 mehr prüfen

Im Allgemeinen sollten Sie wie folgt vorgehen

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

Denn die Prüfung ist grundlegend falsch. Nehmen wir an, Bars liefert 1000 und cb liefert ebenfalls 1000. In der Schleife erhalte ich dann bei der ersten Iteration den Wert 1000. In der ersten Bedingung des Schleifenkörpers:

Zwei Ausgänge außerhalb des Arrays auf einmal : Zugriff auf einen Balken mit Index 1000 und einen mit Index 1001. Denn wenn das Diagramm 1000 Balken hat, hat der erste Balken den Index 0 und der letzte den Index 999.

Im weiteren Verlauf des Schleifenkörpers wird auf die noch weiter zurückliegenden Takte der Geschichte verwiesen:

All dies muss bei der ersten Prüfung berücksichtigt werden.

Für eine korrekte Prüfung siehe das Beispiel der Funktion IndicatorCounted() in der MQL4-Referenz. Erst jetzt sollte IndicatorCounted() durch die gemeinsame Nutzung von rates_total (dies ist Bars) und prev_calculated (dies ist IndicatorCounted()) ersetzt werden.

Danke, ich habe es gefunden,

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

Womit soll ich es vergleichen? Im Beispiel beginnt es mitLimit

 limit=Bars-counted_bars;

Womit sollte ich dieses "cb" vergleichen?

 
PolarSeaman:

Danke, ich habe es gefunden,

Womit soll ich es vergleichen? Im Beispiel beginnt es mit demGrenzwert.

Womit sollte ich diese "cb" vergleichen?

Wenn Sie die Anzahl der Balken, auf denen die Daten des Indikators angezeigt werden, begrenzen möchten, sollten Sie dies auf diese Weise tun:

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));                            
}

Verwenden Sie wie folgt:

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

for (int i = limit; i >= 0; --i)
{
  ...
}
Der Gesamtwert ist der Index des tiefsten Balkens in der Historie, der auf der Grundlage der Werte in den Einstellungen des Indikators abgerufen werden kann.
 
Taras Slobodyanik:

Sie haben[i+1], Sie müssen +2 mehr prüfen

Im Allgemeinen sollten Sie wie folgt vorgehen

Ich habe es so gemacht, aber es heißt ...array out of range in 'HiLo.mq4' (122,15)

Was sollte ich mit +2 mehr überprüfen?


 
Ihor Herasko:

Wenn Sie die Anzahl der Balken, auf denen die Indikatordaten angezeigt werden, begrenzen möchten, sollten Sie dies tun:

Verwenden Sie wie folgt:

Der Wert von total ist der Index des tiefsten Balkens in der Historie, der auf der Grundlage der Werte der Indikatoreinstellungen aufgerufen werden kann.

Der Compiler schwört.

'InitializeBuffers' - Funktion nicht definiert HiLo.mq4 161 7

und in der Hilfe findet sich nichts über diese Funktion
 
PolarSeaman:

Der Compiler beschwert sich über

'InitializeBuffers' - Funktion nicht definiert HiLo.mq4 161 7

Und es gibt nichts über diese Funktion in der Hilfe

Ich habe im Kommentar geschrieben, dass dies eine Funktion ist, die alle Indikatorpuffer initialisieren soll. Es handelt sich um eine benutzerdefinierte Funktion. Bei mir sieht es so aus:

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

Sie werden einen anderen haben, da die Puffer unterschiedlich sind. Falls der Indikator mit grafischen Objekten arbeitet, müssen Sie diese hier entfernen, da die erste Zeichnung der Messwerte vorgenommen werden soll.

 
Ihor Herasko:

Ich habe im Kommentar geschrieben, dass dies die Funktion ist, die alle Indikatorpuffer initialisieren soll. Es handelt sich um eine benutzerdefinierte Funktion. Bei mir sieht es so aus:

Sie werden einen anderen haben, da die Puffer unterschiedlich sind. Falls der Indikatormit grafischen Objekten arbeitet, müssen Sie hier alle löschen, da die erste Zeichnung der Messwerte vorgenommen werden soll.

Danke, aber es hat sich nichts geändert ...array out of range in 'HiLo.mq4' (130,15)

. Was ist los?

#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:

Danke, aber es hat sich nichts geändert. Was ist los?

Das Ergebnis wird sich natürlich nicht ändern. Schließlich haben Sie die Hauptursache (die Cb-Schleife) nicht beseitigt. Diese Schleife ist falsch organisiert:

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

Sie sollte entfernt und durch die Grenzwertschleife ersetzt werden. An beiden Orten.

 
Ihor Herasko:

Das Ergebnis wird sich natürlich nicht ändern. Immerhin haben Sie den Hauptgrund (die Cb-Schleife) nicht beseitigt. Diese Schleife ist falsch organisiert:

Sie sollte entfernt und durch die Grenzwertschleife ersetzt werden. An beiden Orten.

Es gibt 3 solcher Schleifen. Ich habe sie ersetzt, und das Terminal hing.

 

Ich habe es getan, es friert nicht ein oder stürzt ab, aber es gibt 3 Werte im ersten Puffer (fx2): Preis, 0.0 und 164874239.218492.

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

Wenn der Wert sell_1_B!=EMPTY_VALUE und sell_1_B!=0 ist, bedeutet das nicht, dass es einen Preis gibt.

Wie bekomme ich ein Signal?