取引戦略の開発:出来高制限アプローチの使用
はじめに:見過ごされがちな出来高の力
金融市場における価格変動は、単独で発生するものではありません。急激な動きであれ微細な変化であれ、その背後にはそれを駆動する力、すなわち出来高が存在します。しかし、テクニカル分析の世界では、しばしば価格そのものが主役となります。トレーダーはサポートやレジスタンス、チャートパターンを綿密に分析しますが、それらの価格変動を実際に引き起こしている根本的な力を見落としがちです。出来高は市場のエンジンであり、その振る舞いを理解することは、受動的にチャートを眺める存在から、情報に基づいた戦略的トレーダーへと移行するための鍵となります。
本記事では、生の無制限な出来高データを、制約された形式へと変換する数学的アプローチを紹介します。これをVolume Boundaryと呼びます。さらに、この処理された出来高がどのように取引戦略の基盤となり得るかを検討します。目的は、出来高をより解釈しやすくし、市場環境をまたいで一貫性を持たせ、アルゴリズム取引および裁量取引の双方において直接利用可能にすることです。
出来高の理解:市場の脈動
出来高とは本質的に、特定の期間(5分、1時間、あるいは1取引日など)において成立した取引または契約の数を指します。これは市場の活動量および確信度の指標として機能し、価格変動の「なぜ」に答えるものです。
-
高出来高: 高い出来高を伴う価格変動は強いと見なされ、継続する可能性が高いと考えられます。これは市場参加者の広範な関与を示し、その動きに信頼性と勢いを与えます。たとえば、保ち合いパターンを上抜ける局面において、高出来高を伴うブレイクアウトは、低出来高の場合と比べてはるかに強いシグナルとなります。
-
低出来高: 一方で、低出来高での価格変動は弱く、信頼性に欠けると見なされます。市場全体の合意が不足していることを示し、広範な参加者の支持を欠くため、短期間で反転する可能性があります。
MFI (Market Facilitation Index)、OBV (On-Balance Volume)、Accumulation/Distribution(累積/分配)など、出来高を取り入れた指標は多数存在しますが、これらは派生値や累積値として表現されることが多く、標準化が難しいという課題があります。本記事では、出来高をより直接的に扱うために、まずその非有界な性質を予測可能な有界範囲に収めることを目指します。
出来高を分析に統合することで、トレーダーは単に価格の動きを観察する段階から、それが「なぜ」起きているのか、そしてその動きがどれほど強いのかを理解する段階へと移行することができます。
重要な区別:実出来高とティック出来高
トレーダーが利用できる「出来高」データは、すべての市場で同一ではない点を認識することが重要です。
-
株式市場(実出来高): NYSEやNASDAQのような中央集権型取引所では、出来高は正確かつ確定的な値です。これは実際に取引された株式数を表します。たとえば、1日にMicrosoftの株式が500万株取引された場合、その日の出来高は500万となります。このデータはリアルタイムで報告され、高い精度を持ちます。
-
外国為替市場(ティック出来高): 外国為替市場は分散型であり、総出来高を報告する単一の主体が存在しません。そのため、FXブローカーは実際の取引量の代替指標としてティック出来高を提供します。ティック出来高は、一定期間における価格の変動回数(ティック数)を測定します。この考え方には合理性があり、価格の変動回数が多いほど、取引活動が活発であり、実際の出来高も多いと推測されます。
このような違いはあるものの、ティック出来高は分散型市場における実際の取引量と強い相関を持つことが示されており、FXにおける出来高分析手法として広く受け入れられています。 この研究では、Volume Boundaryインジケーターの基礎入力としてティック出来高を使用します。
数学的基盤:Volume Boundaryの定式化
Volume Boundaryインジケーターを構築するにあたり、ティック出来高を使用し、それを数学的に新たな有界スケールへ変換します。生の出来高(またはティック出来高)は非有界であり、理論上は無制限に増加し得るため、閾値判定やオシレーターとして直接利用することは困難です。出来高の挙動をより解釈しやすくするために、以下の2つの主要な処理をおこないます。
-
スケーリング関数(正規化または対数変換)を用いて生の出来高を変換します。
-
スケーリング後の値を非線形平滑化関数に通し、固定範囲内に収めます。
正規化変換: この手法では、直近の統計的特性に基づいて出来高をスケーリングし、平均回帰的な特性を持たせます。

対数変換: この手法では、極端に大きな出来高の影響を圧縮し、小さな値を相対的に拡張します。出来高が不規則に急増する市場において特に有効であり、よりバランスの取れた可読性の高いスケールを生成します。
ここで
- t = スケーリング後の出来高値
- m = 感度調整のためのスケーリング係数
- AvgVol = 一定期間における出来高の単純移動平均
- StdVol = 同期間における出来高の標準偏差
- Volume = 現在の出来高
これらの変換によりデータは標準化されますが、出力値(t)は依然として理論上は非有界です。次の重要なステップとして、このスケーリング値を固定かつ予測可能な範囲に収める平滑化関数へと入力します。
平滑化関数:境界線の作成
変換後、スケーリングされた出来高は平滑化関数に入力され、固定された範囲内に収められます。これにより、値はオシレーター的かつ滑らかな挙動を持ち、インジケーターにおける閾値判定に適した形になります。
- バタフライ曲線関数
f(t) = sin(t) × exprと表されます。
ここで、expr = e^{cos(t)} − 2cos(4t) − {sin(t/12)}^5です。
バタフライ曲線は、繰り返し現れる有界なパターンを持つため、出来高ベースのモメンタムにおける周期的な極値の特定に適しています。
バタフライ曲線の可視化および詳細については以下をご参照ください。https://www.mql5.com/ja/articles/20113
2. トリプルサイン関数
よりシンプルでありながら効果的な代替手法として、トリプルサイン関数があります。この関数はスケーリングされた出来高を厳密に+1から-1の範囲に制約します。これにより、RSIやストキャスティクスに類似した、典型的なオシレーターの外観が得られます。関数は次のとおりです。
f(t) = {sin(t)}^3
この関数は、インジケーターが+1または-1に近づくにつれて極値が明確に識別できる、クリーンで正規化された出力を提供します。
トリプルサイン関数のグラフと詳細については、https://www.mql5.com/ja/articles/20220をご覧ください。
Volume Boundaryインジケーターの構築
正規化された出来高を計算するには、選択した期間における出来高の平均値および標準偏差が必要です。取引プラットフォームは、新しいバーが生成されるたびに、これら2つの主要な統計量を計算する必要があります。
出来高の標準偏差は次のように定義されます。

簡略化すると、インジケータで一般的に使用される計算形式は以下のようになります。

ここで

