Automatischer Validierer - Probleme

 

Ich versuche, die EA-Version zu aktualisieren und erhalte eine Fehlermeldung.

Derselbe EA befindet sich im Strategietester.


Ich schreibe auch EAs für MT4 zur gleichen Zeit, dort ist alles in Ordnung. Der Code für 4 und 5 EAs ist derselbe, der einzige Unterschied ist die Include-Datei (sie ist für 4 und 5 unterschiedlich).

Das letzte Mal, dass ich diesen EA aktualisiert habe, war im Januar und alles war in Ordnung.

Software-Version - MetaTrader 5 x64 build 2025 gestartet (MetaQuotes Software Corp.)

- Terminal Windows 10 (build 14393) x64, IE 11, UAC, Intel Celeron N2815 @ 1.86GHz, Speicher: 1866 / 3967 Mb, Festplatte: 5 / 35 Gb, GMT+3

 
Uladzimir Kirychenka:

Ich versuche, die EA-Version zu aktualisieren und erhalte eine Fehlermeldung.

Derselbe EA befindet sich im Strategietester.


Ich schreibe auch EAs für MT4 zur gleichen Zeit, dort ist alles in Ordnung. Der Code für 4 und 5 EAs ist derselbe, der einzige Unterschied ist die Include-Datei (sie ist für 4 und 5 unterschiedlich).

Das letzte Mal, dass ich diesen EA aktualisiert habe, war im Januar und alles war in Ordnung.

Software-Version - MetaTrader 5 x64 build 2025 gestartet (MetaQuotes Software Corp.)

- Terminal Windows 10 (build 14393) x64, IE 11, UAC, Intel Celeron N2815 @ 1.86GHz, Speicher: 1866 / 3967 Mb, Festplatte: 5 / 35 Gb, GMT+3

Tun Sie so, als wären Sie ein Idiot und legen Sie eine Einlage von 1 $ oder ein Lot von 100500 an und sehen Sie nach, ob es irgendwelche Geschäfte gibt. Und es wird Warnungen geben, dass nur ein Idiot solche Parameter festlegen würde.

 
Alexey Viktorov:

Tun Sie so, als wären Sie ein Idiot und legen Sie eine Einzahlung von 1$ oder Lot 100500 und prüfen Sie, ob es Trades geben wird. Und ob es Warnungen geben wird, dass nur ein Idiot solche Parameter einstellen kann.

Das gleiche Problem. Ausprobiert - hilft nicht). Kann seit dem 13. April nicht mehr aktualisieren. Wenn ich alles und jedes überprüfe, erhalte ich nur eine Aufschrift auf allen Symbolen: "Es werden keine Handelsgeschäfte getätigt". Wenn ich nicht alles prüfe, erhalte ich eine Fehlermeldung - nicht genug Eigenkapital, um die Position zu eröffnen. Die Version für MT4, sowie für den TS-Autor wurde ohne Probleme aktualisiert.

123

Ich würde in der Abbildung sehen, dass das Mindestlos 2000 ist, der Saldo 10000 ist und es eindeutig nicht genug Geld gibt, um die Position zu eröffnen. Ich bestehe die Prüfung sowieso nicht.

Was ist in solchen Fällen zu tun?

 

Natürlich wird es keine Geschäfte geben. Und was sollen die Warnungen sein? Ich habe nur in OnInit, wenn Losgröße nicht im Bereich SYMBOL_VOLUME_MIN und SYMBOL_VOLUME_MAX ist, dann Initialisierungsfehler INIT_PARAMETERS_INCORRECT

 
Uladzimir Kirychenka:

Natürlich wird es keine Geschäfte geben. Und was sollen die Warnungen sein? Ich habe nur in OnInit, wenn Losgröße nicht im Bereich SYMBOL_VOLUME_MIN und SYMBOL_VOLUME_MAX ist, dann Initialisierungsfehler INIT_PARAMETERS_INCORRECT

Ich erinnere mich, dass ich damals in etwa das gleiche Problem mit den Moderatoren hatte, die nach der automatischen Überprüfung kontrollierten. Bei falschen Parametern wurde OnInit ebenfalls mit dem Code INIT_PARAMETERS_INCORRECT abgebrochen. Und die automatische Überprüfung ergab die gleiche Fehlermeldung, dass es keine Handelsoperation gab. Der Moderator riet mir also, OnInit() nicht mit diesem Code zu beenden, sondern eine Warnung auszugeben.

 

Wahrscheinlich kommt einmal im Monat jemand darauf zu sprechen. Das geht jetzt schon eine ganze Weile so.

Die Sache ist die, dass sich beim Handel (im wirklichen Leben) nicht nur die Höhe des Guthabens ändern kann, sondern auch die Losgröße.

Und während des Testens kann die Einzahlungsgröße (von 1 bis 10000000) oder die Losgröße (von 1000000 bis 0,01) variieren.

Daher sollten diese Prüfungen nicht nur einmal bei OnInit, sondern permanent in der Schleife (z. B. bei OnTick) durchgeführt werden.

Um einen Überlauf des Protokolls zu vermeiden, ist es notwendig, die Warnung(Print Message oder Alert) nur einmal auszugeben.

 
Uladzimir Kirychenka:

Natürlich wird es keine Geschäfte geben. Und was sollen die Warnungen sein? Ich habe nur in OnInit, wenn Losgröße nicht im Bereich SYMBOL_VOLUME_MIN und SYMBOL_VOLUME_MAX ist, dann Initialisierungsfehler INIT_PARAMETERS_INCORRECT

