1. iBearsPower関数の概要と実務での活用法
iBearsPowerは、アレキサンダー・エルダー博士によって考案された「ベアパワー(Bears Power)」指標の値を計算するためのMQL5組み込み関数です。この指標は、「市場における売り手の勢い(弱気派の力)」を視覚化したもので、具体的には「当日の安値」から「指数移動平均線(EMA)」を引くことで算出されます。
実務での活用法
実務トレードにおいては、単体で売買サインを出すのではなく、一般的に以下の手法で活用されます。
– トレンドの勢い確認: ベアパワーがマイナス圏でさらに下降していれば、下落トレンドが強力であることを示します。
– トレンド転換の予兆(ダイバージェンス): 価格が安値を更新しているのに、ベアパワーの値が切り上がっている場合、売り圧力の減衰(反発の予兆)と判断します。
– 押し目買い・戻り売り: メイントレンドをEMAで判定し、ベアパワーが一時的にマイナス圏から回復するタイミングを狙います。
開発者がつまずきやすい点
MQL4から移行した開発者が最も戸惑うのが、「関数を呼ぶだけでは数値が取得できない」という点です。MQL5のiBearsPowerは、指標の計算設定を行う「ハンドル(識別番号)」を返すのみであり、実際の数値を取得するにはCopyBuffer関数を組み合わせて使用する必要があります。この2段構えのステップを理解することが、MQL5攻略の第一歩です。
2. 構文と戻り値
iBearsPower関数の構文は以下の通りです。
int iBearsPower(
string symbol, // 通貨ペア名(NULLで現在のチャート)
ENUM_TIMEFRAMES period, // 時間軸(0またはPERIOD_CURRENTで現在)
int ma_period // 平均期間(一般的には13が推奨される)
);
戻り値
- int型のハンドル: 成功すると指標のハンドル(正の整数)を返します。
- 失敗時:
INVALID_HANDLE(-1)を返します。
取得データの仕様
- インデックス: 0番目のバッファにベアパワーの値が格納されています。
- 値の性質: 中央値「0」を基準としたオシレーターです。
3. 具体的な使い方・実践サンプルコード
以下は、iBearsPowerを使用して、ベアパワーがマイナス圏から0に向かって上昇した(売り圧力が弱まった)タイミングをログに出力するシンプルなEA(エキスパートアドバイザー)のコードです。
//+------------------------------------------------------------------+
//| BearsPowerSample.mq5|
//| Copyright 2023, Quant Engineer |
//+------------------------------------------------------------------+
#property strict
// 入力パラメーター
input int InpMAPeriod = 13; // ベアパワーの期間(EMA)
// グローバル変数
int handleBears; // 指標のハンドルを格納
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// 1. Bears Power指標のハンドルを作成
handleBears = iBearsPower(_Symbol, _Period, InpMAPeriod);
// ハンドルの取得に失敗した場合はエラーを出力
if(handleBears == INVALID_HANDLE)
{
Print("指標ハンドルの作成に失敗しました。エラーコード:", GetLastError());
return(INIT_FAILED);
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// メモリ解放のためにハンドルを削除
IndicatorRelease(handleBears);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double bearsValues[]; // 指標値を格納する動的配列
// 配列を時系列順(最新がインデックス0)に設定
ArraySetAsSeries(bearsValues, true);
// 2. ハンドルを使って最新の指標値を2個コピーする
// 第1引数: ハンドル, 第2引数: バッファ番号(0), 第3引数: 開始位置, 第4引数: 個数, 第5引数: 格納先
if(CopyBuffer(handleBears, 0, 0, 2, bearsValues) < 2)
{
Print("データの取得に失敗しました。");
return;
}
// 3. ロジック判定(例:売り圧力が弱まってきたか確認)
double currentBears = bearsValues[0]; // 最新のベアパワー
double prevBears = bearsValues[1]; // 1本前のベアパワー
// ベアパワーがマイナス圏にあり、かつ前回より上昇(0に接近)している場合
if(currentBears < 0 && currentBears > prevBears)
{
Comment("売り圧力が弱まりつつあります。値: ", currentBears);
}
else
{
Comment("現在のベアパワー: ", currentBears);
}
}
4. 使用上の注意点とよくあるエラー
① ハンドルの作成場所
iBearsPower関数は、必ずOnInit()内で一度だけ呼び出すようにしてください。OnTick()の中で毎回呼び出すと、新しいハンドルが無限に作成され、PCやサーバーのメモリを食いつぶし、プラットフォームがフリーズする原因になります。
② 計算に必要なバー数
EAの起動直後や、期間設定を長くした場合、計算に必要な過去のローソク足データが不足していると、CopyBufferがエラーを返すことがあります。実運用では、BarsCalculated関数を使用して、指標の計算が完了しているか確認する処理を入れるのがより堅牢です。
③ 配列の順序(時系列)
CopyBufferで取得したデータは、デフォルトでは「古い順(インデックス0が最も古い)」です。最新の値を[0]で取得したい場合は、必ずArraySetAsSeries(array, true)を実行して、時系列を反転させておく必要があります。これを忘れると、100本前のデータを使ってエントリー判定を行ってしまうといった致命的なミスに繋がります。
5. 【重要】自動売買における約定スピードと環境の罠
自動売買アルゴリズムの開発において、ロジックの最適化と同じ、あるいはそれ以上に重要なのが「執行環境(レイテンシ)」です。たとえiBearsPowerで完璧なサインを検知できたとしても、自宅のPCから一般的なインターネット回線を通じて注文を出している場合、サーバーへの到達までに数十ミリ秒から数百ミリ秒の遅延が発生します。
この遅延(ネットワーク・レイテンシ)は、激しい値動きの中では致命的です。あなたが「今の価格」でエントリーしようとした瞬間、サーバー側ではすでに価格が数ピップス先へ進んでおり、不利な価格での約定(スリッページ)を引き起こします。たった1ピップスの差であっても、数百回の取引を繰り返すEAにおいては、その累積損失がバックテストとリアルトレードの結果を乖離させる最大の要因となります。プロのクオンツエンジニアが、証券会社のサーバーと同じデータセンター内、あるいは極めて物理的距離が近い場所に設置された「専用のVPS(仮想専用サーバー)」を利用するのは、この物理的な遅延を極限まで排除し、一瞬のチャンスを確実につかみ取るためです。安定した24時間の稼働と、ミリ秒単位での約定スピードを確保することは、シストレ開発者にとって「必須の投資」と言っても過言ではありません。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント