Das Problem der Umstellung von MT4 auf MT5. Oder, genauer gesagt, die Unfähigkeit, einige Algorithmen in MT5 ohne Fehler auszuführen. - Seite 9

 
Vict:

Ja, Code mit Ausnahmen ist viel einfacher und sauberer, die ständige Fehlerprüfung macht ihn zu einem Chaos. Aber es gibt eine Menge Probleme in µl ohne Ausnahmen. Die Entwickler haben die Kreuze nicht gezogen.

Meiner Meinung nach gibt es keinen Unterschied.

Bei Rückgabecodes müssen Sie ein Makro wie RETURN_IF_BAD_RESULT() schreiben und es in alle Funktionen einfügen, die Ergebnisse zurückgeben.

Mit Ausnahmen - Sie müssen TRY-CACTH-Abschnitte schreiben. Außerdem müssen Sie sich merken, welche Funktionen Ausnahmen auslösen und welche nicht, fügen Sie Ihrem Code Kommentare // Ausnahme hinzu.

Etwas ist ein Kinderspiel, etwas ist...

 
Vict:

Ja, Code mit Ausnahmen ist viel einfacher und sauberer, die ständige Überprüfung von Fehlern verwandelt ihn in ein unübersichtliches Durcheinander. Aber es gibt eine Menge Probleme in µl ohne Ausnahmen. Die Entwickler konnten die Kreuze nicht ziehen.

Nein, ich spreche nicht einmal von Ausnahmen... alternativ könnte es auch einen "bösen Schuster" geben... der alle Fahrten außerhalb des Bereichs in Ausnahmen umwandelt ))))

imho, Sie brauchen nur einen Weg, um alle Rückkehr mit Exit in OS zu brechen... lassen Sie es einige Exit(), Sie haben die Idee richtig, ich will nicht endlos Code Spulen zu multiplizieren - es gibt keinen Sinn, immer alle Funktionsaufrufe in verpacken

void OnStart()
{
if(!MyFuncReadOHLC_1()) return;
if(!MyFuncReadOHLC_2()) return;
....
}
 
Georgiy Merts:

Meiner Meinung nach gibt es keinen Unterschied.

Bei Rückgabecodes müssen Sie ein Makro wie RETURN_IF_BAD_RESULT() schreiben und es in alle Funktionen einfügen, die Ergebnisse zurückgeben.

Mit Ausnahmen - Sie müssen TRY-CACTH-Abschnitte schreiben. Plus - merken Sie sich, welche Funktionen eine Ausnahme auslösen und welche nicht, fügen Sie Kommentare // Ausnahme zu Ihrem Code hinzu.

Irgendwas ist im Argen, irgendwas ist im Argen...

Bei Ausnahmen muss ich mir nichts merken, oft ist sogar TRY-CACTH nicht nötig (es beendet einfach den Programmabsturz), es ist eine EXKLUSIVE Situation und kommt normalerweise nicht vor, machen Sie sie nicht zu if-else-Blöcken. Zum Beispiel - ich schrieb ein Vektor-wie (pathetisch-wie), statt Ausnahme auf erfolglose Zuweisungen zu werfen, musste ich schrauben Operator! und ziehen Sie es bei jeder Einfügung (obwohl ich darüber vergessen), zweifelhaften Nutzen.

 
Igor Makanu:

Imho muss man einfach in der Lage sein, alles mit dem Betriebssystem zu unterbrechen...

Ja, das ist auch in Ordnung, seltsam, dass es nicht da ist ...

 
Vict:

Ja, auch nichts, seltsam, dass es nicht vorhanden ist ...

Ich fühle mich einfach nicht wohl dabei, kurze Programme mit lesbarem Code in eine Art Monster zu verwandeln. Hier ist eine typische Vorlage für MQL4 - überprüfen Sie den "neuen Balken", überprüfen Sie Indikatoren - arbeiten oder nicht mit Aufträgen arbeiten:

void OnTick()
  {
   int takeprofit,stoploss; 
   double lot;
   ENUM_CMD CMD1,CMD2,CMD3;
   CMD1 = ind1();
   CMD2 = ind2();
   CMD3 = ind3();
   if(NewBar())
     {
      DeleteOrdersLimits(Magic);
      if(CMD1==CMD_BUY && CMD2==CMD_BUY && CMD3==CMD_BUY)
        {
         CalcTakeProfitStopLoss(takeprofit,stoploss);
         lot=CalcLot(stoploss);
         if(ReversSignal)SELL_STOP_PR(Low[1],lot,Magic,stoploss,takeprofit); else BUY_STOP_PR(High[1],lot,Magic,stoploss,takeprofit);
        }
      if(CMD1==CMD_SELL && CMD2==CMD_SELL && CMD3==CMD_SELL)
        {
         CalcTakeProfitStopLoss(takeprofit,stoploss);
         lot=CalcLot(stoploss);
         if(ReversSignal)BUY_STOP_PR(High[1],lot,Magic,stoploss,takeprofit);else SELL_STOP_PR(Low[1],lot,Magic,stoploss,takeprofit);
        }
     }
  }
//+------------------------------------------------------------------+

In diesem Beispiel ziehen die Indikatoren "jeden Tick", da sie auf verschiedenen TFs arbeiten... ist das nicht wirklich wichtig.

Ich verwende OHLC-Daten inind1(),ind2(),ind3() und inNewBar()

Wenn ich bei einem Funktionsaufruf einen Fehler beim Zugriff auf die Zeitreihe erhalte, welchen Sinn hat es dann, diesen Code weiter auszuführen? - Ich muss das OS verlassen und auf einen neuen Tick warten, d.h. in jedemind1(),ind2(),ind3() und inNewBar() prüfe ich GetLastError() und bei Erhalt eines Fehlers sofort Exit() im OS mit Schreiben in EA log

 
Vict:

Bei Ausnahmen muss ich mir nichts merken, oft ist sogar TRY-CACTH nicht nötig (das Programm wird im Notfall einfach beendet), es ist eine EXKLUSIVE Situation und kommt normalerweise nicht vor, machen Sie sie nicht zu if-else-Blöcken. Zum Beispiel - ich schrieb ein Vektor-wie (pathetisch-wie), statt Ausnahme auf erfolglose Zuweisungen zu werfen, musste ich schrauben Operator! und ziehen Sie es bei jeder Einfügung (obwohl ich darüber vergessen), zweifelhaften Nutzen.

Nun, komm schon, Kumpel...

Sie sagen, "Sie brauchen sich nichts zu merken", und dann fahren Sie fort: Oft wird nicht einmal TRY-CATCH benötigt. Dieses "oft" bedeutet, dass irgendwo ein Block benötigt wird und irgendwo nicht, und Sie müssen sich das merken. Die Situation ist dieselbe wie bei den Rückgabecodes - wenn Sie eine Ressource anfordern und eine Ausnahme auftritt (ein Fehler wird zurückgegeben), müssen Ressourcen zurückgewiesen werden. Das heißt, Sie müssen sich in jedem Fall merken, welche Funktion eine Ausnahme auslöst und welche nicht.

Ach ja, und zur "Ausnahmesituation"... Nun, wie soll ich sagen... Das Fehlen von Anführungszeichen scheint ein vernünftiger Grund für eine Ausnahme zu sein, aber ist es eine "Ausnahmesituation"?

 
Igor Makanu:

Ich finde es einfach nicht bequem, kurze Programme mit lesbarem Code in eine Art Monster zu verwandeln, hier ist eine typische Vorlage für MQL4 - überprüfen Sie die "neue Bar", überprüfen Sie Indikatoren - Arbeit oder nicht Arbeit mit Aufträgen:

In diesem Beispiel ziehen die Indikatoren "jeden Tick", da sie auf verschiedenen TFs arbeiten... ist das nicht wirklich wichtig.

Ich verwende OHLC-Daten inind1(),ind2(),ind3() und inNewBar()

Wenn ich bei einem Funktionsaufruf einen Fehler beim Zugriff auf die Zeitreihe erhalte, welchen Sinn hat es dann, diesen Code weiter auszuführen? - Ich muss das OS verlassen und auf einen neuen Tick warten, d.h. in jedem ind1(),ind2(),ind3() und inNewBar() prüfe ich GetLastError() und nachdem ich einen Fehler erhalten habe, sofort Exit() im OS mit Aufzeichnung im EA-Log

