Zero Divide (Das Thema gefunden - aber warum?) - Seite 2

 
RaptorUK:

Wenn Sie Tage damit verbringen wollen, dieses einfache Problem zu lösen, dann können Sie das gerne tun.... Ich würde es nicht tun.

Wenn Sie wissen, wann es während Ihres Backtests auftritt, dann ist es leicht zu finden ... Starten Sie den Backtest einen Tag vor dem Datum, an dem es auftritt ... Finden Sie auf die Minute genau heraus, wann es passieren wird ... für alle Divisionen in Ihrem Code . ... ja, alle, fügen Sie ein Print() vor der Zeile mit der Division ein, das den Divisor und einen Verweis auf die betreffende Codezeile ausgibt ...

Zum Beispiel:

Wenn Ihr Code mit dem Fehler "Dividieren durch Null" abbricht, überprüfen Sie die Protokolldatei, und in den letzten Ausdrucken wird die Codezeile, die den Fehler verursacht hat, und die Variable, die auf Null gesetzt wurde, ausgedruckt...

Lernen Sie, intelligenter zu arbeiten und Ihre Probleme logisch und effizient aufzuspüren.


Vielen Dank für Ihre Hilfe und Ihre Hinweise, wie ich das Problem in den Griff bekommen kann! Ich habe das Problem gefunden (nachdem ich eine lange Zeit damit verbracht habe, Drucke überall hin zu klatschen!)

Es ist eigentlich aus der Tatsache, dass mein Broker (ILQ) verwendet eine fiktive Feed und die Hilfe von einem Mitglied dieses Forums auf meinem Thread in Bezug auf diese. In einer Nussschale dies ist der Code unten - Mit ILQ können Sie so niedrig wie 1 Einheit handeln. Im MT4-Transaktionsfenster würden Sie die genaue Größe der Einheiten eingeben, die Sie wollen (z.B. 0,01 || 874 Einheiten).

Können Sie mir helfen zu verstehen, welcher Teil dieser Formel an der Stelle, an der ich den Pfeil gesetzt habe, falsch ist? Aus meiner Sicht sieht die Formel gut aus?

