「スプレッド表示インジケーター」のサンプルコードをそのままコピペしてコンパイルしたのに、

チャート上に何も表示されない——という経験はありませんか。

原因の多くは、インジケーターなのに

表示処理をスクリプト専用の関数に書いてしまっていることです。

この記事では、チャート上にスプレッドを表示するインジケーターの作り方を、

実際にMetaEditorでコンパイルしてチャートに表示できる形で解説します。

チャート上にスプレッドを表示するインジケーターの作り方

MarketInfo関数でスプレッドの値を取得し、

OBJ_LABELオブジェクトでチャート左上に文字として表示する、

初級者向けのシンプルなインジケーターを作成していきます。

  • チャート上にスプレッドを表示させる

メタエディタでtrade-spreadインジケーターを新規作成する

まずはMetaEditorを開き、

このインジケーター専用のファイルを新規作成するところから始めます。

メタエディタを開く

メタエディタ(MetaEditor)を立ち上げましょう。

操作は以下に記載しています。

【MQL】カスタムインジケーターを作成の流れについてわかりやすく説明してみた

今回は名前を「trade-spread」で作成します。

OnCalculate()にMarketInfoでスプレッドを取得する処理を書く

インジケーターの表示処理は、

OnStart()ではなくOnCalculate()に書く必要があります。

ここでは実際にMarketInfo関数でスプレッドを取得するコードを解説します。

注意: このインジケーターの表示処理は、

スクリプト専用のOnStart()ではなく、

インジケーターが毎ティック呼び出すOnCalculate()に書きます。

OnStart()はスクリプト(Scripts)として

実行した場合にしか呼び出されないため、

カスタムインジケーターとしてコンパイル
・チャートへ追加しても、OnStart()の中身は一度も実行されません。

double spread変数では、スプレッドの値に0.1をかけた値を代入しています。

MarketInfo関数については以下の記事を参照してください。

【MQL】気配値表示ウインドウに表示されている様々な情報を返す関数「MarketInfo」についてわかりやすく説明してみた
double spread = MarketInfo(Symbol(),MODE_SPREAD)*0.1;//スプレッドの値を取得

オブジェクトの作成・位置・文字の設定は、OnInit()で一度だけ行い、

OnCalculate()では表示するテキストだけを毎回更新します。

こうすることで、ティックが来るたびにオブジェクトを作り直す無駄や、

オブジェクト名の重複を避けられます。

ObjectCreate(0,"spread",OBJ_LABEL,0,0,0);//オブジェクトを設定(OnInit()で1回だけ)
ObjectSetInteger(0,"spread",OBJPROP_XDISTANCE,5);//原点からX軸に距離5
ObjectSetInteger(0,"spread",OBJPROP_YDISTANCE,18);//原点からY軸に距離18

OnCalculate()では、最新のスプレッド値でテキストだけを更新します。

ObjectSetString(0,"spread","Spread:"+DoubleToString(spread,1),20,"MS ゴシック",clrWhite);//表示形式

これで、OnCalculate()関数の記述は完了です。

double spread = MarketInfo(Symbol(),MODE_SPREAD)*0.1;//スプレッドの値を取得
ObjectSetString(0,"spread","Spread:"+DoubleToString(spread,1));//表示テキストを更新

OnInit()でオブジェクトの初期設定を書く

続いて、OBJ_LABELオブジェクトの作成・位置・文字色といった初期設定を、

OnInit()関数にまとめて記述します。

OnInit()関数に、オブジェクトの作成・位置・文字色などの初期設定を記述しましょう。

ObjectCreate(0,"spread",OBJ_LABEL,0,0,0);//オブジェクトを設定
ObjectSetInteger(0,"spread",OBJPROP_XDISTANCE,5);//原点からX軸に距離5
ObjectSetInteger(0,"spread",OBJPROP_YDISTANCE,18);//原点からY軸に距離18
ObjectSetInteger(0,"spread",OBJPROP_COLOR,clrWhite);//文字色

これでOnInit()関数の記述は完了です。

OnDeinit()で表示を消す処理とコンパイル手順

最後に、インジケーターを削除したときに表示も一緒に消えるようOnDeinit()を記述し、

コンパイルして動作を確認します。

OnDeinit()関数に記述する

OnDeinit()関数に記述しましょう。

OnDeinit()関数を記述することでインジケーターを削除すると表示が消えます。

ObjectDelete(0,"spread");//インジケーター削除すると表示が消える

これでOnDeinit()関数の記述は完了です。

void OnDeinit(const int reason)
{
 ObjectDelete(0,"spread");//インジケーター削除すると表示が消える
}

コピペしてコンパイルが通らないときに確認すること

補足: このインジケーターをコンパイルしたのにチャート上に何も表示されない場合、

表示処理をOnStart()に書いてしまっていないか確認してください。

OnStart()はスクリプト専用の関数で、

インジケーターとして動かしても呼び出されません。

表示に関わる処理は必ずOnInit()(初期設定)か

OnCalculate()(毎ティックの更新)に書きます。

コンパイルする

コンパイルしましょう。

通貨ペアの隣にSpreadと表示されていたら成功です。

MQL インジケーター作成 スプレッド 表示

MarketInfoを使ったスプレッド表示インジケーターのソースコード全体

ここまで解説したOnInit()・OnCalculate()・

OnDeinit()を組み合わせた、

trade-spreadのソースコード全体は以下に記載しています。

//+------------------------------------------------------------------+
//|                                                 trade-spread.mq4 |
//|                     Copyright 2020, FX-EA System Project Creator |
//|                        https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, FX-EA System Project Creator"
#property link      "https://creator.fx-ea-system-project.com/"
#property version   "1.01"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ObjectCreate(0,"spread",OBJ_LABEL,0,0,0);//オブジェクトを設定
   ObjectSetInteger(0,"spread",OBJPROP_XDISTANCE,5);//原点からX軸に距離5
   ObjectSetInteger(0,"spread",OBJPROP_YDISTANCE,18);//原点からY軸に距離18
   ObjectSetInteger(0,"spread",OBJPROP_COLOR,clrWhite);//文字色
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectDelete(0,"spread");//インジケーター削除すると表示が消える
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   double spread_value = MarketInfo(Symbol(),MODE_SPREAD)*0.1;//スプレッドの値を取得
   ObjectSetString(0,"spread",OBJPROP_TEXT,"Spread:"+DoubleToString(spread_value,1));//表示テキストを更新
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

【MQL】チャート上にスプレッドを表示するインジケーター【初級編】:まとめ

今回はスプレッドを表示させてみました。

表示処理はOnStart()ではなくOnInit()・OnCalculate()に書く、

という点さえ押さえておけば、他の情報を表示するインジケーターにも応用できます。

MarketInfoを活用することで他の情報を表示させることも可能になります。

あわせて読みたい: 【MQL】前日の高値・安値を表示するインジケーター【初級編】

関連記事