インジケータは標準で入っている「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
にほんブログ村 |
お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。