|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Fehlermeldung: Zero Divide
PHP-Code:
Ich vermute also, dass der Nenner, genauer (Max-Bid) häufig zu 0 wird. (?) Aber sollte die if-Bedingung nicht genau diesen Fehler vermeiden ? Ich wäre dankbar über Tipps, was da nicht stimmt. PS: Mein Broker zeigt den Kurs auf 5 Nachkommastellen an. Diese Funktion soll den maximalen Kurs der letzten 5 Candles ermitteln und den StopLoss so setzen, dass ich ich im Falle eines Verlusts 2% (Risk) meines Kapitals verliere. |
|
|||
Ich bin mir jetzt nicht ganz sicher, Ich würde aber erstmal das Point auskommentieren. Bzw. setze mal einfacah eine zahl für das Point ein.
Das [Max - Bid] glaube ich eher nicht. Da du es ja als double deklariert hast. Würde nur gegen Null gehen, sowie su schon gesagt hattest, aber nicht Null werden. Es sei denn das High ist null. Das kann ja aber nur sein wenn du keine Kurse hast. Aber dann würde bestimmt eine andere Fehlermeldung kommen. Versuch mal einfach alles was du von der Mt4 Syntax nimmst mit eigenen Zahlenwerte zu arbeiten. Bei mir war das nur komisch, da eigentlich immer alles lief und ich schon die standartfunktion genommem hatte, die schon immer in benutzung waren... |
|
|||
Also, du verwendest einen 5-Digit Broker.
Du solltest berücksichtigen, das bei deinen Berechnungen die Delta=20 als 2 interpretiert wird (5-Digits). Wenn du mit 20 Pips rechnen möchtest, musst du eine 0 dranhängen (200)! Allerdings spielt das in deinem Beispiel keine Rolle. Vieleicht wird das "Zero Divide" an einer anderen Stelle deines Codes verursacht. |
|
|||
Nein, dieser Fehler tritt nur wegen dieses Codes auf.
Ohne ihn läufts alles. |
|
|||
Zitat:
da kann man doch vorbeugen :: double x=Max-Bid; if(x==0) x=0.0000001; double dLotsShort = (Balance*Risk*Bid) / (100000*(Max-Bid+x)); Ist doch easy ! Das da keiner allein drauf kommt Wenn es jetzt noch auftritt, dann muß der Fehler an einer anderen Stelle auftreten. Kannst ja mal den kompletten Code posten. Gruß Joe |
|
|||
Ich hab den Code doch noch ein bischen abgeändert und der Fehler "Zero divide" wird nicht mehr angezeigt. Ich bekomme aber neue Fehlermeldungen und hab keinen Plan, wo die herkommen.
Hier mein Code: Zuerst wird geprüft, ob Stochastik und RSI auf mehreren Zeitebenen im Extrembereich sind. die Variablen "c" und "f" werden "true", wenn die Indikatoren im Extrembereich liegen. Code:
. .//RSI + Stochastik überkauft => c = true .//RSI + Stochastik überverkauft => f = true . . //---------------Money-Management------------------------- //Bestimme den höchsten und niedrigsten Kurs der letzten 80 Candles double Max = High[Highest(NULL,240,MODE_HIGH,80,0)]; double Min = Low[Lowest(NULL,240,MODE_LOW,80,0)]; double Balance = AccountBalance(); //Bestimme die Mindest- und Höchst-Lotgröße double minlotsize = MarketInfo(Symbol(), MODE_MINLOT); double maxlotsize = MarketInfo(Symbol(), MODE_MAXLOT); */Prüfe nun, ob das Hoch der letzten 80 Candles höher war, als der aktuelle Kurs. Die Differenz dieser beiden Kurse sollte mindestens 30 Pips betragen. Dann wird die Lotgröße für einen Short-Trade bestimmt, wobei der Stoploss = dem Abstand vom aktuellen Kurs zum Höchstkurs der letzten 80 Candles ist + weitere 30 Pips. Wenn die errechnete Lotgröße zu groß/klein ist, wird sie auf die Minimale/Maximale Lotgröße gesetzt. Risk ist hier 0.02, ich will also 2% meines Guthabens verlieren, wenn es schief geht./* if(Max > Bid){ if((Max - Bid)>0.003){ double dLotsShort = (Balance*Risk)/(100000 * (Max - Bid + 0.003)); // if(dLotsShort < minlotsize) dLotsShort = minlotsize; if(dLotsShort > maxlotsize) dLotsShort = maxlotsize; }} */Hier das gleiche nochmal für Long-Trades./* if(Min < Ask){ if((Ask - Min)>0.003){ double dLotsLong = (Balance*Risk)/(100000 * (Ask - Min + 0.003)); if(dLotsLong < minlotsize) dLotsLong = minlotsize; if(dLotsLong > maxlotsize) dLotsLong = maxlotsize; }} //------------------------------------------------------------------------ //---------------Sell_Logik------------------------------------------------ if(Max > Bid){ if(ShortTradesAccepted == true) { iTotalTrades=OrdersTotal(); if(c == true) { iTradeSignal = iOpenSellSignal; } if((iTradeSignal == iOpenSellSignal) && (iTotalTrades < iMaxTrades)) { double dSellStopLoss = Max + 0.003; //Hier liegt evtl. ein Fehler double dSellTakeProfit = Bid-(iTakeProfit*Point); //vlt. auch hier ? iOrderOpenStatus = OrderSend(Symbol(), OP_SELL,dLotsShort, Bid, iSlippage, dSellStopLoss, dSellTakeProfit, "TRADERS MAG EA",iMagicNumber,0,Red); if (iOrderOpenStatus<0) { iErrorNumber=GetLastError(); Print ("Order fehlgeschlagen!: ", iErrorNumber); return; } } c = false; }} //------------------------------------------------------------------------- //--------------------------Buy_Logik------------------------------------- //------------------------------------------------------------------------- if(Min < Ask){ if(LongTradesAccepted == true) { iTotalTrades=OrdersTotal(); if(f == true) { iTradeSignal = iOpenBuySignal; } if((iTradeSignal == iOpenBuySignal) && (iTotalTrades < iMaxTrades)) { double dBuyStopLoss = Min - 0.003; //Hier ist evtl. ein Fehler double dBuyTakeProfit = Ask+(iTakeProfit*Point); //Oder hier iOrderOpenStatus = OrderSend(Symbol(), OP_BUY,dLotsLong, Ask, iSlippage, dBuyStopLoss, dBuyTakeProfit, "TRADERS MAG EA",iMagicNumber,0,Green); if (iOrderOpenStatus<0) { iErrorNumber=GetLastError(); Print ("Order fehlgeschlagen!: ", iErrorNumber); return; } } f = false; }} Beim Durchlaufen des des Backtests kommen folgende Fehlermeldungen: 1.) Ordersend Error 4051 2.) Ordersend Error 4107 3.) invalid price 1.34896000 for OrderSend function Bei 3.) wird ein Kurs mit 5 Nachkommastellen angezeigt, ich benutze aber einen 4-Digit-Broker. Und ich kapier nicht wo dieser price überhaupt herkommt. Sieht jemand, wodurch diese Fehler verursacht werden? Vieleicht sehe ich den Wald vor lauter Bäumen nicht. |
|
|||
Versuche mal
NormalizeDouble(wert,Nachkommastellen) zu benutzen Gruß Joe |
|
|||
bei mir lag es hier drann
//Bestimme die Mindest- und Höchst-Lotgröße double minlotsize = MarketInfo(Symbol(), MODE_MINLOT); double maxlotsize = MarketInfo(Symbol(), MODE_MAXLOT); für den backtest hatte ich dann einfach werte eingeben //Bestimme die Mindest- und Höchst-Lotgröße double minlotsize =0.1; double maxlotsize = 0.2; danach gings |
|
|||
Durch NormalizeDouble() hat wurde das Problem mit dem invalid Prace behoben.
Allerdings bleibt noch die Fehlermeldung 4051 invalid Lots amount. Die Funktion, mit der ich die minimale bzw. maximale Lotgröße angibt zeigt beim Programmstart für beide Werte 0.1 an. Kann das bei einer Einlage von 10000 EUR sein ? Auf jeden Fall stimmt etwas mit der Berechnung der Lots nicht. Ist meine Formel korrekt ? Welche Formel gebt ihr in den Code ein, um die Lotgröße mit max. 2% Verlust zu bestimmen ? Stimmt diese mit meiner überein ? |
|
|||
Also,
was sind 2% Verlust bei Stoploss 100 Pips bei EURUSD Microlotaccount sollte sich so rechnen. KontoEquity 200 ergibt bei 2% = 4 Verlust 0,1 = 10 Cent je Pip 0,1 = 1 Euro je 10 Pips 0,1 = 4 Euro je 40 Pips Da also 0,1 zu groß ist:: 0,1/100/40 = 0,1/2,5 = 0,04 Lot wäre richtig. Jetzt sollte es nicht mehr schwerfallen daraus eine Methode(Funktion) zu machen double myLotSize(AccountEquity(), double verlustProzent) { double erg=meine berechnungen return(erg); } |
Lesezeichen |
Stichworte |
fehler, fehlermeldung, metatrader programmierung, mql4, programmierung, zero divide |
|
|