ストキャスティクスのクロスでエントリーするEA

ほとんどのチャートソフトに用意されているストキャスティクス

FXのトレードを始めようとブローカーに口座を開設すると、よほど怪しげなブローカーでない限り、トレードするためのツールとしてのチャートソフトが使用できるようになります。

ブローカーによって様々な種類のチャートソフトが用意されているのですが、テクニカル分析(インジケーター)を表示する機能がついていないチャートソフトはまずないでしょう。移動平均線をはじめとした数種類以上の基本的なテクニカル分析が用意されているはずです。

こうしたテクニカル分析の中でも必ずといってもいいほど標準で用意されているのがストキャスティクスです。

ストキャスティクスはオシレーター系のインジケーターでよく使用されている使い方としては、売られすぎで買い、買われすぎで売るという逆張り手法が人気で、私もFXを始めたばかりのころは逆張り手法ばかりでトレードしていましたね。

ストキャスティクスの逆張り手法は、相場の動きの波とオシレーターの波が一致したときには面白いように勝てるのですが、一度その均衡が崩れてしまうと買われすぎの状態がずっと続いたり、売られすぎの状況のまま時が過ぎていくという悲劇的な結末を迎えてしまいます。

FXの初心者のころなんかストップロスの設定なんかいい加減だったので、これで結構痛い目を見たことが結構ありました(-_-;)

あまりストップロスをタイトにし過ぎても、小さな負けの連続で口座残高は減っていってしまうので、シンプルな逆張りで勝つのって自分には結構難しかったですね。

ストキャスティクスの%KラインのクロスでエントリーするEA

ストキャスティクスは単純な逆張りに使えることはもちろんですが、移動平均線クロスのような使い方をしてみても面白いテクニカル指標です。その昔MACDクロスの手法で好成績をあげているEAもあったみたいだし、ストキャスティクスのクロスも捨てたものではないはずです。

というわけでストキャスティクスクロスのEAを作成してみました。

ルールはものすごくシンプルで、期間の異なる2本の%Kラインのクロスによりエントリーし、ストップロスとテイクプロフィットでクローズするだけです。

この条件にプラスしてクローズロジックを追加してもいいかもしれないですね。今回はそこまで考慮していませんが、興味のある人がいれば他の条件も加えてテストいきたいと思います。

EAのコードは以下のとおりです。

MetaEditorに貼り付けてコンパイルする使用できます。

//+------------------------------------------------------------------+
//|                                              Stoch-Cross EA.mq4  |
//|                                             Created by Pineapple |
//|                                            https://mt4trader.net |                                                                  
//|                                              Copyright 2025      |
//+------------------------------------------------------------------+

#property copyright ""
#property link      ""
#property version   "1.00"
#property description "Stoch-Cross EA"
#property description "ストキャスティクスのクロスでエントリーするEAです"
#property strict

// 入力パラメータ
input double LotSize = 0.1;         // ロットサイズ
input int KPeriod = 14;            // ストキャスティクス %K期間
input int DPeriod = 3;             // ストキャスティクス %D期間
input int Slowing = 3;             // ストキャスティクス スローイング
input double StochOverbought = 80; // 買われすぎレベル
input double StochOversold = 20;   // 売られすぎレベル
input int StopLoss = 300;          // ストップロス(ポイント)
input int TakeProfit = 500;        // テイクプロフィット(ポイント)
input int Slippage = 3;            // スリッページ(ポイント)

// グローバル変数
double PointValue;                 // ポイント値の調整用

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   // ブローカーの桁数に応じてPoint値を調整
   if(Digits == 5 || Digits == 3)
      PointValue = Point * 10;
   else
      PointValue = Point;
   
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert tick function                                            |
//+------------------------------------------------------------------+
void OnTick()
{
   // 既存の注文がある場合は処理しない
   if(OrdersTotal() > 0) return;
   
   // ストキャスティクスの値を取得(現在のバーと前のバー)
   double kCurrent = iStochastic(NULL, 0, KPeriod, DPeriod, Slowing, MODE_SMA, 0, MODE_MAIN, 0);
   double dCurrent = iStochastic(NULL, 0, KPeriod, DPeriod, Slowing, MODE_SMA, 0, MODE_SIGNAL, 0);
   double kPrevious = iStochastic(NULL, 0, KPeriod, DPeriod, Slowing, MODE_SMA, 0, MODE_MAIN, 1);
   double dPrevious = iStochastic(NULL, 0, KPeriod, DPeriod, Slowing, MODE_SMA, 0, MODE_SIGNAL, 1);
   
   // 買いエントリー:%Kが%Dを下から上にクロスし、売られすぎゾーンにある場合
   if(kPrevious < dPrevious && kCurrent > dCurrent && kCurrent <= StochOversold)
   {
      double sl = Ask - StopLoss * PointValue;
      double tp = Ask + TakeProfit * PointValue;
      
      int ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, Slippage, 
                           sl, tp, "Stoch Buy", 0, 0, clrGreen);
      
      if(ticket < 0)
         Print("OrderSend failed with error #", GetLastError());
   }
   
   // 売りエントリー:%Kが%Dを上から下にクロスし、買われすぎゾーンにある場合
   if(kPrevious > dPrevious && kCurrent < dCurrent && kCurrent >= StochOverbought)
   {
      double sl = Bid + StopLoss * PointValue;
      double tp = Bid - TakeProfit * PointValue;
      
      int ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, 
                           sl, tp, "Stoch Sell", 0, 0, clrRed);
      
      if(ticket < 0)
         Print("OrderSend failed with error #", GetLastError());
   }
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // 終了時の処理(必要に応じて追加)
}

//+------------------------------------------------------------------+

Share this content:

こんにちは、パイナップル兄さんです。 本サイトの管理人をしています。 twitter名でもパイナップル兄さんで細々と活動しています。 どうぞよろしくお願いいたします‍

1 件のコメント

comments user
鈴木

はじめまして。こちらダウンロードさせていただきたいのですが、ダウンロードリンクが見当たりません。
どこか別のページで配布されてますでしょうか?

コメントを送信

CAPTCHA