neues Problem: Nach Hinzufügen des Parabolic SAR Indikators kein Livetrading möglich - obwohl in der Simulation alles sauber läuft - Seite 5

 
PS-WW-Trader:

Da ich gerade am erlernen von MQL5 bin, meinst Du mit den weiteren Standard-Klassen das hier?

https://www.mql5.com/de/articles/481


Hier ist ein schönes Beispiel wie man mit diesen Standard Klassen arbeitet.

https://www.mql5.com/de/code/download/21331/martingailexpert.mq5

 
Christian:

Hier ist ein schönes Beispiel wie man mit diesen Standard Klassen arbeitet.

https://www.mql5.com/de/code/download/21331/martingailexpert.mq5

Super, werde ich mir ansehen.

Besten Dank und einen schönen Sonntag.

 

Hallo allerseits,


ich bin gerade dabei weiter am Code zu basteln und bin dabei auf https://www.mql5.com/de/articles/2555#invalid_lot gestoßen. Der Tradingbot soll vor jeder "....Abgabe der Handelsorder muss man die Zulänglichkeit der Mittel auf seinem Konto prüfen. Der Mangel an Mittel für die Versorgung der zukünftigen offenen Position oder der Order wird als grober Fehler angenommen. "


Jetzt habe ich den Code eingefügt und bekomme jedoch eine Fehlermeldung im Strategietester angezeigt, sie lautet: 2020.04.20 18:57:28.031    Core 1    tester stopped because OnInit reports incorrect input parameters. Ich vermute den Fehler beim Funktionsaufruf in der OnIni Funktion. Wahrscheinlich ist das ORDER_TYPE_SELL inkorrekt. Wie füge ich die Money Prüffunktion richtig ein?

//+------------------------------------------------------------------+



#include<Trade\Trade.mqh>  // Benötigte Library
// Erstellung einer Instanz namens CTrade
CTrade trade;

// Eingaben und Array- und Variablendefinitionen
  
   input int      SL=300;     // Stop Loss in Points
   input int      TP=50;      // Take Profit in Points
   
   input int setADX = 22;     //  ADX Setting for Crossing between D+ and D-
   input int setPer = 14;     //  ADX Periode - Standard 14, größere Werte spätere Trends--> Genauer
   
   input double myLotSize = 0.1;  // Lotsize 
   input int    MN = 12345;    // IMMER EINE MAGIC NUMBER VERWENDEN BEI EINEM EA; NIEMALS OHNE
   input string Text = "myOwnText";  // Diesen kannst Du verwenden um den Komment in der Position anzuzeigen

   // für ADX-Wert
   double ArrayADX[];
   // für D+-Wert
   double ArrayDpl[];
   // für D- -Wert
   double ArrayDmi[]; 
  
    // für unseren ADX-Indikator
   int adx;
   
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
  
  // Anfang Money Check
  
         string err_text="";
         
        // akt. Markt für string symb,   // Lotgröße für double lots, )   // Buy oder Sell für int type)
        if( CheckMoneyForTrade(Symbol(), myLotSize, ORDER_TYPE_SELL))  
         {
      Print(__FUNCTION__,", ERROR: ",err_text);
      return(INIT_PARAMETERS_INCORRECT);
          }
 // wenn Check erfolgreich => genug Geld
 
      // Ende Money Check   
  
  
   //---für ADX-Indikator 
   adx=iADX(Symbol(),_Period,setPer);

   
   //--- What if handle returns Invalid Handle
   if(adx<0)
     {
      Alert("Error Creating Handles for indicators - error: ",GetLastError(),"!!");
      return(-1);
     }
     
   // sortiere die Preise abwärts von der aktuellen Kerze
   ArraySetAsSeries(ArrayADX,true);  
   ArraySetAsSeries(ArrayDpl,true);
   ArraySetAsSeries(ArrayDmi,true);
     
    trade.SetExpertMagicNumber(MN);          // Immer die Magic Number verwenden um Trades zu sortieren, den kommentar kann der Broker verändern     
     
        return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
      //--- Release our indicator handles
   IndicatorRelease(adx);
  }
  
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
    // Bevor wir unseren Kaufhandel eröffnen können - müssen wir den Nachfragepreis kennen
   double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); //Ask Price, is the price when we want to buy something, _Digits variable stores the number of digits after the decimal point

   // Definierter EA, erste Indikatorlinie (ADX) = (erste 0) die 1 liefert den Wert für die zweite Indikatorlinie D+ usw., aktuelle Kerze (zweite Index 0), 3 Kerzen (Kopieren der Daten für 3 Kerzen), speichere Resultat in meinPreisArray  // Mit der Funktion Copybuffer füllen wir unser Preisarray aufgrund der ADX Definition
   CopyBuffer(adx,0,0,3,ArrayADX);   // ADX-Wert
   CopyBuffer(adx,1,0,3,ArrayDpl);     // Dplus
   CopyBuffer(adx,2,0,3,ArrayDmi);   // D-Minus
  
