Diskussion zum Artikel "Welche Überprüfungen der Handelsroboter vor der Veröffentlichung in Market bestehen soll" - Seite 3

 
Bogdan Bovykin:

Ich meine, um es als ein Panel zu machen? und überprüfen Sie es auf diese Weise? oder wie?

öffnen Sie einfach jeden Handel manuell im Moment und diese EA ist auf dem Chart, um das Ticket der offenen Bestellung angehängt.

ok

Wenn SIE das Dienstprogramm selbst geschrieben haben, können SIE einen Handel im Tester in INIT öffnen und der Assistent wird ihn verwalten.

 

Wenn der Expert Advisor die Tests im Terminal bestanden hat und Trades eröffnet, dann schreibt er in der automatischen Prüfung einen Fehler, dass keine Trades eröffnet wurden (Paar und TF sind gleich), bzw. er besteht die "Automatische Prüfung" nicht

Zufall? Das glaube ich nicht!

Was ist zu tun?

 
Ich hatte vor kurzem den gleichen Fehler, ich musste nur einen Handel in inite zwangsweise öffnen
 

Ist es möglich, dass MetaQuotes eine Vorlage für Entwickler erstellt? Das würde es den Entwicklern leichter machen und MetaQuotes außerdem eine Menge Geld und Ressourcen für die Überprüfung eingereichter EAs sparen.

Die Vorlage für Entwickler befindet sich in der Codebasis

https://www.mql5.com/de/code/mt4/experts/best

 
Alain Verleyen:

Das ist ein interessanter Artikel, leider gibt es zu viele Fehler (Tippfehler oder sogar logische Fehler im vorgeschlagenen Code), und es wird wahrscheinlich mehr Leute verwirren als ihnen an einigen Stellen helfen.

//+------------------------------------------------------------------+
//| Rückgabe des maximal erlaubten Volumens für eine Order auf das Symbol |
//+------------------------------------------------------------------+
double NewOrderAllowedVolume(string symbol)
  {
   double allowed_volume=0;
//--- die Begrenzung des maximalen Auftragsvolumens
   double symbol_max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
//--- die Begrenzung des Volumens durch ein Symbol erhalten
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_LIMIT);

//--- Ermitteln des Volumens der offenen Position für ein Symbol
   double opened_volume=PositionVolume(symbol);
   if(opened_volume>=0)  There is no opened positions
     {
      //--- wenn wir das Volumen ausgeschöpft haben
      if(max_volume-opened_volume<=0)
         return(0);

      //--- das Volumen der offenen Position übersteigt nicht max_volume
      double orders_volume_on_symbol=PendingsVolume(symbol);
      allowed_volume=max_volume-opened_volume-orders_volume_on_symbol;
      if(allowed_volume>symbol_max_volume) allowed_volume=symbol_max_volume;
     }
   return(allowed_volume);
  }

Logischer Fehler. Wenn es noch keine Position gibt, muss man immer noch das anhängige Volumen prüfen und das erlaubte Volumen berechnen. Dieser Code gibt allowed_volume=0 zurück, wenn noch keine Position geöffnet ist, ohne die Pendings zu berücksichtigen.

Warum? in diesem Code wird auch das Volumen der schwebenden Aufträge geprüft
 
Alain Verleyen:


+ fehlender Parameter (PrintFormat hat für %, aber nur 3 Parameter sind vorgesehen).

Dankeschön! Behoben

bool OrderModifyCheck(ulong ticket,double price,double sl,double tp)
  {
//--- Bestellung nach Ticket auswählen
   if(orderinfo.Select(ticket))
     {
      //--- Punktgröße und Name des Symbols, für das ein schwebender Auftrag erteilt wurde
      string symbol=orderinfo.Symbol();
      double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
      int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
      //--- prüfen, ob es Änderungen im offenen Preis gibt
      bool PriceOpenChanged=(MathAbs(orderinfo.PriceOpen()-price)>point);
      //--- prüfen, ob es Änderungen in der StopLoss-Ebene gibt
      bool StopLossChanged=(MathAbs(orderinfo.StopLoss()-sl)>point);
      //--- prüfen, ob es Änderungen in der Takeprofit-Stufe gibt
      bool TakeProfitChanged=(MathAbs(orderinfo.TakeProfit()-sl)>tp);
      //--- wenn es Änderungen in den Ebenen gibt
      if(PriceOpenChanged || StopLossChanged || TakeProfitChanged)
         return(true);  // Reihenfolge kann geändert werden 
      //--- es gibt keine Änderungen in den Ebenen Open, StopLoss und Takeprofit
      else
      //--- Benachrichtigung über den Fehler
         PrintFormat("Order #%d already has levels of Open=%.5f SL=%.5f TP=%.5f",
                     ticket,orderinfo.PriceOpen(),orderinfo.StopLoss(),orderinfo.TakeProfit());
     }
//--- zum Ende gekommen, keine Änderungen für den Auftrag
   return(false);       // Änderungen sind sinnlos 
  }
 
Alain Verleyen:

Ähnlicher Fehler wie Punkt 2° oben.

Und gleiche Fehler auch in OrderModifyCheck() mql4 Version.


Alles behoben, vielen Dank!

 
Alain Verleyen:

bool OrderModifyCheck(ulong ticket,double price,double sl,double tp)
  {
//--- Bestellung nach Ticket auswählen
   if(orderinfo.Select(ticket))
     {
      //--- Punktgröße und Name des Symbols, für das ein schwebender Auftrag erteilt wurde
      string symbol=orderinfo.Symbol();
      double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
      int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
      //--- prüfen, ob es Änderungen im offenen Preis gibt
      bool PriceOpenChanged=(MathAbs(orderinfo.PriceOpen()-price)>point);
      //--- prüfen, ob es Änderungen in der StopLoss-Ebene gibt
      bool StopLossChanged=(MathAbs(orderinfo.StopLoss()-sl)>point);

Ein anderer logischer Fehler. Das Ändern eines SL/TP um 1 Punkt ist erlaubt. Es sollte >= sein.

Soweit ich mich erinnere, verwenden wir diese Praxis nur, um keine Ablehnung vom Handelsserver zu erhalten, weil sich der Preis während der Zeit, in der unsere Handelsanfrage den Server erreicht, ändert.

Es ist einfach ein sicherer Ansatz.

 
Alain Verleyen:

bool OrderModifyCheck(ulong ticket,double price,double sl,double tp)
  {
//--- Bestellung nach Ticket auswählen
   if(orderinfo.Select(ticket))
     {
      //--- Punktgröße und Name des Symbols, für das ein schwebender Auftrag erteilt wurde
      string symbol=orderinfo.Symbol();
      double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
      int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
      //--- prüfen, ob es Änderungen im offenen Preis gibt
      bool PriceOpenChanged=(MathAbs(orderinfo.PriceOpen()-price)>point);
      //--- prüfen, ob es Änderungen in der StopLoss-Ebene gibt
      bool StopLossChanged=(MathAbs(orderinfo.StopLoss()-sl)>point);
      //--- prüfen, ob es Änderungen in der Takeprofit-Stufe gibt
      bool TakeProfitChanged=(MathAbs(orderinfo.TakeProfit()-sl)>tp);
      //--- wenn es Änderungen in den Ebenen gibt
      if(PriceOpenChanged || StopLossChanged || TakeProfitChanged)

+ Tippfehler, sollte "-tp)>=Punkt);" sein

Danke! behoben
 
bool TakeProfitChanged=(MathAbs(orderinfo.TakeProfit()-sl)>tp);

//--

bool TakeProfitChanged=(MathAbs(orderinfo.TakeProfit()-tp)>point);