MQL4プログラミング 第5回 インジケーターを作成してみよう(パラメータの作成)
インジケーターにパラメーターを追加
今回のテーマはこれです。
前回までのプログラムに今回手を加える内容は
・短期MAの期間
・長期MAの期間
・ADXの期間
前回のプログラムではそれぞれ固定になっていましたね。この固定になっている事のデメリットは
・期間を変える場合はプログラムを修正、コンパイルしてインジケーターを再実行しないといけない。
・通貨ペア毎に期間を変えたい場合は通貨ペア専用のインジケーターを個別に作成しなければいけない。
これは大変な労力が必要になります。
これらを解決する手段が「インジケーターにパラメーターをを追加する」です。
では、今回のプログラムを示します。
// prg-0005.mq4
#property copyright "Copyright 2024, smile-invest-blog.com"
#property link "https://www.smile-invest-blog.com/prg-0005/"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Yellow
#property indicator_color2 Red
#property indicator_width1 2
#property indicator_width2 2
double Log1Up[]; // Highサイン用バッファ
double Log1Down[]; // Low サイン用バッファ
int realBars = 0;
extern int shortMaPeriod = 10; // 短期移動平均線の期間
extern int longMaPeriod = 30; // 長期移動平均線の期間
extern int adxPeriod = 14; // ADXの期間
//+------------------------------------------------------------------+
//| initialization function
//+------------------------------------------------------------------+
int init() {
//---- indicators
SetIndexStyle(0, DRAW_ARROW, EMPTY);
SetIndexArrow(0, 233);
SetIndexBuffer(0, Log1Up);
SetIndexStyle(1, DRAW_ARROW, EMPTY);
SetIndexArrow(1, 234);
SetIndexBuffer(1, Log1Down);
//----
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| deinitialization function
//+------------------------------------------------------------------+
int deinit() {
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| start function
//+------------------------------------------------------------------+
int start() {
bool ret_hantei; // hantei関数の結果格納用
int counted_bars=IndicatorCounted();
int limit = Bars - counted_bars;
for(int i = limit - 1; i >= 0; i--) {
if(i == 0) {
Log1Down[i] = EMPTY_VALUE;
Log1Up[i] = EMPTY_VALUE;
ret_hantei = hantei(i); // 上下サイン表示の判定を関数化した
if (ret_hantei == true) { // hantei関数の結果がtrueの時
if (realBars < Bars) { // 1本のローソク足で1回だけ実行するための条件
realBars = Bars; // realBarsをBarsにする事で同じローソク足では1回だけ実行する
if (Log1Up[i] != EMPTY_VALUE) { // hantei関数内で上サイン表示と判定された
Alert(Symbol(), " *** High ***");
}
else if (Log1Down[i] != EMPTY_VALUE) { // hantei関数内で下サイン表示と判定された
Alert(Symbol(), " *** Low ***");
}
}
}
}
}
return(0);
}
//+------------------------------------------------------------------+
//| エントリーの条件判定関数
//| int i メイン関数からのiの値
//+------------------------------------------------------------------+
bool hantei(int i) {
double shortMaPrevious, longMaPrevious;
double shortMaCurrent, longMaCurrent;
double adx;
// 前回の移動平均値を取得
shortMaPrevious = iMA(NULL, 0, shortMaPeriod, 0, MODE_SMA, PRICE_CLOSE, i+1);
longMaPrevious = iMA(NULL, 0, longMaPeriod, 0, MODE_SMA, PRICE_CLOSE, i+1);
// 現在の移動平均値を取得
shortMaCurrent = iMA(NULL, 0, shortMaPeriod, 0, MODE_SMA, PRICE_CLOSE, i);
longMaCurrent = iMA(NULL, 0, longMaPeriod, 0, MODE_SMA, PRICE_CLOSE, i);
// 現在のADXベースライン値を取得する
adx = getAdx(MODE_MAIN, i);
if (shortMaPrevious < longMaPrevious && shortMaCurrent > longMaCurrent) {
// // 移動平均線のクロスを確認 → ゴールデンクロス
if (adx > 25) {
// adx値が25より大きい場合 → Highサイン
Log1Up[i] = Low[i] - 10 * Point;
return true;
}
}
else if (shortMaPrevious > longMaPrevious && shortMaCurrent < longMaCurrent) {
// 移動平均線のクロスを確認 → デッドクロス
if (adx > 25) {
// adx値が25より大きい場合 → Lowサイン
Log1Down[i] = High[i] + 10 * Point;
return true;
}
}
return false;
}
//+----------------------------------------------------------------------+
//| ADXの値を取得する
//| 引数1 MODE_MAIN(0):ベースライン,MODE_PLUSDI(1):+DIライン,MODE_MINUSDI(2):-DIライン
//| 引数2 シフト数
//+----------------------------------------------------------------------+
double getAdx(int mode, int i) {
double ret;
ret = iADX(
NULL, // 通貨ペア
0, // 時間軸
adxPeriod, // 平均期間
PRICE_CLOSE, // 適用価格
mode, // ラインインデックス
i // シフト
);
return ret;
}
修正箇所はたった3行、16行目から18行目のそれぞれの変数宣言の前に「extern」を入れただけです。簡単ですよね。
では、修正前と修正後の設定編集を比べてみましょう。
「パラメーターの入力」タブが追加されexternと記載された3つの変数が表示されています。これらの値を通貨ペア毎に設定可能となりました。
今回の解説は以上と大変短くなりましたが、少しのプログラム修正で大変便利な機能が追加されました。今回のサンプルプログラムもコピペでそのままコンパイル、実行できるのでパラメーターの変更も是非試してくださいね。
次回は過去足も遡ってサインを表示できるようプログラムを修正していきます。