Diskussion zum Artikel "Veröffentlichen eines Produkts im Market" - Seite 48

 

Mein EA gibt bei der Registrierung eines neuen Produkts einen Fehler zurück:

test on EURUSD,H1 (netting) 2020.04.15 15:47:05 failed modify #44 sell 0.2 EURUSD sl: 1.08929, tp: 1.08599 -> sl: 1.08919, tp: 1.08599 [Modification failed due to order or position being close to market]

Aber mein EA soll auf WIN$ laufen, nicht auf Forex. Warum zeigt der Tester nicht an, welches Asset ausgeführt werden soll?

Wie kann ich nun etwas korrigieren, das keinen Fehler hat, denn der EA läuft perfekt, ich kann das Produkt nur nicht zum Verkauf registrieren.

 
Adriano De Mello Moura #:

Mein EA gibt einen Fehler zurück, wenn ich ein neues Produkt registriere:

test on EURUSD,H1 (netting) 2020.04.15 15:47:05 failed modify #44 sell 0.2 EURUSD sl: 1.08929, tp: 1.08599 -> sl: 1.08919, tp: 1.08599 [Modification failed due to order or position being close to market]

Aber mein EA soll auf WIN$ laufen, nicht auf Forex. Warum zeigt der Tester nicht an, welches Asset ausgeführt werden soll?

Wie kann ich nun etwas korrigieren, das keinen Fehler hat, denn der EA läuft perfekt, ich kann das Produkt nur nicht zum Verkauf registrieren.

Der Roboter muss darauf vorbereitet sein, mit jedem Vermögenswert zu arbeiten....


Um den oben erwähnten Fehler zu korrigieren, müssen Sie die folgende Prüfung durchführen, bevor Sie die Position ändern:

//+--------------------------------------------------------------------------------------------------------------------+
//| Prüft, ob der Abstand zwischen TakeProfit/StopLoss und dem Schlusskurs größer ist als SYMBOL_TRADE_STOPS_LEVEL |
//+--------------------------------------------------------------------------------------------------------------------+
bool Check_SL_TP(ENUM_ORDER_TYPE type, double SL, double TP)
  {
//--- Lokale Variablen
   bool SL_check = false, TP_check = false;

//--- Ermittelt den letzten Preis für das aktuelle Symbol
   double BID = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   double ASK = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

//--- Ermitteln der Stufe SYMBOL_TRADE_STOPS_LEVEL
   int stops_level = (int)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);
   if(stops_level != 0)
     {
      PrintFormat("SYMBOL_TRADE_STOPS_LEVEL=%d: StopLoss and TakeProfit must not be nearer than %d points from the closing price", stops_level, stops_level);
     }

