各aMarketEVENT呼び出しごとにデルタを監視および表示するソリューションstart()
( aMarketQUOTE 別名 Tick 到着時)
最初に、 (実際には新しい-MQL 世紀の)が次に呼び出される前に、その間に「古い」値を格納および保持するメソッドが必要です。start()
OnTick()
Astatic double
は賢明な方法です。
static double previousVALUE = EMPTY; // initialised to EMPTY
次に、カスタムインディケータ「SS2009_B」の前進ロジックに従って初期化します。
if ( previousVALUE == EMPTY ) {
previousVALUE = iCustom( NULL, // a Symbol
0, // a TimeFRAME
"SS2009_B",
0,
0, // a Buffer# to get value from
1 // step-back one Bar
);
}
構文の詳細については、MQL4 ドキュメントを確認してください
double iCustom(
string symbol, // symbol
int timeframe, // timeframe
string name, // path/name of the custom indicator compiled program
... // custom indicator input parameterA (if
... // custom indicator input parameterB (if
... // custom indicator input parameterC (if necessary)
int mode, // line index
int shift // shift
);
最後にデルタを計算して UI に表示し、シャッフルして次の呼び出しに備える
double currentVALUE = iCustom( NULL, 0, "SS2009_B", 0, 0, 0);
double deltaVALUE = previousVALUE - currentVALUE;
previousVALUE = currentVALUE; // shuffle [1]<-[0] before RET/next call
if ( deltaVALUE > 0 ){
ObjectSetText( "TimeLabel11",
"RESULT: " + NormalizeDouble( deltaVALUE, Digits ) + "|^|",
fsize,
"Courier New",
Yellow // can be deltaVALUE specific too :o)
);
}
if ( deltaVALUE < 0 ){
ObjectSetText( "TimeLabel11",
"RESULT: " + NormalizeDouble( deltaVALUE, Digits ) + "|v|",
fsize,
"Courier New",
Cyan // can be deltaVALUE specific too :o)
);
}
浮動小数点数の精度に関する注意事項
あなたはの使用に気付くかもしれませんNormalizeDouble()
これは、float の比較に関する問題を回避するために、かなり重要なステップです。
標準浮動小数点 ( MQL4 double
) の精度が十分でない場合、MQL4 で拡張精度の数値を使用することを選択できます。そのためのドキュメントを確認してください。
ただし、float 比較には常に注意してください。
より安全な側にいるためのベストプラクティスNormalizeDouble()
は、 (予防として)および比較ではなく、いくつかのthresholdDELTA
ようなもの の両方を使用することですif ( MathAbs( floatA - floatB ) < anEqualityTresholdDELTA ){ ... }
if ( floatA == floatB ) {...}