Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Fehlermeldung: Zero Divide (http://www.expert-advisor.com/forum/showthread.php?t=1814)

Biatsch 08.01.12 00:34

Fehlermeldung: Zero Divide
 
PHP-Code:

extern int Delta 20;
extern double Risk 0.02;

double Max High[Highest(NULL,240,MODE_HIGH,5,0)];
double Balance AccountBalance();

if((
Max Bid) >= Delta*Point){
   
double dLotsShort = (Balance*Risk*Bid) / (100000*(Max-Bid));


Diese Funktion führt ständig zur Fehlermeldung "Zero Divide".
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.

Bohne 08.01.12 11:21

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...

naranjoe 08.01.12 16:34

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.

Biatsch 08.01.12 17:22

Nein, dieser Fehler tritt nur wegen dieses Codes auf.
Ohne ihn läufts alles.

JoeDormann 08.01.12 20:18

Zitat:

Zitat von Biatsch (Beitrag 7648)
PHP-Code:

extern int Delta 20;
extern double Risk 0.02;

double Max High[Highest(NULL,240,MODE_HIGH,5,0)];
double Balance AccountBalance();

if((
Max Bid) >= Delta*Point){
   
double dLotsShort = (Balance*Risk*Bid) / (100000*(Max-Bid));


Diese Funktion führt ständig zur Fehlermeldung "Zero Divide".
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.

Hallo,
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

Biatsch 15.01.12 12:12

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.

JoeDormann 15.01.12 17:10

Versuche mal

NormalizeDouble(wert,Nachkommastellen) zu benutzen

Gruß Joe

Bohne 16.01.12 08:22

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

Biatsch 18.01.12 12:14

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 ?

JoeDormann 18.01.12 17:15

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);
}


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:31 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum