【MQL5】iStochastic関数の使い方|ストキャスティクスの%K・%Dクロスで売買するサンプルコード

【MQL5】iStochastic関数の使い方|ストキャスティクスの%K・%Dクロスで売買するサンプルコード MQL5リファレンス

iStochastic関数は、ストキャスティクス(%K と %D の2本線)の値をMQL5プログラムから取得する関数です。ストキャスティクスは「直近の値幅の中で、現在値がどの位置にあるか」を 0〜100 で表すオシレーター系の指標で、買われすぎ・売られすぎの判定や、%K と %D のクロスでタイミングを計るのに使われます。この記事では、iStochasticの構文と「ハンドル+CopyBufferの2段階」、そしてコピーしてすぐ動く4つのサンプル(%K/%Dの取得・買われすぎ/売られすぎ判定・クロスのシグナル・逆張りの最小EA)を丁寧に解説します。

iStochastic(ストキャスティクス)とは

ストキャスティクスは、一定期間の高値〜安値のレンジの中で、現在の終値が「上の方か・下の方か」を 0〜100 で表します。動きの速い線が %K(メイン)、それを平滑化した線が %D(シグナル)。一般に 80以上で買われすぎ・20以下で売られすぎと見て、さらに%Kと%Dのクロスを反転のタイミングに使います。MQL5では iStochastic() でこの2本を取得します。

前提:値の取り出しは「2段階」
MQL5のインジケーターは「① OnInit() でハンドルを作る → ② OnTick()CopyBuffer() により値を取り出す」の2段階です(詳しくは iMAの記事 を参照)。ストキャスティクスは線が2本=バッファが2つ(0=%K / 1=%D)あります。

iStochastic() の構文と引数

int  iStochastic(
   string           symbol,        // 通貨ペア(_Symbol で現在のペア)
   ENUM_TIMEFRAMES  period,        // 時間足(PERIOD_CURRENT 等)
   int              Kperiod,       // %K期間(一般的に 5 または 14)
   int              Dperiod,       // %D期間(一般的に 3)
   int              slowing,       // スローイング(一般的に 3)
   ENUM_MA_METHOD   ma_method,     // 平滑化方法(通常 MODE_SMA)
   ENUM_STO_PRICE   price_field    // 計算価格(STO_LOWHIGH か STO_CLOSECLOSE)
);

戻り値はハンドル(整数のID)です。バッファ番号は 0=%K(メイン)、1=%D(シグナル)。price_field は通常 STO_LOWHIGH(高安ベース)を使います。

サンプル①:%K と %D を取得して表示する

ストキャスティクス(5, 3, 3) の現在値(2本)をチャート左上に表示します。

コピペOK

int stoHandle = INVALID_HANDLE;

int OnInit()
{
   // ① ハンドルを1回だけ作る(5,3,3・SMA・高安ベース)
   stoHandle = iStochastic(_Symbol, PERIOD_CURRENT, 5, 3, 3, MODE_SMA, STO_LOWHIGH);
   if(stoHandle == INVALID_HANDLE)
   {
      Print("iStochasticハンドルの作成に失敗: ", GetLastError());
      return(INIT_FAILED);
   }
   return(INIT_SUCCEEDED);
}

void OnTick()
{
   double k[], d[];
   ArraySetAsSeries(k, true);                // [0]を最新足にそろえる
   ArraySetAsSeries(d, true);

   // ② 2本それぞれを、バッファ番号を指定して取り出す
   if(CopyBuffer(stoHandle, 0, 0, 2, k) < 2) return;   // 0=%K
   if(CopyBuffer(stoHandle, 1, 0, 2, d) < 2) return;   // 1=%D

   Comment("%K = ", DoubleToString(k[0], 1),
           "   %D = ", DoubleToString(d[0], 1));
}

void OnDeinit(const int reason)
{
   IndicatorRelease(stoHandle);              // 後始末
}

サンプル②:買われすぎ・売られすぎを判定する

確定した足の%Kで「売られすぎ(20以下)/買われすぎ(80以上)」を判定します。形成中の足ではなく確定足で、新しい足ができた時だけチェックします。

コピペOK

input double InpOver  = 80.0;   // 買われすぎ ライン
input double InpUnder = 20.0;   // 売られすぎ ライン
datetime lastBar = 0;

void OnTick()
{
   datetime t = iTime(_Symbol, PERIOD_CURRENT, 0);
   if(t == lastBar) return;                  // 新しい足の時だけ
   lastBar = t;

   double k[];
   ArraySetAsSeries(k, true);
   if(CopyBuffer(stoHandle, 0, 0, 2, k) < 2) return;

   double v = k[1];                          // 直近の確定足の%K
   if(v <= InpUnder)      Print("売られすぎ:%K=", DoubleToString(v, 1));
   else if(v >= InpOver)  Print("買われすぎ:%K=", DoubleToString(v, 1));
}

サンプル③:%K と %D のクロスでシグナルを出す

水準だけでなく、%Kが%Dを下から上に抜けた=買いのように、2本のクロスでタイミングを取ります。さらに売られすぎ圏(30以下)でのゴールデンクロスに絞ると、ダマシが減ります。確定足の [1] と [2] を比較します。

コピペOK

double k[], d[];
ArraySetAsSeries(k, true);
ArraySetAsSeries(d, true);
if(CopyBuffer(stoHandle, 0, 0, 3, k) < 3) return;   // %K [1],[2]
if(CopyBuffer(stoHandle, 1, 0, 3, d) < 3) return;   // %D [1],[2]

// %Kが%Dを下から上抜け+売られすぎ圏=買いシグナル
bool buySignal  = (k[2] <= d[2] && k[1] > d[1] && k[1] < 30.0);

// %Kが%Dを上から下抜け+買われすぎ圏=売りシグナル
bool sellSignal = (k[2] >= d[2] && k[1] < d[1] && k[1] > 70.0);

if(buySignal)  Print("買いシグナル(売られすぎ圏でのGC)");
if(sellSignal) Print("売りシグナル(買われすぎ圏でのDC)");

サンプル④:ストキャス逆張りで売買する最小EA

サンプル③の買いシグナルでエントリーし、%Kが50に戻ったら決済する、動く最小EAです。CTrade を使います。

コピペOK(デモ口座で動作確認用)

#include <Trade\Trade.mqh>
CTrade   trade;
int      stoHandle;
datetime lastBar = 0;
input double InpLot = 0.10;

int OnInit()
{
   stoHandle = iStochastic(_Symbol, PERIOD_CURRENT, 5, 3, 3, MODE_SMA, STO_LOWHIGH);
   if(stoHandle == INVALID_HANDLE) return(INIT_FAILED);
   trade.SetExpertMagicNumber(20260619);
   return(INIT_SUCCEEDED);
}

void OnTick()
{
   datetime t = iTime(_Symbol, PERIOD_CURRENT, 0);
   if(t == lastBar) return;
   lastBar = t;

   double k[], d[];
   ArraySetAsSeries(k, true);
   ArraySetAsSeries(d, true);
   if(CopyBuffer(stoHandle, 0, 0, 3, k) < 3) return;
   if(CopyBuffer(stoHandle, 1, 0, 3, d) < 3) return;

   bool buySignal = (k[2] <= d[2] && k[1] > d[1] && k[1] < 30.0); // 売られすぎ圏のGC
   bool exitLong  = (k[1] >= 50.0);                              // 50まで戻ったら利確(簡易)

   if(buySignal && PositionsTotal() == 0)
      trade.Buy(InpLot, _Symbol);

   if(exitLong)
   {
      for(int i = PositionsTotal() - 1; i >= 0; i--)
      {
         ulong ticket = PositionGetTicket(i);
         if(PositionSelectByTicket(ticket) &&
            PositionGetString(POSITION_SYMBOL) == _Symbol)
            trade.PositionClose(ticket);
      }
   }
}

void OnDeinit(const int reason)
{
   IndicatorRelease(stoHandle);
}
これは学習用の最小サンプルです
損切り(SL)・利確(TP)・スプレッド確認・資金管理は入っていません。実運用にはこれらの安全装置が必須です。まずはデモ口座で動きを確認してください。

ストキャスティクスを使うときの注意・落とし穴

① 強いトレンドでは張り付く
上昇が強いと%Kは80以上に張り付いたまま価格が伸びます。「買われすぎ=即売り」は危険。上位足のトレンドiMA 等)に逆らわない場面で使うのが無難です。
② 水準 + クロスで精度を上げる
「20以下だから買い」ではなく「売られすぎ圏で%Kが%Dを上抜けたら買い」のように、水準とクロスの2条件にするとダマシが減ります(サンプル③)。RSIと考え方は近いので iRSI も参考に。
③ お決まりの3点 + バッファ番号
ハンドルは OnInit() で1回だけ/CopyBuffer() の戻り値を必ずチェック/ArraySetAsSeries(配列, true) を忘れない。iStochastic特有として、0=%K・1=%D を取り違えないこと。

まとめ

  • iStochastic() はストキャスティクスのハンドルを返す。値は CopyBuffer() で取り出す
  • バッファは 0=%K(メイン) / 1=%D(シグナル) の2つ
  • 一般に 80以上=買われすぎ/20以下=売られすぎ。確定足で・新バー時のみ判定する
  • 水準だけでなく「売られすぎ/買われすぎ圏での%K×%Dクロス」にするとダマシが減る
  • 強いトレンドでは張り付くので、上位足フィルターと併用する
タイトルとURLをコピーしました