構造体を利用したBid,Askの取得方法、ティックの発生理由の取得方法を解説します。
MQL4には価格関連の定義済み変数がありましたが、MQL5にはありません。
現在の価格Bid、Askなどは、構造体MqlTickを利用して取得することができます。
また、ティックの発生理由を取得することができます。
MQL5にない価格関連の定義済み変数一覧
現在の価格を取得する定義済み変数
double Ask double Bid
配列になった定義済み変数
double Bars[] double Close[] double High[] double Low[] double Open[] double Time[] double Volume[]
8個のメンバーがあります。
struct MqlTick { datetime time; //更新時間 double bid; // Bid double ask; // Ask double last; //最終取引価格 ulong volume; //最終取引量 long time_msc; //更新時間(ミリ秒) uint flags; //ティックフラッグ double volume_real; //正確な最終取引量 };
それでは実際の使用例を紹介します。
void OnTick(){ MqlDateTime Now; TimeToStruct(TimeCurrent(),Now); Print("Hour: ",Now.hour); }
※多くの業者はlast、volume、volume_realの値を返してきません。
void OnTick() { MqlTick Tick; SymbolInfoTick(_Symbol,Tick); Comment("Bid: ",Tick.bid, "Ask: ",Tick.ask); }
解説)
MqlTick Tick;
TickをMqlTick構造体として宣言します。宣言時点ではすべてのメンバーに値は入っていません。
SymbolInfoTick(_Symbol,Tick);
SymbolInfoTick()関数は指定したシンボルのデーターをMqlTick型に代入します。
Tick.bidやTick.askに値が代入されます。
Comment("Bid: ",Tick.bid, "Ask: ",Tick.ask);
確認の為コメントにBidとAskの値を表示します。
チャート左上に価格が表示されます。
MT5はいろいろな理由でティックが発生します。ティックの発生した理由はflagsに返されます。
フラグ | 値 | 理由 |
---|---|---|
TICK_FLAG_BID | 2 | Bid価格の変更 |
TICK_FLAG_ASK | 4 | Ask価格の変更 |
TICK_FLAG_LAST | 8 | 最終取引価格の変更 |
TICK_FLAG_VOLUME | 16 | 最終取引量の変更 |
TICK_FLAG_BUY | 32 | 買い取引の発生 |
TICK_FLAG_SELL | 64 | 売り取引の発生 |
MT5はBidとAskの価格は別々に変わることがあります。
Bid価格だけ変更の場合flagsはTICK_FLAG_BID=2、Ask価格だけ変更はTICK_FLAG_ASK=4、両方とも変更の場合6になります。また、Bid価格の変更と買い取引の発生の両方が理由の時は2+32=34がflagsに入ります。
TICK_FLAG_BIDだけを確認したいときはビッド演算子を使用します。
MqlTick Tick; SymbolInfoTick(Symbol(),Tick); if((Tick.flags & TICK_FLAG_BID)==TICK_FLAG_BID) Print("TICK_FLAG_BID");
配列になっていた定義済み変数は、関数を利用して取得することができます。
例えばMQL4にあった定義済み変数Close[]は、iClose()関数を利用することで取得できます。iCloseなどの価格を取得する関数はMQL4を同じ内容です。
MT5はBidとAskの価格が別々に格納されています。そのためMT4と比べて正確なバックテストができます。しかし、Askを参照する方法はBidに比べて限られています。MqlTickを理解することで価格の配信の考え方を把握しましょう。
林 貴晴(AMSER株式会社代表取締役)
内資系薬品会社で約10年勤務の後、
外資系製薬会社(現IQVIA及びGSK)で合計約10年を勤務
その後EA AMSERを開発し、その成績を評価され、株式会社ゴゴジャンの部長として抜擢。
現在はAMSER株式会社代表取締役、株式会社トリロジー他で役員を兼任。