Validierungsfehler bei der Freigabe des Handelsroboters für den Markt. - Seite 5

 
Danke für den Tipp, aber das ist wahrscheinlich nicht mein Fall. Mein Validator sieht die Handelsfunktionen überhaupt nicht, keine Möglichkeit, die maximale Anzahl von Aufträgen zu erreichen )))
 

Oh, Shaitan... Validierung bestanden und jetzt

keine Handelsgeschäfte

nicht länger ein Fehler.

P.S. Es war eine zufällige Aufnahme. Der nächste Test ist wieder das Gleiche


 
Andrey Kaunov:

Hier liegt kein Fehler vor, ich verstehe überhaupt nicht, was hier los ist. Ich habe eine Krücke (Division durch Null) vor die Handelsfunktion gesetzt:

Es funktioniert:

Wenn ich sie herausnehme, erhalte ich das gleiche

Keine Handelsgeschäfte.

Ich verstehe nicht, was den Validator von OrderSend() abhält. Denn wenn sie bei ihm ankommt, muss es sich um Abrechnungsfehler handeln (obwohl ich sie alle behoben habe) 130, 131, 134, ..., aber nicht"keine Handelsgeschäfte". Ich muss nur eine Pending Order irgendwo weit weg in OnInit() platzieren, damit sie nicht ausgelöst wird.

Und welchen Sinn hat eine solche Krücke, wenn die Bedingung, unter der ein Handel durchgeführt werden soll, nicht in den Kodex eingeht?

 
Warum kommt es nicht an?! Schau genau hin, Alexey. Kurz vor OrderSend gibt es eine Krücke.
 
Andrey Kaunov:
Warum gibt es keine Eingabe?! Schau genau hin, Alexey. Kurz vor OrderSend gibt es eine Krücke.

Richtig. Wenn OrderSend nicht ausgeführt wird, bedeutet dies, dass die Codeausführung aus irgendeinem Grund nicht zu ihm gelangt. Und egal, was Sie im Bedingungsblock davor setzen, es gibt keine Eingabe und keine Ausführung, nicht einmal eine Division durch Null.

 

Moment, ich verstehe das nicht. Wenn der Operator 1 (Division durch Null) ausgeführt wird, dann ist der nächste der if-Operator. Und das bedeutet, dass der Zustand des Fahrzeugs überprüft werden muss. Um die Bedingung zu prüfen, muss die Funktion OrderSend ausgeführt werden, was bedeutet, dass sie nach der Division durch Null an der Reihe ist.

Aber das macht nichts. Ich habe den Code aus Gründen der Reinheit des Experiments geändert:


Das Ergebnis ist das gleiche. Das Ergebnis mit der Krücke ist ein Fehler bei der Division durch Null. Ohne die Krücke ist das Ergebnis wie oben gezeigt: keine Handelsoperationen.

 
Andrey Kaunov:

Moment, ich verstehe das nicht. Wenn der Operator 1 (Division durch Null) ausgeführt wird, dann ist der nächste der if-Operator. Und das bedeutet, dass der Zustand des Fahrzeugs überprüft werden muss. Um die Bedingung zu prüfen, muss die Funktion OrderSend ausgeführt werden, was bedeutet, dass sie nach der Division durch Null an der Reihe ist.

Aber das macht nichts. Ich habe den Code aus Gründen der Reinheit des Experiments geändert:


Das Ergebnis ist das gleiche. Das Ergebnis mit der Krücke ist ein Fehler bei der Division durch Null. Das Ergebnis ohne Krücke ist oben dargestellt: keine Handelsoperationen.

Sie hätten kein Bild zum Einfügen des Codes verwenden sollen. Es ist unmöglich, sie überhaupt zu lesen. Und das Problem liegt nicht in diesem Codefragment. Das Problem besteht darin, dass eine Bedingung bei einigen Eingabeparametern nicht erfüllt ist und es keine Benachrichtigung gibt.

 
Andrey Kaunov:
Warum kommt es nicht an?!

Warum versuchen Sie, für den Markt schlechter zu schreiben als für sich selbst?

Es ist ganz einfach: Bevor Sie eine Bestellung abschicken, prüfen Sie, ob sie überhaupt ausführbar ist.

Prüfen Sie die Limits (das haben Sie gesagt), prüfen Sie die Mittel und die Marge (die haben Sie nicht), schauen Sie, ob es eine Verbindung gibt und ob der Handel erlaubt ist.

(Option) wenn es umfangreiche Berechnungen gab, ist es keine Sünde, RefreshRates vor dem Lesen Bid Ask

Um Ihrer selbst willen werden Sie all diese Kontrollen durchführen. Warum nicht jetzt?

 

Sie denken, ich prüfe das nicht. Die Losgröße wird in einer separaten Funktion geprüft

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, 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();
   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; //MathFloor(free/margin/step)*step;
   return(_lot);
}

