ゼロディバイド(課題を発見、しかしなぜ?) - ページ 2

 
RaptorUK:

もしあなたが、この単純な問題を何日もかけて解決したいのであれば、ぜひともご自由に ... .... 私はそうしません。

バックテストでいつ起こるかわかっているなら、見つけるのは簡単です ... ... それが起こる日の前日にバックテストを開始します ... ... 正確に、分単位で、いつ起こるかを見つけます ... ... あなたのコード内のすべての分割について ... ...... そう、それらすべてについて、除数を含む行の前にPrint()を追加して、除数と問題のコードの行への参照を表示します ....

例えば

あなたのコードがゼロによる除算エラーで終了したとき、ログファイルをチェックし、最後のいくつかのプリントに、エラーを生成したコードの行とどの変数がゼロに設定されたかを示すプリントがあります ... ...

.............................................賢く仕事をすることを学び、論理的かつ効率的に問題を解決してください。


この問題に対処するための正しい方向性を示していただき、ありがとうございました。私は問題を見つけました(あらゆるところにプリントを叩きつけるのに長い時間を費やした後に!)。

私のブローカー(ILQ)が想定外のフィードを使用しているという事実と、これに関する私のスレッドでこのフォーラムのメンバーから助けを得たことに起因しています。簡単に言うと、これは以下のコードです。MT4の取引ウィンドウに、希望する正確な単位を入力します(例:0.01 || 874単位)。

この計算式のどの部分が間違っているのか、私が矢印をつけたところを理解するのに役立ちますか?私が見ているところでは、計算がうまくいっているように見えますが?

//+------------------------------------------------------------------+
//| 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:


この問題に対処するための正しい方向性を示していただき、ありがとうございました。私は問題を見つけました(あらゆるところにプリントを叩きつけるのに長い時間を費やした後に!)。

私のブローカー(ILQ)が想定外のフィードを使用しているという事実と、これに関する私のスレッドでこのフォーラムのメンバーから助けを得たことに起因しています。簡単に言うと、これは以下のコードです。MT4の取引ウィンドウに、希望する正確な単位を入力します(例:0.01 || 874単位)。

この計算式のどの部分が間違っているのか、私が矢印をつけたところを理解するのに役立ちますか?私が見ているところでは、計算がうまくいっているように見えますが?

OK、私は代替ロットサイズ計算についてのあなたの他のスレッドを簡単に読みましたが、十分な詳細ではありません、しかし、この問題に対処するための一般的な用語では、これは私が行うかもしれないものです... .

何が問題を引き起こしているのでしょうか? tsですか? tvですか? それとも両方ですか? もしどちらかが0.0なら、tsとtvの積は 0.0になります ... しかし、もし一方だけが時々0.0として返されているなら、どちらかの問題だけに対処する必要があります ... ...


TickSizeは(私が知る限り)変わりません ... 読み続ける必要はなく、init()で読みますが、0.0の値が返されていないことを確認します。あるいは、読み続けますが、0.0でない場合にのみ返された値を使用します。

TickValueは変化しますが、決して0.0であってはなりません。したがって、もしそれを読んで0.0であったとしても、その値を更新しないでください ... あるいは、もう一度試してみてから更新します。

これは、ロケット科学ではありません ... ...

 

なぜこのような質問を続けるのか理解できません。常識的に考えれば、Raptorが言ったようにすればよいのです。もしts*tvが問題でないことがわかったら、除算器として使われている他のすべての変数をプリントアウトしてください。

 

SDC - それはもうやりましたよ(笑)?私が言いたかったのは、ロットサイジングの公式が私には良く見えるということで、むしろ私が何かを見逃していないかどうかを確認するためにコードを投稿しました。

このコードでは、"<<<"が "0 "またはゼロ除算を 出力していることにお気づきでしょう...。

RaptorUK - ありがとう、分解してくれてありがとう。あなたが言っていることから、それを解決する方法がわかったと思います - 少し遊んでみて、問題が解決したかどうか報告します :)

 
その "TickValue "が "0 "を返しているのはわかりました。

静的ダブルtv = 0;」を使い、「int init」内でティック値を割り当て、「tv=0」の場合、新しいH1キャンドルごとにその静的ダブルを更新しようとしましたが、それでも「0」より高いものは生成されないのでしょうか?通貨ペアはGBPJPYです(全てStrategy Tester 内です)。

