Beunruhigt durch den Fehler gibt es keine Handelsgeschäfte - Seite 14

 
Maxim Kuznetsov:

darüber nachdenken, was bei Stop Out passieren wird. (Sie haben bereits Margin Call, Steppe ist näher denn je)

Ihr Handel wird zwangsweise geschlossen, aber Sie ignorieren eine solche Option, und Sie werden jeden Tick danach suchen (in der Geschichte ist sie lang) und falsche Aufträge senden.

Für alle, die "mehr als 10 Jahre MQL-Programmierung" haben, möchte ich hinzufügen

Wenn etwas passieren kann, dann wird es auch passieren.

Stop Out und Margin Call sind nicht so normal, aber es ist natürlich, und ein EA sollte darauf vorbereitet sein.

Die Handelsbedingungen können sich ändern, sie sind nicht konstant. StopLevel springt und sogar die Hebelwirkung ändert sich manchmal.

Der Benutzer kann leicht Stop/Take setzen/ändern oder eine Position schließen, auch unbeabsichtigt - der Expert Advisor sollte darauf reagieren

Ein Benutzer kann eine Order mit Magic öffnen/schließen (oder versehentlich Magic=0 setzen und von Hand handeln) - was wird der Roboter tun?

Guthaben wird eingezahlt/abgehoben, ohne den EA neu zu starten - es ist extrem wichtig, dass der Roboter dazu in der Lage ist (es gab kürzlich ein Thema - ein Mann hat gerade Geld verloren)

Der Neustart des Terminals kann lange dauern, oder die Verbindung kann für längere Zeit unterbrochen werden.

Der Validator prüft nur 1-2% des "Kandidaten-Minimums" und die Leute beschweren sich trotzdem...

 
Renat Akhtyamov:

scheint sequentiell geschrieben worden zu sein, Frage - Antwort

alle Seiten des Threads sind zugänglich.

Renat, ich verstehe, dass Sie die Haftbefehle zählen. Ich verstehe nicht, warum?


Maxim Kuznetsov:

Nur um für alle diejenigen, die "mehr als 10 Jahre MQL-Programmierung" haben, hinzuzufügen.

Wenn etwas passieren kann, dann wird es auch passieren.

Stop Out und Margin Call sind nicht so normal, aber es ist natürlich, und ein EA muss darauf vorbereitet sein

Die Handelsbedingungen können sich ändern, sie sind nicht konstant. StopLevel springt und sogar die Hebelwirkung ändert sich manchmal.

Der Benutzer kann leicht Stop/Take setzen/ändern oder eine Position schließen, auch unbeabsichtigt - der Expert Advisor sollte darauf reagieren

Ein Benutzer kann eine Order mit Magic öffnen/schließen (oder versehentlich Magic=0 setzen und von Hand handeln) - was wird der Roboter tun?

Guthaben wird eingezahlt/abgehoben, ohne den EA neu zu starten - es ist extrem wichtig, dass der Roboter dazu in der Lage ist (es gab kürzlich ein Thema - ein Mann hat gerade Geld verloren)

Der Neustart des Terminals kann lange dauern, oder die Verbindung kann für längere Zeit unterbrochen werden.

Der Validator wird nur von 1-2% der "Mindestkandidaten" geprüft und die Leute beschweren sich trotzdem...

Maxim, wovon reden Sie?! Was habe ich um Rat gefragt, was ich tun soll, wenn ich eine Unterbrechung erhalte. Lesen Sie das Forum ab Seite 6, meiner Meinung nach habe ich meine Frage sehr ausführlich dargelegt.

 
Andrey Kaunov:

Renat, ich verstehe, dass Sie die Haftbefehle zählen. Ich verstehe nicht, warum?


Maxim, wovon reden Sie?! Habe ich um Rat gefragt, was ich bei einer Unterbrechung tun soll? Lesen Sie das Forum auf Seite 6, ich glaube, ich habe meine Frage sehr ausführlich dargelegt.

Denn die Tickets auf der real sind nicht 0,,,,N

 
Oh, du meinst meinen kleinen Code. Es spielt also keine Rolle, welche Art von Tickets es gibt. Renat dort ist ein zweidimensionales Array. In Zelle [0] schreibt er einen Fahrschein, und in Zelle [1] zählt er die Bestellungen. Wir könnten es mit anderen Variablen machen, aber ich habe mich dafür entschieden, es so zu machen.
 
Andrey Kaunov:

Renat, ich verstehe, dass Sie die Haftbefehle zählen. Ich verstehe nicht, warum?


Maxim, wovon reden Sie?! Habe ich um Rat gefragt, was ich bei einer Unterbrechung tun soll? Lesen Sie das Forum ab Seite 6, meiner Meinung nach habe ich meine Frage sehr ausführlich dargelegt.

was kann ich Ihnen mit Ihrer 10-jährigen Erfahrung raten...im Prinzip nichts :-)

Du ignorierst meinen Rat und bestehst darauf, den Validor für deinen EA zu reparieren.

---

Sie haben einen Stop-Out auf NZDUSD, eine Order wurde geschlossen, die Logik Ihres EAs spielt keine Rolle, Sie wählen sie trotzdem aus und senden OrderClose, Sie erhalten false. Dieser erstaunliche Vorgang wiederholt sich bei jedem Ticken, das Ganze verlangsamt sich und der Scheck wird annulliert. Und das ist der einfachste Fall.

Über die Kontrolle der Handelsbedingungen - siehe vorherige 14 Seiten

 
Andrey Kaunov:

Achten Sie auf diesen Beitrag von Ihnen:

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Genervt von dem Fehler, dass es keine Handelsgeschäfte gibt

Andrey Kaunov, 2020.07.25 11:42

Ich werde es versuchen, danke für den Tipp.

Vladimir, können Sie die Frage konstruktiv verstehen? Muss ich die Partie nicht auf die Gewinnspanne und so weiter prüfen?Der Artikel "Welche Kontrollen müssen bestehen..." ist für mich schon wie eine Bibel. Ich habe oben Codeschnipsel gepostet. Ich habe den Code entsprechend Ihren Empfehlungen aus dem Artikel geändert, damit er vollständig konform ist:

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, int direction, bool is_margin=true) {
   if(lot<=0) return(0.0);
   RefreshRates();
   double min=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double max=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   double step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP); 
   //double free = AccountFreeMargin()*0.95;
   //double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot=MathRound(_lot/step)*step;
   //if(is_margin && _lot*margin>free)  _lot=0.0;
   ResetLastError();
   if(is_margin && (AccountFreeMarginCheck(Symbol(),direction,_lot)<=0 || GetLastError()==134)) _lot=0.0;
   return(_lot);
}

Aber ich erhalte immer noch "no trades":

Nun, wenn die Funktion immer 0,0 Lot sendet und es nicht erlaubt, Trades zu eröffnen, ändere ich sie so, dass sie ein Minimum Lot sendet:

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, int direction, bool is_margin=true) {
   if(lot<=0) return(0.0);
   RefreshRates();
   double min=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double max=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   double step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP); 
   //double free = AccountFreeMargin()*0.95;
   //double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot=MathRound(_lot/step)*step;
   //if(is_margin && _lot*margin>free)  _lot=0.0;
   ResetLastError();
   if(is_margin && (AccountFreeMarginCheck(Symbol(),direction,_lot)<=0 || GetLastError()==134)) _lot=min;
   return(_lot);
}

Und ich habe die Erfahrung gemacht, dass der Handel tatsächlich stattfindet (siehe Screenshots unten). Aber das minimale Los kommt natürlich sehr seltsam, aber lass es kommen. Aber die Angebote sind da!

Das ist in dieser Situation, sehr seltsame Sache ist Validator, so dass eine minimale Menge 0,2 für eine Einzahlung von $ 1.


Natürlich wird es überhaupt keine Angebote geben! Und das bei einem völlig ausreichenden Code. Übrigens habe ich zum Testen alle Bedingungen für Indikatoren usw. entfernt. Die Geschäfte werden eröffnet, sobald der Expert Advisor gestartet wird.

Was macht der Validator also? Ich glaube, das Einzige, was es bisher bewirkt, ist, dass es die Programmierer umhaut!

Beachten Sie, dass ich nicht darum bitte, etwas im Validator zu ändern. Wir können einfach die Prüfprotokolle einsehen. Wir werden dann verstehen, mit welchen Parametern die Tests laufen und auf welchen Einlagen. Letztendlich können Sie mit Hilfe von Ausdrucken zumindest prüfen, wo der Fehler im Code liegt, und ihn so schnell wie möglich beheben. Wir werden nicht eine ganze Woche lang mit dem Finger in den Himmel zeigen, nur um einen Fehler zu lokalisieren. Wir arbeiten doch nicht gegeneinander, oder? Ich verstehe, dass wir versuchen, gemeinsam etwas zu verdienen.

Ihr allererster Screenshot. Sie haben sich an die Meldung angehängt, dass es keine Trades auf NZDUSD gibt. Und Sie kämpfen schon seit 14 Seiten gegen diese Mühle an.

Aber der Hauptfehler auf dem ersten Screenshot ist nicht dieser. Es ist derjenige, der Sie über zu lange Tests auf GBPUSD informiert. Da der Test zu lange dauerte, wurde er vom Prüfer abgebrochen.

Führen Sie den Code Profiler auf GBPUSD, M30 aus und lassen Sie ihn drei Stunden lang handeln. Dann schauen Sie sich die Engpässe an und beheben Sie sie.

 
Maxim Kuznetsov:


---

