1. iOBV関数の概要と実務での活用法
iOBVは、テクニカル指標である「オン・バランス・ボリューム(On Balance Volume)」のハンドルを取得するためのMQL5組み込み関数です。OBVは、価格の変化と出来高(ボリューム)を組み合わせた先行指標として知られ、「出来高は価格に先行する」という理論に基づいています。
実務での活用法
実務においてOBVは、単体で売買シグナルを出すよりも、「トレンドの裏付け」として活用されるのが一般的です。
– ダイバージェンスの検知: 価格が上昇しているのにOBVが停滞・下落している場合、その上昇トレンドは「燃料不足(出来高不足)」と判断し、反転を警戒します。
– ブレイクアウトの確認: 持ち合い相場で価格が抜ける前に、OBVが先にレジスタンスを抜ける動きを先行指標として捉えます。
実務でつまずきやすい点
MQL4とは異なり、MQL5のiOBVは直接数値(double型)を返すのではなく、「インジケーターのハンドル(識別番号)」を返します。初心者の多くは、このハンドルを取得しただけで満足し、実際の数値を取得するためのCopyBuffer関数の実装を忘れて「値が取得できない」という壁に突き当たります。また、FXにおける出来高は「ティック回数(価格更新回数)」であることも正しく理解しておく必要があります。
2. 構文と戻り値
iOBV関数の構文は以下の通りです。
int iOBV(
string symbol, // 通貨ペア名(NULLで現在のチャート)
ENUM_TIMEFRAMES period, // 時間軸(PERIOD_CURRENTで現在の足)
ENUM_APPLIED_VOLUME applied_volume // 使用するボリュームの種類
);
パラメーター解説
- symbol: 対象となる通貨ペア。通常は
_SymbolまたはNULLを指定します。 - period:
PERIOD_M15やPERIOD_H1などの時間軸を指定します。 - applied_volume: FXでは通常
VOLUME_TICK(ティックボリューム)を使用します。株式や先物で実出来高がある場合はVOLUME_REALを選択しますが、一般的なFXブローカーではティックボリューム以外は正しく機能しません。
戻り値
- 成功した場合:インジケーターのハンドル(int型)を返します。
- 失敗した場合:
INVALID_HANDLEを返します。
3. 具体的な使い方・実践サンプルコード
以下は、OBVの値を2本取得し、直近のOBVが上昇しているか(=買い圧力が増しているか)を判定するシンプルなEAのテンプレートです。
//+------------------------------------------------------------------+
//| OBV_Sample_EA.mq5 |
//| Copyright 2024, Quant Engineer |
//+------------------------------------------------------------------+
#property strict
// インジケーターハンドルを格納する変数
int obvHandle;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// OBVハンドルの初期化(現在の通貨ペア、現在の時間軸、ティックボリュームを使用)
obvHandle = iOBV(_Symbol, PERIOD_CURRENT, VOLUME_TICK);
// ハンドルの取得に失敗した場合の処理
if(obvHandle == INVALID_HANDLE)
{
Print("OBVハンドルの取得に失敗しました。エラーコード:", GetLastError());
return(INIT_FAILED);
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// 使用済みのハンドルを解放してメモリを節約
IndicatorRelease(obvHandle);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double obvValues[]; // OBVの値を格納する動的配列
ArraySetAsSeries(obvValues, true); // 配列を時系列順(最新が0)に設定
// CopyBufferを使用してハンドルの値を配列にコピー
// 0番バッファから、現在の足(0)から2本分取得
if(CopyBuffer(obvHandle, 0, 0, 2, obvValues) < 2)
{
Print("OBVデータのコピーに失敗しました。");
return;
}
// OBVの値を抽出(最新の足と1本前の足)
double currentOBV = obvValues[0];
double prevOBV = obvValues[1];
// ロジック例:OBVが上昇傾向にあるか
if(currentOBV > prevOBV)
{
Comment("OBV上昇中: 買い圧力が強まっています。\n",
"Current: ", DoubleToString(currentOBV, 0), "\n",
"Previous: ", DoubleToString(prevOBV, 0));
}
else if(currentOBV < prevOBV)
{
Comment("OBV下落中: 売り圧力が強まっています。");
}
}
4. 使用上の注意点とよくあるエラー
- 絶対値に意味はない: OBVは累積値であるため、数値そのもの(例:1254300など)には意味がありません。前日比や移動平均との乖離など、「変化」や「傾き」を評価するように設計してください。
- 計算開始位置による誤差: OBVは「チャートに読み込まれた最古のデータ」から計算を開始します。そのため、MT5のチャートに表示されているバー数設定(最大バー数)が異なると、同じ通貨ペアでも端末間でOBVの値が一致しないことがあります。
- メモリリークの防止:
OnInitで取得したハンドルは、EAを削除する際にIndicatorReleaseで解放する習慣をつけましょう。 - データの準備待ち: 起動直後などはヒストリカルデータが読み込まれておらず、
CopyBufferがエラーになることがあります。実運用では戻り値を必ずチェックし、エラー時は処理をスキップする堅牢なコードが必要です。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、iOBVのような先行指標を使いこなすロジックの構築は半分に過ぎません。残りの半分は「実行環境」です。どれほど精緻なクオンツモデルを組み上げても、自宅のPCや不安定なWi-Fi環境から注文を出している限り、プロのトレーダーや機関投資家がひしめく市場では勝ち残れません。
FXの自動売買において、ネットワーク遅延(レイテンシ)は致命的な損失(スリッページ)に直結します。自宅PCでは数ミリ秒から数百ミリ秒の遅延が日常的に発生し、エントリー価格が滑ることで期待期待値が崩壊します。これを防ぐためには、ブローカーのサーバーと同じデータセンター内に位置する「専用のVPS(仮想専用サーバー)」の利用が不可欠です。24時間365日の安定稼働はもちろん、極限まで約定スピードを高めることが、システムトレードを「ギャンブル」から「ビジネス」へと昇華させるための必須条件となります。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント