2023年1月25日水曜日

MT5 Tickが動いた理由の検証

 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が立っていることを条件にする場合ビッド演算子を使います。

void OnTick()
   {
   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