MQL4MQL5 EA(エキスパートアドバイザー) 売買サイン・相場の判定
手持ちのインジケーターのサインで売買したい
結論:iCustom() でインジケーターを読み込み、矢印が出るバッファの値が 0・EMPTY_VALUE 以外ならサインと判定します。
考え方
Indicators フォルダにあるインジケーターは、iCustom() で EA から値を読めます。矢印でサインを出すインジケーターは、サインのある足にだけ価格が入り、ない足は 0 か EMPTY_VALUE になっているのがふつうです。ここでは、買いサインがバッファ 0、売りサインがバッファ 1 のインジケーターのサインを、確定足で読み取ってアラートを出す EA を例にしています。
- インジケーターのファイル名(拡張子なし)とパラメーターの順番を確認する
- データウィンドウでマウスを矢印の足に合わせ、どのバッファ番号に値が入るかを確認する
- iCustom() でそのバッファの、確定した1本前の値を読む
- 値が 0 でも EMPTY_VALUE でもなければサインと判定する
そのまま使えるコード
MetaEditor の「新規作成」で「エキスパートアドバイザ(テンプレート)」を選び、できたファイルの中身をすべてこのコードに置き換えてコンパイル(F7)します。ファイルは Experts フォルダに保存され、ナビゲーターからチャートにドラッグして使います。
MQL4(MT4)
#property strict
// インジケーターのサイン(バッファ0=買い、1=売り)を読み取る EA(MT4)
input string InpIndicator = "MyArrow"; // インジケーターのファイル名(拡張子なし)
input int InpBuyBuf = 0; // 買いサインのバッファ番号
input int InpSellBuf = 1; // 売りサインのバッファ番号
datetime lastBar = 0;
bool HasSignal(double v)
{
return v != 0 && v != EMPTY_VALUE;
}
int OnInit()
{
return INIT_SUCCEEDED;
}
void OnTick()
{
datetime t = iTime(_Symbol, PERIOD_CURRENT, 0);
if(t == lastBar) return;
lastBar = t;
// パラメーターはインジケーターの input の順番どおりに書く(省略すると既定値)
double buy = iCustom(_Symbol, 0, InpIndicator, InpBuyBuf, 1);
double sell = iCustom(_Symbol, 0, InpIndicator, InpSellBuf, 1);
if(GetLastError() == 4072)
{
Print(InpIndicator, " を読み込めません。ファイル名とコンパイル済みか確認してください");
return;
}
if(HasSignal(buy)) Alert(_Symbol, " 買いサイン");
if(HasSignal(sell)) Alert(_Symbol, " 売りサイン");
}MQL5(MT5)
// インジケーターのサイン(バッファ0=買い、1=売り)を読み取る EA(MT5)
input string InpIndicator = "MyArrow"; // インジケーターのファイル名(拡張子なし)
input int InpBuyBuf = 0; // 買いサインのバッファ番号
input int InpSellBuf = 1; // 売りサインのバッファ番号
int hInd = INVALID_HANDLE;
datetime lastBar = 0;
bool HasSignal(double v)
{
return v != 0 && v != EMPTY_VALUE;
}
int OnInit()
{
// パラメーターは iCustom(銘柄, 時間足, 名前, パラメーター1, パラメーター2, …) の順に書く
hInd = iCustom(_Symbol, PERIOD_CURRENT, InpIndicator);
if(hInd == INVALID_HANDLE)
{
Print(InpIndicator, " を読み込めません error=", GetLastError());
return INIT_FAILED;
}
return INIT_SUCCEEDED;
}
void OnDeinit(const int reason)
{
IndicatorRelease(hInd);
}
void OnTick()
{
datetime t = iTime(_Symbol, PERIOD_CURRENT, 0);
if(t == lastBar) return;
double buy[], sell[];
if(CopyBuffer(hInd, InpBuyBuf, 1, 1, buy) < 1 || CopyBuffer(hInd, InpSellBuf, 1, 1, sell) < 1)
return; // 計算待ち
lastBar = t;
if(HasSignal(buy[0])) Alert(_Symbol, " 買いサイン");
if(HasSignal(sell[0])) Alert(_Symbol, " 売りサイン");
}MT4 版・MT5 版とも MetaEditor でコンパイル(エラー・警告なし)を確認済みです。実際の口座で使う前に、デモ口座やストラテジーテスターで動作を確かめてください。
カスタマイズのポイント
- インジケーターのパラメーターを指定したいときは、iCustom() の名前の後ろに、インジケーターの input の順番どおりに値を並べます。
- プログラミングなしで EA にしたいときは、インジケーターEA化ツールも使えます。
注意点
- 未確定の足(shift=0)でサインを出したり消したりするインジケーター(リペイント)は、確定足(shift=1)で読んでもバックテストと実際の動きが変わることがあります。
- ファイル名が違う、またはコンパイルされていない(.ex4 / .ex5 がない)と読み込めません。












