既刊のMomentum基準線100クロス矢印インジケーターの記事は、
100を上下にまたいだ瞬間に矢印を出す、表示専用の設計でした。
では、矢印に気づいて自分で発注する手間を、
そのままEAの発注条件に置き換えてしまえばどうなるでしょうか。
この記事では、100クロスの判定ロジックを発注条件に転用し、
損切り必須・ポジション重複防止を備えた順張りEAに仕立てる方法を解説します。
・既刊インジケーターの判定ロジックをEA化する考え方
・基準線100をまたいだ”瞬間”をエントリー条件にする設計
・損切り必須
・ポジション重複防止の書き方
・実際に動くEAのコード全体
既刊インジケーターとの関係(矢印表示から発注条件へ)
まず、インジケーターとEAで判定ロジックをどう使い分けるかを整理します。
既刊Momentum基準線100クロス矢印インジケーターの振り返り
既刊の記事では、計算期間前の価格を100とした比率であるMomentumの値が、
100を上下にまたいだ瞬間だけを矢印で知らせました。
「気づいて発注する」から「自動で発注する」への転換
本記事のEAは、この判定関数をそのまま`OnTick()`内に移し、
矢印の代わりに発注を実行させます。
・このEAは100クロスの瞬間にエントリーする順張り設計
・『いつ勢いが失速してトレンドが終わるか』は判定していない
・利確
・トレーリングストップの設定で手仕舞いのタイミングを補う必要がある
順張りEAとしての位置づけ
既刊のCCI逆張りEA・Williams%R逆張りEA等とは逆方向の発想で、
勢いが変化した方向へ乗っていく、順張り型のEAです。
Momentum(iMomentum)と基準線100クロス判定ロジック
発注条件の土台になる判定ロジックを確認します。
iMomentum関数のシグネチャ(既刊記事で確認済み)
double iMomentum( string symbol, //通貨ペア(NULLで現在のチャート) int timeframe, //時間足 int period, //計算期間 int applied_price,//適用価格(PRICE_CLOSE等) int shift //シフト(0=現在のバー) );
iMomentum()の引数構成は、
既刊momentum-cross-arrow-indicator-mt4.mdが
2026-10-11にMQL4公式リファレンスで直接確認済みです。
本記事でもそのまま同じ引数を使用します。
確定済みの1本前・2本前の値を比較する判定関数
int GetMomentumCrossState(int shift)
{
double momNow = iMomentum(_Symbol, 0, InpPeriod, InpAppliedPrice, shift);
double momPrev = iMomentum(_Symbol, 0, InpPeriod, InpAppliedPrice, shift + 1);
if(momNow > 100 && momPrev <= 100)
return(1);
if(momNow < 100 && momPrev >= 100)
return(-1);
return(0);
}
値そのものではなく、100を挟んで切り替わった瞬間だけを検知する、
既刊インジケーターと同じ考え方の関数です。
RSI/MACDとの計算の違い
・RSIは上昇/下落の比率を0〜100に正規化した指標
・MACDは2本の移動平均線の差を計算する指標
・Momentumは現在の価格÷計算期間前の価格×100という単純な比率
発注条件・損切り・ポジション重複の防止
判定だけでは発注にならないため、安全策を組み込みます。
100クロスの”瞬間”を検知する
bool BuySignal()
{
return(GetMomentumCrossState(1) == 1 && GetMomentumCrossState(2) != 1);
}
bool SellSignal()
{
return(GetMomentumCrossState(1) == -1 && GetMomentumCrossState(2) != -1);
}
確定済みの1本前(shift=1)が切り替わっていて、
2本前(shift=2)はまだ切り替わっていなかった場合だけを、
エントリーのシグナルにします。
形成中の0番目の足を基準にしないのは、既刊のアリゲーター並び順EAと同じく、
リペイント(後からサインが変わる現象)を避けるための設計です。
損切り・利確を必ず指定する
double sl = Ask - InpStopLossPips * point; double tp = Ask + InpTakeProfitPips * point; OrderSend(_Symbol, OP_BUY, InpLots, Ask, 3, sl, tp, "MomentumCross", InpMagic, 0, clrBlue);
損切り(`sl`)・利確(`tp`)を発注時点で必ず指定し、未設定のまま放置しません。
ポジション重複を防ぐチェック
bool HasOpenPosition()
{
for(int i = 0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) &&
OrderSymbol() == _Symbol && OrderMagicNumber() == InpMagic)
return(true);
}
return(false);
}
同じマジックナンバー・同じ通貨ペアでポジションが既にあるかを確認し、
あれば新規エントリーをスキップします。
実際に動くMomentumクロスエントリーEAのコード全体
ここまでの要素をまとめた、EAの全体です。
//+------------------------------------------------------------------+
//| MomentumCrossEA.mq4 |
//| Copyright 2026, FX-EA System Project Creator |
//| https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, FX-EA System Project Creator"
#property link "https://creator.fx-ea-system-project.com/"
#property version "1.00"
#property strict
input int InpPeriod = 14; //Momentumの計算期間
input int InpAppliedPrice = PRICE_CLOSE;//適用価格
input double InpLots = 0.1; //発注ロット数
input int InpStopLossPips = 300; //損切り(pips)
input int InpTakeProfitPips = 600; //利確(pips)
input int InpMagic = 20261021; //マジックナンバー
int GetMomentumCrossState(int shift)
{
double momNow = iMomentum(_Symbol, 0, InpPeriod, InpAppliedPrice, shift);
double momPrev = iMomentum(_Symbol, 0, InpPeriod, InpAppliedPrice, shift + 1);
if(momNow > 100 && momPrev <= 100)
return(1);
if(momNow < 100 && momPrev >= 100)
return(-1);
return(0);
}
bool BuySignal()
{
return(GetMomentumCrossState(1) == 1 && GetMomentumCrossState(2) != 1);
}
bool SellSignal()
{
return(GetMomentumCrossState(1) == -1 && GetMomentumCrossState(2) != -1);
}
bool HasOpenPosition()
{
for(int i = 0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) &&
OrderSymbol() == _Symbol && OrderMagicNumber() == InpMagic)
return(true);
}
return(false);
}
void OnTick()
{
if(HasOpenPosition())
return;
double point = _Point;
if(_Digits == 3 || _Digits == 5)
point *= 10;
if(BuySignal())
{
double sl = Ask - InpStopLossPips * point;
double tp = Ask + InpTakeProfitPips * point;
int ticket = OrderSend(_Symbol, OP_BUY, InpLots, Ask, 3, sl, tp,
"MomentumCross", InpMagic, 0, clrBlue);
if(ticket < 0)
Print("買い発注に失敗しました。エラーコード: ", GetLastError());
}
else if(SellSignal())
{
double sl = Bid + InpStopLossPips * point;
double tp = Bid - InpTakeProfitPips * point;
int ticket = OrderSend(_Symbol, OP_SELL, InpLots, Bid, 3, sl, tp,
"MomentumCross", InpMagic, 0, clrRed);
if(ticket < 0)
Print("売り発注に失敗しました。エラーコード: ", GetLastError());
}
}
`InpPeriod`期間で計算したMomentumが100を挟んで切り替わった瞬間だけ、
新規エントリーが発生します。
MetaEditorでのコンパイル・実行手順
- MetaEditorで新規Expert Advisor「MomentumCrossEA」を作成し、上のコードを貼り付ける
- F7キー(またはコンパイルボタン)でコンパイルし、「0 error(s), 0 warning(s)」になることを確認する
- ストラテジーテスターでこのEAを選択し、任意の通貨ペア・期間でバックテストを実行する
- 「結果」タブで、100クロス直後にエントリーが発生していることを確認する
よくあるエラーと注意点
実際に運用する前に、確認しておきたい点です。
100付近でのチャタリングに注意
・値動きが小さい時間帯はMomentumが100付近で細かく入れ替わりやすい
・エントリーが増えすぎる場合は期間(InpPeriod)を長めにする
・用途に応じて期間を調整する必要がある
コンパイルエラーになる
`iMomentum()`の引数を5個すべて指定しているか確認してください。
`period`だけ変えたい場合でも、
`applied_price`・`shift`は省略できません。
トレンドが続かずすぐに損切りになる
固定pipsの損切り(`InpStopLossPips`)は、
通貨ペアやボラティリティによって最適値が変わります。
既刊atr-volatility-indicator-mt4.mdの
ATR値を参考に調整することを推奨します。
MQL4とMQL5の違い
Momentumの扱い方に関する2言語の違いを確認します。
MQL4は値を直接返す方式
MQL4の`iMomentum()`は、呼び出すたびに1つの値を直接返します。
MQL5はハンドル方式に変わる
MQL5には`iMomentum()`という同名関数は無く、
テクニカル指標ハンドルを作成し、CopyBufferで値を取得する方式に変わります。
既刊copybuffer.mdのハンドル方式を応用すれば移植できます。
100クロス判定ロジックはMQL5でも応用可能
「直前の値と今の値を比較して基準線をまたいだ瞬間を検知する」
という考え方自体は、MQL5に移植する場合でも、そのまま応用できます。
このEAの使いどころと限界
得意な場面と、単独では対応しきれない場面を整理します。
シンプルな計算ゆえの反応の速さに強い
RSI・MACDより計算がシンプルな分、値動きの変化に反応が速く、
トレンドの転換点を早期に捉えやすい場面があります。
手仕舞いのロジックは別途必要
このEAは「乗る」ことに特化しており、「いつ降りるか」は固定の利確・損切りに任せています。
より精緻な手仕舞いをしたい場合は、
100クロスが逆方向に発生した時点で決済する関数を追加してください。
よくある質問
MomentumクロスエントリーEAについて、よく検索される疑問に回答します。
・既刊インジケーターと同時に使えば、判定の根拠を目視でも確認できる
・InpStopLossPips/InpTakeProfitPipsは通貨ペア
・時間足でバックテストして調整する
・値動きが小さい時間帯は信号頻度が増えやすい点を理解しておく
既刊インジケーターと同時に使う必要がありますか?
必須ではありません。
このEAは判定ロジックを内部に持っているため単独で動作しますが、
目視で経過を確認したい場合は既刊インジケーターを併用してください。
OsMAクロスEA等と何が違いますか?
計算式が根本的に異なります。
既刊osma-cross-arrow-indicator.mdの
OsMAはMACDのメインライン-シグナルラインの差分、
RSIは上昇/下落の比率を0〜100に正規化した指標であり、
本記事のMomentumは現在の価格÷計算期間前の価格×100という単純な比率です。
数学的に同一の指標ではないため、
組み合わせ企画マトリクスの過去の教訓
(既刊記事で見送ったOsMA×EAの件)には抵触しません。
他のEAと同じ口座で同時運用できますか?
マジックナンバーを別の値にしておけば、
既刊のCCI逆張りEA等と同じ口座で同時に動かすこと自体は可能です。
ただし、同じ通貨ペアで逆方向のEAを動かすと、
意図がぶつかる場面があるため注意してください。
【MQL4】Momentum(モメンタム)の基準線100クロスを発注条件にした順張りEAの作り方(損切り必須・ポジション重複防止つき):まとめ
この記事では、既刊のMomentum基準線100クロス矢印インジケーターの判定ロジックを、
そのままEAの発注条件に転用する方法を解説しました。
損切り必須・ポジション重複防止という最低限の安全策を備えつつ、
手仕舞いのロジックは今後の改善点として残しています。
コメント