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

 

Ich habe einen seltsamen Fehler beim Zeichnen auf dem MT5-Chart gefunden: Pfeile anstelle von niedrigen Kerzen werden an willkürlichen Stellen platziert, als ob sie auf den Chart verschoben wären




#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window

#property strict

#property indicator_buffers 1 
#property indicator_plots   1
 
#property indicator_label1  "Arrows" 
#property indicator_type1   DRAW_ARROW 
#property indicator_color1  clrGreen 
#property indicator_width1  1

double Buf_0[];

int OnInit()
  {

   SetIndexBuffer(0,Buf_0,INDICATOR_DATA);
   PlotIndexSetInteger(0,PLOT_ARROW,233);
   
   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[])
  {
   
   for (int i=0; i<rates_total; i++)
      {
   
      Buf_0[i]=iLow(_Symbol, _Period,i);
      }
   return(rates_total);
  }

 
psyman:

Ich habe einen seltsamen Fehler beim Zeichnen auf dem MT5-Chart gefunden: Pfeile anstelle von niedrigen Kerzen werden an willkürlichen Stellen platziert, als ob sie auf den Chart verschoben wären




1. Der Indikator hat bereits ein niedriges Feld. Sie muss angewendet werden.

2. Es ist nicht notwendig, die Visualisierung mit maximaler Geschwindigkeit laufen zu lassen.

3. Der Code ist furchtbar fehlerhaft - denn bei jedem Tick werden ALLE BARs durchlaufen.

 
Vladimir Karputov:

1. Der Indikator hat bereits ein niedriges Feld. Wenden Sie es an.

2. Es ist nicht notwendig, die Visualisierung mit maximaler Geschwindigkeit laufen zu lassen.

3. Der Code ist furchtbar fehlerhaft - denn bei jedem Tick werden ALLE BARs durchlaufen.

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[])
  {
   ArrayInitialize(Buf_0,EMPTY_VALUE);

   for (int i=0; i<rates_total; i++)
      {
   
      Buf_0[i]=iLow(_Symbol, _Period,i);
      }
   return(rates_total);
  }
 
Vladimir Karputov:

1. Der Indikator hat bereits ein niedriges Feld. Wenden Sie es an.

2. Es ist nicht notwendig, die Visualisierung mit maximaler Geschwindigkeit laufen zu lassen.

3. Der Code ist furchtbar fehlerhaft - denn bei jedem Tick werden ALLE Balken durchlaufen.

Ich habe den Code nicht hier gepostet, sondern den einfachsten geschrieben, um das Parsen zu vereinfachen.

Sag mir mehr darüber, was falsch ist, über die Höchstgeschwindigkeit ist nicht klar.

 
Vitaly Muzichenko:

Vitaly, die Initialisierung funktioniert aus irgendeinem Grund nicht. Ich habe versucht,PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0) zu schreiben; es funktioniert auch nicht :(

 
psyman:

Ich habe den Code nicht hier gepostet, sondern den einfachsten geschrieben, um das Parsen zu vereinfachen.

Erklären Sie mir genauer, was los ist, die Höchstgeschwindigkeit ist unklar.

Beginnen Sie mit der Korrektur, einen Schritt nach dem anderen. Reparieren Sie es zum Beispiel zuerst:

Der Indikator hat bereits ein niedriges Array. Sie müssen es anwenden.

 
Buf_0[i]=iLow(_Symbol, _Period,i);

iLow funktioniert als Serie true, Buf_0 ist false, low[] ist ebenfalls false. D.h. das 0. Element in Ihrem Fall erhält rates_total-1 (gespiegelt)

Sie müssen zum Beispiel einen von ihnen umdrehen:

Buf_0[i]=iLow(_Symbol, _Period,rates_total-1-i);
 
psyman:

Ich habe einen seltsamen Fehler beim Zeichnen auf dem MT5-Chart gefunden: Pfeile anstelle von niedrigen Kerzen werden an willkürlichen Stellen platziert, als ob sie auf den Chart verschoben wären



Die Kenntnis des Rätsels über die Äpfel bei Pinocchio wird bei diesem Problem bestimmt helfen. Ich kann mich nicht mehr im Detail daran erinnern, wir werden darauf warten, dass jemand es fehlerfrei nacherzählt.

 
Igor Zakharov:

iLow funktioniert als Serie true, Buf_0 ist false, low[] ist ebenfalls false. D.h. das 0. Element in Ihrem Fall erhält rates_total-1 (gespiegelt)

Sie müssen zum Beispiel einen von ihnen umdrehen:

Dies ist ein Indikator! Es gibt bereits Arrays in OnCalculate.

                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[]

Warum sollten Sie iXXXX Funktionen in einen Indikator packen?

 
Vladimir Karputov:

Dies ist ein Indikator! OnCalculate hat ALREADY Arrays

Warum sollten Sie iXXXXXX Funktionen in einen Indikator einbauen?

Woher soll ich das wissen? Der Fragesteller hat iLow() verwendet, das bedeutet, dass er es braucht. Vielleicht ist es einfacher zu erkennen, vielleicht plant er, ein anderes Symbol oder einen anderen Zeitrahmen durch eine Eingangsvariable anzusprechen (ich erinnere mich nicht, gibt es ein Copyright in Vierern?)

Hinzugefügt: Die Frage zu den fünf wurde im Thread zum Quartär gestellt. Ich habe es übersehen, ich bereue es. Aber die Antwort ist immer noch dieselbe.