Limits werden hier nicht benötigt, da Stop Loss und Take Profit bei Handelseröffnung gleich Null sind.RefreshRates() aktualisiert die Daten bei der Lotberechnung. Natürlich gibt es keine Überprüfung der Verbindung usw. vor jeder Eingabe, aber das ist nicht der Punkt. Wenn OrderSend eine Anfrage sendet, wird ein bestimmter Fehler angezeigt: 130, 131 usw. Aber was ich habe, ist.

Ich versuche gar nicht, einen Auftrag zum Öffnen zu senden. Auch im letzten Test, als ich in der Funktion OnInit() eine Prüfposition festlegte.

int OnInit() {
  
   int stops_level=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
   iTrailStart=inpTrailStart;
   iTrailStart2=inpTrailStart2;
   iTrailStartL=inpTrailStartL;
   //---
   if(stops_level>0) {
      if(inpTrailStart<stops_level+3) iTrailStart=stops_level+3;
      if(inpTrailStart2<stops_level+3) iTrailStart2=stops_level+3;
      if(inpTrailStartL<stops_level+3) iTrailStartL=stops_level+3;
   }
   
   Comment("");
   EventSetMillisecondTimer(300);
   ButtonCreate("V_5",5,25,50,20,"FLAT",9,clrBlack,C'236,233,235', clrNONE,false);
   ButtonCreate("V_7",60,25,50,20,"TREND",9,clrBlack,C'236,233,235', clrNONE,false);
   ButtonCreate("Auto",115,25,50,20,"Auto",9,clrBlack,C'236,233,235',clrNONE,false);
   ObjectCreate(0,"Lot",OBJ_EDIT,0,0,0);
   ObjectSetInteger(0,"Lot",OBJPROP_CORNER,CORNER_LEFT_LOWER);
   ObjectSetInteger(0,"Lot",OBJPROP_XDISTANCE,115);
   ObjectSetInteger(0,"Lot",OBJPROP_YDISTANCE,50);
   ObjectSetString(0,"Lot",OBJPROP_TEXT,"");
   ObjectSetInteger(0,"Lot",OBJPROP_ALIGN,ALIGN_RIGHT);
   ObjectSetInteger(0,"Lot",OBJPROP_FONTSIZE,9);
   ObjectSetInteger(0,"Lot",OBJPROP_COLOR,clrBlack);
   ObjectSetInteger(0,"Lot",OBJPROP_YSIZE,20);
   ButtonCreate("V_5_buy",5,50,50,20,"BUY",9,clrBlack,C'236,233,235', clrNONE,false);
   ButtonCreate("V_5_sell",60,50,50,20,"SELL",9,clrBlack,C'236,233,235', clrNONE,false); 
     
   test_ticket=OrderSend(_Symbol,OP_BUYLIMIT,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),_Point,30,0.0,0.0,"NZT-48_test",iMagicNumber,0,clrNONE);
   
   return(INIT_SUCCEEDED);
}//-------------------------------------- End OnInit ---------------------------------------- 

Alexey Viktorov:

Sie hätten den Code nicht in ein Bild einfügen sollen. Es ist unmöglich, sie zu lesen. Das Problem liegt nicht in diesem Codefragment. Das Problem besteht darin, dass eine Bedingung in einigen Eingabeparametern nicht erfüllt ist und es keine Benachrichtigung über diese Tatsache gibt.

Das mag sein. Aber ich habe bereits alles doppelt geprüft. Ich weiß nicht, wo ich als nächstes graben soll.

 
Andrey Kaunov:

Sie denken, ich prüfe das nicht. Die Losgröße wird in einer separaten Funktion geprüft

Limits werden hier nicht benötigt, da Stop Loss und Take Profit bei Handelseröffnung gleich Null sind.RefreshRates() aktualisiert die Daten bei der Lotberechnung. Natürlich gibt es keine Überprüfung der Verbindung usw. vor jeder Eingabe, aber das ist nicht der Punkt. Wenn OrderSend eine Anfrage sendet, wird ein bestimmter Fehler angezeigt: 130, 131 usw. Aber was ich habe, ist.

Ich versuche gar nicht, einen Auftrag zum Öffnen zu senden. Auch im letzten Test, als ich in der Funktion OnInit() eine Prüfposition festlegte.


Das ist möglich. Aber ich habe bereits alles doppelt geprüft. Ich weiß nicht, wohin ich als nächstes gehen soll.

Schauen Sie sich an, wie andere Aufträge im EA umgesetzt wurden. Ich glaube nicht, dass der Expert Advisor nur die

bei der Eröffnung wurde ticket<0 gesetzt - sehen Sie sich die andere Logik an, wie sie in der Realität darauf reagiert

Grund der Beschwerde: