MarketInfo関数の書式や引数を調べても、実際にコンパイルして動かせるサンプルコードが見つからない——という人向けの記事です。

この記事では、MarketInfo関数の代表的な使い方に加えて、実際にMetaEditorでコンパイルしてAsk・Bid・スプレッドをチャート上に表示できるサンプルコードを紹介します。

気配値表示ウインドウに表示されている様々な情報を返す関数『MarketInfo』

MarketInfo関数とは、気配値表示ウインドウに表示されている各通貨ペアの

  • Ask
  • Bid
  • スプレッド
  • スワップ

などのマーケット情報を扱う関数です。

MarketInfo(string symbol,int type);
MarketInfo(通貨ペア,何の情報か)

戻り値はdouble型です。symbolは通貨ペアです。typeは何の情報かになります。

typeはかなりの数がありますので、詳しくはMQL4でMarketInfoと入力して、

それにカーソルを合わせてキーボードのF1キーを押すと一覧が表示されます。

代表的なものだけを以下に記載しておきます。

Ask情報を取得したい場合

Ask情報を取得したい場合は、以下のようになります。

MarketInfo("USDJPY",MODE_ASK);

Bid情報を取得したい場合

Bid情報を取得したい場合は、以下のようになります。

MarketInfo("USDJPY",MODE_BID);

通貨単位を取得したい場合

通貨単位を取得したい場合は、以下のようになります。

MarketInfo("USDJPY",MODE_POINT);

スプレッド情報を取得したい場合

スプレッド情報を取得したい場合は、以下のようになります。

MarketInfo("USDJPY",MODE_SPREAD);

MarketInfo関数を使ってAsk・Bid・スプレッドを表示する

ここまでの内容を組み合わせて、現在の通貨ペアのAsk・Bid・スプレッドをチャート左上に表示するインジケーターを作ってみましょう。

//+------------------------------------------------------------------+
//|                                            MarketInfoLabel.mq4   |
//+------------------------------------------------------------------+
#property strict
#property indicator_chart_window

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectDelete(0, "MarketInfoLabel");
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   double ask = MarketInfo(Symbol(), MODE_ASK);
   double bid = MarketInfo(Symbol(), MODE_BID);
   double spread = MarketInfo(Symbol(), MODE_SPREAD);

   string text = StringFormat("%s  Ask:%s  Bid:%s  Spread:%.0f",
                               Symbol(), DoubleToString(ask, Digits), DoubleToString(bid, Digits), spread);

   if(ObjectFind(0, "MarketInfoLabel") < 0)
     {
      ObjectCreate(0, "MarketInfoLabel", OBJ_LABEL, 0, 0, 0);
      ObjectSetInteger(0, "MarketInfoLabel", OBJPROP_CORNER, CORNER_LEFT_UPPER);
      ObjectSetInteger(0, "MarketInfoLabel", OBJPROP_XDISTANCE, 10);
      ObjectSetInteger(0, "MarketInfoLabel", OBJPROP_YDISTANCE, 20);
     }
   ObjectSetString(0, "MarketInfoLabel", OBJPROP_TEXT, text);
   return(0);
  }
//+------------------------------------------------------------------+
Copy

MarketInfo()で取得したAsk・Bid・スプレッドを1つの文字列にまとめ、OBJ_LABELオブジェクトのテキストとして更新しています。オブジェクト名を固定してObjectFind()で存在チェックしてから作成することで、毎ティック同じ名前でオブジェクトを重複作成しようとしてエラーになるのを防いでいます。

まとめ

関連記事