FX自動売買基礎と応用

MQLプログラミング言語で移動平均線の売買サインを表示する方法


2本のMAを表示する


この記事では「MQLプログラミング言語で移動平均線を作成する方法」で作った簡易版プログラムを利用しながら、2本のMAがクロスした時にサインを表示するプログラムの作成方法を解説します。

参考記事:MQLプログラミング言語で移動平均線を作成する方法

まずはMAを2本表示する改修からです。

バッファーを「2」に変更して、パラメータを丸ごとコピーします。また、それぞれ区別できるように、1つ目のMA関係の末尾に「0」を、2つ目の末尾に「1」をつけます。そしてパラメータで見分けやすいように仮の文字列(MA1、MA2)を作って区切りとします。

一つ目の短期MAは期間「5」にして、もう一つの長期MAは期間は20のままに、色を黄色に変更します。


#property indicator_buffers 2
#property indicator_plots   2
//--- parameters
input string _00 = ""; // [ MA1 ]
input int PERIOD0 = 5;                        // 期間
input int SHIFT0 = 0;                          // シフト
input ENUM_MA_METHOD METHOD0 = MODE_SMA;       // MA種別
input ENUM_APPLIED_PRICE PRICE0 = PRICE_CLOSE; // 適用価格
input color CLR0 = clrWhite;                   // 色
input ENUM_LINE_STYLE STYLE0 = STYLE_SOLID;    // 線種
input int WIDTH0 = 1;                          // 太さ

input string _10 = ""; //   
input string _11 = ""; // [ MA2 ]
input int PERIOD1 = 20;                        // 期間
input int SHIFT1 = 0;                          // シフト
input ENUM_MA_METHOD METHOD1 = MODE_SMA;       // MA種別
input ENUM_APPLIED_PRICE PRICE1 = PRICE_CLOSE; // 適用価格
input color CLR1 = clrYellow;                   // 色
input ENUM_LINE_STYLE STYLE1 = STYLE_SOLID;    // 線種
input int WIDTH1 = 1;  

計算用にそれぞれバッファーが必要なので、1つ目を「0」、2つ目を「1」とします。


double MABuffer0[], MABuffer1[];

OnInit関数のところもMA2本分を用意して、それぞれに「0」「1」と指定します。


SetIndexBuffer(0, MABuffer0);
SetIndexBuffer(1, MABuffer1);
SetIndexStyle (0, DRAW_LINE, STYLE0, WIDTH0, CLR0);
SetIndexStyle (1, DRAW_LINE, STYLE1, WIDTH1, CLR1);
SetIndexLabel(0, "MA1");
SetIndexLabel(1, "MA2");

OnCalculate関数でも、「0」「1」と指定します。


