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本を取得します。
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)・スプレッド確認・資金管理は入っていません。実運用にはこれらの安全装置が必須です。まずはデモ口座で動きを確認してください。
ストキャスティクスを使うときの注意・落とし穴
「20以下だから買い」ではなく「売られすぎ圏で%Kが%Dを上抜けたら買い」のように、水準とクロスの2条件にするとダマシが減ります(サンプル③)。RSIと考え方は近いので iRSI も参考に。
ハンドルは
OnInit() で1回だけ/CopyBuffer() の戻り値を必ずチェック/ArraySetAsSeries(配列, true) を忘れない。iStochastic特有として、0=%K・1=%D を取り違えないこと。
まとめ
iStochastic()はストキャスティクスのハンドルを返す。値はCopyBuffer()で取り出す- バッファは 0=%K(メイン) / 1=%D(シグナル) の2つ
- 一般に 80以上=買われすぎ/20以下=売られすぎ。確定足で・新バー時のみ判定する
- 水準だけでなく「売られすぎ/買われすぎ圏での%K×%Dクロス」にするとダマシが減る
- 強いトレンドでは張り付くので、上位足フィルターと併用する

