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

 
for(int h = OrdersTotal()-1; h >= 0; h--) // Начинаем цикл перебора ордеров
    {
     if(OrderSelect(h, SELECT_BY_POS)) //Выбираем ордер с индексом h
      {
       if((cnt_OO >= 2))//Если cnt_OO больше либоравно 2 выполняем блок иначе переходим к Метке 1
        {
       if((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus))//Если мейджик выбраного ордера совпадает и лотность совпадает с Lots/Prikup - Dplus
//(если переменные типа double необходимо обязательно нормализовать) выполняем блок иначе переходим к Метке 1
        {
         Nextstep  = NextStep;
         BaseNext  = OrderOpenPrice();
         LotsNext  = NormalizeDouble(OrderLots()*K,lotDigit);
         if(NewPB > 0)
          PBcloseON = true;
         Alert ("Pospedny Order NEXT  ",OrderTicket());
         Alert ("Otkritih orderov  ",cnt_OO);
        break; //Прерываем цикл
        }}
//Метка 1
         LotsNext    = NormalizeDouble(Lots*Prikup,lotDigit); 
         Alert ("Otkritih orderov NEXT net ");
        Alert ("Otkritih orderov  ",cnt_OO);
         break;// Прерываем цикл 
     
        }}

Das erste ProblemLots/Prikup - Dplus muss normalisiert werden. Wenn die Variablen vom Typ Double sind, werden Sie sich wundern, wenn 4/2 nicht die erwartete 2, sondern 1,999999999999 ergibt - Sie haben sich wahrscheinlich noch nicht mit diesem Problem beschäftigt.

Wenn also((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus)) falsch ist, und ich kann mit hoher Wahrscheinlichkeit sagen, dass es falsch ist, dann kommen Sie auch bei cnt_OO größer als 1 garantiert zu einem Block nach Etikett 1. Also funktioniert bei Ihnen alles ohne Fehler Das Problem liegt in der Datenverarbeitungslogik.

Das zweite Problem besteht darin, dass Sie garantiert nur den letzten Auftrag in der Liste verarbeiten, warum also eine for-Schleife verwenden?

Wenn Sie dies nur für den Prüfer tun und dann den letzten Auftrag aus der Liste auswählen, erhalten Sie wirklich den gewünschten Auftrag, aber nicht immer. Auf dem realen Markt, insbesondere wenn mehrere Expert Advisors laufen, erhalten Sie garantiert etwas anderes als Sie erwarten, und die Schleife wird garantiert nach dem ersten Durchlauf mit dem Break-Befehl abgebrochen.

 
Vitaly Gorbunov:

Das erste ProblemLots/Prikup - Dplus muss normalisiert werden. Wenn die Variablen vom Typ Double sind, werden Sie sich wundern, wenn 4/2 nicht die erwartete 2, sondern 1,999999999999 ergibt - Sie haben sich wahrscheinlich noch nicht mit diesem Problem beschäftigt.

Wenn also((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus)) falsch ist, und ich kann mit hoher Wahrscheinlichkeit sagen, dass es falsch ist, dann kommen Sie auch bei cnt_OO größer als 1 garantiert zu einem Block nach Etikett 1. Also funktioniert bei Ihnen alles ohne Fehler Das Problem liegt in der Datenverarbeitungslogik.

Das zweite Problem besteht darin, dass Sie garantiert nur den letzten Auftrag in der Liste verarbeiten, warum also eine for-Schleife verwenden?

Wenn Sie dies nur für den Prüfer tun und dann den letzten Auftrag aus der Liste auswählen, erhalten Sie wirklich den gewünschten Auftrag, aber nicht immer. Auf dem realen Markt, insbesondere wenn mehrere Expert Advisors laufen, erhalten Sie garantiert genau die falsche Reihenfolge und die Schleife bricht nach dem ersten Durchlauf ab.

Vitaly Gorbunov:

Das erste ProblemLots/Prikup - Dplus muss normalisiert werden. Wenn die Variablen vom Typ Double sind, werden Sie sich wundern, wenn 4/2 nicht die erwartete 2, sondern 1,99999999999999 ergibt - vielleicht sind Sie mit diesem Problem noch nicht konfrontiert worden

Wenn also((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus)) falsch ist, und ich kann mit hoher Wahrscheinlichkeit sagen, dass es falsch ist, dann kommen Sie auch bei cnt_OO größer als 1 garantiert zu einem Block nach Etikett 1. Also funktioniert bei Ihnen alles ohne Fehler Das Problem liegt in der Datenverarbeitungslogik.

Das zweite Problem besteht darin, dass Sie garantiert nur den letzten Auftrag in der Liste verarbeiten, warum also eine for-Schleife verwenden?

Wenn Sie dies nur für den Prüfer tun und dann den letzten Auftrag aus der Liste auswählen, erhalten Sie wirklich den gewünschten Auftrag, aber nicht immer. Auf dem realen Markt, insbesondere wenn mehrere Expert Advisors laufen, erhalten Sie garantiert genau die falsche Reihenfolge, und die Schleife bricht nach dem ersten Durchlauf mit dem Break-Befehl ab.

Was die Normalisierung betrifft - danke, ich hatte nicht bemerkt, dass sie fehlt. Mein Auge hat sich einfach in meinem Kopf verloren.