Sie haben einen Stop-Out auf NZDUSD, Sie haben eine Order geschlossen, die Logik Ihres EAs kümmert sich nicht darum, Sie wählen sie trotzdem aus und senden OrderClose, Sie erhalten false. Dieser erstaunliche Vorgang wiederholt sich bei jedem Ticken, das Ganze verlangsamt sich und der Scheck wird annulliert. Und das ist der einfachste Fall.

Zur Überprüfung der Handelsbedingungen - siehe vorherige 14 Seiten.

Maxim, Sie lesen den Code sehr unaufmerksam.

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
   gl_lots=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   gl_ask=NormalizeDouble(Ask,_Digits);
   gl_bid=NormalizeDouble(Bid,_Digits);
   gl_comm="test";
//---
   if(AccountFreeMarginCheck(_Symbol,OP_BUY,gl_lots)<=0 || GetLastError()==134) {
      printf("Not enough money for the minimum lot: %.4f",gl_lots); 
      return;
   }
   if(test_ticket[1]<8 && test_ticket[0]==0) {
      test_ticket[0]=OrderSend((StringCompare(_Symbol,"NZDUSD")==0?"NZDUSD":_Symbol),OP_BUY,gl_lots,gl_ask,30,0.0,0.0,gl_comm,33333,0,clrNONE);
      if(test_ticket[0]>0) test_ticket[1]++;
      else if(Fun_Error(GetLastError())==1) return; 
   }   
   if(test_ticket[0]>0)
      if(OrderSelect(test_ticket[0],SELECT_BY_TICKET)) {
         if(OrderCloseTime()==0 && OrderOpenTime()+300<TimeCurrent())
            if(OrderClose(test_ticket[0],OrderLots(),gl_bid,30,clrNONE)) {
               printf("Test order closed, ticket #%d",test_ticket[0]);
               test_ticket[0]=0;
            } else if(Fun_Error(GetLastError())==1) return;
      } else if(Fun_Error(GetLastError())==1) return;
}

Die in der Markierung erwähnte Bedingung lässt die Funktion OrderClose() nicht weglaufen, wenn die Bestellung geschlossen ist. Und zweitens, wenn mindestens eine Order auf NZDUSD offen ist, würde der Validator nicht "no trade" zurückgeben.

Artyom Trishkin:

...

Führen Sie den Code Profiler auf GBPUSD, M30 aus und lassen Sie ihn drei Stunden lang handeln. Dann schauen Sie sich die Engpässe an und beheben Sie sie.

Okay, Artyom. Ich werde es ausprobieren.

 
Andrey Kaunov:

Maxim, Sie haben den Code sehr unaufmerksam gelesen.

Die durch die Markierung angegebene Bedingung lässt die Funktion OrderClose() nicht entkommen, das ist der erste Punkt. Und zweitens, wenn mindestens eine Order auf NZDUSD eröffnet wurde, würde der Validator nicht "no trade" zurückgeben.


Ehrlich gesagt bin ich es leid, als Debugger eines krummen Codes zu fungieren und das Selbstvertrauen des Autors zu bekämpfen. Die angegebenen Fehler sind vorhanden, sehen Sie selbst nach

Wenn Sie nicht wissen, was Sie damit tun sollen, müssen Sie etwas für Ihren eigenen Profit tun. Validator hat damit nichts zu tun

 
Ich bitte Sie nicht persönlich, Maxim, irgendetwas zu debuggen. Der Code ist schief, gut, aber er besteht die Validierung. Die Frage ist eine ganz andere.
 
Artyom Trishkin:

...

Führen Sie den Code Profiler auf GBPUSD, M30 aus und lassen Sie ihn drei Stunden lang handeln. Dann schauen Sie sich die Engpässe an und beheben Sie sie.

Artyom, der Code-Profiler hat keine Engpässe angezeigt. Der gesamte Code läuft reibungslos und ohne krankhaft lange Prozesse.

Die Quintessenz dieser ganzen Geschichte ist die folgende. Auf Biegen und Brechen habe ich die Validierung schließlich bestanden. Es hängt überhaupt nicht vom Code ab (wenn er korrekt ist, ohne offensichtliche Fehler, wie in diesem Artikel erwähnt). Wie der Validator funktioniert, weiß offensichtlich nur sein Schöpfer. Der Code wird nach 2 Mal und dann beim dritten Mal überprüft. Manchmal passiert es mehrmals hintereinander, manchmal gar nicht. Außerdem ändere ich nur die Eingabeparameter (sie sind unbedeutend) oder verschiebe die Zeilen, die nichts ändern, wenn ich sie neu anordne, oder ich entferne oder füge sogar Kommentare hinzu (die die Arbeitsdatei in keiner Weise beeinflussen sollten).

Im Allgemeinen hängt die Validierung nur von der "Stimmung" des Validators ab (Spannung im Netz, eine Art Leistungsfluss oder was auch immer). So blieb der Code im üblichen Tester bei normalen Parametern nie hängen und verursachte keine Fehler, weder bei Paaren noch bei TF.