一目均衡表を使ったEAでは、「三役好転・三役逆転」を条件にするパターンが一般的ですが、
本記事ではよりシンプルに「雲抜け」だけで売買を判定するEAを解説します。
条件が明確で扱いやすく、カスタマイズのベースとしても使いやすいロジックです。
エントリーロジック解説
買いエントリー
- 価格が雲(先行スパンA・B)を上抜けた場合
売りエントリー
- 価格が雲(先行スパンA・B)を下抜けた場合
一目均衡表の中でも最もシンプルな判定であり、
雲をトレンドの境界として扱う基本的な考え方になります。
一目均衡表EAのサンプルコード解説
以下にMQL4サンプルコードを掲載します。
そのままコピーしてMT4(MetaEditor)に貼り付ければコンパイル可能で、動作確認も済んでいます
//+------------------------------------------------------------------+
//| 03_Ichimoku_kumo.mq4 |
//| Copyright © 2020-2025 ぷろぐらむFX |
//| https://fx-prog.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020-2025 ぷろぐらむFX"
#property link "https://fx-prog.com/"
#property version "1.00"
#property strict
input double Lots = 0.01; //ロット
input int TP = 1000; //利確(pips)
input int SL = 1000; //損切り(pips)
//***【パラメータ設定↓】一目均衡表***//
input double KumoBufferPips = 5; //雲抜け判定(pips)
//***【パラメータ設定↑】一目均衡表***//
string Ea_Name = "Ichimoku"; //オーダーコメントに使用
double PipValue; //ブローカー桁数に対応した Point 補正
datetime prevtime; //ローソク足時間保持用
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit(){
//デジットチェック
if (Digits == 3 || Digits == 5){
PipValue = Point * 10; // 例: EURUSD 1.23456 → 1pip = 0.00010
}else{
PipValue = Point; // 例: USDJPY 123.45 → 1pip = 0.01
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick(){
int total = OrdersTotal(); //ポジショントータル数をセット
int ea_order_Type = -1; //0:OP_BUY 1:OP_SELL
double ea_order_stop_price = 0; //ストップロスレート
double ea_order_good_price = 0; //利確レート
//新しい足ができた時だけやる
if(Time[0] != prevtime){
prevtime = Time[0];
}else{
return;
}
//ポジションがない場合はエントリー判定
if(total == 0){
bool openBuy = false; //買い新規注文判断
bool openSell = false; //売り新規注文判断
//***【新規注文判断↓】***//
bool isBullIchimoku_S = false;
bool isBearIchimoku_S = false;
// 雲
double SenkouSpanA = iCustom(NULL,0,"Ichimoku",9,26,52,2,1);
double SenkouSpanB = iCustom(NULL,0,"Ichimoku",9,26,52,3,1);
double kumoTop = MathMax(SenkouSpanA, SenkouSpanB);
double kumoBottom = MathMin(SenkouSpanA, SenkouSpanB);
double close1 = iClose(NULL,0,1);
double close2 = iClose(NULL,0,2);
// 上抜け(クロス)
if(close2 <= kumoTop + KumoBufferPips * PipValue
&& close1 > kumoTop + KumoBufferPips * PipValue){
isBullIchimoku_S = true;
}
// 下抜け(クロス)
else if(close2 >= kumoBottom - KumoBufferPips * PipValue
&& close1 < kumoBottom - KumoBufferPips * PipValue){
isBearIchimoku_S = true;
}
//***【新規注文判断↑】***//
//参照するサンプルEAの買いエントリーフラグをセットしてください
if(isBullIchimoku_S){
openBuy =true;
ea_order_Type = OP_BUY;
//参照するサンプルEAの売りエントリーフラグをセットしてください
}else if(isBearIchimoku_S){
openSell =true;
ea_order_Type = OP_SELL;
}
//***【TP/SL判断↓】***//
if(openBuy){
ea_order_stop_price = Ask - SL * PipValue;
ea_order_good_price = Ask + TP * PipValue;
}else if(openSell){
ea_order_stop_price = Bid + SL * PipValue;
ea_order_good_price = Bid - TP * PipValue;
}
//***【TP/SL判断↑】***//
if(ea_order_Type > -1){
funcOrder_Send(ea_order_Type,ea_order_stop_price,ea_order_good_price,Lots,Ea_Name,777,0);
}
//ポジションがある場合は決済判定
}else{
bool closeBuy = false; //買いポジション決済判断
bool closeSell = false; //売りポジション決済判断
bool kekka = OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
//***【決済注文判断↓】***//
bool isBullIchimoku_C = false;
bool isBearIchimoku_C = false;
// 一目均衡表(雲のみ)
double SenkouSpanA = iCustom(NULL,0,"Ichimoku",9,26,52,2,1);
double SenkouSpanB = iCustom(NULL,0,"Ichimoku",9,26,52,3,1);
double close1 = iClose(NULL,0,1);
// BUYポジション → 雲に再突入したら決済
if(OrderType() == OP_BUY){
if(close1 < MathMax(SenkouSpanA, SenkouSpanB)){
isBullIchimoku_C = true;
}
}
// SELLポジション → 雲に再突入したら決済
else if(OrderType() == OP_SELL){
if(close1 > MathMin(SenkouSpanA, SenkouSpanB)){
isBearIchimoku_C = true;
}
}
//***【決済注文判断↑】***//
//参照するサンプルEAの買いポジション決済フラグをセットしてください
if(isBullIchimoku_C){
closeBuy =true;
ea_order_Type = OP_BUY;
//参照するサンプルEAの売りポジション決済フラグをセットしてください
}else if(isBearIchimoku_C){
closeSell =true;
ea_order_Type = OP_SELL;
}
if(ea_order_Type > -1){
funcOrder_CloseAll(ea_order_Type, -1, 0);
}
}
return;
}
//★★★★★★★★★★★★★★★★★★★★ ここから下は共通関数 ★★★★★★★★★★★★★★★★★★★★
//+------------------------------------------------------------------+
//|【関数】新規注文関数
//|
//|【引数】 orderType:売買(0=BUY, 1=SELL)
//|【引数】 sl:損切り価格 tp:利確価格
//|【引数】 lots:取引ロット数
//|【引数】 orderComment:オーダーコメント
//|【引数】 magic:マジックNo
//|【引数】 maxSpreadPips: 許容スプレッド[Point] (0=制限なし)
//|
//|【戻値】true=成功 false=失敗
//+------------------------------------------------------------------+
bool funcOrder_Send(int orderType, double sl, double tp, double lots,
string orderComment, int magic, int maxSpreadPoints){
int ticket = -1;
double price = 0;
color clr = clrNONE;
double spread = 0;
// 最大10回リトライ
for(int retry=0; retry<10; retry++)
{
RefreshRates();
// スプレッド取得(MT4表示と同じポイント単位)
spread = MarketInfo(Symbol(), MODE_SPREAD);
// スプレッドチェック(maxSpreadPoints=0 の場合はスキップ)
if(maxSpreadPoints > 0 && spread > maxSpreadPoints){
Print("スプレッド拡大中(", spread,
"ポイント) → 待機中 (リトライ=", retry+1, ")");
Sleep(2000);
continue;
}
// エントリー価格と色を決定
if(orderType == OP_BUY){
price = Ask;
clr = clrBlue;
}else if(orderType == OP_SELL){
price = Bid;
clr = clrRed;
}
ticket = OrderSend(Symbol(), orderType, lots, price,
20, sl, tp, orderComment, magic, 0, clr);
if(ticket > 0){
Print("新規注文成功! チケットNo=", ticket,
" レート=", price, " Lots=", lots,
" スプレッド=", spread, "ポイント");
return true;
}else{
int err = GetLastError();
Print("新規注文失敗 エラーNo=", err,
" リトライ回数=", retry+1);
Sleep(2000);
}
}
return false;
}
//+------------------------------------------------------------------+
//|【関数】全決済関数 |
//| |
//|【引数】 orderType : -1=すべて 0=BUYのみ 1=SELLのみ |
//|【引数】 magic: 対象マジック番号 (-1=全マジック対象) |
//|【引数】 maxSpreadPoints: 許容スプレッド[Point] (0=制限なし) |
//| |
//|【戻値】true=全成功 false=一部失敗あり |
//+------------------------------------------------------------------+
bool funcOrder_CloseAll(int orderType, int magic, int maxSpreadPoints){
bool allSuccess = true;
int totalOrders = OrdersTotal();
double spread, closePrice, lots;
int type, ticket;
color clr = clrNONE;
for(int i = totalOrders-1; i >= 0; i--)
{
//オーダーセレクト失敗でスキップ
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
// 同一シンボル以外はスキップ
if(OrderSymbol() != Symbol()) continue;
// マジック番号指定がある場合は一致しないものをスキップ
if(magic != -1 && OrderMagicNumber() != magic) continue;
type = OrderType();
ticket = OrderTicket();
lots = OrderLots();
// orderType指定でフィルタ
if(orderType == 0 && type != OP_BUY) continue;
if(orderType == 1 && type != OP_SELL) continue;
// 最大10回リトライ
bool result = false;
for(int retry=0; retry<10; retry++)
{
RefreshRates();
// スプレッド取得
spread = MarketInfo(Symbol(), MODE_SPREAD);
if(maxSpreadPoints > 0 && spread > maxSpreadPoints){
Print("スプレッド拡大中(", spread,
"ポイント) → クローズ待機中 ticket=", ticket,
" リトライ=", retry+1);
Sleep(2000);
continue;
}
// クローズ価格決定
if(type == OP_BUY){
closePrice = Bid;
clr = clrBlue;
}else if(type == OP_SELL){
closePrice = Ask;
clr = clrRed;
}
result = OrderClose(ticket, lots, closePrice, 20, clr);
if(result){
Print("クローズ成功! チケットNo=", ticket,
" ロット=", lots, " クローズ価格=", closePrice,
" スプレッド=", spread, "ポイント");
break;
}else{
int err = GetLastError();
Print("クローズ失敗 ticket=", ticket,
" エラーNo=", err,
" リトライ=", retry+1);
Sleep(2000);
}
}
if(!result) allSuccess = false;
}
return allSuccess;
}売買判定について

上記は、一目均衡表の雲抜けEAを実際のチャートに適用した例です。
エントリー判定について(66~91行目)
このEAでは、一目均衡表の「雲(先行スパンA・B)」と価格の位置関係のみを使って売買を判定しています。
- 価格が雲を上抜けた状態 → 買い
- 価格が雲を下抜けた状態 → 売り
現在の価格が雲の外側にあるかどうかを基準に、売買方向を判定しています。
なお、一定pips以上しっかり雲を抜けた場合のみエントリーする(パラメータで調整可能)ようにすることで、
ダマシを軽減することも可能です。
クローズ判定について(124~147行目)
- 価格が再び雲の中に戻ったタイミングで決済
- トレンドが弱まったと判断してポジションを閉じる
雲の内側はトレンドが不安定な状態とされるため、その領域に戻った時点で決済します。
このように「雲を抜けたらエントリー」「雲に戻ったら決済」というシンプルなルールで、
売買を判断しています。
注文処理について(共通ロジック)
本記事の一目均衡表 EAで使用している「新規注文、決済注文処理」は、当サイト共通のベースソースに含まれています。
EAを効率的に自作したい方は、以下の記事もあわせて参考にしてください。
👉 MT4 EAベースソースコード(無料配布・カスタマイズ容易)
👉 新規・変更・決済注文関数の詳しい解説はこちら
⚠️ このEAを使う際の注意点
- 本ロジックはトレンド相場で有効なため、レンジ相場ではダマシが発生しやすくなります
- サンプルEAはシンプルな構造にするため、マジックナンバー管理は行っていません(単独稼働を推奨)
- 新しいローソク足が確定したタイミングで、1回のみ売買判定を行う設計です
- TP/SLのパラメータは設定可能ですが、雲への再突入で決済するロジックのため使用頻度は低くなります
本記事のEAは検証・理解を目的としたシンプルな構成のため、
実運用ではフィルター追加やポジション管理の調整も重要になってきます。
ダウンロード
EAファイルのダウンロードはこちら👇
📥 一目均衡表EA(雲判定) をダウンロード \ 国内最大級のEAプラットフォーム /
GogoJungle(ゴゴジャン)でEAの評価・レビューをチェック!
🔧 パラメータとカスタマイズ
今回のパラメータ設定は以下の通りです:
- 取引ロット数(例:0.01 = 1,000通貨)
- 利確幅(pips)
- 損切幅(pips)
- 雲抜け判定(pips)※一定pips以上しっかり雲を抜けた場合のみエントリー

カスタマイズのヒント(応用)
このEAはそのままでも動作しますが、エントリー条件を調整することで性能が大きく変わります。
特に以下のような調整が有効です。
- 三役好転・逆転を使ったエントリー
- 遅行スパンの条件を外す
- 転換線と基準線だけで判断する
より詳しいカスタマイズ例は以下の記事で解説しています。
▶ MT4 EAの作り方|一目均衡表EAで三役好転の順張りEAを作る方法
▶ 一目均衡表と移動平均線を使ったEA
※一目均衡表の基本を確認したい方はこちら
一目均衡表は、トレンドの方向や強さを判断するテクニカル指標です。
三役好転・三役逆転の条件については以下で詳しく解説しています。
EAバックテストレポート
USDJPY(M15, 2024/08〜2025/08, 初期証拠金100万円, FXTFヒストリカル)での結果:
| 通貨ペア・時間足 | PF | 勝率 | 最大DD | 取引回数 | 備考 |
|---|---|---|---|---|---|
| USDJPY M15 | 1.12 | 26% | 0.91% | 753回 | 当然ながら三役好転版EAよりも取引回数は多い |

まとめ:一目均衡表EAは「トレンド特化+シンプル構造」がポイント
本記事では、一目均衡表の雲をベースにしたシンプルなEAの作り方を解説しました。
- 雲上抜け・下抜けでトレンド方向にエントリー
- 雲への再突入で決済するシンプルなロジック
- KumoBufferを使うことでダマシを軽減
構造自体はシンプルですが、「トレンド相場に強い」特徴を持つ実用的なロジックです。
ただし、レンジ相場ではダマシが発生しやすく、 実運用ではフィルターや資金管理の調整が重要になります。
まずはバックテストやデモ運用で挙動を確認しながら、 自分なりに条件を調整していくのがおすすめです。
「もっと精度を上げたい」「自分の手法に合わせてカスタマイズしたい」という場合は、
一目均衡表の応用ロジックも参考にしてみてください。
👉 一目均衡表EA(三役好転・逆転)の解説はこちら
💡 このサンプルをベースにしたカスタマイズ相談も可能です。
▶ 仕様相談・EA作成の詳細はこちら
✅ 今回のロジックをベースにしたEAサンプルも多数公開中
今回紹介したようなEAの売買ロジック・考え方をベースに、
当サイトではさまざまなFX自動売買EAのサンプルコードを公開しています。
ロジックの違いや設計の考え方を比較しながら、
自分に合ったEA構成を探したい方はぜひチェックしてみてください。
📊 EA運用・検証フェーズに進みたい方へ
今回のような仕組みを理解したうえで、
「実際にどのEAが安定しているのか」「検証データではどんな差が出ているのか」
を確認したい方は、以下の記事も参考になります。
⚙️ 同じ条件でバックテストしたい方へ(検証環境)
当サイトのバックテストは、同一の検証環境で比較できるように統一しています。
EAの再現テストやパラメータ検証を行う場合は、
検証環境の作り方もあわせて確認しておくと理解が深まります。
EA開発初心者向けに、今後も実践的に使えるMQL4関数や実装例を紹介していきます。
気になる機能やロジックがあれば、用途別に整理した関連記事もぜひあわせてご覧ください。








コメント