事前計算された - ページ 10

 
Dmitry Fedoseev:
そんなことはない。数本のバーの接続が切れ、数本のバーがゴミで初期化されなくなります。
アレクセイ・コジツィン
上記のドミトリーの言うように、数小節の接続が切れたか...。ところで、prev_calculatedは、接続に失敗した場合にも0を返すのでしょうか?

どうやらこの時、確かに通信が途絶えていたようだ。

2016.10.19 04:46:13.770 Network '4092672': scanning network finished
2016.10.19 04:45:37.260 Network '4092672': scanning network for access points
2016.10.19 04:45:36.630 Network '4092672': trading has been enabled - hedging mode
2016.10.19 04:45:36.630 Network '4092672': terminal synchronized with MetaQuotes Software Corp.
2016.10.19 04:45:36.000 Network '4092672': previous successful authorization performed from 31.173.80.3 on 2016.10.18 17:51:14
2016.10.19 04:45:36.000 Network '4092672': authorized on MetaQuotes-Demo through Access Point SG Singapore (ping: 583.86 ms)
2016.10.19 04:42:57.680 Network '4092672': connection to MetaQuotes-Demo lost

そして、ブレークがあった場合、prev_calculatedは0を返すことがほとんどである。

さて、長い休みでしたが、他のprev_calculatedのnullの原因は何でしょうか?

この線から。

2016.10.18 23:51:34.895 Network '4092672': scanning network finished
2016.10.18 23:51:20.865 Network '4092672': scanning network for access points

このような貿易記録以外には、上記のような記録はありません。

2016.10.19 00:00:36.066 Trades  '4092672': cancel order #103987819 buy stop 0.10 USDJPY at 103.977 sl: 103.377 tp: 104.077

また、prev_calculatedの0化回数については、前回の記事で確認できます。

 
Alexey Kozitsyn:

潜在的には、ここに原因があるのかもしれません。

if(rates_total > prev_calculated)
   {
    minEquity = 0;
    maxEquity = 0;
   }
   minEquity = NormalizeDouble(fmin((minEquity == 0 ? bal : minEquity), equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);

新しいバーが 届いたら、値を0にリセットする--結構です。しかし、その場合、minEquityと0が等しいかどうかをチェックすることになり、これは推奨されません。

私の言葉を証明するために、ここにあなたの画像を掲載します。おっしゃるとおり「ゴミ」の値が、ほぼゼロになっていることがおわかりいただけると思います。

もちろん、「ゴミ箱」の値で画像にデータウィンドウを追加した方が良いですよ。

なぜこの方法が推奨されないのか、詳しく教えてください。

この(minEquity ==0? bal : minEquity)の部分は、minEquity ==0であれば、先に取得したbalの値を返し、 minEquityの値は関数fmin()が終了するまで変化しない。

このような書き方は少し危険だとは思いますが...。が、問題はそこではありません。

 
Alexey Viktorov:

なぜこの方法が推奨されないのか、もう少し詳しく説明してください。

この (minEquity ==0? bal : minEquity) の部分は、もし minEquity ==0 ならば、先に得られた bal の値を返します; minEquity の値は関数 fmin() が終了するまで変わりません。

この書き方はちょっと危険だということには同意しますが...。が、問題はそこではありません。

minEquity ==0.の場合、同じ数のダブルを比較 することになります。このことが、値が0になったことの説明になるかもしれません。
 
Alexey Kozitsyn:
具体的には、minEquity==0。ダブった数値の等しさで比較 してるんですね。そう考えると、値が0になったのも納得がいくかもしれません。

なるほど、正解はminEquity ==0.0 なんですね.慣れないうちは

そして最後の一文は全く理解できない。0にする値は?

 
Alexey Viktorov:

なるほど、正解はminEquity ==0.0 なんですね.慣れないうちは

そして最後の一文は全く理解できない。0にする値は?

しかし、暗黙の型変換がエラーの原因になるかどうかはわかりません。実数の型の 比較のことです。すなわちここでは、安全のために、このように書きます。

CompareDoubles( minEquity, 0.0 );

bool CompareDoubles(double number1,double number2)
  {
   if(NormalizeDouble(number1-number2,8)==0) return(true);
   else return(false);
  }
 
Alexey Kozitsyn:

しかし、私は暗黙の型変換がエラーを引き起こす可能性があるかどうかは知りません。つまり、ここでは、信頼性を高めるために、このように書きます。

CompareDoubles( minEquity, 0.0 );

bool CompareDoubles(double number1,double number2)
  {
   if(NormalizeDouble(number1-number2,8)==0) return(true);
   else return(false);
  }


はい、私のバージョンでは、小数点以下2桁でお金を数えます。これは、そんなにきめ細かいことをするための見積もりではありません。
 
Alexey Viktorov:
はい、私のバージョンでは、小数点以下2桁でお金を数えます。これは引用ではないので、そんなに正確なことは言えません。

几帳面さではなく、正確さが重要なのです。あなたの場合、バッファにゼロの値が書き込まれることになるかもしれません。そのような精度を求めないのであれば、この方法でやってください。

if(rates_total > prev_calculated)
   {
    minEquity = -1.0;
    maxEquity = 0.0;
   }
   minEquity = NormalizeDouble(fmin((minEquity < 0 ? bal : minEquity), equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);

そうすれば、エラーは発生しません。

 
Alexey Kozitsyn:

几帳面さではなく、正確さが重要なのです。あなたの場合、バッファにゼロの値が書き込まれることになるかもしれません。その精度を求めないのであれば、この方法でやってください。

if(rates_total > prev_calculated)
   {
    minEquity = -1.0;
    maxEquity = 0.0;
   }
   minEquity = NormalizeDouble(fmin((minEquity < 0 ? bal : minEquity), equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);

その場合、誤りはないでしょう。

どうして私はこんなにバカなんだろう?minEquityを0以外の値で初期化した方が良いとは、どうしてわからなかったのでしょう。そうすれば、すべてが簡単になる......。

if(rates_total > prev_calculated)
   {
    minEquity = DBL_MAX;
    maxEquity = 0.0;
   }
   minEquity = NormalizeDouble(fmin(minEquity, equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);

maxEquity =DBL_MIN を使用することもできます。

 
Alexey Viktorov:

どうして私はこんなにバカなんだろう?minEquityを0以外の値で初期化した方が良いとは、どうしてわからなかったのでしょう。そうすれば、すべてが簡単になるのに・・・。

if(rates_total > prev_calculated)
   {
    minEquity = DBL_MAX;
    maxEquity = 0.0;
   }
   minEquity = NormalizeDouble(fmin(minEquity, equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);


まあ...ぐらい
 
Alexey Kozitsyn:
まあ...それとも...
それはあまり問題ではありません。どうにか回避できてはいるが、インジケータ起動時にインジケータバッファに ゴミが入るのはおかしい。
理由: