専門家集団 - ページ 2

 
ストッパーについては、「クールダウン」(正しい呼び方がわかりません)を導入した方が良いと思います。

ピップの精度でストップをトレースすると、ブローカーは吠えてExpert Advisorを切ってしまいます :)

この方がいいと思うんです。
   if (MathAbs(CurrentStopLoss - NewStopLoss) > (Ask - Bid)*Koef) { // ストップロスを修正 ......................}.


つまり、新しいストップが古いストップと所定のスプレッド数(1-2)だけ異なる場合、注文を修正するのです。
あなたの悩みは、ここで自動的に解決します。

 
Makさん、アドバイスありがとうございます。します。
ただ、ここだけ問題が違っていて、同じ値を設定しようとするのです。つまり、このようなチェックは、エラーを回避するのではなく、その確率を下げるだけです =)
 
ただ、ここだけ問題が違っていて、同じ値を設定しようとするのです。つまり、このようなチェックは、エラーを回避するのではなく、その確率を下げるだけです =)

EAのテキストの不具合である可能性が高いです。
似たようなのがあって、どう直したか覚えていない。

しかし、上記の例では、スクリプト内のエラーは確実に
は、同じ値に設定しようとすることはありません。
 
Только тут проблема в другом - оно пытается установить _на_то_же_значение_... т.е. такая проверка не спасёт от ошибки, а просто уменьшит её вероятность =)

専門家のテキストの不具合である可能性が高いです。同じようなものがあった、どうやって直したのか、覚えていない。しかし、上記の例では、スクリプトにエラーが発生しても が同じ値に設定しようとしないことを保証しています。





Makさん、そこに1行のテキストがあります =
)_TrailingStop( orderticket, 50 );



このようなエラーを避けるために、正確に関数を書きました。チェックは同じですが、すべてのピップが ワークアウトされるという違いがあります。もし値が同じなら(この場合、価格からストップまでの距離は50に等しい)、トレーリングストップは機能しないはずです。しかも、ほとんどの場合うまくいかない =゜)))彡、なぜかすり抜けることも・・・。

 
NormalizeDoubleの 動作が異なる場合があるのかもしれませんね。
四捨五入しているのか、捨てているのか?

一般に、浮動小数点型は等価比較しない方が良いと言われています。
唯一の例外は、
double A,B; ...... A = ......; ...... B = A; ....... if (B == A)
.................................................................................



そして、1行について・・・。_TrailingStopにはたくさんの行があり、 、2つでもあれば、すでにエラーの原因になっています :)

 
何を
するのか、捨てるのか、丸める
のか。 私も気になるところです;)

すでにここで一部修正しました: instead
( orderstoploss == 0.0 ...... )


せいぞう

if ( orderstoploss <= 0 ........................................)

で、あとは問題ないようでした。

....orderstoploss < ( bid - TrailingStop * point ) 





レナート、私はあなたに期待しているんですよ。

 
週末に手伝えることがあるかどうか確認します。
 
今週末に見てみて
、参考に
したいと思います。ちゃんとしなきゃ...。
 
きっと角度のような単純なもので、私が気づいていないだけなのでしょう......。

komposterさん、間違ってますよ :)スプーン曲げの少女が言ったように、「物事は見かけによらない」のです。
例えば、次のループは5つの数字を表示する。
for (double d = 0.1; d <= 0.5; d += 0.1) Print(d);


次のサイクルでは、バウンダリーを1.0増やして、どのくらい印刷するのでしょうか?

for (double d = 1.1; d <= 1.5; d += 0.1) Print(d);



5つの数字も印刷されるかと思いきや、4(フォー)しか印刷されない。素晴らしいことだと思いませんか?
ループの後にもう1行追加すると

Print("d=" + d + "(d <= 1.5)=" + (d <= 1.5));


を得ることができます。

d=1.50000000 (d <= 1.5)=0



ほとんどあなたのストップ付きと同じですが、より基本的なものです :) 。この問題は、最初のコンピューターチップと同じくらい古いものです。
コンピュータは2進数、人間は10進数で計算します。丸め処理を行うと、アーチファクトが発生します。

Makが提案した "切り上げ "は、些細なバグではなく、丸め方に根本的な問題がある場合に有効です。

多くの人は、金融計算には特別な10進数演算ライブラリを使用しなければならないと考えていますが、そのようなライブラリでも、時にはエラーが発生することがあります。
というのは、時に重大な結果をもたらすことがあります。ところで、Renatさんは算術のどの実装を使っているのでしょうか?

 
komposter

ざっと見たところ(まだ調べてませんが)、計算しているポイント リファレンスが見つかりました。
捨てる」ことを心がけ、Pointを置く。おそらくそれが問題なのでしょう(MarketInfoのポイントは、必ずしも思い通りにならないかも?)