1. iStochastic関数の概要と実務での活用法
MQL5のiStochastic関数は、オシレーター系の代表格である「ストキャスティクス」のインジケーター・ハンドルを取得するための関数です。ストキャスティクスは、一定期間の価格レンジの中で現在の価格がどこに位置するかを数値化(0〜100%)し、相場の「買われすぎ・売られすぎ」を判断するのに役立ちます。
実務での活用とつまずきポイント:
MQL4ではiStochasticを呼ぶと即座に「数値」が返ってきましたが、MQL5では「ハンドル(識別番号)」が返ってくるという点が最大の変更点であり、初心者が最初につまずく壁です。
実務開発においては、単に「80以上で売り」といった単純な逆張り戦略だけでなく、メイン線(%K)とシグナル線(%D)のゴールデンクロス・デッドクロス、あるいは価格との逆行(ダイバージェンス)を検知して、トレンドの転換点を探るロジックによく使われます。計算負荷が比較的低いため、マルチタイムフレーム(MTF)分析で上位足の状態を確認するフィルターとしても非常に優秀です。
2. 構文と戻り値
iStochastic関数の構文は以下の通りです。
int iStochastic(
string symbol, // 通貨ペア名(NULLなら現在のチャート)
ENUM_TIMEFRAMES period, // 時間軸(0なら現在のチャート)
int Kperiod, // %K期間
int Dperiod, // %D期間
int slowing, // スローイング(減速)
ENUM_MA_METHOD ma_method, // 移動平均の種類(MODE_SMAなど)
ENUM_STO_PRICE_FIELD price_field // 価格の対象(Low/High または Close/Close)
);
戻り値:
成功すればインジケーターのハンドル(int型)を返します。失敗した場合は INVALID_HANDLE を返します。
取得できるバッファ:
– 0 (MAIN_LINE): ストキャスティクスのメイン線 (%K)
– 1 (SIGNAL_LINE): ストキャスティクスのシグナル線 (%D)
このハンドルを使って、後述する CopyBuffer 関数で実際の数値を取得します。
3. 具体的な使い方・実践サンプルコード
以下は、ストキャスティクスのメイン線とシグナル線が20以下でゴールデンクロスした時に買いサイン、80以上でデッドクロスした時に売りサインを出す簡易的なEAのサンプルです。
//+------------------------------------------------------------------+
//| SimpleStochEA.mq5 |
//+------------------------------------------------------------------+
#property strict
// 入力パラメーター
input int InpKPeriod = 5; // %K 期間
input int InpDPeriod = 3; // %D 期間
input int InpSlowing = 3; // スローイング
input int InpUpper = 80; // 上限ライン
input int InpLower = 20; // 下限ライン
// グローバル変数
int handleStoch; // ストキャスティクスのハンドルを格納
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// 1. ストキャスティクスのハンドルを取得
handleStoch = iStochastic(_Symbol, _Period, InpKPeriod, InpDPeriod, InpSlowing, MODE_SMA, STO_LOWHIGH);
// ハンドルの取得に失敗した場合はエラー
if(handleStoch == INVALID_HANDLE)
{
Print("ハンドルの取得に失敗しました。エラーコード:", GetLastError());
return(INIT_FAILED);
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double mainLine[], signalLine[];
// 時系列(最新の値を0番目)として扱う設定
ArraySetAsSeries(mainLine, true);
ArraySetAsSeries(signalLine, true);
// 2. ハンドルを使って最新2本分のデータをバッファからコピーする
if(CopyBuffer(handleStoch, 0, 0, 2, mainLine) < 0 ||
CopyBuffer(handleStoch, 1, 0, 2, signalLine) < 0)
{
Print("データのコピーに失敗しました。");
return;
}
// 3. ロジックの判定(1本前と現在のクロスを確認)
// 買いサイン:20以下でメイン線がシグナル線を下から上に抜けた
if(mainLine[1] < signalLine[1] && mainLine[0] > signalLine[0] && mainLine[0] < InpLower)
{
Print("買いシグナル発生!");
}
// 売りサイン:80以上でメイン線がシグナル線を上から下に抜けた
if(mainLine[1] > signalLine[1] && mainLine[0] < signalLine[0] && mainLine[0] > InpUpper)
{
Print("売りシグナル発生!");
}
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// 4. 使用したハンドルを解放してメモリを節約
IndicatorRelease(handleStoch);
}
4. 使用上の注意点とよくあるエラー
- ハンドルの作成はOnInitで一度だけ行う:
OnTick内でiStochasticを毎回呼び出さないでください。呼び出すたびに新しいハンドルが作成され、メモリを大量に消費し、最終的にプラットフォームがフリーズします。 - ArraySetAsSeriesの忘れ:
CopyBufferでコピーした配列は、デフォルトでは「古い順([0]が最も古い)」になっています。これを「最新順([0]が現在の足)」にするためにArraySetAsSeriesを忘れないようにしましょう。 - 計算未完了時のエラー:
EAを起動した直後や時間足を変えた直後は、インジケーターの計算が完了しておらずCopyBufferがエラーを返すことがあります。戻り値を確認する処理(サンプルコード参照)を必ず入れてください。 - price_field の指定ミス:
STO_LOWHIGH(安値・高値ベース) かSTO_CLOSECLOSE(終値ベース) かで挙動が変わります。一般的にはSTO_LOWHIGHが広く使われます。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、ロジックの正確さと同じくらい重要なのが「実行環境の物理的レイテンシ(遅延)」です。自宅のデスクトップPCやWi-Fi環境でEAを稼働させることは、プロのクオンツから見れば極めてリスクの高い行為と言わざるを得ません。家庭用回線では、予期せぬネットワークの瞬断やWindowsアップデートによる強制再起動が避けられず、さらに証券会社サーバーとの物理的な距離が遠いため、注文がサーバーに届くまでにコンマ数秒のラグが生じます。
このわずかな遅延(スリッページ)は、特にストキャスティクスのようなオシレーターを使う短期売買において、バックテストの結果とリアルトレードの結果を乖離させる最大の要因となります。ミリ秒単位で優位性を競うFX市場で勝ち残るには、ブローカーのデータセンターに近い場所に位置する専用のVPS(仮想専用サーバー)を利用することが不可欠です。安定した電源と超高速なバックボーン回線を備えたVPS環境を整えることは、システム開発における「必要経費」ではなく、致命的な損失を回避するための「インフラ投資」なのです。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント