【MQL5】iBullsPower関数の使い方と自動売買実装コード

1. iBullsPower関数の概要と実務での活用法

iBullsPowerは、アレキサンダー・エルダー博士によって考案された「ブルパワー(Bulls Power)」指標の値を計算するためのMQL5組み込み関数です。この指標は、市場における「買い手の勢い」を数値化したもので、具体的には「現在の高値」から「指数移動平均(EMA)」を引くことで算出されます。

実務での活用法と落とし穴:
実務開発において、初心者が最も陥りやすいミスは、ブルパワーが「0以上なら買い」と単純に判断してしまうことです。ブルパワーは単体で使うのではなく、一般的にEMA(トレンドの方向確認)やベアパワー(売りの勢い)と組み合わせて使用します。

例えば、「EMAが上昇トレンドにある中で、ブルパワーが一時的にマイナス圏からプラス圏に転じた瞬間を押し目買いのトリガーとする」といった、トレンドフォローの補助指標として活用するのがクオンツ的な王道アプローチです。また、価格が高値を更新しているのにブルパワーが低下している「ダイバージェンス」を検知し、トレンドの終焉を予測するロジックにも応用されます。

2. 構文と戻り値

iBullsPower関数を使用するには、まずインジケーターの「ハンドル」を取得し、そのハンドルを介して実際の値を取得するという2ステップの手順を踏みます。

構文

int  iBullsPower(
   string           symbol,     // 通貨ペア(NULLは現在のペア)
   ENUM_TIMEFRAMES  period,     // 時間軸(0は現在の時間軸)
   int              ma_period   // 平均化期間(一般的には13が多用される)
   );

戻り値

  • 成功した場合:インジケーターのハンドル(整数値)を返します。
  • 失敗した場合:INVALID_HANDLEを返します。

取得したハンドルを CopyBuffer 関数に渡すことで、指定した期間のブルパワーの数値(double型)を取得できます。

3. 具体的な使い方・実践サンプルコード

以下は、iBullsPowerを利用して、簡単な買いシグナルを判定するEA(エキスパートアドバイザー)のテンプレートコードです。

//+------------------------------------------------------------------+
//|                                           SimpleBullsPowerEA.mq5 |
//+------------------------------------------------------------------+
#property strict

// 変数の宣言
int handleBullsPower; // ブルパワーのハンドルを格納
double bufferBulls[]; // 指標値を格納する配列

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   // iBullsPowerのハンドルを取得(期間13、現在の通貨ペア・時間軸)
   handleBullsPower = iBullsPower(_Symbol, _Period, 13);

   if(handleBullsPower == INVALID_HANDLE)
   {
      Print("ハンドル取得失敗");
      return(INIT_FAILED);
   }

   // 配列を時系列順(最新がインデックス0)に設定
   ArraySetAsSeries(bufferBulls, true);

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   // 最新の2本分(現在足と1本前)のデータをコピー
   if(CopyBuffer(handleBullsPower, 0, 0, 2, bufferBulls) < 0)
   {
      Print("データコピー失敗");
      return;
   }

   // 取得した値を確認
   double currentBullsPower = bufferBulls[0]; // 最新足の値
   double prevBullsPower = bufferBulls[1];    // 1本前の足の値

   // 実践的なロジック例:
   // ブルパワーが0ラインを下から上に抜けた(ゴールデンクロス的な動き)場合にログ出力
   if(prevBullsPower < 0 && currentBullsPower > 0)
   {
      Print("買いの勢いが強まりました: ", currentBullsPower);
      // ここにオーダー送信処理(OrderSend)などを記述
   }
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // インジケーターのハンドルを解放してメモリを節約
   IndicatorRelease(handleBullsPower);
}

4. 使用上の注意点とよくあるエラー

  1. ハンドルの作成場所:
    iBullsPower関数は、必ずOnInit内で1回だけ実行するようにしてください。OnTick内で毎回呼び出すと、新しいハンドルが無限に作成され、ターミナルの動作が極端に重くなったり、最終的にクラッシュしたりする原因になります。

  2. 時系列設定の忘れ:
    CopyBufferで値を取得する前に、ArraySetAsSeriesを使って配列を時系列設定(最新の足がインデックス0)にするのを忘れないでください。これを怠ると、古いデータと新しいデータのインデックスが逆転し、意図しない売買判断を下すことになります。

  3. 計算期間(ma_period)の妥当性:
    デフォルトの13はエルダー博士の推奨設定ですが、スキャルピングや長期スイングなど、手法に応じて最適化が必要です。あまりに短すぎるとノイズを拾いやすく、長すぎるとシグナルが遅れる(ラグが発生する)性質があることを理解しておきましょう。

5. 【重要】自動売買における約定スピードと環境の罠

アルゴリズムトレードにおいて、ロジックの正確さと同等、あるいはそれ以上に重要なのが「実行環境の物理的な距離」です。自宅のPCや一般的な光回線を利用してEAを稼働させることは、プロのクオンツの視点からは非常にリスクの高い行為と言わざるを得ません。家庭用回線はネットワークの揺らぎ(ジッター)が大きく、注文が証券会社のサーバーに届くまでにコンマ数秒の遅延が発生します。この「わずかな遅れ」が原因で、バックテストでは利益が出ていたロジックも、実運用ではスリッページによって期待値がマイナスに転じ、致命的な損失を生むことが多々あります。

特にiBullsPowerのようなオシレーターをトリガーにする戦略は、エントリーの瞬間の価格が損益を大きく左右します。約定スピードを極限まで高め、物理的なネットワーク遅延を最小化するためには、証券会社のサーバーと同じデータセンター内、あるいは至近距離に設置された自動売買専用のVPS(仮想専用サーバー)を利用することが不可欠です。24時間安定した稼働と、ミリ秒単位のレスポンスを確保できる環境を整えることこそが、システムトレーダーとして生き残るための最低条件です。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

タイトルとURLをコピーしました