Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 1008
Beiträge: 12807
Benutzer: 1.988
Aktive Benutzer: 883
Links: 79
Wir begrüßen unseren neuesten Benutzer: unicurrent
Mit 57 Benutzern waren die meisten Benutzer gleichzeitig online (vor 21 Stunden um 19:24).
Neue Benutzer:
vor einer Stunde
- unicurrent
vor 2 Stunden
- Titantrade...
vor 8 Stunden
- Lobst
vor 18 Stunden
- schalkypet
vor 23 Stunden
- Harger

Onlineuser
'Wer ist online' anzeigen Benutzer: 1
Gäste: 26
Gesamt: 27
Team: 0
Team:  
Benutzer:  Mast83
Freunde anzeigen

Facebook
Expert-Advisor.com auf Facebook.
Zum Metatrader Forum

Spenden

Werbung

Antwort
 
LinkBack Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 08.01.12
Mitglied
 
Registriert seit: Oct 2011
Beiträge: 56
Biatsch befindet sich auf einem aufstrebenden Ast
Standard 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.
Mit Zitat antworten
  #2 (permalink)  
Alt 08.01.12
Elite Mitglied
 
Registriert seit: Jan 2010
Beiträge: 251
Bohne befindet sich auf einem aufstrebenden Ast
Standard

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...
Mit Zitat antworten
  #3 (permalink)  
Alt 08.01.12
Benutzerbild von naranjoe
Mitglied
 
Registriert seit: Jun 2010
Ort: Trier
Beiträge: 78
naranjoe befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #4 (permalink)  
Alt 08.01.12
Mitglied
 
Registriert seit: Oct 2011
Beiträge: 56
Biatsch befindet sich auf einem aufstrebenden Ast
Standard

Nein, dieser Fehler tritt nur wegen dieses Codes auf.
Ohne ihn läufts alles.
Mit Zitat antworten
  #5 (permalink)  
Alt 08.01.12
Benutzerbild von JoeDormann
Elite Mitglied
 
Registriert seit: Sep 2011
Ort: Kassel
Beiträge: 516
JoeDormann befindet sich auf einem aufstrebenden Ast
JoeDormann eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von Biatsch Beitrag anzeigen
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
__________________
Teamspeak2::80.81.254.141:8778 ___ skype::joe.dormann
http://www.expert-advisor.com/forum/...forums-ea.html
Wir schlagen den ForexMillionar LIVE-Trading on Teamspeak.
Forum-EA 01Testversion freigegeben
Mit Zitat antworten
  #6 (permalink)  
Alt 15.01.12
Mitglied
 
Registriert seit: Oct 2011
Beiträge: 56
Biatsch befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #7 (permalink)  
Alt 15.01.12
Benutzerbild von JoeDormann
Elite Mitglied
 
Registriert seit: Sep 2011
Ort: Kassel
Beiträge: 516
JoeDormann befindet sich auf einem aufstrebenden Ast
JoeDormann eine Nachricht über Skype™ schicken
Standard

Versuche mal

NormalizeDouble(wert,Nachkommastellen) zu benutzen

Gruß Joe
__________________
Teamspeak2::80.81.254.141:8778 ___ skype::joe.dormann
http://www.expert-advisor.com/forum/...forums-ea.html
Wir schlagen den ForexMillionar LIVE-Trading on Teamspeak.
Forum-EA 01Testversion freigegeben
Mit Zitat antworten
  #8 (permalink)  
Alt 16.01.12
Elite Mitglied
 
Registriert seit: Jan 2010
Beiträge: 251
Bohne befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #9 (permalink)  
Alt 18.01.12
Mitglied
 
Registriert seit: Oct 2011
Beiträge: 56
Biatsch befindet sich auf einem aufstrebenden Ast
Standard

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 ?
Mit Zitat antworten
  #10 (permalink)  
Alt 18.01.12
Benutzerbild von JoeDormann
Elite Mitglied
 
Registriert seit: Sep 2011
Ort: Kassel
Beiträge: 516
JoeDormann befindet sich auf einem aufstrebenden Ast
JoeDormann eine Nachricht über Skype™ schicken
Standard

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);
}
__________________
Teamspeak2::80.81.254.141:8778 ___ skype::joe.dormann
http://www.expert-advisor.com/forum/...forums-ea.html
Wir schlagen den ForexMillionar LIVE-Trading on Teamspeak.
Forum-EA 01Testversion freigegeben
Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
fehler, fehlermeldung, metatrader programmierung, mql4, programmierung, zero divide


Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus




Alle Zeitangaben in WEZ +2. Es ist jetzt 16:48 Uhr.



-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2012 vbdesigns.de
SEO by vBSEO 3.6.0
Copyright ©2009 - 2011 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------