はじめに
「ストキャスティクスを使った逆張りロジックを、FX自動売買EAとして自動化したい!」という方向けに、この記事では MT4(MQL4)で動作する無料EAサンプルコード を紹介します。初心者でもコピペで動かせるので、学習用や実験用に最適です。
ストキャスティクスは、相場の買われすぎ・売られすぎを判断する代表的なオシレーターです。裁量トレードでも逆張りの根拠として人気があり、本記事ではそれをEA化して自動エントリーさせる方法を解説します。
🔄 ストキャスティクスとは?
ストキャスティクス(Stochastic Oscillator)は、過去一定期間の高値・安値に対する終値の位置を数値化したインジケーターです。
- %K(ファーストストキャス)と%D(シグナル線)の2本のラインで構成
- 20以下で「売られすぎ」、80以上で「買われすぎ」と判断
- ゴールデンクロス(%Kが%Dを下から上に抜ける)で買いサイン
- デッドクロス(%Kが%Dを上から下に抜ける)で売りサイン
👉 EAでは、買われすぎゾーンでのデッドクロス → 売り、売られすぎゾーンでのゴールデンクロス → 買い をトリガーにしています。
EAの概要とポイント
- iStochastic(MT4標準インジケータ)を利用
- %Kと%Dのクロスを自動判定して売買エントリー
- 「買いポイント」「売りポイント」をパラメータで調整可能
- 利確・損切はTP/SL設定でシンプルに制御
エントリーロジック解説
- 買いエントリー
%Kが%Dを下から上に抜ける(ゴールデンクロス)かつ、20以下の売られすぎゾーン → BUY - 売りエントリー
%Kが%Dを上から下に抜ける(デッドクロス)かつ、80以上の買われすぎゾーン → SELL
👉 典型的な逆張りEAのサンプルで、裁量トレードの補助としても活用可能です。
⚠️ 注意点
- ストキャスティクスはレンジ相場で有効ですが、トレンドが強い場面ではダマシが多くなります。
- 単独利用よりも、移動平均線やボリンジャーバンドなどトレンド系と組み合わせると精度が上がります。
- 新しいローソク足が確定したタイミングで判定しています。
- マジックナンバーは考慮していないため、このEA単独で稼働させてください。
ダウンロード
EAファイルのダウンロードはこちら👇
“ストキャスティクス EA” をダウンロード 08_Stochastic.ex4 – 5 回のダウンロード – 11.38 KB📜 ストキャスティクスEAのサンプルコード解説
以下にMQL4サンプルコードを掲載します。
そのままコピーしてMT4(MetaEditor)に貼り付ければコンパイル可能で、動作確認も済んでいます。
//+------------------------------------------------------------------+
//| 08_Stochastic.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 = 100; //利確(pips)
input int SL = 100; //損切り(pips)
//***【パラメータ設定↓】ストキャス***//
input int STOCHAS_K_KIKAN = 5; //%K期間
input int STOCHAS_D_KIKAN = 3; //%D期間
input int STOCHAS_SLOW = 3; //スローイング
input int STOCHAS_KAI = 20; //買いポイント(設定値以下のクロスで買い)
input int STOCHAS_URI = 80; //売りポイント(設定値以上のクロスで売り)
//***【パラメータ設定↑】ストキャス***//
string Ea_Name = "Stochastic"; //オーダーコメントに使用
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(); //ポジショントータル数をセット
double ea_order_stop_price=0; //ストップロスレート
double ea_order_good_price=0; //利確レート
//---
//新しい足ができた時だけやる
if(Time[0] != prevtime){
prevtime = Time[0];
}else{
return;
}
bool openBuy = false; //買い新規注文判断
bool openSell = false; //売り新規注文判断
//***【新規注文判断↓】***//
bool isBullStochas_S = false;
bool isBearStochas_S = false;
// ストキャス値(1本前と2本前の %Kと%D)
double K1 = iStochastic(NULL,0,STOCHAS_K_KIKAN,STOCHAS_D_KIKAN,STOCHAS_SLOW,MODE_SMA,STO_LOWHIGH,MODE_MAIN,1);
double D1 = iStochastic(NULL,0,STOCHAS_K_KIKAN,STOCHAS_D_KIKAN,STOCHAS_SLOW,MODE_SMA,STO_LOWHIGH,MODE_SIGNAL,1);
double K2 = iStochastic(NULL,0,STOCHAS_K_KIKAN,STOCHAS_D_KIKAN,STOCHAS_SLOW,MODE_SMA,STO_LOWHIGH,MODE_MAIN,2);
double D2 = iStochastic(NULL,0,STOCHAS_K_KIKAN,STOCHAS_D_KIKAN,STOCHAS_SLOW,MODE_SMA,STO_LOWHIGH,MODE_SIGNAL,2);
//ゴールデンクロス & 買いゾーン
if(K2 < D2 && K1 > D1 && K1 < STOCHAS_KAI)
{
isBullStochas_S=true;
}
//デッドクロス & 売りゾーン
else if(K2 > D2 && K1 < D1 && K1 > STOCHAS_URI)
{
isBearStochas_S=true;
}
//***【新規注文判断↑】***//
//参照するサンプルEAの買いエントリーフラグをセットしてください
if(isBullStochas_S){
openBuy =true;
//参照するサンプルEAの売りエントリーフラグをセットしてください
}else if(isBearStochas_S){
openSell =true;
}
total=OrdersTotal();
if(total == 0){
if(openBuy){
ea_order_stop_price = Ask - SL * PipValue;
ea_order_good_price = Ask + TP * PipValue;
//新規注文(買い)
funcOrder_Send(OP_BUY,ea_order_stop_price,ea_order_good_price,Lots,Ea_Name,777,0);
}else if(openSell){
ea_order_stop_price = Bid + SL * PipValue;
ea_order_good_price = Bid - TP * PipValue;
//新規注文(売り)
funcOrder_Send(OP_SELL,ea_order_stop_price,ea_order_good_price,Lots,Ea_Name,777,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;
}
iStochastic() 関数の解説
今回のEAでは、MT4標準インジケータである ストキャスティクス(Stochastic Oscillator) を取得するために iStochastic()
関数を使っています。
【使用例】
double K1 = iStochastic(NULL,0,STOCHAS_K_KIKAN,STOCHAS_D_KIKAN,STOCHAS_SLOW,
MODE_SMA,STO_LOWHIGH,MODE_MAIN,1);
double D1 = iStochastic(NULL,0,STOCHAS_K_KIKAN,STOCHAS_D_KIKAN,STOCHAS_SLOW,
MODE_SMA,STO_LOWHIGH,MODE_SIGNAL,1);
引数の意味
- 引数1 … 通貨ペア
NULL
で現在のチャートを対象 - 引数2 … 時間軸
0
で現在の時間足を対象 - 引数3 … %K期間
ストキャスティクスの計算に使う期間(例:5) - 引数4 … %D期間
シグナル線(%D)の計算期間(例:3) - 引数5 … スローイング(Slowing)
%Kの平滑化に使う期間(例:3) - 引数6 … MA手法
平滑化に使う移動平均の種類(例:MODE_SMA
) - 引数7 … 価格適用方法
STO_LOWHIGH
(高値安値ベース)やSTO_CLOSECLOSE
(終値ベース)などを選択 - 引数8 … 取得モード
MODE_MAIN
… %Kラインの値MODE_SIGNAL
… %Dラインの値 - 引数9 … バーシフト
0
で最新足、1
で1本前、2
で2本前の値を取得
ストキャスティクス利用箇所
- 新規注文処理(75〜90行目) … 直近2本の%Kと%Dを取得し、ゴールデンクロスかデッドクロスかを判定
- 決済処理は無し(本EAは「TP/SLで管理」)
ストキャスティクスの売買判定について

//ゴールデンクロス & 買いゾーン
if(K2 < D2 && K1 > D1 && K1 < STOCHAS_KAI) {
isBullStochas_S = true;
}
//デッドクロス & 売りゾーン
else if(K2 > D2 && K1 < D1 && K1 > STOCHAS_URI) {
isBearStochas_S = true;
}
👉 このように、クロスの方向とゾーン条件を組み合わせることで、単純なクロスよりも精度の高いエントリー判定を行っています。
パラメータとカスタマイズ
今回のEAのパラメータは以下の通りです:
- 取引ロット数(Lots)
- %K期間(STOCHAS_K_KIKAN)
- %D期間(STOCHAS_D_KIKAN)
- スローイング期間(STOCHAS_SLOW)
- 買いポイント(STOCHAS_KAI:デフォルト20)
- 売りポイント(STOCHAS_URI:デフォルト80)
- 利確(TP)
- 損切り(SL)
👉 買いポイント/売りポイントを調整することで、トレード回数や精度を自分好みにカスタマイズできます。

EAバックテストレポート
USDJPY(M5, 2024/08〜2025/08, 初期証拠金100万円, FXTFヒストリカル)での結果:
通貨ペア・時間足 | PF | 勝率 | 最大DD | 取引回数 | 備考 |
---|---|---|---|---|---|
USDJPY M15 | 1.47 | 60% | 1.08% | 229回 | TP/SLが広いので少しトレード回数が少ない |

まとめ
ストキャスティクスEAはシンプルな逆張りロジックで、初心者でも理解しやすい設計です。
- レンジ相場で強みを発揮
- 短期足向け(M5やM15)に最適
- トレンドフィルタを追加すると実用性アップ
まずはサンプルコードを試してみて、自分の環境でバックテストを行ってみましょう。調整や改良次第で実用的なEAへと発展できます。
✅ 他にも多数のEAサンプルを公開中!
今回紹介した内容以外にも、当サイトではさまざまなFX自動売買EAのサンプルコードを提供しています。
自分に合った戦略のEAを見つけたい方は、ぜひチェックしてみてください。
EA開発初心者向けに、今後も実践的なMQL4関数を紹介していきます。
気になる機能やロジックがあれば、ぜひ他の記事もあわせてご覧ください!
コメント