遅かったらすみません...?
 
DomGilberto:
その "TickValue "が "0 "を返しているのはわかりました。

静的ダブルtv = 0;」を使い、「int init」内でティック値を割り当て、「tv=0」の場合、新しいH1キャンドルごとにその静的ダブルを更新しようとしましたが、それでも「0」より高いものは生成されないのでしょうか?通貨ペアはGBPJPYです(全てStrategy Tester内です)。

遅かったらすみません...?
TICKVALUEが0.0という不正確な値を返した場合、なぜtvの 値を更新するのですか? TICKVALUEが0以外の値を返した場合のみtvを更新すべきです ... ....
 

すみません、基本的に両方の方法を試したという意味です。ということで、int initセクションで「tv = MarketInfo(Symbol(), MODE_TICKVALUE);」とだけやってみましたが...。(とか「static double tv = 0;」とか。)

基本的にティックバリューは常に "0 "なのでしょうか?(もちろん印刷はさせています!)

同様に、EURUSDのバックテストに切り替えると、tick値も "0 "を教えてくれますが、2001年から2013年までのバックテスト全体をゼロ除算 エラーなしで成功させることに成功したのでしょうか?

UPDATE: そこで、私はロットベースのフィードを持っているライブ市場の通常のブローカーでテストを実行し、ティック値は数字> 0を返していた。しかし、私は想定フィードを持っている同じライブ市場のブローカーにこの同じスクリプトをドロップすると、ティック値は "0 "として返されました?想定フィードオプション(1単位から取引可能)を使用する場合、このロットサイズエラーを回避する方法があれば教えてください。

 
DomGilberto:

すみません、基本的に両方の方法を試したという意味です。ということで、int initセクションで「tv = MarketInfo(Symbol(), MODE_TICKVALUE);」とだけやってみましたが...。(とか「static double tv = 0;」とか。)

基本的にティックバリューは常に "0 "なのでしょうか?(もちろん印刷はさせています!)

同様に、EURUSDのバックテストに切り替えると、tick値も「0」を教えてくれますが、2001年から2013年までのバックテスト全体をゼロ除算エラーなしで正常に 実行することに成功しましたか?

あなたが示したコードから ... あなたが示した関数を呼び出して いない限り、それは不可能です ... 。

   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 ;

TICKVALUEが常に0.0であれば、tvは0.0なので、ts * tv = 0.0なので、常にゼロによる除算エラーが発生します ... ...

ターミナルはBrokerに接続されていますか? それとも接続されていない状態で実行されていますか?

 

私が作ったこのビデオ(40秒くらい)が、私が言っていることを説明してくれることを期待しています(私がそれを明確にしているかどうか確信がないので)。

ビデオ: http://screencast.com/t/uMHY5DpM

最初の部分は、ライブチャート(リアル口座)にスクリプトをドロップすると、その「想定口座」のティック値とティックサイズが「0」を返すことがわかりますが、これはロットウィンドウ(単位)に表示されています。

2番目の部分は、同じブローカーを使用していますが、ロットベースのフィードで、今回はティック値とティックサイズを返します。ここでも、ロットを使って取引していることを図示しています...。

ストラテジーテスターについては、なぜうまくいったりいかなかったりするのか、まったくわかりません。バックテストを実行する間、口座も接続されています(デモの想定給餌口座(単位))。

次の質問ですが、もしこれが想定フィード口座から得られる典型的な反応であるなら、この状況でポジションサイジングの計算を修正する方法を提案できますか? ロットベースのフィードでは完璧に動作します...もう少しうまく説明できるといいのですが。

 
DomGilberto:
OK、その "TickValue "は "0 "を返しているのですね。

私は "static double tv = 0; "を使用して、次に "int init "内でティック値を割り当て、次に "tv==0 "の場合、すべての新しいH1キャンドルでその静的ダブルを更新しようとしましたが、それはまだ "0 "より高い何も生成しませんか?通貨ペアはGBPJPYです(全てStrategy Tester内です)。

遅かったらすみません...?


TickValueはどのように出力しているのでしょうか?

GBPJPYの桁数は通常3なので、TickValueが0と表示されるのは、小数点以下の桁数が足りないためである可能性が高いです。

念のため、表示される小数点以下の桁数を増やすとよいでしょう。

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

ただし

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

は、pips_to_bslがゼロの場合にもゼロになることに注意してください。これは可能ですか?