MT5はいろいろな理由でティックが動きます。
ティックが動いた理由はMqlTick構造体にSymbolInfoTick()変数で値を代入し、flagsを見ることで確認できます。
フラグの値は2進数です。
Tick.flagsの確認は以下のコードような流れになります。
void OnTick()
{
MqlTick Tick; //TickをMqlTick構造体に宣言
SymbolInfoTick(Symbol(),Tick);//Tickのメンバに値を代入
Comment(Tick.flags);//Tick.flagsの値をコメントに表示
}
実際に表示すると2や4が表示されますが6も表示されます。
Bid,Ask両方の価格が変更されると6になります。
また、まれに0が戻ってくることがあります。
理由なきティックということでしょうか!
MT5取り扱いのFX会社4社でどのような数字が戻ってくるか確認しました。
0:理由なし
2:Bid価格変更
4:Ask価格変更
6:Bid+Ask価格変更
外為ファイネストは98,100,102と不思議な数字が出ています。
98=2+32+64 /100=4+32+64 102=6+32+64
32:買い取引
64:売り取引
外為ファイネストは常に売り買い取引のフラグが立っているようです。
どの業者でもTICK_FLAG_BID=2が立っていることを条件にする場合ビッド演算子を使います。
{
MqlTick Tick; //TickをMqlTick構造体に宣言
SymbolInfoTick(Symbol(),Tick);//Tickのメンバに値を代入
if((Tick.flags & TICK_FLAG_BID)==TICK_FLAG_BID)
Print(Tick.flags,"True");
else
Print(Tick.flags,"False");
}
ビッド演算子 &は 2進数の同じ桁の数字が両方1の場合1になります。
例)0b0011 & 0b0110 -> 0b0010
0b0011
0b0110
---------
0b0010
先頭0bは2進数という意味です。
一番左の桁は両方0なので0になります 0&0 -> 0
左から2つ目の桁は0と1で0になります 0&1 -> 0
左から3つ目の桁は1と1で1です 1&1 -> 1
一番右の桁は 1と0で0です 1&0 → 0
0b0011 & 0b0110結果は0b0010になります。
---------------------------------------------------
難解ですが二進数のフラグを調べるには便利な方法です。
ややこしいので例を4つほど記述します。
Tick.flags=2の場合 2は0b0010
TICK_FLAG_BID=2 2は0b0010
Tick.flag & TICK_FLAG_BID ->0b0010 = 2
Tick.flags=4の場合 4は0b0100
TICK_FLAG_BID=2 2は0b0010
Tick.flag & TICK_FLAG_BID ->0b0000 = 0
Tick.flags=6の場合 6は0b0110
TICK_FLAG_BID=2 2は0b0010
Tick.flag & TICK_FLAG_BID ->0b0010 = 2
Tick.flags=15の場合 6は0b1111
TICK_FLAG_BID=2 2は0b0010
Tick.flag & TICK_FLAG_BID ->0b0010 = 2