//+------------------------------------------------------------------+
//| Order Enter Function                                             |
//+------------------------------------------------------------------+
void OrderEntry(int direction)
{
   //Padding for the stop and padding for the entry too. 
   double ATR_Pad = iATR(NULL,60,14,1)/2;
      if(ATR_Pad == 0.0)Print(" ATR_Pad = ", ATR_Pad); 
   double Buy_Pad = NormalizeDouble(ATR_Pad,Digits);
   double Sell_Pad = NormalizeDouble(ATR_Pad,Digits);
   
   //Get Highest Price in our lookback range and set buy price above it.
   int iTBT = iBarShift(NULL,60, triggerBarTime, true),
   iHH = iHighest(NULL,60, MODE_HIGH, iTBT + CandlesBeforeBiasObtained, 0);
   double Buy_Here = High[iHH] + Buy_Pad;
   double buyPrice= NormalizeDouble(Buy_Here,Digits);

   //Get Lowest Price in our lookback range and set sell price below it.
   int iTBT_1 = iBarShift(NULL, 60, triggerBarTime, true),
   iLL = iLowest(NULL, 60, MODE_LOW, iTBT_1 + CandlesBeforeBiasObtained, 0);
   double Sell_Here =Low[iLL] - Sell_Pad;
   double sellPrice = NormalizeDouble(Sell_Here,Digits);
   
   //Stop calculations.    
   double ATR = iATR(NULL,60,14,1);
   double MA = iMA(NULL,60,MA_Period,0,1,0,1);
   double BuyStopPriceMath = MA - ATR;
   double SellStopPriceMath = MA + ATR;
   double BuyStopPrice = NormalizeDouble(BuyStopPriceMath,Digits);
   double SellStopPrice = NormalizeDouble(SellStopPriceMath,Digits);

   //get our buystop price from below the ma and our takeprofit based on our r:r ratio.
   double pips_to_bsl = buyPrice-BuyStopPrice;
   double buy_tp_price=(pips_to_bsl*RewardRatio)+buyPrice;
   double buy_takeprofit_price= NormalizeDouble(buy_tp_price, Digits);

   //get our sellstop price from below the ma and our takeprofit based on our r:r ratio.
   double pips_to_ssl=SellStopPrice-sellPrice;
   double sell_tp_price=sellPrice-(pips_to_ssl*RewardRatio);
   double sell_takeprofit_price= NormalizeDouble(sell_tp_price, Digits);
   
   //Lot calculation - Facilitates Notional and Lots within MT4 - As well as find the tick value relative to the account denomination.   
   double risk_amount = AccountEquity( )*RiskPercent/100;
      if( risk_amount == 0.0 )Print(" risk_amount = ", risk_amount);
   double Lot_Step = MarketInfo(Symbol(), MODE_LOTSTEP);
   double ts = MarketInfo(Symbol(), MODE_TICKSIZE);
   double tv = MarketInfo(Symbol(), MODE_TICKVALUE);
   double minlot = MarketInfo(Symbol(), MODE_MINLOT);
         
   double loss_for_1_lot = pips_to_bsl/ ts * tv ; //<<<<<<<<<<<<<<<<<<<<<<<<<<< This is giving me a "0" randomly sometimes?
      if( loss_for_1_lot == 0.0 )Print(" loss_for_1_lot = ", loss_for_1_lot);
   //Alert(loss_for_1_lot);
   double LotSize_Buy = MathFloor( risk_amount / loss_for_1_lot/ Lot_Step) * Lot_Step ;
      if( LotSize_Buy == 0.0 )Print(" LotSize_Buy = ", LotSize_Buy);
   //Alert(LotSize_Buy);
      
   double loss_for_1_lot1 = pips_to_ssl/ ts * tv ;  //<<<<<<<<<<<<<<<<<<<<<<<<<<< This is giving me a "0" randomly sometimes?
      if( loss_for_1_lot1 == 0.0 )Print(" loss_for_1_lot1 = ", loss_for_1_lot1);
   //Alert(loss_for_1_lot1);
   double LotSize_Sell = MathFloor( risk_amount / loss_for_1_lot1/ Lot_Step) * Lot_Step ;
      if( LotSize_Sell == 0.0 )Print(" LotSize_Sell = ", LotSize_Sell);
   //Alert(LotSize_Sell);
 
DomGilberto:


Vielen Dank für Ihre Hilfe und Ihre Hinweise, wie ich das Problem in den Griff bekommen kann! Ich habe das Problem gefunden (nachdem ich eine lange Zeit damit verbracht habe, Drucke überall hin zu klatschen!)

Es ist eigentlich aus der Tatsache, dass mein Broker (ILQ) verwendet eine fiktive Feed und die Hilfe von einem Mitglied dieses Forums auf meinem Thread in Bezug auf diese. In einer Nussschale dies ist der Code unten - Mit ILQ können Sie so niedrig wie 1 Einheit handeln. Im MT4-Transaktionsfenster würden Sie die genaue Größe der Einheiten eingeben, die Sie wollen (z.B. 0,01 || 874 Einheiten).

Können Sie mir helfen zu verstehen, welcher Teil dieser Formel an der Stelle, an der ich den Pfeil gesetzt habe, falsch ist? Aus meiner Sicht sieht die Formel gut aus?

OK, ich habe kurz Ihren anderen Thread über die alternative Losgrößenberechnung gelesen, aber nicht ausführlich genug, aber ganz allgemein könnte ich folgendes tun, um dieses Problem zu lösen...

Was verursacht das Problem? ts? tv? oder beide? wenn einer von beiden 0,0 ist, dann ist das Produkt aus ts und tv 0,0 ... aber wenn nur einer gelegentlich als 0,0 zurückgegeben wird, dann müssen Sie das Problem nur mit einem von beiden angehen ...


TickSize ändert sich nicht (soweit ich weiß) ... Sie brauchen es nicht ständig zu lesen, lesen Sie es in init(), aber überprüfen Sie, dass Sie keinen Wert von 0,0 zurückbekommen, oder lesen Sie es weiter, wenn Sie wollen, aber verwenden Sie nur, was zurückgegeben wird, wenn es nicht 0,0 ist.

TickValue kann sich ändern, sollte aber nie 0,0 sein. Wenn Sie ihn also lesen und er 0,0 ist, aktualisieren Sie den Wert nicht ... oder versuchen Sie es erneut und aktualisieren Sie ihn dann.

Das ist keine Raketenwissenschaft...

 

Ich verstehe nicht, warum Sie immer wieder danach fragen müssen. Der gesunde Menschenverstand sollte Ihnen sagen, dass Sie tun sollten, was Raptor gerade gesagt hat. Wenn sich herausstellt, dass ts*tv nicht das Problem ist, drucken Sie alle anderen Variablen aus, die als Teiler verwendet werden.

 

@SDC - Das habe ich bereits getan lol? Ich habe bereits herausgefunden, woher das Problem kommt. Ich wollte nur sagen, dass die Formel für die Losgröße für mich gut aussieht, und anstatt um den heißen Brei herumzureden, habe ich den Code gepostet, um zu sehen, ob ich etwas übersehe?

Sie werden im Code die "<<<<" bemerken, die eine "0" oder Null ausgibt divide....

@ RaptorUK - danke, Kumpel, ich weiß es zu schätzen, dass du das aufgeschlüsselt hast. Ich denke, ich weiß, wie man es aus dem, was Sie sagen - ich habe ein Spiel mit ihm in ein bisschen und Bericht zurück zu bestätigen, das Problem gelöst ist :)

 
Ok so seine "TickValue", die eine "0" zurückgibt.

