2016年5月11日水曜日

[MQL超入門] その021 本格的にEAを作ってみよう。その2 カスタム指標を使用する

それでは、独自に作成したインジケータ(カスタム指標)を使用したEAを作成しましょう。

インジケータは標準で入っている「Custom Moving Averages」を使用します。
移動平均線のインジケータなので、戦略や結果は前回とほとんど変わりませんが、これを使って独自のインジケータの使い方を説明します。

それではコードを見てみましょう。
今回は[EA_MACustom]という名前で新しいEAを作成しています。
//+------------------------------------------------------------------+
//|                                                  EA_MACustom.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

#include <Custom/TradingWrapper.mqh>

input int MagicNumber = 37858262; //マジックナンバー 他のEAと当らない値を使用する。
input int MaxPosition = 1;        //最大ポジション数
input double SpreadFilter = 2;    //最大スプレット値(PIPS)

input double Lot = 0.02;          //売買ロット
input uint Slippage = 2;          //許容スリップページ(pips)
input uint StopLoss = 200;        //ストップロス
input uint TakeProfit = 200;      //利益確定

input int Period = 25;                    //移動平均の期間
input int Shift = 0;                      //移動平均線の表示を右シフトする本数
input ENUM_MA_METHOD Method = MODE_SMA;   //移動平均線の種類

const string IndicatorName = "Custom Moving Averages";

// トレード補助クラス
CTradingWrapper m_wrapper(Symbol(), MagicNumber, MaxPosition, SpreadFilter);

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
//---
   
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
   
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//---
   string symbol = Symbol();
   static ENUM_TIMEFRAMES target = PERIOD_H1;
   static datetime before = 0;

   // 1時間の確定足でのみ動作
   datetime current = iTime(symbol, target, 0);
   if( before == current )
   {
      return ;
   }
   before = current;

   m_wrapper.RefreshPositions();

   // 1つ前と2つ前の足の終値を取得する
   double close1 = iClose( symbol, target, 1 );
   double close2 = iClose( symbol, target, 2 );
   
   // 1つ前と2つ前の移動平均の値を取得する
   double ma1 = iCustom(symbol, target, IndicatorName, Period, Shift, Method, 0, 1 );
   double ma2 = iCustom(symbol, target, IndicatorName, Period, Shift, Method, 0, 2 );
   
   int orderCmd = OP_NONE;
   if ( close1 > ma1 && close2 < ma2 )
   {
      // 終値が移動平均線を上抜けたら買う
      orderCmd = OP_BUY;
   }
   else if ( close1 < ma1 && close2 > ma2 )
   {
      // 終値が移動平均線を下抜けたら売る
      orderCmd = OP_SELL;
   }
   
   if ( orderCmd != OP_NONE )
   {
      bool hasPosition = ( m_wrapper.GetPositionCount() > 0 );
      if ( hasPosition )
      {
         // ポジションを保持していれば決済する
         m_wrapper.CloseOrder( 0, Slippage );
      }

      m_wrapper.RefreshPositions();
      
      // 注文する
      m_wrapper.SendOrder( orderCmd, Lot, 0, Slippage, StopLoss, TakeProfit );
   }   
}
//+------------------------------------------------------------------+
見れば分かると思いますが、前回とほとんど同じですね。
前回との違いだけ説明していきます。

input int Period = 25;                    //移動平均の期間
input int Shift = 0;                      //移動平均線の表示を右シフトする本数
input ENUM_MA_METHOD Method = MODE_SMA;   //移動平均線の種類
移動平均線の条件を入力パラメータとして宣言しています。
これらの条件は「Custom Moving Averages」インジケータのパラメータです。
基本的にインジケータのパラメータはEAの入力パラメータとしておくとよいです。

const string IndicatorName = "Custom Moving Averages";
使用するインジケータの名前です。
[Indicators]フォルダに格納されている名前どおりに指定します。この場合は[Indicators]フォルダ直下にあるインジケータを使用しているので名前のみですが、子フォルダの下にあるインジケータの場合はフォルダ階層も含めて指定します。
例えば、このインジケータが[Indicators]フォルダの下の[Custom]フォルダに格納されている場合は、"Custom/Custom Moving Averages"のように指定します。

   // 1つ前と2つ前の移動平均の値を取得する
   double ma1 = iCustom(symbol, target, IndicatorName, Period, Shift, Method, 0, 1 );
   double ma2 = iCustom(symbol, target, IndicatorName, Period, Shift, Method, 0, 2 );
ここでカスタムインジケータの値を取得しています。
前回のiMA()関数ではなく、カスタムインジケータの値を取得するiCustom()関数を使用しています。
iCustom()関数の引数は以下の通りです。
・string symbol
  通過ペア名。
・int timeframe
  時間軸。時間軸は、以下のように定義されています。
  ENUM_TIMEFRAMES列挙型
・string name
  使用するインジケータの名前。
・(インジケータのパラメータ)
  インジケータのパラメータ。(数は可変)
  パラメータの数だけ、順番に指定します。
・int mode
  インジケータの中の取得したいライン(バッファ)の番号。(0~)
  インジケータによっては、1つのインジケータの中に複数のラインを表示するものがあります。
  その中のどのラインの値を取得するかを、0から始まるライン番号で指定します。
・int shift
  インジケータの値を取得する足の位置。(0~)

引数の中のインジケータのパラメータは、インジケータをチャートに表示した時の[パラメーターの入力]タブの通りの内容と順番になります。
・図021.01 インジケータ パラメーターの入力
また、コードでインジケータのパラメータを確認したい場合、ナビゲーターの[インディケータ]の中のインジケータを右クリックし、[修正]をクリックします。
・図021.02 インジケータのコード表示
メタエディターにてインジケータのコードが表示されますので、入力パラメータの宣言を確認できます。
・図021.03 インジケータのコード確認

後ろから2番目のmode引数のインジケータのライン番号は、インジケータをチャートに表示した時の[色の設定]タブで確認できます。
ラインの一覧が表示されますので、一番左の#の列がラインの番号になります。
・図021.04 インジケータ 色の設定
コードでインジケータのラインを確認したい場合は、パラメータの場合と同様にメタエディターでインジケータのコードを開きます。
SetIndexBuffer()関数でライン番号とラインの元になるデータを指定していますので、こちらで確認することができます。

このように、iCustom()関数を使用することによって、独自のインジケータの値を取得することができます。

ここまでで、簡単にですが一通りEAを作成することが出来るようになったかと思います。これらを参考に、ぜひ自作のEAを作ってみてください。
本ブログでも公開している無料インジケータもありますので、よければそちらなども使用して試してみてください。

次の回へ

「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ MetaTraderへ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。