//--- nur zwei Auftragsarten prüfen
   switch(type)
     {
      //--- Kaufvorgang
      case  ORDER_TYPE_BUY:
        {
         //--- Überprüfung des StopLoss
         SL_check = (BID - SL > stops_level * _Point);
         if(!SL_check)
           {
            ERRMSG = StringFormat("For order %s StopLoss=%.5f must be less than %.5f (Bid=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), SL, BID - stops_level * _Point, BID, stops_level);
           }
         //--- Prüfung des TakeProfits
         TP_check = (TP - BID > stops_level * _Point);
         if(!TP_check)
           {
            ERRMSG = StringFormat("For order %s TakeProfit=%.5f must be greater than %.5f (Bid=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), TP, BID + stops_level * _Point, BID, stops_level);
           }
         //--- Rückgabe des Ergebnisses der Prüfung
         return(SL_check && TP_check);
        }
      //--- Verkaufsvorgang
      case  ORDER_TYPE_SELL:
        {
         //--- Überprüfung des StopLoss
         SL_check = (SL - ASK > stops_level * _Point);
         if(!SL_check)
           {
            ERRMSG = StringFormat("For order %s StopLoss=%.5f must be greater than %.5f (Ask=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), SL, ASK + stops_level * _Point, ASK, stops_level);
           }
         //--- Prüfung des TakeProfits
         TP_check = (ASK - TP > stops_level * _Point);
         if(!TP_check)
           {
            ERRMSG = StringFormat("For order %s TakeProfit=%.5f must be less than %.5f (Ask=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), TP, ASK - stops_level * _Point, ASK, stops_level);
           }
         //--- Rückgabe des Ergebnisses der Prüfung
         return(TP_check && SL_check);
        }
      break;
     }

//--- Verifizierung erfolgreich
   return(false);
  }



Weitere Prüfungen, die vom Roboter durchgeführt werden sollten, finden Sie im folgenden Artikel:

Welche Tests sollte ein Handelsroboter bestehen, bevor er auf dem Markt veröffentlicht wird - MQL5 Artikel

 

Hallo, ich bin nicht in der Lage, die Produktbeschreibung für eines meiner alten Produkte zu bearbeiten.

Ich habe die Anweisungen in den verschiedenen Foren befolgt, einschließlich der Beschreibung neu zu schreiben, sie aus dem Markt auszublenden und so weiter und so fort, aber die Beschreibung kehrt immer noch zur ursprünglichen Version zurück.

Jetzt kann ich das Produkt nicht mehr auf dem Markt wiederherstellen und es auch nicht mehr bearbeiten. Ich habe in den Foren um Unterstützung zu diesem Problem gebeten, aber bisher keine Hilfe erhalten.

Wie löse ich das Problem, dass ich die Produktbeschreibung nicht bearbeiten kann? Bitte helfen Sie mir

 

Beim Laden des Expert Advisors und beim Testen wird ein Fehler geschrieben, es ist nicht klar, wie man ihn korrigiert.

Test auf EURUSD,H1 (Netting)

2020.04.14 00:24:42 fehlgeschlagener Sofortkauf 0,01 EURUSD bei 1,09044 [Ungültiges Volumen]

2020.04.14 00:24:45 fehlgeschlagener Sofortkauf 0,01 EURUSD bei 1,09044 [Ungültiges Volumen]

2020.04.14 00:24:48 fehlgeschlagener Sofortkauf 0,01 EURUSD zu 1,09037 [Ungültiges Volumen]

2020.04.21 00:01:34 fehlgeschlagener Sofortkauf 0,01 EURUSD zu 1,08626 [Ungültiges Volumen]

2020.04.21 00:01:37 fehlgeschlagener Sofortkauf 0.01 EURUSD bei 1.08626 [Ungültiges Volumen]

2020.04.21 00:01:40 fehlgeschlagener Sofortkauf 0,01 EURUSD zu 1,08626 [Ungültiges Volumen]

2020.04.27 16:08:24 fehlgeschlagener Sofortverkauf 0,01 EURUSD zu 1,08546 [Ungültiges Volumen]

2020.04.27 16:08:27 gescheiterter Sofortverkauf 0,01 EURUSD bei 1,08548 [Ungültiges Volumen]

2020.04.27 16:08:30 fehlgeschlagener Sofortverkauf 0,01 EURUSD bei 1,08547 [Ungültiges Volumen]

2020.04.29 20:15:52 gescheiterter Sofortverkauf 0,01 EURUSD bei 1,08565 [Ungültiges Volumen]

2020.04.29 20:15:55 gescheiterter Sofortverkauf 0,01 EURUSD bei 1,08566 [Ungültiges Volumen]

2020.04.29 20:15:58 gescheiterter Sofortverkauf 0,01 EURUSD bei 1,08566 [Ungültiges Volumen]

2020.05.18 00:12:09 fehlgeschlagener Sofortkauf 0.01 EURUSD bei 1.08134 [Ungültiges Volumen]

2020.05.18 00:12:12 fehlgeschlagener Sofortkauf 0.01 EURUSD bei 1.08134 [Ungültiges Volumen]

2020.05.18 00:12:15 fehlgeschlagener Sofortkauf 0.01 EURUSD bei 1.08143 [Ungültiges Volumen]

2020.05.21 15:50:25 fehlgeschlagener Sofortverkauf 0,01 EURUSD zu 1,10031 [Ungültiges Volumen]

2020.05.21 15:50:28 gescheiterter Sofortverkauf 0.01 EURUSD zu 1.10034 [Ungültiges Volumen]

2020.05.21 15:50:31 gescheiterter Sofortverkauf 0,01 EURUSD bei 1,10036 [Ungültiges Volumen]

2020.05.25 19:00:05 fehlgeschlagener Sofortkauf 0,01 EURUSD bei 1,08950 [Ungültiges Volumen]

2020.05.25 19:00:08 fehlgeschlagener Sofortkauf 0,01 EURUSD zu 1,08951 [Ungültiges Volumen]

2020.05.25 19:00:11 fehlgeschlagener Sofortkauf 0,01 EURUSD zu 1,08952 [Ungültiges Volumen]

es gibt keine Handelsoperationen

 
Kirill Voytseshchuk #:

Beim Laden und Testen des Expert Advisors wird ein Fehler geschrieben, und es ist nicht klar, wie dieser behoben werden kann.

Test auf EURUSD,H1 (Netting)

2020.04.14 00:24:42 fehlgeschlagener Sofortkauf 0.01 EURUSD bei 1.09044 [Ungültiges Volumen]

***

Bitte lesen Sie die vollständige Fehlermeldung - dort finden Sie einen Link zu dem Artikel "Welche Prüfungen sollten bestehen ...".
 

Lesen Sie es, fügen Sie es in den Code ein

Falsche Volumina in Handelsgeschäften

Vor dem Absenden von Handelsaufträgen muss auch geprüft werden, ob die im Auftrag angegebenen Volumina korrekt sind. Die Anzahl der Lots, die der Expert Advisor in der Order angeben wird, sollte vor dem Aufruf der Funktion OrderSend() überprüft werden. Bei Finanzinstrumenten gibt dieSpezifikation das minimal und maximal zulässige Volumen für den Handel sowie die Volumenabstufung an . Sie können diese Werte in MQL5aus der Aufzählung ENUM_SYMBOL_INFO_DOUBLE mit der FunktionSymbolInfoDouble() erhalten.

//+------------------------------------------------------------------+
//| Prüft das Auftragsvolumen auf Korrektheit
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- minimal zulässiges Volumen für Handelsgeschäfte
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(volume<min_volume)
     {
      description=StringFormat("Volumen kleiner als das zulässige Minimum SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- maximal zulässiges Volumen für Handelsgeschäfte
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
     {
      description=StringFormat("Volumen größer als maximal erlaubt SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- Ermitteln der minimalen Volumenabstufung
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      description=StringFormat("Volumen ist kein Vielfaches der Mindestabstufung SYMBOL_VOLUME_STEP=%.2f, das nächste korrekte Volumen ist %.2f",
                               volume_step,ratio*volume_step);
      return(false);
     }
   description="Korrekter Volumenwert";
   return(true);
  }

Das hat nicht geholfen, kann ich einen anderen Code korrigieren?

Können Sie mir sagen, wie ich das Skript verfeinern kann?

Обзор рынка - Торговые операции - Справка по MetaTrader 5
Обзор рынка - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Окно "Обзор рынка" позволяет просматривать ценовые данные по торговым инструментам: котировки, ценовую статистику и график тиков. Здесь...
 
Kirill Voytseshchuk #:

Lesen Sie es, fügen Sie es in den Code ein

Falsche Volumina bei Handelsgeschäften

Vor dem Absenden von Handelsaufträgen muss auch geprüft werden, ob die im Auftrag angegebenen Volumina korrekt sind. Die Anzahl der Lots, die der Expert Advisor in der Order angeben wird, sollte vor dem Aufruf der Funktion OrderSend() überprüft werden. Bei Finanzinstrumenten gibt dieSpezifikation das minimal und maximal zulässige Handelsvolumen sowie die Volumenabstufung an . Diese Werte können in MQL5aus der Aufzählung ENUM_SYMBOL_INFO_DOUBLE unter Verwendung der FunktionSymbolInfoDouble() ermittelt werden

Hat nicht geholfen, kann ich einen anderen Code korrigieren?

Können Sie mir sagen, wie ich das Skript verfeinern kann?

Lesen Sie den Artikel vollständig, 'CheckVolumeValue' ist eine Überprüfung der Korrektheit der Eingabeparameter.

Und es gibt auch eine Überprüfung der korrekten Losrundung ...

 

Unter Berücksichtigung des Volumens der offenen Position und des Volumens der schwebenden Aufträge sieht die endgültige Prüfung wie folgt aus:

//+------------------------------------------------------------------+
//| Gibt das maximal zulässige Volumen für die Bestellung nach Symbol zurück |
//+------------------------------------------------------------------+
double NewOrderAllowedVolume(string symbol)
  {
   double allowed_volume=0;
//--- Ermitteln des Höchstvolumens im Auftrag
   double symbol_max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
//--- Ermitteln der Zeichenbegrenzung für das Volumen
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_LIMIT);

//--- Ermitteln des Volumens der offenen Position nach Symbol
   double opened_volume=PositionVolume(symbol);
   if(opened_volume>=0)
     {
      //--- wenn wir das Volumen bereits 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);
  }

add?

checkvolumevalue.mq5 wie hier geschrieben


//+------------------------------------------------------------------+
//| Skript-Programmstartfunktion|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP)/2.0;
   double volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN)-step;
   double finish=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX)+step;

//--- Herausfinden, wie viele Dezimalstellen in der Volumenabstufung enthalten sind
   int digits=(int)MathLog10(SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP));
   if(digits<0) digits=-digits;
   else digits=0;

//--- viele verschiedene Lautstärkewerte in der Schleife prüfen
   while(volume<finish+4*step)
     {
      string descr;
      if(!CheckVolumeValue(volume,descr))
        {
         Print("Inspektionsergebnis",volume,": ",descr);
        }
        else PrintFormat("Das %G-Volumen ist korrekt.",volume);
      volume+=3*step;
      volume=NormalizeDouble(volume,digits+1);
     }
//---
  }
//+------------------------------------------------------------------+
//| Prüft das Auftragsvolumen auf Korrektheit
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- minimal zulässiges Volumen für Handelsgeschäfte
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(volume<min_volume)
     {
      description=StringFormat("Volumen kleiner als das zulässige Minimum SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- maximal zulässiges Volumen für Handelsgeschäfte
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
     {
      description=StringFormat("Volumen größer als maximal erlaubt SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- Ermitteln der minimalen Volumenabstufung
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      description=StringFormat("Volumen ist kein Vielfaches der Mindestabstufung SYMBOL_VOLUME_STEP=%.2f, das nächste korrekte Volumen ist %.2f",
                               volume_step,ratio*volume_step);
      return(false);
     }
   description="Korrekter Volumenwert";
   return(true);
  }
//+------------------------------------------------------------------+
 
Kirill Voytseshchuk schwebenden Aufträge sieht die endgültige Prüfung wie folgt aus:

add?

checkvolumevalue.mq5 wie hier geschrieben


Alle notwendigen Prüfungen sind in dem Artikel Fast ein Konstruktor für die Erstellung eines EA

Почти конструктор для создания советника
Почти конструктор для создания советника
  • www.mql5.com
Предлагаю свой набор торговых функций в виде готового советника. Представленный способ позволяет получать множество торговых стратегий простым добавлением индикаторов и изменением входных параметров.
 

Ist der Code, nach dem Sie vorhin gefragt haben, geeignet?

Sie könnten die erforderlichen Zeilen aus dem Artikel schreiben.