// Kann für die Anzeige der Indikatorwerte in Verbindung mit der comment Funktion verwendet werden 
   
   // Berechne den EA für für die aktuelle Kerze (ADX)
   double ADXWert=NormalizeDouble(ArrayADX[0],_Digits);  // ADX
   double DplWert=NormalizeDouble(ArrayDpl[0],_Digits);  // D+ Wert aktuelle Kerze
   double DminWert=NormalizeDouble(ArrayDmi[0],_Digits);  // D- Wert aktuelle Kerze
   
// Ende ADX

   // Für neue Kerzenerkennung und Sar...
   MqlRates priceData[]; 
   ArraySetAsSeries(priceData,true);
   //Copy candle prices for 3 candles into array
   CopyRates(_Symbol,_Period,0,3,priceData);

   // einen Zähler für die Kerze erstellen
   static int candlecounter; 
   // Datums-Zeit-Variable für den letzten Zeitstempel erstellen
   static datetime timestamplastcheck;
   // Datumszeit-Variable für die aktuelle Kerze erstellen
   datetime timestampcurrentcandle;

   // Zeitstempel für aktuelle Kerze im Array lesen
   timestampcurrentcandle=priceData[0].time;

   // Buy Handelsbedingung - ADX, Crossing....SAR folgt...
   bool Buy=((ADXWert>=setADX)  && (ArrayDpl[0] > ArrayDmi[0]) && (ArrayDpl[1] < ArrayDmi[1]));

   //  wenn sich der aktuelle Zeitstempel vom letzten Mal unterscheidet
   if ((timestampcurrentcandle!=timestamplastcheck) && (Buy))
   { // Anfang if timestamp
      // aktuellen Zeitstempel für das nächste Mal merken
      timestamplastcheck=timestampcurrentcandle;
      // 1 zum Kerzenzähler hinzufügen
      candlecounter=candlecounter+1;

      // Chart Ausgabe
     // Comment("Counted candles since start:",candlecounter, "\n", "Bool Buy",Buy); 
    
   trade.Buy(myLotSize,_Symbol,Ask,(Ask-SL*_Point),(Ask+TP*_Point),Text); // Parameter: myLotsize = Positionsgröße, _Symbol= akt. Chartsymbol, Ask = Ask Preis, SL, TP, letzter Parameter = für Kommentare        
   
   } // Ende if timestamp
   
} // Ende on Tick

// Ab hier Funktionen einfügen

bool CheckMoneyForTrade(string symb,double lots,ENUM_ORDER_TYPE type)
  {
//--- Erhalten wir den Eröffnungspreis
   MqlTick mqltick;
   SymbolInfoTick(symb,mqltick);
   double price=mqltick.ask;
   if(type==ORDER_TYPE_SELL)
      price=mqltick.bid;
//--- Die Werte der notwendigen und freien Marge
   double margin, free_margin=AccountInfoDouble(ACCOUNT_MARGIN_FREE);
   //--- Rufen wir die Funktion der Überprüfung auf
   if(!OrderCalcMargin(type,symb,lots,price,margin))
     {
      //--- etwas ging schief, berichten wir es und geben false zurück
      Print("Error in ",__FUNCTION__," code=",GetLastError());
      return(false);
     }
   //--- wenn es Mittel für die Durchführung der Handelsoperationen nicht ausreichend sind
   if(margin>free_margin)
     {
      //--- berichten wir über den Fehler und geben false zurück
      Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError());
      return(false);
     }