Was ist das Problem mit dem Aufruf von return(iErrrCode)?

 
Georgiy Merts:

Und was ist das Problem beim Aufruf von return(iErrrCode)?

Hm, ich werde versuchen, es im Code zu zeigen, ich habe den Code mit Exit umgeschrieben, wenn die OHLC-Daten falsch verarbeitet wurden, es wird so aussehen:

void OnTick()
  {
   int takeprofit,stoploss; 
   double lot;
   bool nb;
   ENUM_CMD CMD1,CMD2,CMD3;
   if(!ind1( CMD1 )) return;
   if(!ind2( CMD2 )) return;
   if(!ind3( CMD3 )) return;
   if(!NewBar( nb )) return;
   
   if( nb )
     {
      DeleteOrdersLimits(Magic);
      if(CMD1==CMD_BUY && CMD2==CMD_BUY && CMD3==CMD_BUY)
        {
         CalcTakeProfitStopLoss(takeprofit,stoploss);
         lot=CalcLot(stoploss);
         if(ReversSignal)SELL_STOP_PR(Low[1],lot,Magic,stoploss,takeprofit); else BUY_STOP_PR(High[1],lot,Magic,stoploss,takeprofit);
        }
      if(CMD1==CMD_SELL && CMD2==CMD_SELL && CMD3==CMD_SELL)
        {
         CalcTakeProfitStopLoss(takeprofit,stoploss);
         lot=CalcLot(stoploss);
         if(ReversSignal)BUY_STOP_PR(High[1],lot,Magic,stoploss,takeprofit);else SELL_STOP_PR(Low[1],lot,Magic,stoploss,takeprofit);
        }
     }
  }

jetzt erhalte ich Funktionswerte per Referenz und verlasse die Funktion, wenn sie nicht korrekt verarbeitet wurde (im Kontext der Diskussion - das Terminal hat keinehistorischen Daten von TF vorbereitet)

 
Georgiy Merts:

Nun, komm schon, Kumpel...

Sie sagen, "Sie brauchen sich nichts zu merken", und dann fahren Sie fort: Oft wird nicht einmal TRY-CATCH benötigt. Dieses "oft" bedeutet, dass irgendwo ein Block benötigt wird und irgendwo nicht, und Sie müssen sich das merken. Die Situation ist dieselbe wie bei den Rückgabecodes - wenn Sie eine Ressource anfordern und eine Ausnahme auftritt (ein Fehler wird zurückgegeben), müssen Ressourcen zurückgewiesen werden. Das heißt, Sie müssen sich in jedem Fall merken, welche Funktion eine Ausnahme auslöst und welche nicht.

Ach ja, und zur "Ausnahmesituation"... Nun, wie soll ich sagen... Das Fehlen von Anführungszeichen ist ein vernünftiger Grund für eine Ausnahme, aber ist es eine "Ausnahmesituation"?

Sie haben die Ausnahmen auf Ihre eigene Art und Weise genutzt, offensichtlich zu Unrecht. Im Allgemeinen sollten Sie sich nicht darum kümmern, ob diese Funktion eine Ausnahme auslöst oder nicht. Der Einsatz von TRY-CATCH ist optional. Und um Ressourcenprobleme zu vermeiden, besorgen Sie sich RAIIhttps://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D0%B0_%D0%B5%D1%81%D1%82%D1%8C_%D0%B8%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F, das Hochfahren des Stapels wird alles aufräumen.

Und zur "Ausnahmesituation"... Nun, wie soll ich es sagen... Das Fehlen von Zitaten scheint ein vernünftiger Grund zu sein, eine Ausnahme zu machen, aber handelt es sich um eine "Ausnahmesituation"?
Die Ausschließlichkeit bleibt dem Autor des Codes überlassen, aber Ausnahmen sollten natürlich nicht mit if-else vergleichbar sein.
 

Merkwürdigerweise habe ich vorher nicht daran gedacht:

// Немедленное завершение, деструкторы не вызываются
void abort() {Alert(1/(uint)MathAbs(0));}

Damit entfällt eine Reihe von Fehlerprüfungen, z. B. die Speicherzuweisung.