- σ = 標準偏差
- N = 出来高サンプル数
- μ = 出来高の単純平均
- v = 個々の出来高値
処理フローのまとめ
- AvgVolとStdVolを計算します。
- 正規化または対数スケーリングのいずれかを用いて出来高を変換します。
- 変換された値を平滑化関数に入力します。 - バタフライ曲線
- 結果をVolume Boundaryインジケーターとして出力します。
-トリプルサイン曲線
正規化の場合:
-
出来高 → スケーリングされた値 → 平滑化関数 → 境界付き出力
対数スケールの場合:
-
出来高 → log(出来高) → 平滑化関数 → 有界出力
インジケーターのコード構造
数学的基盤を確立したところで、次に MetaTrader 5プラットフォーム上で Volume Boundaryインジケーターを実装する段階に移ります。本セクションでは、インジケーターの主要コンポーネント、ユーザーが利用可能な主要パラメータ、および内部でどのように出来高統計量とスケーリング値が計算されるかについて説明します。
input int VolumePeriod = 20; // Period for volume average and std dev input double ScaleFactor = 1.0; // Scaling factor (m) input ifcn InputMethod = 1; // Input method input sfcn SmoothingMethod = 1; // Smoothing method
本インジケーターは柔軟性を重視して設計されており、トレーダーが自身の戦略や市場に応じて挙動を調整できるようになっています。これは外部入力パラメータによって実現されています。
- VolumePeriod:出来高の平均および標準偏差を計算するために使用するバー数を定義します。
- ScaleFactor (m):変換後の出来高値に乗算されるスケーリング係数です。
- InputMethod:正規化変換と対数変換のどちらを使用するかを選択します。
- SmoothingMethod:バタフライ曲線とトリプルサイン関数のどちらの平滑化を使用するかを指定します。
// Set indicator range based on smoothing method if(SmoothingMethod == ButterflyCurve) { IndicatorSetDouble(INDICATOR_MINIMUM, -3.2); IndicatorSetDouble(INDICATOR_MAXIMUM, 3.2); } else { IndicatorSetDouble(INDICATOR_MINIMUM, -1.2); IndicatorSetDouble(INDICATOR_MAXIMUM, 1.2); }
初期化における重要なステップの一つが、インジケーター表示範囲(ビジュアルバウンド)の設定です。これは、選択された平滑化関数に応じて動的に構成され、ヒストグラムがクリッピングされることなく明確に表示されるようにします。
-
バタフライ曲線:出力の自然な範囲が広いため、表示範囲は -3.2 ~ +3.2 に設定されます。
-
トリプルサイン:典型的なオシレーター範囲である-1~+1を適切に収めるため、余裕を持たせて-1.2~+1.2に設定されます。
このような動的調整により、描画データは常にオシレーターウィンドウ内に最適に収まり、視認性と解釈性が向上します。
//+------------------------------------------------------------------+ //| Calculate average volume and standard deviation | //+------------------------------------------------------------------+ void CalculateVolumeStats(int pos, int rates_total, const long &tick_volume[]) { double sum = 0.0; double sumSq = 0.0; int count = 0; for(int i = pos; i < pos + VolumePeriod && i < rates_total; i++) { double volume_val = (double)tick_volume[i]; sum += volume_val; sumSq += volume_val * volume_val; count++; } if(count > 0) { AvgVolBuffer[pos] = sum / count; double variance = (sumSq / count) - (AvgVolBuffer[pos] * AvgVolBuffer[pos]); StdVolBuffer[pos] = MathSqrt(MathMax(variance, 0)); } else { AvgVolBuffer[pos] = 0; StdVolBuffer[pos] = 1; } }
CalculateVolumeStats()関数は、生のティック出来高データから重要な統計的基準値を導き出す、計算処理の中核となる関数です。
主な処理内容は以下の通りです。
- 指定された期間(VolumePeriod)にわたり、出来高の合計および二乗和を計算します。
- これに基づいて単純平均(AvgVolBuffer)を算出します。
- 平均値を用いて分散を求め、そこから標準偏差(StdVolBuffer)を導出します。MathMax(variance, 0)は、分散が負になることを防ぐ処理がおこなわれ、数値的安定性が確保されています。
- これらの値はインジケーターバッファに格納され、後続の変換処理で使用されます。
//+------------------------------------------------------------------+ //| Calculate scaled input t | //+------------------------------------------------------------------+ double CalculateInputT(int pos, const long &tick_volume[]) { double currentVolume = (double)tick_volume[pos]; double t = 0; if(InputMethod == scaledMethod) { if(StdVolBuffer[pos] != 0) t = ScaleFactor * (currentVolume - AvgVolBuffer[pos]) / StdVolBuffer[pos]; else t = 0; } else // logMethod { if(currentVolume > 0) t = ScaleFactor * MathLog(currentVolume); else t = 0; } return t; }
CalculateInputT()関数は、生の出来高を標準化されたスケーリング値tに変換します。この値は、最終的な有界化処理に入力されます。
処理の流れは以下の通りです。
-
現在バーのティック出来高を取得します。
-
正規化(スケーリング)方式が選択されている場合、
t = m * (Volume - AvgVol) / StdVol .を使用して、現在の出来高が平均からどれだけ離れているかを、標準偏差単位で測定します。 -
対数方式が選択されている場合、
t = m * log(Volume)を使用して、大きな値の影響を圧縮します。これにより、広いレンジを持つデータでも扱いやすくなります。 -
計算されたtは、その後平滑化関数(バタフライ曲線またはトリプルサイン関数)に渡されます。
for(int i = limit; i >= 0; i--) { // Calculate volume statistics CalculateVolumeStats(i, rates_total, tick_volume); // Calculate scaled input t double t = CalculateInputT(i, tick_volume); // Apply smoothing function if(SmoothingMethod == ButterflyCurve) { OscillatorBuffer[i] = ButterflyMethod(t); } else // Triple sine method { OscillatorBuffer[i] = TripleSineMethod(t); } }
このセクションでは、Volume Boundaryオシレーターの中核となる計算処理を実行します。このループは最新のバーから過去方向へと各バーを処理し、インジケーターが効率的かつ正確に更新されるようにしています。
-
まず、出来高の統計量が計算されます。
関数CalculateVolumeStats()は、指定されたルックバック期間における平均値および標準偏差を算出します。これらの値は正規化変換に不可欠です。 -
スケーリングされた入力値tが計算されます。
CalculateInputT()を用いて、生の出来高はスケーリングされた形式へ変換されます。変換方法はユーザーの選択に応じて、正規化または対数変換のいずれかが適用されます。 -
平滑化関数が適用されます。
-
バタフライ曲線が選択されている場合、スケーリング値tはButterflyMethod(t)に渡されます。
-
トリプルサインが選択されている場合は、代わりにTripleSineMethod(t)が使用されます。
-
-
結果はオシレーターバッファに格納されます。
計算された出力はOscillatorBuffer[i]に格納され、最終的な有界出来高オシレーターとしてチャート上に描画されます。
要するに、このループはインジケーターの中核として機能し、生の出来高を、選択された平滑化手法を用いて数学的に有界なオシレーターへと変換します。
Volume Boundary Oscillator (VBO)の動作デモ
このセクションでは、Volume Boundary Oscillator (VBO)がチャート上でどのように視覚的に振る舞うかを確認します。対象は、2つの入力変換手法である正規化変換と対数変換です。これらの例により、市場活動の変化に対するインジケーターの反応や、平滑化関数が出力に与える影響を把握できます。
正規化変換を使用した場合
正規化手法を適用した場合(図1)、オシレーターは正の領域および負の領域の両方にわたり自由に変動します。この手法では、出来高を平均値および標準偏差に対して相対化するため、VBOはボラティリティや取引活動の変化に対して高い応答性を持ちます。この挙動は、すべての時間足において一貫しており、バタフライ曲線およびトリプルサインのいずれの平滑化関数を使用した場合でも同様に維持されます。

図1:VBO正規化変換
対数変換を使用した場合
対数変換を選択した場合(図2)、インジケーターは同様に正および負の範囲で振動しますが、その挙動は正規化手法とは異なります。オシレーターがゼロラインの片側に長時間とどまる場合があります。これは、生の出来高の変動が小さい場合に発生し、対数関数が出来高データのスケールを圧縮するため、対数変換後の値の変化が緩やかになることに起因します。

図2:VBO対数変換
Volume Boundaryエキスパートアドバイザー(VBO-EA)の開発
Volume Boundary Oscillatorが完成したことで、次にその応用として、取引戦略およびEAを構築し、このインジケーターを用いて売買シグナルを生成します。VBOは以下のような複数の方法でシグナルを生成できます。
- 閾値方式:あらかじめ定義された上下限レベルへの到達に反応する方法
- ヒストグラム傾斜方式:オシレーターの増加または減少を分析する方法
- ゼロラインクロス方式:市場モメンタムの変化を検出する方法
本記事では、価格アクションによる基本的な確認を組み合わせた、閾値ベースのアプローチを示します。
取引戦略:閾値とプライスアクション確認
この手法では、VBOがあらかじめ設定された閾値レベルをブレイクすることを条件とし、それに加えてローソク足の方向による確認をおこないます。この二重フィルタにより、出来高シグナルが実際の価格変動を伴うことを保証し、取引の有効性を高めます。
エントリー条件
買いシグナル
以下の両方の条件が満たされた場合に買いポジションを開きます。
- 直近の確定ローソク足が陽線である(Close > Open)
- VBOシグナルが指定された閾値レベルを上回るまたは下回る
閾値レベルは、使用する平滑化手法およびトレーダーの設定に応じて正または負の値を取ることができます。
売りシグナル
売りエントリーは次の場合におこなわれます。
- 直近の確定ローソク足が陰線である(Close < Open)
- VBOシグナルが選択された閾値レベルを上回るまたは下回る
この手法は、出来高ベースの確認と価格方向の挙動を組み合わせたものです。
エグジットルール
各取引は、あらかじめ定義されたテイクプロフィット(TP)およびストップロス(SL)によって管理されます。これらは固定ピップ値または口座資本の割合として設定可能です。この戦略では、固定ピップ値による決済を採用します。
複数エントリーロジック
この戦略では同一方向に対して2回までのエントリーを許可しますが、取引の集中を避けるために閾値を交互に切り替える設計となっています。
ルールは以下の通りです。
-
1回目のエントリーが正の閾値で発生した場合、
2回目のエントリーは負の閾値で発生する必要があります(逆の場合も同様です)。 -
2回目のエントリーではプライスアクションの確認は不要で、閾値条件のみが必要です。
この交互閾値アプローチにより、エントリーの分散化が可能となり、単一のモメンタム局面への過度な集中を防ぎます。
例:- 1回目の買いエントリー:負の閾値でトリガーされ、プライスアクション確認あり
- 2回目の買いエントリー:正の閾値でトリガーされ、プライスアクション確認なし
この構造により、追加エントリーは異なる出来高条件下で実行されるため、バランスが改善され、冗長性が低減されます。
VBO EAのデモンストレーション
VBO-EAは、ユーザーが設定可能な柔軟な入力パラメータ群を提供しており、トレーダーが自身の市場条件やリスクプロファイルに応じて戦略を調整できるようになっています。これらのパラメータはMetaTrader 5上で最適化することも可能であり、パフォーマンスの改善や最適なパラメータ組み合わせの特定に利用できます。
EAは、以下のような複数の設定項目を公開しています。
- インジケーターパラメータ(変換手法、平滑化手法、スケールファクター、出来高期間)
- 取引パラメータ(ロットサイズなど)
- 売買シグナルに使用される閾値レベル
- リスク管理用のTPおよびSL値
これらの設定(図3)により、トレーダーはVBO-EAが出来高の挙動をどのように解釈し、どのように取引を実行するかを完全に制御することができます。

図3:VBO-EA入力パラメータ
図4:VBO EAのデモンストレーション
結論
本記事では、Volume Boundary Oscillator (VBO)を紹介しました。これは、バタフライ曲線やトリプルサインといった数学的関数を用いて、生の市場出来高を有界で解釈可能なシグナルへと変換する新しいアプローチです。非有界な出来高を制御されたオシレーション形式へ変換することで、VBOは市場参加、モメンタム、および時間軸をまたいだ活動変化をより明確に可視化します。
さらに、Volume Boundary EA (VBO-EA)がこのインジケーターを完全な取引フレームワークへと拡張する方法を示しました。出来高の変換と平滑化から、閾値ベースのエントリー、プライスアクションによる確認、構造化された複数エントリーロジックに至るまで、EAは出来高の数学的処理が自動売買の実行およびシステマティックな意思決定をどのように支援できるかを示しています。
本研究は、出来高のような従来の市場要素を数学的構造によって再定義することで、新たな視点を得て取引の明確性を向上させる価値を示しています。
今後の研究では、他の戦略や異なるインジケーターとの組み合わせを検証し、さまざまな金融商品において最も有効な組み合わせを特定していく予定です。それまで、楽しい取引を。
| ファイル名 | 説明 |
|---|---|
| VolumeBoundary.mq5 | 別チャートウィンドウに表示されるインジケーターを含みます。有界化された出来高データを処理および可視化し、トレーダーがメイン価格チャートとは独立してオシレーターの挙動を観察できるようにします。 |
| VB_EA.mq5 | 自動売買の意思決定を実行するEAを含みます。Volume Boundary Oscillatorのロジックを統合し、入力シグナルを処理し、定義された戦略ルールに従ってエントリーおよびエグジットを管理します。 |
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/20469
警告: これらの資料についてのすべての権利はMetaQuotes Ltd.が保有しています。これらの資料の全部または一部の複製や再プリントは禁じられています。
この記事はサイトのユーザーによって執筆されたものであり、著者の個人的な見解を反映しています。MetaQuotes Ltdは、提示された情報の正確性や、記載されているソリューション、戦略、または推奨事項の使用によって生じたいかなる結果についても責任を負いません。
MQL5入門(第30回):MQL5のAPIとWebRequest関数の習得(IV)
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
MQL5における取引戦略の自動化(第45回):逆フェアバリューギャップ(IFVG)
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索