トレード備忘録 & MT4/MT5インディケータ及びEAの開発

日々のトレード備忘録及びMT4/MT5に関する事項

「FXメタトレーダー入門」のEAを新MT4 Strict クラスで書き換える【3】

2018-08-06 20:58:36 | 投資

 前2回に亘って「FXメタトレーダー入門」掲載、最初のEAプログラム例MACross_Exp.mq4を新MT4のメタエディターを使って書き換えてきた。プログラムとしては完結したEAとなったが、今回は新MT4でも新たに装備されたクラス機能を使えばどのような形になるのか、個人的な興味もあって試してみることにした。

 オリジナルEAでは組み込みテクニカル指標、iMA()が使用されているが、この部分は新MT4でクラスライブラリとして定義されているCiMAを使って書き換えることができる。このクラスを利用するためにはプログラムの最初に#include <Indicators\Indicators.mqh>と記載(インクルード)しておく必要がある。クラスオブジェクトを作成してEAで利用する方法については豊島久道著ラトルズ版「メタトレーダーで始めるFXシステムトレードプログラミング」に詳しく説明されている。該当部分をほとんど丸写しで使用させていただいて、完成したEAは下記のとおりである。

 過去ブログでも紹介のとおり、豊島先生は昨年9月にMT4/5共通ライブラリLibEA.mqhを公開された。そこではテクニカル指標の扱いが大きく異なるMT5においても、従来のMT4の組み込みテクニカル指標(iMaやiBands)とまったく同じ感覚で利用できるように工夫されている。旧MT4の基本知識があれば十分なので、雑多に装備されたMT4/5搭載のクラス機能を改めて勉強する必要はないといってもよい。

//MACross_Exp_CiMA.mq4

#property strict

//マジックナンバー
#define MAGIC 20070828

#include <Indicators\Indicators.mqh> //テクニカル指標クラスの定義

//テクニカル指標の設定
CiMA FastMA, SlowMA; //移動平均のオブジェクト
input int FastMAPeriod = 10; // 短期移動平均の期間
input int SlowMAPeriod = 40; // 長期移動平均の期間

input double Lots = 0.1;
input int SlippagePips = 3;
int Slippage;

//仕掛けシグナル関数
int EntrySignal()
{
//テクニカル指標の初期化
if(FastMA.MaPeriod() < 0)
FastMA.Create(_Symbol, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE);
if(SlowMA.MaPeriod() < 0)
SlowMA.Create(_Symbol, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE);

//テクニカル指標の更新
FastMA.Refresh();
SlowMA.Refresh();

int ret = 0; //シグナルの初期化

//買いシグナル
if(FastMA.Main(1) > SlowMA.Main(1)
&& FastMA.Main(2) <= SlowMA.Main(2)) ret = 1;

//売りシグナル
if(FastMA.Main(1) < SlowMA.Main(1)
&& FastMA.Main(2) >= SlowMA.Main(2)) ret = -1;

return ret; //シグナルの出力
}

//ポジション決済関数
void ClosePositions()
{
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == false) break;
if(OrderMagicNumber() != MAGIC || OrderSymbol() != Symbol()) continue;
//オーダータイプのチェック
if(OrderType()==OP_BUY)
{
int ticket = OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,White);
break;
}
if(OrderType()==OP_SELL)
{
int ticket = OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,White);
break;
}
}
}
//初期化関数
int OnInit()
{
Slippage = SlippagePips*10;
if(_Digits == 2 || _Digits == 4)
{
Slippage = SlippagePips;
}
return(INIT_SUCCEEDED);
}

//ティック関数 
void OnTick()
{

//トレード可能かチェック
if(IsTradeAllowed()==false) return;

int sig_entry = EntrySignal();

// 買い注文
if(sig_entry > 0)
{
ClosePositions();
static datetime time = Time[0];
if(time != Time[0])
{
int ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",MAGIC,0,Blue);
time = Time[0];
}
}

//売り注文
if(sig_entry < 0)
{
ClosePositions();
static datetime time = Time[0];
if(time != Time[0])
{
int ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",MAGIC,0,Red);
time = Time[0];
}
}

}

(注1)豊島先生は、共通ライブラリLibEA.mqh開発前には3種類のライブラリを公開されてきた。そのうち、MyLib.mqhは旧MT4に対応するもので、「FXメタトレーダー実践プログラミング」にて採用されている。現在でもこのライブラリは広く愛用されていて、引き続き旧メタエディター上でプログラムを作成している人が多い。その後、MyPosition.mqhを「FXメタトレーダー4&5 一挙両得プログラミング」にてMT4、MT5別個のライブラリとして公開。そして、MT4/5 共通ライブラリの先駆ともいえるLibPosition.mqhをラトルズ版「FXシステムプログラミング」にて公開されてきた。最新のLibEA.mqhはMT4/5共通ライブラリの完成版であり、現在では上記3種類の旧ライブラリはすべてこのライブラリに実質統合されている。

(注2)仕掛けシグナル関数中、テクニカル指標の更新(Refresh())はMT4では必要としないが、MT5との共通性を考慮してそのまま残している。コメントアウトすることができる。