前述の同書に対するブログに続いて、本日は同本でサンプルプログラムとして取り上げられたテクニカル指標を取り上げてみたい。
同本は電子本として2015年11月に刊行され、昨年12月に更新がなされ、当時最新のBuild 1031に準拠するとともに、内容の修正や増補が行われている。また、本年3月には「新MT4 EA実践プログラミング」が発刊され、そこでは新規開発されたライブラリ-を使ってのEA作成術が紹介されている。
上記2教本は、パンローリング社出版の紙本「FXメタトレーダー入門」及び「FXメタトレーダー実践プログラミング」の後継書でもある。われわれトレーダーにとってはバイブルであった二書であるだけに、電子本も同じような存在になるよう切に願うばかりである。
「新MT4 EA実践プログラミング」発刊に当たっての、著者のコメントがブログで述べられているが、その中で少し気がかりな表現があった。そのまま引用すると、「いくら詳しく説明しても、MQL4のプログラムは初心者にとっては難しいと思います。そこで、本書の独自ライブラリを使うことを前提として、できるだけ簡単にプログラミングできる方法を紹介しました」という一文である。
なるほど、トレード関数は極度に簡略化されたものになっている。半面、簡略化された関数は、いわばブラックボックス化していて、利用者が自由な発想のもと、MT4の持つ汎用性・拡張性を生かした独自のプログラミングを作成するという意欲を削ぐのではないかという懸念が残る。
このことを念頭にKindle版「FX メタトレーダー入門」のカスタム指標、ex7_ind.mq4を取り上げてみたい。
//ex7_ind.mq4
#property strict
#property indicator_separate_window //別ウィンドウに表示
#property indicator_buffers 1 //指標バッファの数
#property indicator_color1 clrRed //ラインの色
#property indicator_width1 2 //ラインの太さ
#property indicator_style1 STYLE_SOLID //ラインの種類
#property indicator_level1 100 //指標のレベル
#property indicator_levelcolor clrBlue //レベルの色
#property indicator_levelwidth 1 //レベルの太さ
#property indicator_levelstyle STYLE_DASH //レベルの種類
double Buf[]; //指標バッファ用の配列の宣言
input int MomPeriod = 10; //モメンタムの期間
//初期化関数
int OnInit()
{
SetIndexBuffer(0, Buf); //配列を指標バッファに関連付ける
return(INIT_SUCCEEDED);
}
//指標計算関数
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 = rates_total - prev_calculated; //プロットするバーの数
for(int i=0; i
{
Buf[i] = iMomentum(_Symbol, 0, MomPeriod, PRICE_CLOSE, i);
}
return(rates_total-1);
}
このカスタム指標は紙本「メタトレーダー入門」では、次のようになっていた。
//Ex5.mq4 |
#property indicator_separate_window //<---サブウインドウに表示
#property indicator_buffers 1
#property indicator_color1 Red
//指標バッファ
double Buf[];
//モメンタムの期間
extern int Mom_Period = 14;
//+------------------------------------------------------------------+
int init()
{
//指標バッファの割り当て
SetIndexBuffer(0,Buf);
return(0);
}
//+------------------------------------------------------------------+
int start()
{
//指標の計算範囲
int limit = Bars-IndicatorCounted();
if(limit == Bars) limit -= Mom_Period;
//指標の計算
for(int i=limit-1; i>=0; i--)
{
Buf[i] = Close[i]*100/Close[i+Mom_Period];
}
return(0);
}
//+------------------------------------------------------------------+
新MT4では旧MT4のint init()やint start()に代ってint OnInit()やint OnCalculate()が採用されているから、見てくれは変わっているが、それとは別にプログラムの内容が大きく変わっているのである。紙本入門編では、先ず、指標の計算式から始めてそれを配列に反映させ、チャートに描画させるという労を惜しまない内容になっている。便利な組み込み指標関数iMomentum()は上記課程を勉強した後に紹介されている。最初からiMomentum()等の組み込み指標関数を使ってしまうと、トレーダー独自の指標関数を作成するという発想や意欲が湧いてこないのではないかという危惧が残る。
ひょっとして、著者にはパンローリング社に対する版権上のオブリゲーションがあるのだろうか。EAでも旧著で開発されたライブラリーMyLib.mqhやMyLib.mq4は、新MT4でもマイナーチェンジは加えるにしても、ほぼそのまま使えると思うのだが。
注)旧著のMomentumの計算式は、著書中の注意書きに従ってMT4の計算式に合わせている。