既刊のiAO(Awesome Oscillator)インジケーターの記事では、
ゼロラインクロスと、簡易版の「ソーサー」シグナルという2種類の矢印を表示しました。
このサイトには、ゼロラインクロスをそのまま発注条件にしたEA記事が既にいくつもあります。
そこでこの記事では、あえてゼロクロスではなく、勢いの「加速」
を捉えるソーサーシグナルだけを発注条件にするEAを作ります。
・ゼロクロスEAとソーサーシグナルEAの考え方の違い
・簡易版ソーサーシグナルを発注条件に変換する方法
・損切り必須
・ポジション重複防止の書き方
・実際に動くEAのコード全体
なぜゼロクロスではなくソーサーを選ぶのか
まず、既刊のゼロクロスEA群と本記事の違いを整理します。
既刊iAOインジケーターのおさらい
既刊インジケーターは、AO(高値・安値の中間値をもとにした、
5期間・34期間の移動平均の差)が、
ゼロラインを跨いだ瞬間と、2本連続で同方向に動いた瞬間の、
2種類をそれぞれ別の矢印で表示しました。
既刊のゼロクロスEA群との違い
| EA | エントリー条件 | 捉えているもの |
|---|---|---|
| 既刊iForceクロスEA | 値の符号が反転した瞬間 | 勢いの方向転換 |
| 既刊Momentumクロス EA | 基準線100を跨いだ瞬間 | 勢いの方向転換 |
| 本記事(AOソーサーEA) | 同じ方向への2本連続変化 | 勢いの”加速” |
ゼロラインクロスは「向きが変わった瞬間」を捉える設計であるのに対し、
ソーサーシグナルは「すでに向いている方向に勢いが増している瞬間」
を捉える、別の発想です。
ソーサーシグナルを選ぶ理由
・ゼロクロスは反転直後に乗るため、だまし(フェイク)に弱い場面がある
・ソーサーは、トレンドが続いている最中の「乗り遅れ」を減らす狙いの設計
・どちらが優れているかではなく、捉えたい場面が違うという位置づけ
iAO関数とソーサーシグナルの判定ロジック
発注条件の土台になる判定ロジックを確認します。
iAO関数のシグネチャ(既刊記事で確認済み)
double iAO( string symbol, // 通貨ペア名(NULLで現在のチャート) int timeframe, // 時間足(0で現在の時間足) int shift // 何本前のバーの値を取得するか );
引数の構成は既刊iao-awesome-oscillator-mt4.mdが、
2026-10-31にMQL4公式リファレンスで直接確認済みのものと同じです。
確定済みの3本を比較するソーサー判定関数
int GetSaucerSignal(int shift)
{
double ao0 = iAO(_Symbol, 0, shift);
double ao1 = iAO(_Symbol, 0, shift + 1);
double ao2 = iAO(_Symbol, 0, shift + 2);
bool risingTwice = (ao0 > ao1 && ao1 > ao2);
bool fallingTwice = (ao0 < ao1 && ao1 < ao2);
if(ao0 > 0 && risingTwice)
return(1);
if(ao0 < 0 && fallingTwice)
return(-1);
return(0);
}
ゼロラインより上で2本連続上昇、またはゼロラインより下で2本連続下降した瞬間だけを、
シグナルとして扱います。
簡易版であることの限界
・本来のソーサーシグナルは3本以上のバー形状パターン判定で、
本記事は2本連続の変化で簡略化している
・既刊iao-awesome-oscillator-mt4.mdと同じ簡略化であり、
本来の定義より検知頻度が高くなる
・精度を求める場合は値の並び自体も目視で確認することをおすすめする
発注条件・損切り・ポジション重複の防止
判定だけでは発注にならないため、安全策を組み込みます。
シグナルの”瞬間”だけを検知する
bool BuySignal()
{
return(GetSaucerSignal(1) == 1 && GetSaucerSignal(2) != 1);
}
bool SellSignal()
{
return(GetSaucerSignal(1) == -1 && GetSaucerSignal(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, "AOSaucerCross", 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);
}
同じマジックナンバー・同じ通貨ペアでポジションが既にあるかを確認し、
あれば新規エントリーをスキップします。
実際に動くAOソーサーエントリーEAのコード全体
ここまでの要素をまとめた、EAの全体です。
//+------------------------------------------------------------------+
//| AOSaucerCrossEA.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 double InpLots = 0.1; //発注ロット数
input int InpStopLossPips = 300; //損切り(pips)
input int InpTakeProfitPips = 600; //利確(pips)
input int InpMagic = 20261103; //マジックナンバー
int GetSaucerSignal(int shift)
{
double ao0 = iAO(_Symbol, 0, shift);
double ao1 = iAO(_Symbol, 0, shift + 1);
double ao2 = iAO(_Symbol, 0, shift + 2);
bool risingTwice = (ao0 > ao1 && ao1 > ao2);
bool fallingTwice = (ao0 < ao1 && ao1 < ao2);
if(ao0 > 0 && risingTwice)
return(1);
if(ao0 < 0 && fallingTwice)
return(-1);
return(0);
}
bool BuySignal()
{
return(GetSaucerSignal(1) == 1 && GetSaucerSignal(2) != 1);
}
bool SellSignal()
{
return(GetSaucerSignal(1) == -1 && GetSaucerSignal(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,
"AOSaucerCross", 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,
"AOSaucerCross", InpMagic, 0, clrRed);
if(ticket < 0)
Print("売り発注に失敗しました。エラーコード: ", GetLastError());
}
}
ゼロラインを跨いだ瞬間ではなく、2本連続で同方向に動いた瞬間だけ、
新規エントリーが発生します。
MetaEditorでのコンパイル・バックテスト手順
実際に動かすまでの手順です。
- MetaEditorで新規Expert Advisor「AOSaucerCrossEA」を作成し、上のコードを貼り付ける
- F7キー(またはコンパイルボタン)でコンパイルし、「0 error(s), 0 warning(s)」になることを確認する
- ストラテジーテスターでこのEAを選択し、任意の通貨ペア・期間でバックテストを実行する
- 「結果」タブで、2本連続で同方向に動いた直後にエントリーが発生していることを確認する
よくあるエラーと注意点
実際に運用する前に、確認しておきたい点です。
簡易版の判定による誤検知
・本記事の判定は2本連続の変化だけを見ている
・本来の3本パターンより検知頻度が高くなり、エントリーが増えすぎることがある
・不要なエントリーが多いと感じた場合は、確定本数の条件を3本以上に増やして調整する
既刊ゼロクロスEA群と同時運用する場合の重複
既刊iForceクロスEA等と同じ通貨ペア・口座で同時運用する場合、
マジックナンバーを分けていても、似たタイミングで両方がエントリーすることがあります。
発注する戦略の総数を事前に把握しておいてください。
コンパイルエラーになる
`iAO()`の引数は3個すべて指定してください。
`shift`だけを省略することはできません。
よくある質問
AOソーサーエントリーEAについて、よく検索される疑問に回答します。
・既刊iAOインジケーターと併用すれば、矢印とエントリーのタイミングを目視でも確認できる
・InpStopLossPips/InpTakeProfitPipsは通貨ペア・時間足で、
バックテストして調整する
・同方向の確定本数を増やすほど、シグナルは減るが精度は上がりやすい
既刊iAOインジケーターと同時に使う必要がありますか?
必須ではありません。
このEAは判定ロジックを内部に持っているため単独で動作しますが、
目視で経過を確認したい場合は既刊インジケーターを併用してください。
ゼロクロスEAと何が違いますか?
捉えているタイミングが違います。
ゼロクロスは「向きが変わった瞬間」、
ソーサーは「すでに向いている方向に勢いが増している瞬間」を条件にしています。
計算式自体はどちらもAO(高値・安値の中間値をもとにした移動平均差)で同じですが、
判定ロジックが異なるため、エントリーするタイミングは重なりません。
OsMAクロスEA等と計算式が重複しませんか?
重複しません。
既刊osma-cross-arrow-indicator.mdのOsMAは、
終値ベースのMACDメインライン-シグナルラインの差分です。
本記事のAOは高値・安値の中間値をもとにした移動平均差であり、
参照する価格も計算の出発点も異なります。
【MQL4】iAO(Awesome Oscillator)の「ソーサー」シグナルで順張りエントリーするEAの作り方(ゼロクロスEAとの違いも解説):まとめ
この記事では、既刊iAOインジケーターの2種類のシグナルのうち、
ゼロクロスではなくソーサーシグナルを選んで発注条件に変換する方法を解説しました。
損切り必須・ポジション重複防止という最低限の安全策を備えつつ、
既刊のゼロクロス系EA群とはエントリーのタイミングが重ならない設計にしています。
コメント