Ich habe versucht, mit "static double tv = 0;" und dann die Tick-Wert innerhalb "int init" zuweisen, und dann aktualisieren, dass statische Doppel auf jeder neuen H1 Kerze, wenn "tv==0", aber es wird immer noch nicht produzieren etwas höher als "0"? Das fragliche Währungspaar ist GBPJPY (dies alles geschieht im Strategy Tester)

Entschuldigung, wenn ich zu langsam bin...?
 
DomGilberto:
Ok so seine "TickValue", die eine "0" zurückgibt.

Ich habe versucht, mit "static double tv = 0;" und dann die Tick-Wert innerhalb "int init" zuweisen, und dann aktualisieren, dass statische Doppel auf jeder neuen H1 Kerze, wenn "tv==0", aber es wird immer noch nicht produzieren etwas höher als "0"? Das fragliche Währungspaar ist GBPJPY (dies alles geschieht im Strategy Tester)

Entschuldigung, wenn ich zu langsam bin...?
Warum sollten Sie den Wert von tv aktualisieren, wenn TICKVALUE einen falschen Wert von 0,0 zurückgegeben hat? Sie sollten tv nur aktualisieren, wenn TICKVALUE einen Wert ungleich Null zurückgibt...
 

Sorry, ich wollte sagen, dass ich im Grunde beide Möglichkeiten ausprobiert habe. Ich habe also versucht, im Abschnitt "int init" einfach "tv = MarketInfo(Symbol(), MODE_TICKVALUE);" zu verwenden... (und "static double tv = 0;")

Im Grunde ist der Tickwert immer "0"? (Ich lasse ihn natürlich für mich drucken!)

Wenn ich zum Backtest für EURUSD übergehe, zeigt der Tick-Wert ebenfalls "0" an, aber es gelingt mir, den gesamten Backtest von 2001 bis 2013 ohne Fehler bei der Nullteilung erfolgreich durchzuführen.

UPDATE: Ich habe also einen Test mit einem normalen Broker auf den Live-Märkten durchgeführt, der einen lotbasierten Feed hat, und der Tick-Wert gab eine Zahl > 0 zurück. Als ich jedoch dasselbe Skript auf denselben Live-Markt-Broker mit einem fiktiven Feed legte, gab der Tick-Wert "0" zurück? Haben Sie eine Idee, wie ich diesen Fehler bei der Losgröße umgehen kann, wenn ich die fiktive Feed-Option verwende (Handel mit nur 1 Einheit)?

 
DomGilberto:

Sorry, ich wollte sagen, dass ich im Grunde beide Möglichkeiten ausprobiert habe. Ich habe also versucht, einfach "tv = MarketInfo(Symbol(), MODE_TICKVALUE);" im Abschnitt "int init" zu verwenden... (und "static double tv = 0;")

Im Grunde ist der Tickwert immer "0"? (Ich lasse ihn natürlich für mich drucken!)

Ebenso, wenn ich umschalten auf Backtest auf EURUSD der Tick-Wert ist auch sagen mir "0", jedoch gelingt es, erfolgreich laufen die gesamte Back-Test ohne Null-Division Fehler von 2001-2013 ?

Anhand des von Ihnen gezeigten Codes ist das nicht möglich, es sei denn, Sie rufen die von Ihnen gezeigte Funktion nicht auf.

   double ts = MarketInfo(Symbol(), MODE_TICKSIZE);
   double tv = MarketInfo(Symbol(), MODE_TICKVALUE);
   double minlot = MarketInfo(Symbol(), MODE_MINLOT);
         
   double loss_for_1_lot = pips_to_bsl/ ts * tv ;

wenn TICKVALUE immer 0,0 ist, dann ist tv 0,0, also ist ts * tv = 0,0 und Sie erhalten immer einen Fehler bei der Division durch Null...

Ist Ihr Terminal mit Ihrem Broker verbunden oder haben Sie es nicht angeschlossen?

 

Ich hoffe, dass dieses Video, das ich gemacht habe (40 Sekunden oder so), veranschaulicht, wovon ich spreche (da ich nicht sicher bin, ob ich es deutlich mache oder nicht).

Video: http://screencast.com/t/uMHY5DpM

Sie werden sehen, dass der erste Teil, wenn ich das Skript auf dem Live-Chart (echtes Konto) ablege, dass der Tick-Wert und die Tick-Größe "0" auf diesem "fiktiven Konto" zurückgeben, was ich im Lots-Fenster (Einheiten) zeige.

Der zweite Teil ist mit dem gleichen Broker, aber auf einem Lot-basierten Feed und dieses Mal gibt es einen Tick-Wert und Tick-Größe zurück. Auch hier zeige ich, dass Sie mit lots.... handeln.

Was den Strategietester betrifft, so habe ich keine Ahnung, warum er manchmal funktioniert und manchmal nicht. Das Konto war angeschlossen, während ich die Backtests durchführte (auf einem fiktiven Demokonto mit Einlagen (Einheiten)).

Meine nächste Frage wäre, wenn dies die typische Antwort ist, die ich von dem fiktiven Fed-Konto erhalte, können Sie mir dann vorschlagen, wie ich meine Positionsgrößenberechnung unter diesen Umständen korrigieren kann? Bei einer lotbasierten Einspeisung funktioniert sie perfekt... Ich hoffe, das erklärt es ein wenig besser?

 
DomGilberto:
Ok, es ist also der "TickValue", der eine "0" zurückgibt.

Ich habe versucht, "static double tv = 0;" zu verwenden und dann den Tick-Wert innerhalb von "int init" zuzuweisen, und dann diesen statischen Double bei jeder neuen H1-Kerze zu aktualisieren, wenn "tv==0", aber es wird immer noch nicht etwas höher als "0" produzieren? Bei dem fraglichen Währungspaar handelt es sich um GBPJPY (dies alles geschieht im Strategy Tester)

Entschuldigung, wenn ich zu langsam bin...?


Wie drucken Sie TickValue?

Da die Ziffern von GBPJPY in der Regel 3 sind, ist es durchaus möglich, dass TickValue Null ausgibt, weil nicht genügend Dezimalstellen vorhanden sind.

Um absolut sicher zu sein, kann es eine Idee sein, die gedruckten Dezimalstellen zu erweitern

DoubleToStr(MarketInfo(Symbol(),MODE_TICKVALUE),8)

Beachten Sie, dass

double loss_for_1_lot = pips_to_bsl/ ts * tv ; //<<<<<<<<<<<<<<<<<<<<<<<<<<< This is giving me a "0" randomly sometimes?

auch Null ergibt, wenn pips_to_bsl Null ist. Ist dies möglich?