ホーム » FX自動売買基礎と応用 » MT5版のティックチャート表示ツールを作成する【MQLプログラミングの基礎】

MT5版のティックチャート表示ツールを作成する【MQLプログラミングの基礎】

1.ファイルの新規作成

この記事では、サブウィンドウにティックチャートとティックチャートのMA(移動平均線)を表示するツールを作成します。

※この記事はMQL5の内容です。MQL4に対応した類似記事は以下を参照してください。

ティックチャートと1分足を重ねて表示する自動売買の作成方法

MetaEditorの「新規作成」アイコンをクリックしてMQLウィザードを開始します。

MQLウィザード新規作成_MT5版のティックチャート表示ツールを作成する【MQLプログラミングの基礎】

「カスタムインディケータ」を選択して「次へ」をクリック。

一般プロパティ_MT5版のティックチャート表示ツールを作成する【MQLプログラミングの基礎】

ファイル名は「TickChart.mq5」とします。

チャート上へ表示するデータ数(BARS)とMA用の期間パラメーター(PERIOD)を追加し、「次へ」をクリック。

名前 タイプ 初期値
BARS int 500
PERIOD int 20

イベントハンドラ_MT5版のティックチャート表示ツールを作成する【MQLプログラミングの基礎】

イベントハンドラは一番上のOnCalculateのみを選択し、「次へ」をクリック。

描画プロパティ_MT5版のティックチャート表示ツールを作成する【MQLプログラミングの基礎】

「カスタムインディケータの描画プロパティ」では、「サブウィンドウに表示」にチェックを入れて、ティックチャート用のバッファ(tickChart)とMA用のバッファ(ma)を追加します。

「完了」をクリックすれば、ファイルのベースが作成されます。

MAの種類を指定するパラメーター「METHOD」を「input int PERIOD=20;」の下に追記します。


input ENUM_MA_METHOD METHOD = MODE_SMA;

2.初期表示用のティックデータをサーバーから取得

ティックデータを受け取るMqlTick型の配列tickを「double maBuffer[];」の下に追記します。


MqlTick tick[];

CopyTicks関数を利用して、最新からBARSで指定した数のティックデータを取得します。

OnCalculate関数内に、下記を追記します。


   static bool getTick = false; // ティックデータ取得記憶
   if (!getTick) {
      if (CopyTicks(NULL, tick, COPY_TICKS_ALL, 0, BARS) <= 0) return 0; // 取得失敗時はやり直し
      getTick = true; // 取得成功

   }

データを取得できなかった(戻り値が0以下)場合は、リトライするようにしています。

初期読み込みの時点で、表示用のインジケーターバッファの値をリセットするため、下記を「getTick = true;」の下へ追記します。


      ArrayInitialize(tickChartBuffer, EMPTY_VALUE);
      ArrayInitialize(maBuffer, EMPTY_VALUE);

取得したデータのBid値をサブウィンドウに表示するため、if (!getTick) { }文の下へ、下記を追記します。


   if (!getTick) {
      //【省略】
   }
   int n = ArraySize(tickChartBuffer) - 1; // バッファ最新足
   int nTick = ArraySize(tick) - 1; // ティックデータ最新足

   for (int i = nTick; i >= 0; i--) {
      tickChartBuffer[n - nTick + i] = tick[i].bid; // ティックデータをバッファへ入力
   }

インジケーター用のバッファ配列の方向を指示していないので、配列の最後(ArraySize(tickChartBuffer) - 1)が最新足となります。

サーバーから取得したティックデータ(配列tick)も配列の最後(ArraySize(tick) - 1)が最新足のデータです。

3.最新ティック情報を反映する

サーバーからの初期読み込み以降は、ティック配信毎に配列tickの最新部へ現値を入力します。

int nTick = ArraySize(tick) - 1;」の下に下記を追記します。


   if (prev_calculated > 0) {
      for (int i = 0; i < nTick; i++) tick[i] = tick[i + 1]; // データをシフト
      tick[nTick].bid = close[n]; // 最新値を反映
   }

配列tickを後ろへ1つずつずらした後、最新部へ現値を入力しています。

4.MA計算

MT5に標準で用意されているMA計算用のインクルードファイルを利用するため、「//--- input parameters」の上へ、下記を追記します。


#include  <MovingAverages.mqh>

MAの種類に合わせて「MovingAverages.mqh」の関数を適用するため、OnCalculate関数内の最下部「return(rates_total);」の上に下記を追記します。

まずは、SMA用の式となります。


   switch (METHOD) { // ティックデータのMA計算
   case MODE_SMA :
      for (int i = n - nTick + PERIOD; i <= n; i++) maBuffer[i] = SimpleMA(i, PERIOD, tickChartBuffer);
      break;

   }

インクルードファイル(MovingAverages.mqh)内のSimpleMA関数を利用して、ティックデータがある範囲内に対してMAを計算させています。

同様にEMA・SMMA・LWMAを計算させるため、上記の「break;」の下に、次のコードを追記します。


   case MODE_EMA :
      for (int i = n - nTick; i <= n; i++) {
         double prev_value = i == n - nTick ? tickChartBuffer[i] : maBuffer[i - 1];
         maBuffer[i] = ExponentialMA(i, PERIOD, prev_value, tickChartBuffer);
      }
      break;
   case MODE_SMMA :
      for (int i = n - nTick; i <= n; i++) {
         double prev_value = i == n - nTick ? tickChartBuffer[i] : maBuffer[i - 1];
         maBuffer[i] = SmoothedMA(i, PERIOD, prev_value, tickChartBuffer);
      }
      break;
   case MODE_LWMA :
      for (int i = n - nTick + PERIOD; i <= n; i++) maBuffer[i] = LinearWeightedMA(i, PERIOD, tickChartBuffer);
      break;

EMAとSMMAについては、前足のMAデータ(prev_value)を利用する関数になっていますが、最初の値はティックデータそのままを指定するようにしています。

表示範囲外(最古部分)のデータを消すため、OnCalculate関数内の最下部、「return(rates_total);」の上に下記を追記します。


   if (n > nTick) {
      tickChartBuffer[n - nTick] = EMPTY_VALUE;
      for (int i = n - nTick; i < n - nTick + PERIOD; i++) maBuffer[i] = EMPTY_VALUE;
   }

上記までの作業で、今回のツールは完成となります。

コンパイル後にチャートへセットすると、サブウィンドウにティックチャートとMAが表示されます。

ティックチャート_MT5版のティックチャート表示ツールを作成する【MQLプログラミングの基礎】

5.ソースコード

今回、作成したソースコードは下記の通りです。


//+------------------------------------------------------------------+
//|                                                    TickChart.mq5 |
//|                                  Copyright 2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot tickChart
#property indicator_label1  "tickChart"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrWhite
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot ma
#property indicator_label2  "ma"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
#include <MovingAverages.mqh>
//--- input parameters
input int      BARS=500;
input int      PERIOD=20;
input ENUM_MA_METHOD METHOD = MODE_SMA;
//--- indicator buffers
double         tickChartBuffer[];
double         maBuffer[];
MqlTick tick[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,tickChartBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,maBuffer,INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int32_t rates_total,
                const int32_t 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 int32_t &spread[])
  {
//---
   static bool getTick = false; // ティックデータ取得記憶
   if (!getTick) {
      if (CopyTicks(NULL, tick, COPY_TICKS_ALL, 0, BARS) <= 0) return 0; // 取得失敗時はやり直し
      getTick = true; // 取得成功
      ArrayInitialize(tickChartBuffer, EMPTY_VALUE);
      ArrayInitialize(maBuffer, EMPTY_VALUE);
   }
   int n = ArraySize(tickChartBuffer) - 1; // バッファ最新足
   int nTick = ArraySize(tick) - 1; // ティックデータ最新足
   if (prev_calculated > 0) {
      for (int i = 0; i < nTick; i++) tick[i] = tick[i + 1]; // データをシフト
      tick[nTick].bid = close[n]; // 最新値を反映
   }
   for (int i = nTick; i >= 0; i--) {
      tickChartBuffer[n - nTick + i] = tick[i].bid; // ティックデータをバッファへ入力
   }
   switch (METHOD) { // ティックデータのMA計算
   case MODE_SMA :
      for (int i = n - nTick + PERIOD; i <= n; i++) maBuffer[i] = SimpleMA(i, PERIOD, tickChartBuffer);
      break;
   case MODE_EMA :
      for (int i = n - nTick; i <= n; i++) {
         double prev_value = i == n - nTick ? tickChartBuffer[i] : maBuffer[i - 1];
         maBuffer[i] = ExponentialMA(i, PERIOD, prev_value, tickChartBuffer);
      }
      break;
   case MODE_SMMA :
      for (int i = n - nTick; i <= n; i++) {
         double prev_value = i == n - nTick ? tickChartBuffer[i] : maBuffer[i - 1];
         maBuffer[i] = SmoothedMA(i, PERIOD, prev_value, tickChartBuffer);
      }
      break;
   case MODE_LWMA :
      for (int i = n - nTick + PERIOD; i <= n; i++) maBuffer[i] = LinearWeightedMA(i, PERIOD, tickChartBuffer);
      break;
   }
   if (n > nTick) { // 旧データ消去
      tickChartBuffer[n - nTick] = EMPTY_VALUE;
      for (int i = n - nTick; i < n - nTick + PERIOD; i++) maBuffer[i] = EMPTY_VALUE;
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

本記事の監修者・HT FX

2013年にFXを開始し、その後専業トレーダーへ。2014年からMT4/MT5のカスタムインジケーターの開発に取り組む。ブログでは100本を超えるインジケーターを無料公開。投資スタイルは自作の秒足インジケーターを利用したスキャルピング。

EA(自動売買)を学びたい方へオススメコンテンツ

EA運用の注意点

OANDAではEA(自動売買)を稼働するプラットフォームMT4/MT5の基本的な使い方について、画像や動画付きで詳しく解説しています。MT4/MT5のインストールからEAの設定方法までを詳しく解説しているので、初心者の方でもスムーズにEA運用を始めることが可能です。またOANDAの口座をお持ちであれば、独自開発したオリジナルインジケーターを無料で利用することもできます。EA運用をお考えであれば、ぜひ口座開設をご検討ください。


本ホームページに掲載されている事項は、投資判断の参考となる情報の提供を目的としたものであり、投資の勧誘を目的としたものではありません。投資方針、投資タイミング等は、ご自身の責任において判断してください。本サービスの情報に基づいて行った取引のいかなる損失についても、当社は一切の責を負いかねますのでご了承ください。また、当社は、当該情報の正確性および完全性を保証または約束するものでなく、今後、予告なしに内容を変更または廃止する場合があります。なお、当該情報の欠落・誤謬等につきましてもその責を負いかねますのでご了承ください。

この記事をシェアする