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

 
Ihor Herasko:


Aber Tatsache ist, dass. Der Ruhezustand sollte keine Auswirkungen auf die Neuberechnung der Daten im Indikator haben. Mit der Pufferbefüllung stimmt etwas nicht. Vielleicht gibt es ein reproduzierbares Stück Code?

Der Indikator wurde auf Bestellung geschrieben - es ist ein wildes OOP, ich verstehe es nicht :(

Ich habe die ganze Nacht mit diesem Problem verbracht, während ich den Grund für die Abweichung zwischen Tester und echtem Konto gefunden habe, vielleicht werde ich nach dem Schlafen einige der geheimen Logik entfernen und sie zur Überprüfung veröffentlichen.

 
Aleksey Vyazmikin:

Ich konfrontiert ein Problem, der Indikator basierte EA funktioniert korrekt auf einem realen Konto, aber es liegt in der Tester, in Tick Generation Modi sowohl durch OHLC und durch alle Ticks - das Ergebnis ist das gleiche. Das Ergebnis des Fehlers ist der leere Puffer des Indikators beim Null-Bar (nur wenn es einen neuen Bar am oberen TF gibt, der für die Berechnung des Indikators verwendet wird). Ich habe es jedoch geschafft, den Indikator zu berechnen, indem ich Sleep zu meinem Expert Advisor hinzufügte. Aber ich habe herausgefunden, dass dieser Sleep je nach Modus der Tick-Generierung unterschiedlich sein sollte - für die Generierung aus allen Ticks ist Sleep(15000) ausreichend, während für OHLC Sleep(30000) benötigt wird.

Es stellt sich also die Frage, ob die Situation mit Sleep normal ist, denn es stellt sich logischerweise heraus, dass dort unterschiedliche Verzögerungszeiten modelliert werden, abhängig von der Art der Tick-Erzeugung!

Liebe Entwickler, ich bitte Sie, die Situation mit dem Indikator zu erklären, weil ich selbst nicht verstehen kann, was der Grund ist - ein Fehler im Code oder im Tester!

Ich bin bereit, Ihnen den Indikator und den Expert Advisor in der PM zu geben, aber sagen Sie mir, an wen.

Wenn Sie den Preis in ein Array kopieren wollen, müssen Sie prüfen, ob die Historie verfügbar ist und ob der Preis nicht geändert wurde. Zu diesem Zweck müssen wir prüfen, ob der Verlauf für TF verfügbar ist. Wenn nicht, sollten wir versuchen, ihn erneut zu kopieren und warten, bis er in die Schleife geladen wurde.

das ist eine schlechte Hand des Programmierers, wenn er das nicht wusste

Schlupf ist nicht normal
 
void OnChartEvent(            const int id,        // идентификатор события   
                              const long& lparam,  // параметр события типа long 
                              const double& dparam,// параметр события типа double 
                              const string& sparam // параметр события типа string 
                              )
   {
   Print(My_Name, " ---  ", id, "    lparam = ", lparam, "    dparam = ", dparam, "    sparam = ", sparam, "    ChartID() = ", ChartID() );        // <<|+|+|+<<  // 

   }                              

Bitte erklären Sie...

Ich drücke die Taste = Ich erhalte Ereignis-ID = 0. Dies kann viele Male wiederholt werden. Das Ergebnis ist dasselbe, solange die Leertaste nicht gedrückt wird.

Ich drücke die Leertaste = Ich erhalte die Ereignis-ID = 0. Danach führen alle Eingaben auf der Tastatur zu keinem Ereignis mehr.

Um aus dem Stupor herauszukommen, drücke ich die Maustaste = ich erhalte die Ereignis-ID = 4. Danach können Sie wieder auf die Tastatur klicken = für jeden Klick kommen Ereignisse. Solange keine Leertaste gedrückt wird = mit dem gleichen Ergebnis.

Frage: Bin ich ein Narr, der etwas nicht versteht, oder sollte es nicht so sein? Bitte geben Sie einen Link an.

 
Nikita Chernyshov:

Hallo Kollegen.

Frage: Um in mql4 die Anzahl der Positionen zu berechnen, kann man die Funktion wie folgt schreiben

Wie wird dies in mql5 umgesetzt? Wie kann ich Positionen nach magischer Zahl oder nach Art berechnen?

Fügen Sie diese Zeile vor der MQL4-Funktion ein

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

und es wird in MT5 funktionieren.

 
Maxim Dmitrievsky:

Die Sache mit den Indikatoren ist, dass die Zeitreihe noch nicht fertig ist, d.h. sie kann den Preis nicht sofort in ein Array kopieren. Zu diesem Zweck sollten wir prüfen, ob der Verlauf für TF verfügbar ist. Wenn nicht, sollten wir versuchen, ihn erneut zu kopieren und warten, bis er in die Schleife geladen wurde.

Dies ist ein schlechtes Blatt für den Programmierer, wenn er/sie es nicht weiß.

Ausrutschen ist nicht in Ordnung

Wie ist dies im Prüfgerät möglich? Ich verstehe, wenn das Problem auf der realen oder in der Tester gibt es keine Geschichte ... Doch wie sollte dieser Test aussehen?

Die Entwickler ignorieren meine Nachricht, was bedauerlich ist.

 
Aleksey Vyazmikin:

Wie ist dies im Prüfgerät möglich? Ich verstehe, wenn das Problem auf der realen oder in der Tester gibt es keine Geschichte gibt ... Doch wie sollte dieser Test aussehen?

Die Entwickler ignorieren meine Nachricht, was bedauerlich ist.

Prüfen, ob die Preise kopiert werden, wenn Copyclose oder was auch immer -1 zurückgibt, werden sie nicht kopiert

 
Maxim Dmitrievsky:

Prüfen, ob die Preise kopiert werden, wenn Copyclose oder was auch immer -1 zurückgibt, werden sie nicht kopiert

Der Indikator wird einmal beim Erscheinen eines neuen Balkens berechnet, was, wenn ich es richtig verstehe, auf diese Weise umgesetzt wird:

//+------------------------------------------------------------------+
//| 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[])
  {
   static int counted_bars=0;
   if(rates_total==prev_calculated) return(rates_total);

Es wird auch durch einen einfachen Druck bestätigt.

Deshalb ist die Situation nicht klar, wenn wir davon ausgehen, dass es keinen Preis zu berechnen, wird der Indikator 1 Mal berechnet werden und der Puffer wird ungefüllt bleiben, aber es ist nicht so - es wird füllen, wenn wir schlafen, um die EA hinzufügen und warten. Vielleicht ist der Indikator langsam in der Berechnung und der Prüfer wartet einfach nicht auf ihn? Aber wie kann man das überprüfen?

 
Aleksey Vyazmikin:

Der Indikator wird 1 Mal berechnet, wenn ein neuer Balken erscheint, was, wenn ich es richtig verstehe, auf diese Weise umgesetzt wird:

Dies wird auch durch einen einfachen Druck bestätigt.

Das ist der Grund, warum die Situation nicht klar ist. Wenn wir davon ausgehen, dass keine Preise berechnet werden, wird der Indikator einmal berechnet und der Puffer bleibt ungefüllt, aber das ist nicht der Fall - er füllt sich, wenn wir dem EA Schlaf hinzufügen und warten. Vielleicht ist der Indikator langsam in der Berechnung und der Prüfer wartet einfach nicht auf ihn? Aber wie kann man das überprüfen?

Vielleicht sollte es dann zeitlich begrenzt sein

 
Maxim Dmitrievsky:

Vielleicht sollten wir dann einen Timer verwenden.

Ja, mit dem Timer im EA geht der Test etwas weiter als ohne Timer, aber schlechter als mit Sleep, und der Timer ist im Wesentlichen dasselbe wie Sleep.

Ich glaube, ich verstehe, was das Problem ist, der Indikator wird mit Daten von zwei anderen Indikatoren berechnet und der Code fragt nach der Anzahl der berechneten Balken der anderen Indikatoren

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CChannel::BarsCalculated(void)
  {
   int upchbars=BarsCalculated(m_upch);
   int dnchbars=BarsCalculated(m_dnch);
   if(upchbars<=dnchbars) return(upchbars);
   return(dnchbars);
  }

und die erwartete berechnete Anzahl von Balken

int barsch=(InpChPeriod==PERIOD_CURRENT?rates_total:Bars(_Symbol,InpChPeriod));

Wenn diese beiden Werte nicht übereinstimmen, wird der Puffer nicht gefüllt.

   if(!channel.CreateChannel() || barsch<=0 || barsch!=channel.BarsCalculated() || channel.FillChBuffers(rates_total,calculated,time)==0)
     {
      for(;counted_bars<rates_total;counted_bars++)
        {
         ZigzagBuffer[counted_bars]=0.0;
         ZigzagStepBuffer[counted_bars]=0.0;
         UpChBuffer[counted_bars]=0.0;
         DnChBuffer[counted_bars]=0.0;
         InfoZigzagBuffer[counted_bars]=0.0;
         InfoUpChBuffer[counted_bars]=0.0;
         InfoDnChBuffer[counted_bars]=0.0;
         InfoDirectBuffer[counted_bars]=0.0;
         InfoBegPriceBuffer[counted_bars]=0.0;
         InfoEndPriceBuffer[counted_bars]=0.0;
         InfoBegTimeBuffer[counted_bars]=0.0;
         InfoEndTimeBuffer[counted_bars]=0.0;
         InfoStartPriceBuffer[counted_bars]=0.0;
         InfoStartTimeBuffer[counted_bars]=0.0;
         InfoZigzagTotal[counted_bars]=InfoZigzagTotal[counted_bars-1];
        }
      if(InpInfEnd) CopyInfoBuffers(rates_total-1,(int)InfoZigzagTotal[rates_total-1]);
      return(calculated);
     }

Wenn ich richtig verstehe, werden die Indikatoren in einem Thread ausgeführt und ihre Priorität wird durch den Zeitpunkt ihrer Erstellung verteilt, d.h. es stellt sich heraus, dass der Indikator, den ich vom EA anspreche, die höhere Priorität hat und seine Berechnung zuerst durchführt und danach den Thread an die Indikatoren weitergibt, die die Berechnung durchführen sollen (basierend auf den Pufferdaten).

Im Druck können Sie sehen, dass, wenn ich Sleep einer ausreichenden Größe, die Neuberechnung im Indikator durchgeführt wird (ich verstehe nicht, wie noch) und warum nur nach 13 Sekunden?

2019.01.22 19:50:16.992 2019.01.21 23:45:00   barsch=6275
2019.01.22 19:50:16.992 2019.01.21 23:45:00   BarsCalculated=6274

2019.01.22 19:50:16.993 2019.01.21 23:45:13   barsch=6275
2019.01.22 19:50:16.993 2019.01.21 23:45:13   BarsCalculated=6275

Der Indikator verfügt über keinen Timer.

Und was sollte ich tun, um eine korrekte Berechnung zu erhalten, versuchen zu verwenden, während in EA vor dem Warten auf Wert in Puffer nicht hilft - hängt.

 
Hallo, ich wollte in meinem EA einen Trailing Stop mit Step implementieren. Ich konnte nichts anderes als die Vorlage in Kodobase und Macd Sample finden. Vielleicht gibt es andere Möglichkeiten?