1. iStdDev関数の概要と実務での活用法
iStdDev関数は、相場の「ボラティリティ(価格の変動率)」を測定するためのテクニカル指標である「標準偏差(Standard Deviation)」のハンドルを取得するための関数です。
標準偏差は、統計学的に「価格が平均からどれくらい離れているか」を示します。FXのシステムトレード(EA開発)における実務では、主に以下の目的で活用されます。
- 相場の静止と過熱の判断: 標準偏差が低いときはレンジ相場、急上昇したときはトレンドの発生やブレイクアウトの予兆と判断します。
- ボリンジャーバンドの自作: ボリンジャーバンドは「移動平均線 ± 標準偏差×n」で構成されているため、その核となる計算に利用します。
- 動的なストップロスの設定: ボラティリティが大きい時は損切り幅を広く、小さい時は狭くするといった、相場環境に合わせたリスク管理に用います。
初心者が特につまずきやすいポイントは、MQL4(旧バージョン)との違いです。MQL5では関数を呼び出して直接数値を得るのではなく、一度「ハンドル」という識別番号を作成し、それを使ってデータを取得するという手順が必要になります。
2. 構文と戻り値
iStdDev関数を使用するには、まず以下の構文でインジケーターのハンドルを作成します。
int iStdDev(
string symbol, // 通貨ペア(NULLで現在のチャート)
ENUM_TIMEFRAMES period, // 時間軸(0またはPERIOD_CURRENTで現在の足)
int ma_period, // 平均化期間
int ma_shift, // 水平シフト
ENUM_MA_METHOD ma_method, // 平均化メソッド(SMA, EMAなど)
ENUM_APPLIED_PRICE applied_price // 適用価格(CLOSE, OPENなど)
);
戻り値
- 成功した場合:インジケーターのハンドル(int型の整数)を返します。
- 失敗した場合:
INVALID_HANDLEを返します。
データの取得
ハンドルを取得しただけでは標準偏差の数値(1.25や0.05など)は手に入りません。後述する CopyBuffer 関数を使用して、配列に数値をコピーして利用します。
3. 具体的な使い方・実践サンプルコード
以下は、標準偏差が一定の閾値を超えたときにログを出力する、非常にシンプルで実践的なEAのテンプレートです。
//+------------------------------------------------------------------+
//| StdDev_Sample_EA.mq5|
//+------------------------------------------------------------------+
#property strict
// 入力パラメーター
input int InpStdDevPeriod = 20; // 標準偏差の期間
input double InpThreshold = 0.0010; // 判定の閾値(通貨ペアに合わせて調整)
// グローバル変数
int handleStdDev; // インジケーターのハンドルを格納
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// 1. 標準偏差インジケーターのハンドルを作成
handleStdDev = iStdDev(_Symbol, _Period, InpStdDevPeriod, 0, MODE_SMA, PRICE_CLOSE);
// ハンドル作成に失敗した場合はエラー
if(handleStdDev == INVALID_HANDLE)
{
Print("ハンドルの作成に失敗しました。エラーコード:", GetLastError());
return(INIT_FAILED);
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// 不要になったハンドルを解放してメモリを節約
IndicatorRelease(handleStdDev);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double stdDevValues[]; // データを格納する動的配列
ArraySetAsSeries(stdDevValues, true); // 最新の足がインデックス0にくるように設定
// 2. CopyBufferを使って、ハンドルから配列にデータをコピー
// 引数:(ハンドル, バッファ番号, 開始位置, 個数, コピー先配列)
if(CopyBuffer(handleStdDev, 0, 0, 2, stdDevValues) < 0)
{
Print("データの取得に失敗しました。");
return;
}
// 3. 取得した値を利用する
double currentStdDev = stdDevValues[0]; // 最新の足の標準偏差
if(currentStdDev > InpThreshold)
{
Comment("現在の標準偏差: ", currentStdDev, "\nボラティリティが上昇しています!");
}
else
{
Comment("現在の標準偏差: ", currentStdDev, "\n相場は穏やかです。");
}
}
4. 使用上の注意点とよくあるエラー
- ハンドルの作成はOnInitで行う:
OnTick内で毎回iStdDevを呼び出すのは絶対に避けてください。呼び出すたびにメモリを消費し、PCやサーバーに過大な負荷をかけ、最悪の場合はプラットフォームがフリーズします。必ずOnInitで一度だけ作成し、変数に保存してください。 - 計算期間の不足:
チャートに読み込まれているヒストリーデータが少ない場合、CopyBufferが失敗したり、期待通りの計算結果が得られなかったりすることがあります。特にEA稼働直後はデータが同期されているか確認が必要です。 - 通貨ペアごとの桁数:
標準偏差の「0.001」という数値は、ドル円(110.00形式)とユーロドル(1.10000形式)では意味が全く異なります。計算結果を比較する場合は、通貨ペアごとのポイント数などを考慮した正規化を検討してください。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、iStdDevなどのインジケーターを用いて完璧なエントリーロジックを組んだとしても、実行環境が貧弱であればその努力は水の泡となります。特に日本の一般的な家庭用インターネット回線は、FX業者のサーバーとの間に物理的な距離があり、数十ミリ秒から数百ミリ秒の「ネットワーク遅延(レイテンシ)」が発生しています。この遅延は、価格が激しく動くボラティリティの高い局面(=標準偏差が急上昇するタイミング)ほど顕著になり、意図した価格から大きく乖離して約定する「スリッページ」を誘発します。
プロのクオンツエンジニアが個人開発者と決定的に異なるのは、ロジックと同じかそれ以上に「インフラ」を重視する点です。約定スピードを極限まで高め、ネットワーク遅延による致命的な損失を回避するには、FX業者のデータセンターに近い場所に位置する「専用VPS(仮想専用サーバー)」の利用が必須条件となります。24時間安定した稼働を保証し、ミリ秒単位の優位性を確保することこそが、長期的に利益を積み上げるための技術的な土台となるのです。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント