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: 4973
Beiträge: 43249
Benutzer: 7.220
Aktive Benutzer: 81
Links: 84
Wir begrüßen unseren neuesten Benutzer: JosephTK
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor 12 Stunden
- JosephTK
vor 2 Tagen
- Hopfen&Mal...
vor 3 Tagen
- frankmicha...
vor einer Woche
- DFeck
vor einer Woche
- bb1107

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 447
Gesamt: 447
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 08.01.12
Mitglied
 
Registriert seit: Oct 2011
Beiträge: 77
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.
  #2 (permalink)  
Alt 08.01.12
Elite Mitglied
 
Registriert seit: Jan 2010
Beiträge: 275
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...
  #3 (permalink)  
Alt 08.01.12
Elite Mitglied
 
Registriert seit: Jun 2010
Ort: Trier
Beiträge: 116
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.
  #4 (permalink)  
Alt 08.01.12
Mitglied
 
Registriert seit: Oct 2011
Beiträge: 77
Biatsch befindet sich auf einem aufstrebenden Ast
Standard

Nein, dieser Fehler tritt nur wegen dieses Codes auf.
Ohne ihn läufts alles.
  #5 (permalink)  
Alt 08.01.12
Gesperrter Benutzer
 
Registriert seit: Sep 2011
Ort: Kassel
Beiträge: 749
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
  #6 (permalink)  
Alt 15.01.12
Mitglied
 
Registriert seit: Oct 2011
Beiträge: 77
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.
  #7 (permalink)  
Alt 15.01.12
Gesperrter Benutzer
 
Registriert seit: Sep 2011
Ort: Kassel
Beiträge: 749
JoeDormann befindet sich auf einem aufstrebenden Ast
JoeDormann eine Nachricht über Skype™ schicken
Standard

Versuche mal

NormalizeDouble(wert,Nachkommastellen) zu benutzen

Gruß Joe
  #8 (permalink)  
Alt 16.01.12
Elite Mitglied
 
Registriert seit: Jan 2010
Beiträge: 275
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
  #9 (permalink)  
Alt 18.01.12
Mitglied
 
Registriert seit: Oct 2011
Beiträge: 77
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 ?
  #10 (permalink)  
Alt 18.01.12
Gesperrter Benutzer
 
Registriert seit: Sep 2011
Ort: Kassel
Beiträge: 749
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);
}
Thema geschlossen

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 aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 Uhr.





Suchmaschine - Reisen - Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------