MT4でストキャスティクスEAを作成|無料MQL4サンプルコード解説

ストキャスティクストレード
EAサンプル・ノウハウ
記事内に商品プロモーションを含む場合があります
スポンサーリンク

はじめに

「ストキャスティクスを使った逆張りロジックを、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 M151.4760%1.08%229回TP/SLが広いので少しトレード回数が少ない

まとめ

ストキャスティクスEAはシンプルな逆張りロジックで、初心者でも理解しやすい設計です。

  • レンジ相場で強みを発揮
  • 短期足向け(M5やM15)に最適
  • トレンドフィルタを追加すると実用性アップ

まずはサンプルコードを試してみて、自分の環境でバックテストを行ってみましょう。調整や改良次第で実用的なEAへと発展できます。


✅ 他にも多数のEAサンプルを公開中!

今回紹介した内容以外にも、当サイトではさまざまなFX自動売買EAのサンプルコードを提供しています。

自分に合った戦略のEAを見つけたい方は、ぜひチェックしてみてください。


EA開発初心者向けに、今後も実践的なMQL4関数を紹介していきます。
気になる機能やロジックがあれば、ぜひ他の記事もあわせてご覧ください!

コメント