#define LT 0#define GT 1#define GTE 2#define LTE 3#define EQ 4#define NEQ 5bool doublecomp(double a,int type,double b){
// See https://forum.mql4.com/45053/page4// 0 compare doesn't need this functionswitch(type){
case LT: return(b-a>Point/2.);
case GT: return(a-b>Point/2.);
case GTE: return(a-b>-Point); // Addedcase LTE: return(b-a>-Point); // Addedcase EQ: return(!(MathAbs(a-b)>Point/2.));
case NEQ: return(MathAbs(a-b)>Point/2.);
default: return(-1); // Added - needed to avoid compile error about not all control paths returning a value
}
}
SDC: if( !MathAbs( a - b ) > Point/2) が等しいかどうかを比較するためにどのように使用できますか?1.4999 == 1.5000 となります。
それはないです。
if( ! (MathAbs( a - b ) > Point/2) ) be used to compare for equality? That would tell you 1.4999 == 1.5000 if( ! (MathAbs(1.4999 - 1.5000 > 0.00005 ) if( ! (0.0001 > 0.00005 ) if( ! (true ) if( false ) 1.4999 is NOT equal to 1.5000
#define LT 0#define GT 1#define GTE 2#define LTE 3#define EQ 4#define NEQ 5bool ComparePrice(double a,int type,double b){
// See https://forum.mql4.com/45053/page4// 0 compare doesn't need this functionswitch(type){
case LT: return(b-a>Point/2.);
case GT: return(a-b>Point/2.);
case GTE: return(a-b>-Point/2.);
case LTE: return(b-a>-Point/2.);
case EQ: return(!(MathAbs(a-b)>Point/2.));
case NEQ: return(MathAbs(a-b)>Point/2.);
}
return(-1);
}
また、価格以外のdoubleを比較するための2次関数も必要かもしれませんね...。
bool CompareNormal(double a,int type,double b){
// With thanks https://forum.mql4.com/45053/page4// 0 compare doesn't need this functionswitch(type){
case LT: return(b-a>0.0000000000000000000000000000001);
case GT: return(a-b>0.0000000000000000000000000000001);
case LTE: return(b-a>-0.0000000000000000000000000000001);
case GTE: return(a-b>-0.0000000000000000000000000000001);
case EQ: return(!(MathAbs(a-b)>0.0000000000000000000000000000001));
case NEQ: return(MathAbs(a-b)>0.0000000000000000000000000000001);
}
return(-1);
}
MQL4 Reference > Language Basics > Data Types > Real Types (double, float)'も参照してください。
// add more floating point zeros if you need a higher precision
#define isZero(x) (fabs(x) < 0.000000001)
#define isEqual(x,y) (fabs(x-y) < 0.000000001)
2つのダブルを比較する必要がある場合は、このような条件で使用します。
if (isEqual(myFirstDouble, mySecondDouble))
{
// first and second doubles are considered equal// do something
}
double tradesPerDay = totalTradesPerYear/365;
for(int i=0; i < rates_total; i++)
{
// use precomputed tradesPerDay rather than computing the division here.
}
WHRoeder: このコードは良い(特に "added "と "default "をチェックして ください)?また、このスレッドを訪問し、ちょうど最後のページに行く人のための簡単な最後の参照として機能するかもしれません(私がしたように)。
そのコードは正確ではありません。
if( !MathAbs( a - b ) > Point/2) を使って、どのように等しいかどうかを比較することができますか?それは1.4999 == 1.5000と言うことです。
if( ! (MathAbs(1.4999 - 1.5000 > 0.00005 )
if( ! (0.0001 > 0.00005 )
if( ! (true )
if( false ) 1.4999 is NOT equal to 1.5000
私が使っているのは
または、実勢価格ではない倍率の場合は、より高い精度のものを使用します。
このコードについてRaptorsの投稿
を使えばいいんですね。
私はそのメソッドを様々な方法でテストしましたが、期待された、または望ましい結果を返さないシナリオは見つかりませんでした。最終的なコード...ありがとうWHRoeder
また、価格以外のdoubleを比較するための2次関数も必要かもしれませんね...。
MQL4 Reference > Language Basics > Data Types > Real Types (double, float)'も参照してください。
0.00...1の書き方を知っている人がいるかもしれません。
というわけで、「// 0 compare doesn't need thisfunction」に関連している可能性がある、興味深いものを発見しました。
最新版だけのバグかもしれませんが、よくわかりません。0との比較はもはや正しく機能しない。私は、以下のような不親切な方法に頼らざるを得ませんでした。
outcome=(int(outcome*100)/100.0); // 解像度2桁
0の値が実際に0の値として終了することを確認するためです。
WHRoederさん、ありがとうございます。もっと勉強が必要です :)
このトピックは、不必要な複雑さに対処しすぎていると思います。
プログラマの生活を可能な限り楽にするようにしましょう。二重比較を必要とするクラスには定義(どうしても必要ならメソッド)を書こう。
2つのダブルを比較する必要がある場合は、このような条件で使用します。
2つの倍数を比較する必要がある場合は、次のような条件で使用します。倍数がゼロ(またはゼロに非常に近い)かどうかを確認したい場合は、次のような条件を使用します。
余談ですが、多くの投稿で除算について書かれています。
カプセル化されていると、ユーティリティメソッドに「アウトソース」されるコードのコストを忘れてしまいがちです。特に、一度ユーティリティクラスのどこかの素敵なユーティリティメソッドに包まれると、インジケータやEAのいたるところでそれを使い始め、それらがどのような計算 ステップを行うのか長い間忘れてしまっています。ストラテジーテスターを 使うとき、私たちは自分のずさんさのために多くの不必要な時間を支払うことになるのです。
経験則。足し算と引き算は、掛け算と割り算よりずっと速い。除算は最も計算時間がかかるので、可能な限り最適化 しましょう。もし分母がこのループのように固定されていたら...
のように分母がfixなら、分母xをその反転値1/xに置き 換える。
また、除算の結果が常に同じであれば、計算を一度だけ行い、結果を変数に保存しておけば、コード内のあらゆる場所(例えばループ内)で使用することができます。
乾杯。
A.T.