for (int i = limit; i >= 0; i--) {
MABuffer0[i] = iMA(NULL, 0, PERIOD0, SHIFT0, METHOD0, PRICE0, i );
MABuffer1[i] = iMA(NULL, 0, PERIOD1, SHIFT1, METHOD1, PRICE1, i );

以上で作ったものは、下画像のようになります。これをチャートにセットすれば、期間5のMA(白)と、期間20のMA(黄色)が表示されます。

期間5のMA(白)と、期間20のMA(黄色)が表示


矢印サインの定義


次にMAがクロスした場所に、矢印サインを表示させる方法を解説します。買い用と売り用を作るので、バッファーを二つ追加します(2→4へ変更)。


#property indicator_buffers 4
#property indicator_plots   4

それぞれを「UP」と「DN」とします。


double UP[], DN[];

矢印サインなのでタイプは「ARROW」、「STYLE」は「SOLID」、太さ(サインの大きさ)は「2」とします。色は一つ目の買いサインを赤、二つ目の売りサインを青に、また名前を「Buy」と「Sell」とつけます。

矢印サインの場合は、記号の形を指定する必要があります。ここでは買いの形を「233」、売りの形を「234」というコードにします。それぞれ上矢印、下矢印を示します。


//--- indicator buffers mapping
   SetIndexBuffer(0, MABuffer0);
   SetIndexBuffer(1, MABuffer1);
   SetIndexBuffer(2,UP);
   SetIndexBuffer(3,DN);
   SetIndexStyle (0, DRAW_LINE, STYLE0, WIDTH0, CLR0);
   SetIndexStyle (1, DRAW_LINE, STYLE1, WIDTH1, CLR1);
   SetIndexStyle (2, DRAW_ARROW, STYLE_SOLID, 2, clrRed);
   SetIndexStyle (3, DRAW_ARROW, STYLE_SOLID, 2, clrDodgerBlue);
   SetIndexLabel(0, "MA1");
   SetIndexLabel(1, "MA2");
   SetIndexLabel(2, "Buy");
   SetIndexLabel(3, "Sell");
   SetIndexArrow(2, 233);
   SetIndexArrow(3, 234);

なお、矢印の形を確認したい場合は、メニューバーの「ヘルプ」→「MQL4リファレンス」を立ち上げて「wingdings」で検索すると、さまざまな記号が一覧できるようになります。

さまざまな記号の一覧


矢印の表示設定


次に、MA同士のクロスで矢印を表示する条件を作っていきます。

「もし短期MAが長期MAより大きく、かつ1本前の足では短期が長期以下である」という条件が、ゴールデンクロスを意味します。短期MAが長期MAを下から上に抜いたときに安値の位置に買いサインを表示し、また矢印を表示する条件が成立してない場合は空の値とします。これで買いサインができました。


if (MABuffer0[i] > MABuffer1[i] && MABuffer0[i + 1] <= MABuffer1[i + 1]){
  UP[i] = Low[i];
} else {
  UP[i] = EMPTY_VALUE;
}

売りサインは不等号を逆にして、高値の位置に表示するようにします。


if (MABuffer0[i] < MABuffer1[i] && MABuffer0[i + 1] >= MABuffer1[i + 1]){
  DN[i] = High[i];
} else {
  DN[i] = EMPTY_VALUE;
}

これで一通り完成なので、コンパイルします。チャートを確認すると、MAがクロスしたところで買いサインは安値の位置に、売りサインは高値の位置に矢印サインが表示されているのが分かります。

チャート


ソースコード


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


//+------------------------------------------------------------------+
//|                                           MA_Cross_Sign_demo.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots   4
//--- parameters
input string _00 = ""; // [ MA1 ]
input int PERIOD0 = 5;                        // 期間
input int SHIFT0 = 0;                          // シフト
input ENUM_MA_METHOD METHOD0 = MODE_SMA;       // MA種別
input ENUM_APPLIED_PRICE PRICE0 = PRICE_CLOSE; // 適用価格
input color CLR0 = clrWhite;                   // 色
input ENUM_LINE_STYLE STYLE0 = STYLE_SOLID;    // 線種
input int WIDTH0 = 1;                          // 太さ

input string _10 = ""; //   
input string _11 = ""; // [ MA2 ]
input int PERIOD1 = 20;                        // 期間
input int SHIFT1 = 0;                          // シフト
input ENUM_MA_METHOD METHOD1 = MODE_SMA;       // MA種別
input ENUM_APPLIED_PRICE PRICE1 = PRICE_CLOSE; // 適用価格
input color CLR1 = clrYellow;                   // 色
input ENUM_LINE_STYLE STYLE1 = STYLE_SOLID;    // 線種
input int WIDTH1 = 1;                          // 太さ
//--- indicator buffers
double MABuffer0[], MABuffer1[];
double UP[], DN[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
   SetIndexBuffer(0, MABuffer0);
   SetIndexBuffer(1, MABuffer1);
   SetIndexBuffer(2,UP);
   SetIndexBuffer(3,DN);
   SetIndexStyle (0, DRAW_LINE, STYLE0, WIDTH0, CLR0);
   SetIndexStyle (1, DRAW_LINE, STYLE1, WIDTH1, CLR1);
   SetIndexStyle (2, DRAW_ARROW, STYLE_SOLID, 2, clrRed);
   SetIndexStyle (3, DRAW_ARROW, STYLE_SOLID, 2, clrDodgerBlue);
   SetIndexLabel(0, "MA1");
   SetIndexLabel(1, "MA2");
   SetIndexLabel(2, "Buy");
   SetIndexLabel(3, "Sell");
   SetIndexArrow(2, 233);
   SetIndexArrow(3, 234);

//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 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[])
{
//---
   int limit = Bars - IndicatorCounted() - 1;
   if (limit < 1) limit = 1;

   for (int i = limit; i >= 0; i--) {
      MABuffer0[i] = iMA(NULL, 0, PERIOD0, SHIFT0, METHOD0, PRICE0, i );
      MABuffer1[i] = iMA(NULL, 0, PERIOD1, SHIFT1, METHOD1, PRICE1, i );
      
      if (MABuffer0[i] > MABuffer1[i] && MABuffer0[i + 1] <= MABuffer1[i + 1]){
         UP[i] = Low[i];
      } else {
         UP[i] = EMPTY_VALUE;
      } 
      
       if (MABuffer0[i] < MABuffer1[i] && MABuffer0[i + 1] >= MABuffer1[i + 1]){
         DN[i] = High[i];
      } else {
         DN[i] = EMPTY_VALUE;
      }
   }
//--- return value of prev_calculated for next call
   return(rates_total);
}
//+------------------------------------------------------------------+


本記事の監修者・HT FX


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


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

この記事をシェアする

ホーム » FX自動売買基礎と応用 » MQLプログラミング言語で移動平均線の売買サインを表示する方法