Ich verstehe, dass es sehr schwer ist, so zu tun, als sei man ein Idiot, aber manchmal hilft diese Fähigkeit. Versuchen Sie es noch einmal. Sie haben den Expert Advisor eingestellt, Ihr Konto hat $1, Sie setzen das Lot 100500 und Sie warten. Sie warten einen Tag, einen zweiten, einen dritten... dann fängt man an, sich zu ärgern: "Wofür habe ich bezahlt. Warum funktioniert der Scheiß nicht?" und niemand sagt etwas, niemand will etwas sagen wie "Du bist ein Idiot... Mit einer solchen Einlage können Sie nicht auf dem Forex-Markt arbeiten. Nur ein Idiot würde eine Menge 100500" eintragen... So ist das nun mal.

 
Petros Shatakhtsyan:

Wahrscheinlich kommt einmal im Monat jemand darauf zu sprechen. Das geht jetzt schon eine ganze Weile so.

Die Sache ist die, dass sich beim Handel (im wirklichen Leben) nicht nur die Höhe des Guthabens ändern kann, sondern auch die Losgröße.

Und während des Testens kann die Einzahlungsgröße (von 1 bis 10000000) oder die Losgröße (von 1000000 bis 0,01) variieren.

Daher sollten diese Prüfungen nicht nur einmal bei OnInit, sondern permanent in der Schleife (z. B. bei OnTick) durchgeführt werden.

Die Warnung (Print Message oder Alert) darf nur einmal gedruckt werden, um einen Überlauf des Protokolls zu vermeiden.

Selbst ein sehr einfacher Code kann die Validierung nicht bestehen. Es scheint die von Ihnen genannten Bedingungen zu erfüllen.

void OnTick()
  {
   ENUM_POSITION_TYPE PosType=POSITION_TYPE_SELL;
   MqlTradeRequest request;
   MqlTradeResult result;
   MqlTradeCheckResult check;
   ZeroMemory(request);
   ZeroMemory(result);
   ZeroMemory(check);
   long digit;
   double point,Bid;
   SymbolInfoDouble(_Symbol,SYMBOL_BID,Bid);
   request.type   = ORDER_TYPE_SELL;
   request.price  = Bid;
   request.action = TRADE_ACTION_DEAL;
   request.symbol = _Symbol;
   request.volume = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   request.sl=0;
   request.tp=0;
   request.deviation=10;
   request.magic=55555;
   request.comment=NULL;
   request.type_filling=0;
   if(PositionsTotal()==0
   &&CheckMoneyForTrade(_Symbol,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),ORDER_TYPE_SELL)==true
   ){
   OrderSend(request,result);
   }else{
      ExtExpert.Deinit();
      return;
   }
  }
  bool CheckMoneyForTrade(string symb,double lots,ENUM_ORDER_TYPE type)
  {
//--- получим цену открытия
   MqlTick mqltick;
   SymbolInfoTick(symb,mqltick);
   double price=mqltick.ask;
   if(type==ORDER_TYPE_SELL)
      price=mqltick.bid;
//--- значения необходимой и свободной маржи
   double margin,free_margin=AccountInfoDouble(ACCOUNT_MARGIN_FREE);
   //--- вызовем функцию проверки
   if(!OrderCalcMargin(type,symb,lots,price,margin))
     {
      //--- что-то пошло не так, сообщим и вернем false
      Print("Error in ",__FUNCTION__," code=",GetLastError());
      return(false);
     }
   //--- если не хватает средств на проведение операции
   if(margin>free_margin)
     {
      //--- сообщим об ошибке и вернем false
      Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError());
      return(false);
     }
//--- проверка прошла успешно
   return(true);
  }
mit Geldscheck - es gibt keine Handelsgeschäfte, ohne Scheck - nicht genug Geld
 
Petros Shatakhtsyan:

Wahrscheinlich kommt einmal im Monat jemand darauf zu sprechen. Das geht jetzt schon eine ganze Weile so.

Die Sache ist die, dass sich beim Handel (im wirklichen Leben) nicht nur die Höhe des Guthabens ändern kann, sondern auch die Losgröße.

Und während des Testens kann die Einzahlungsgröße (von 1 bis 10000000) oder die Losgröße (von 1000000 bis 0,01) variieren.

Daher sollten diese Prüfungen nicht nur einmal bei OnInit, sondern permanent in der Schleife (z. B. bei OnTick) durchgeführt werden.

Die Warnung (Print Message oder Alert) darf nur einmal ausgegeben werden, um einen Log Overflow zu vermeiden.

Diese Prüfungen (LotMin, LotMax, LotNormalizeStep, Check Balance, OrderCheck) werden jedes Mal durchgeführt, wenn eine Position eröffnet wird. Und die Prüfung des Loses nur in OnInit. Ich kenne die Logik der Überprüfung des Saldos in OnInit nicht.

PS: Alert rettet mich nicht vor Validator-Fehlern ((((((((((

 
Uladzimir Kirychenka:

Diese Prüfungen (LotMin, LotMax, LotNormalizeStep, Check Balance, OrderCheck) werden jedes Mal durchgeführt, wenn eine Position eröffnet wird. Und onInit prüft nur die Menge. Ich kenne die Logik der Überprüfung des Saldos in OnInit nicht.

PS: Alert speichert nicht von Validator-Fehlern ((((((((((

Validator hat keine Fehler :)

Der Validator zeigt nur an, dass im bereitgestellten Code

  • es gibt keine umfassenden Kontrollen
  • es gibt keine Fehlerbehandlung
Der Validator zeigt, dass der so genannte Codeschreiber sich nie in die Lage des Benutzers versetzt hat.

 
Vladimir Karputov:

Der Validator hat keine Fehler :)

Der Validator zeigt lediglich an, dass der angegebene Code

  • es gibt keine umfassenden Kontrollen
  • Es gibt keine Fehlerbehandlung
Der Validator zeigt, dass der so genannte Codeschreiber sich nie in die Lage des Benutzers versetzt hat.

))