English

MQL5の書き方(for MQL4デザイナー)

 

価格の取得方法

構造体を利用したBid,Askの取得方法、ティックの発生理由の取得方法を解説します。

 

MQL5にない定義済み変数

MQL4には価格関連の定義済み変数がありましたが、MQL5にはありません。
現在の価格Bid、Askなどは、構造体MqlTickを利用して取得することができます。
また、ティックの発生理由を取得することができます。

 

MQL5にない価格関連の定義済み変数一覧

現在の価格を取得する定義済み変数

double Ask
double Bid
                            

配列になった定義済み変数

double Bars[]
double Close[]
double High[]
double Low[]
double Open[]
double Time[]
double Volume[]
                                

 

MqlTick構造体

8個のメンバーがあります。

struct MqlTick
{
  datetime     time;          //更新時間
  double       bid;          // Bid
  double       ask;          // Ask
  double       last;          //最終取引価格
  ulong        volume;       //最終取引量
  long         time_msc;     //更新時間(ミリ秒)
  uint         flags;          //ティックフラッグ
  double       volume_real;   //正確な最終取引量
};
                    

 

MqlDateTimeを使用した時間の取得例

それでは実際の使用例を紹介します。

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株式会社代表取締役、株式会社トリロジー他で役員を兼任。