Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 466

 

Ich grüße alle. Ich habe eine solche Frage. Ich habe einen Indikator (modifizierte Fraktale), wenn auf einem Diagramm geladen alles korrekt ist, funktioniert, wie es sollte, aber wenn ich versuche, es in einem EA zu verwenden, sagt es, dass der Puffer leer ist. Gleichzeitig werden bei der Übergabe des Puffers in Deinit die richtigen Werte gespeichert.

Der Quellcode des Indikators ist beigefügt. Ich bin bereit, mir Tipps und Vorschläge anzuhören, was ich falsch mache.

Code von EA:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(Time[0] == prevtime) return;
   prevtime = Time[0];
   

   if(iCustom(NULL,0,"modify_Fractal",0,0) > 0) Print("x = ", 0, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,0));     
   if(iCustom(NULL,0,"modify_Fractal",0,2) > 0) Print("x = ", 2, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,2));
   if(iCustom(NULL,0,"modify_Fractal",0,3) > 0) Print("x = ", 3, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,3));   
   if(iCustom(NULL,0,"modify_Fractal",0,4) > 0) Print("x = ", 4, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,4));
   if(iCustom(NULL,0,"modify_Fractal",0,5) > 0) Print("x = ", 5, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,5)); 
   if(iCustom(NULL,0,"modify_Fractal",0,6) > 0) Print("x = ", 6, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,6));
   
  // тут везде 0
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
      Print("Deinit Function");
      
      for (int x = 0; x < 100; x++ )
      {
         if(iCustom(NULL,0,"modify_Fractal",0,x) > 0) Print("x = ", x, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,x));
         if(iCustom(NULL,0,"modify_Fractal",1,x) > 0) Print("x = ", x, "  fractal Down: ", iCustom(NULL,0,"modify_Fractal",1,x));
      }
   // а здесь полный буфер правильных значений индикатора.
  }
Dateien:
 
Karputov Vladimir:

Sie könnten die "wenn" am Ende durch "wenn" ersetzen:

(wenn es so einfach ist,,,,:)

Danke

 
Maxim Dobrovolskii:

Ich grüße alle. Ich habe eine solche Frage. Ich habe einen Indikator (modifizierte Fraktale), wenn auf einem Diagramm geladen alles korrekt ist, funktioniert, wie es sollte, aber wenn ich versuche, es in einem EA zu verwenden, sagt es, dass der Puffer leer ist. Gleichzeitig werden bei der Übergabe des Puffers in Deinit die richtigen Werte gespeichert.

Der Quellcode des Indikators ist beigefügt. Ich bin bereit, mir Tipps und Vorschläge anzuhören, was ich falsch mache.

Der Code stammt aus dem Expert Advisor:

Ein sehr flüchtiger Blick. Frage: Kann ich ein Fraktal auf der Nullleiste haben? In OnDeinit() durchlaufen Sie jedoch eine Schleife durch die Balken und finden natürlich ein Fraktal (keinen leeren Pufferwert).
 
Artyom Trishkin:
Ein sehr flüchtiger Blick. Frage: Kann ein Fraktal auf einer Nullleiste stehen? In OnDeinit() durchlaufen Sie jedoch eine Schleife durch die Balken und finden natürlich ein Fraktal (keinen leeren Pufferwert).
In Deinit durchlaufe ich auch 4-6 und alles ist an seinem Platz und hat Werte.
 
Maxim Dobrovolskii:
In Deinit gehe ich auch durch 4-6 und alles ist an seinem Platz.

In OnDeinit() laufen Sie in einer Schleife (von 0 bis 100) durch die Balken und suchen nach einem Wert ungleich Null und protokollieren den gefundenen Wert.

In OnTick() versuchen Sie, nur die letzten 6 Takte des Puffers 0 auszugeben. Es darf kein Fraktal auf ihnen sein.

Suchen Sie zunächst den Balken mit dem Fraktal und drucken Sie dann den Wert dieses Balkens aus.

 
Artyom Trishkin:

In OnDeinit() laufen Sie in einer Schleife (von 0 bis 100) durch die Balken und suchen nach einem Wert ungleich Null und protokollieren den gefundenen Wert.

Aber in OnTick() versuchen Sie, nur die letzten 6 Takte von Puffer 0 zu drucken. Es darf kein Fraktal auf ihnen sein. Suchen Sie zunächst den Balken mit dem Fraktal und drucken Sie dann den Wert dieses Balkens aus.

Der 6. Takt soll Fraktal enthalten.

2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 29 fractal Up: 1.09855
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 21 fractal Up: 1.09976
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 16 fraktal Down: 1.09652
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 6 fractal Up: 1.10721
2015.11.01 13:19:10.577 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: Deinit Funktion
2015.11.01 13:19:08.380 2015.10.01 00:00 MoneyRobotics_Proboi! Test gestartet

Das ist der Anfang des Protokolls. Der Test wurde gestartet, der Expert Advisor funktionierte, Deinit wurde gestartet und das Fraktal wurde an 6 Positionen gefunden.



https://charts.mql5.com/9/256/eurusd-h1-alpari-limited-3.png

Bildwiederholung.

Dateien:
 
Maxim Dobrovolskii:

der 6. Takt soll ein Fraktal enthalten.

2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 29 fractal Up: 1.09855
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 21 fractal Up: 1.09976
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 16 fraktal Down: 1.09652
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 6 fractal Up: 1.10721
2015.11.01 13:19:10.577 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: Deinit Funktion
2015.11.01 13:19:08.380 2015.10.01 00:00 MoneyRobotics_Proboi! Test gestartet

Dies ist der Anfang des Protokolls. Zu Beginn des Tests hat der Expert Advisor gearbeitet, Deinit startet, und gleich an der 6. Stelle findet er ein Fraktal.



https://charts.mql5.com/9/256/eurusd-h1-alpari-limited-3.png

Ich weiß nicht, wie ich den Indikatorpuffer ansprechen soll.

Diese hier:

if(Time[0] == prevtime) return;
   prevtime = Time[0];

tun

prevtime = Time[0];

ganz zum Schluss

 
Artyom Trishkin:

Dies:

tun

ganz am Ende.

Wie kann sich das auswirken? Leider hat sich nichts geändert.

wie ich mir den Prozess vorstelle: der Indikator wird geladen, fängt an, jede Tick/Bar-Bedingung zu prüfen, wenn die Bedingung erfüllt ist, legt den Wert in den ausgewählten Puffer oder Puffer, dann ruft der EA den Indikator durch die Puffer-Nummer auf den Wert an einem bestimmten Offset und nimmt den Wert. Oder?

 
Maxim Dobrovolskii:

Wie kann sich das auswirken? Leider hat sich nichts geändert.

Wie stelle ich mir den Prozess vor: der Indikator wird geladen, beginnt die Bedingung jeden Tick/Balken zu prüfen, wenn sie erfüllt ist, legt den Wert in den ausgewählten Puffer oder Puffer, dann ruft der EA den Indikator durch die Puffer-Nummer auf den Wert an einem bestimmten Offset und nimmt den Wert. Oder?

Und warum gibt es einen neuen Balken im Indikator? Offensichtlich gibt es keine komplexen Berechnungen
 
Victor Nikolaev:
Warum gibt es eine neue Balkensteuerung im Indikator? Offenbar gibt es keine komplizierten Berechnungen
Kontrolle eines neuen Balkens im EA, der den Indikator verwendet.