//--- die Überprüfung ist erfolgreich gelaufen 
   return(true);
  }


Besten Dank vorab und liebe Grüße

Paul

Welche Überprüfungen der Handelsroboter vor der Veröffentlichung in Market bestehen soll
Welche Überprüfungen der Handelsroboter vor der Veröffentlichung in Market bestehen soll
  • www.mql5.com
Alle Markets Produkte vor der Veröffentlichung bestehen eine obligatorische vorläufige Überprüfung, da ein kleiner Fehler in der Logik des EAs oder des Indikators zu den Verlusten auf dem Handelskonto führen kann. Gerade deshalb von uns wurde eine Serie der grundlegenden Überprüfungen entwickelt, die das notwendige Niveau der Qualität der...
 

Was passiert wennst die funktion rausnimmst?

also ehrlich gesagt, das hab ich noch nie geprüft ob genug geld da ist, das seh ich eh an der fehlermeldung der order

 
Such mal hier nach: "lot size", ich kriege über 1000 Seiten Suchergebnisse!
 
amando:

Was passiert wennst die funktion rausnimmst?

also ehrlich gesagt, das hab ich noch nie geprüft ob genug geld da ist, das seh ich eh an der fehlermeldung der order


Der Bot schafft sonst die Validierung nicht. (Ist für mich ein starkes Qualitätskriterium und hervorragende Prüfungsmöglichkeit auf etwaige Fehler). Zudem möchte ich den Bot, sofern er irgendwann einmal fertiggestellt ist, eventuell mal zum Verkauf anbieten.

 
Carl Schreiber:
Such mal hier nach: "lot size", ich kriege über 1000 Seiten Suchergebnisse!

Ich habe unterschiedliche Lotgrößen getestet. Was stimmt hierbei nicht? Wahrscheinlich übersehe ich was? ;)

Ich verstehe unter einem Lot = 100.000 Einheiten eines Werts....

LG

Paul

 

Guten Morgen,


ich bin dem Problem etwas näher gekommen, es liegt gar nicht am Bot, der funktioniert wie programmiert, sondern es gibt scheinbar ein Problem mit dem Validator.

Ergänzung: Die Geldmittelprüffunktion geht jetzt. Ich dachte der Fehler in Bezug auf die "tester stopped because OnInit reports incorrect input parameters" hätte was mit der Prüffunktion zu tun, da mir das obligatorisch erschien, das die implementiert gehört.

Aber das war es leider nicht.

So was kann der Fehler bedeuten?

Selbst bei diesem "Musterbot" erhalte ich die gleiche Fehlermeldung. https://www.mql5.com/de/code/download/21331/martingailexpert.mq5
 
Trader-09 Schumacher:

Guten Morgen,


ich bin dem Problem etwas näher gekommen, es liegt gar nicht am Bot, der funktioniert wie programmiert, sondern es gibt scheinbar ein Problem mit dem Validator.

Ergänzung: Die Geldmittelprüffunktion geht jetzt. Ich dachte der Fehler in Bezug auf die "tester stopped because OnInit reports incorrect input parameters" hätte was mit der Prüffunktion zu tun, da mir das obligatorisch erschien, das die implementiert gehört.

Aber das war es leider nicht.

So was kann der Fehler bedeuten?

Selbst bei diesem "Musterbot" erhalte ich die gleiche Fehlermeldung. https://www.mql5.com/de/code/download/21331/martingailexpert.mq5

Schaue mal auf diese Zeile

      return(INIT_PARAMETERS_INCORRECT);

In der OnInit

Das ist dein Problem

Deine if Anweisung gibt diesen Return-Wert an die OnInit zurück und ergo deinen Fehler.

Weil die OnInit nur EINEN richtigen akzeptiert

Der Hier:

   return(INIT_SUCCEEDED);

Alles andere bricht die OnInit ab.

 
Wirf den 'Debugger an und schau in die If Anweisung warum die Bedingung nicht passt.