Zur for-Schleife: Es gibt verschiedene Aufträge im Archiv mit verschiedenen Magiern und von verschiedenen Paaren. Ich gehe sie von hinten nach vorne durch, bis ich das gefunden habe, was ich brauche. Dies geschieht, wenn der EA noch nicht in Betrieb ist und keine neuen Aufträge, die ich benötige, in der Liste erscheinen. Die Schleife wird nicht beim ersten Durchlauf unterbrochen, sondern erst, wenn die gewünschte Reihenfolge gefunden ist.

Wir müssen die Funktionen Onlinit und OnDeinit richtig verstehen. Ihre Notwendigkeit ist offensichtlich.

 

Bei dieser Implementierung funktioniert die Schleife nicht. Ich habe Ihren Code in verschiedenen Varianten immer in einem Durchgang ausgeführt.

Und jetzt sehe ich, wo du dich geirrt hast!

for(int h = OrdersTotal()-1; h >= 0; h--) // Начинаем цикл перебора ордеров
    {
     if(OrderSelect(h, SELECT_BY_POS)) //Выбираем ордер с индексом h
      {
       if((cnt_OO >= 2))//Если cnt_OO больше либоравно 2 выполняем блок иначе переходим к Метке 1
        {
       if((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus))//Если мейджик выбраного ордера совпадает и лотность совпадает с Lots/Prikup - Dplus
//(если переменные типа double необходимо обязательно нормализовать) выполняем блок иначе переходим к команде continue
        {
         Nextstep  = NextStep;
         BaseNext  = OrderOpenPrice();
         LotsNext  = NormalizeDouble(OrderLots()*K,lotDigit);
         if(NewPB > 0)
          PBcloseON = true;
         Alert ("Pospedny Order NEXT  ",OrderTicket());
         Alert ("Otkritih orderov  ",cnt_OO);
        break; //Прерываем цикл
        }

        continue; //Вернёмся в цикл за следующим ордером если предыдущий не прошёл проверку
       }
//Метка 1
         LotsNext    = NormalizeDouble(Lots*Prikup,lotDigit); 
         Alert ("Otkritih orderov NEXT net ");
        Alert ("Otkritih orderov  ",cnt_OO);
         break;// Прерываем цикл 
     
        }}

Ich habe alles so oft wie möglich kommentiert! Versuchen Sie es!

 
Vitaly Gorbunov:

Bei dieser Implementierung funktioniert die Schleife nicht. Ich habe Ihren Code in verschiedenen Varianten immer in einem Durchgang ausgeführt.

Und jetzt ist klar, wo Sie einen Fehler gemacht haben!

Ich habe alles so oft wie möglich kommentiert! Versuchen Sie es!

Danke, ich habe es verstanden. Hier ist ein Workaround für den Fehler der fehlenden Normalisierung. Nach genauerer Prüfung des Wiederherstellungsalgorithmus erwies sich die Bedingung&&(OrderLots() <= Lots/Prikup - Dplus) als unnötig.

Ich danke Ihnen allen für Ihre guten Ratschläge



Hier ist das Ergebnis des Tests. In der Realität ist es ungefähr dasselbe, sogar besser. Seien Sie vorgewarnt - dies ist kein Martingal. Es ist noch schlimmer, als Sie denken :=). Abzug 1,3% Gewinn 507$

 
Gutes Ergebnis! Noch mehr Probleme, aber es ist schwierig, die richtigen Informationen aus Ihnen herauszubekommen, um herauszufinden, was das Problem ist. Wenn du willst, kannst du mich als Freund hinzufügen, damit ich nicht verloren gehe.
 
Vitaly Muzichenko:

Wenn es funktioniert und es Ihnen nichts ausmacht, das Ergebnis mit anderen zu teilen - schreiben Sie eine Lösung für das Problem

Es hat nicht funktioniert (ich habe die php openssl-Bibliothek verwendet). Das Problem wurde auf eine andere Weise gelöst.

 
Juer:

Hat nicht funktioniert (ich habe die php openssl-Bibliothek verwendet). Das Problem wurde auf eine andere Weise gelöst.

Sie haben also in MT verschlüsselt und in .php entschlüsselt? Welchen Weg haben Sie gewählt?

 
Vitaly Muzichenko:

Sie haben also in MT verschlüsselt und in .php entschlüsselt? Welche Methode haben Sie verwendet?

Nein, ich sagte doch, es hat nicht funktioniert. Ich habe es aufgegeben. Für meine Aufgabe reichte ein Haschisch. Ich habe einen Hash gesendet und empfangen und einen weiteren Hash als Bestätigung zurückgeschickt.

Ich konnte sie also nicht in PHP entschlüsseln. Es wäre schön, wenn sich jemand ernsthaft mit dieser Frage befassen könnte. Vielleicht ein Entwickler oder so.

 
Juer:

Nein, ich habe geschrieben, dass es nicht funktioniert hat. Ich habe es aufgegeben. Ein Haschisch war für meine Aufgabe ausreichend. Ich habe einen Hash gesendet und erhalten und einen weiteren Hash als Bestätigung zurück.

Ich konnte sie also nicht in PHP entschlüsseln. Es wäre schön, wenn sich jemand ernsthaft mit dieser Frage befassen könnte. Vielleicht ein Entwickler oder so.

Schreiben Sie Ihre eigene Verschlüsselungsfunktion in puch und portieren Sie sie nach mq. Auf diese Weise können sie es nicht entschlüsseln, und es funktioniert so oder so zu 100 %.

 
Vitaly Muzichenko:

Wenn es funktioniert und es Ihnen nichts ausmacht, das Ergebnis zu teilen, posten Sie die Lösung

google "PKCS#7-Padding-Format"

Grund der Beschwerde: