私たちのファンページに参加してください
- ビュー:
- 95
- 評価:
- パブリッシュ済み:
- アップデート済み:
-
このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動
はじめに:
KCIボラティリティ・ディスタンスは、市場のモメンタムとトレンドの方向性を極めて正確に把握するために、綿密に設計された高度で適応性の高いアルゴリズムです。 独自の行列ベースの計算手法を活用し、このツールは市場のノイズを動的に排除し、トレンドの強さについて厳密に定量的な視点を提供します。高度に最適化されたオブジェクト指向プログラミング(OOP)コアを基盤として構築されており、取引の可視性を高めるだけでなく、エキスパートアドバイザーや機械学習
学習モジュールへのシームレスな統合を両立させ、複数の資産にわたって極めて軽量なCPUパフォーマンスを実現します。
機能と説明
- マトリックス・モメンタム・エンジン: 多次元配列のフレームワーク内で、価格の内部ダイナミクスを計算します。機能: 大きなブレイクアウトが発生する前に、現在の市場方向性の真の根底にある強さを特定し、トレンドの早期検出において優位性を提供します。
- ダイナミック・ノイズ・フィルター: リアルタイムの市場状況に基づいて自ら再調整を行う適応型メカニズム。 機能: 調整局面や出来高の少ない期間における誤ったシグナルや不安定な価格の急騰を自動的に抑制し、自動アルゴリズムが時期尚早な取引を実行するのを防ぎます。
- 方向性強度の出力: 複雑な数学的行列値を、明快で独立した数値データに変換します。機能: 自動取引システムにおいて、正確なエントリーシグナルの判定、トレンド継続パターンの検証、あるいは動的なロットサイズの決定を行うための決定的な指標として機能します。
要件
- テクニカル指標/アルゴリズム取引コア/定量分析ツール。
- 高度に最適化された実行、VPS環境でのCPU消費を抑える極めて軽量な設計(50 KB未満)。
- 組み込みの OOP クラスアーキテクチャを備えたオープンソーススクリプト(.mq5 ファイル)。
このアルゴリズムをEAに組み込むには、主に2つの方法があります。1つ目の方法(組み込みOOP)は、CPU効率を最大化し、機械学習のデータセットを収集するために強く推奨されます。2つ目の方法(iCustom呼び出し)は、プロトタイプの迅速なテストに適しています。
方法1:組み込みOOPクラスを用いた直接利用(超軽量)
- この方法では、外部インジケーターを呼び出すことなく、エンジンをEAに直接組み込みます。コードはグローバルレベルに配置され、OnInitで初期化され、OnTickで実行されます。
コードスニペット
// --- 1. OOPクラスをEAファイルの先頭に配置するか、#include を使ってインクルードしてください --- class CKCIDirectionalMatrix { // (ここにCKCIDirectionalMatrixクラスの実装全体を記述してください) // ... }; // --- 2. グローバルオブジェクトのインスタンスを宣言する --- CKCIDirectionalMatrix MatrixEngine; // EAの入力パラメータ input int MatrixPeriod = 14; input double EntryThreshold = 0.0050; // モメンタムの強さの閾値 // --- 3. OnInit() でエンジンを初期化する --- int OnInit() { if(!MatrixEngine.Init(MatrixPeriod)) return(INIT_PARAMETERS_INCORRECT); return(INIT_SUCCEEDED); } // --- 4. OnTick() 内でコアロジックを実行する --- void OnTick() { // 最新の市場価格データを格納するための配列を準備する double high[], low[], close[]; if(CopyHigh(_Symbol, _Period, 0, MatrixPeriod + 2, high) < 0) return; if(CopyLow(_Symbol, _Period, 0, MatrixPeriod + 2, low) < 0) return; if(CopyClose(_Symbol, _Period, 0, MatrixPeriod + 2, close) < 0) return; // 配列は時系列として設定する必要があります(インデックス 0 = 最新のバー) ArraySetAsSeries(high, true); ArraySetAsSeries(low, true); ArraySetAsSeries(close, true); // 直近でクローズしたバー(インデックス 1)の行列出力を計算する double current_matrix_strength = MatrixEngine.Calculate(1, high, low, close); // --- A. 機械学習/特徴量抽出モジュール --- // 「current_matrix_strength」をニューラルネットワークに入力する // あるいは、入力変数としてAIの特徴ベクトル。 // --- B. 取引決定モジュール(シグナルフィルタリング) --- if(current_matrix_strength > EntryThreshold) { // モメンタムの検証に合格しました。 // 市場のトレンドは十分に強いと見なされている。 // -> ここで、状況に応じて買い注文または売り注文を実行します // EAの方向性戦略に合わせて。 // -> あるいは、この値を使用して動的に // スマートグリッドの間隔やその他の適応パラメータを調整します。 } }
方法2:iCustom() 経由での呼び出し
KCI Volatility Distance インジケータの .mq5 ファイルを別途リリースし、EA が標準のインジケータバッファを通じてそれを読み込むようにしたい場合。
コードスニペット
// --- 1. グローバルスコープでインジケータハンドルを宣言する --- int MatrixHandle; // EAの入力パラメータ input int MatrixPeriod = 14; // --- 2. OnInit() 内でインジケーターハンドルを作成する --- int OnInit() { // インジケーターのファイル名が完全に一致していることを確認する // 「Indicators」フォルダ内にあるファイル。 MatrixHandle = iCustom(_Symbol, _Period, "KCI Volatility Distance", MatrixPeriod); if(MatrixHandle == INVALID_HANDLE) { Print("Failed to load the KCI Volatility Distance indicator."); return(INIT_FAILED); } return(INIT_SUCCEEDED); } // --- 3. OnTick() 内でインジケーターのバッファデータを読み込む --- void OnTick() { double MatrixBuffer[]; ArraySetAsSeries(MatrixBuffer, true); // バッファ 0(KCI-VD ライン)から最新の 2 つの値を取得する if(CopyBuffer(MatrixHandle, 0, 0, 2, MatrixBuffer) <= 0) { Print("Failed to copy matrix buffer data."); return; } // 直近の終値ローソク足からのマトリックス値 double current_matrix_strength = MatrixBuffer[1]; // 現在形成中のローソク足からのマトリックス値(リアルタイム) double previous_matrix_strength = MatrixBuffer[0]; // --- 取引判断ロジック --- if(current_matrix_strength > previous_matrix_strength) { // 勢いが広がっている。 // -> これを追加の確認として使用してください // テイクプロフィットの距離を拡大する。 // // -> あるいは、これを使って適応型をトリガーすることもできます // トレーリングストップの調整。 } }
KCI Volatility Distanceは、適応性が高くCPU負荷の軽いアーキテクチャを採用しているため、その可能性は従来の視覚的インジケーターの枠を超えています。オブジェクト指向プログラミング(OOP)に基づくコードの柔軟性により、さまざまな高度なアルゴリズムシナリオのエンジンとして機能することが可能です。
See how KCI Volatility Distance can be used in this indicator's Arrow Placement : KCI Arrow and on expert advisor EA KCI N-Matrix Engine
以下に、さまざまなEAや複雑なインジケーター開発を目的とした、KCI Volatility Distanceの戦略的な実装例をいくつか紹介します:
1. ストップハンティング対策システム(動的SL&TP)
急激な価格変動は、多くの場合、実際のトレンドというよりも流動性トラップ(リクイディティ・グラブまたは ストップ・ハント)によるものです。KCIボラティリティ・ディスタンスはこの異常を検出することができます。
- ロジック:価格が急騰したにもかかわらず、マトリックス値が低い効率性(方向性)を示している場合、EAはそれを潜在的なストップハンティングとして検知します。
- 実装:EAは、カットロスを実行したり静的なSLを設定したりする代わりに、ボラティリティが収まるまでSLの保護範囲(ダイナミックSL)を自動的に広げ、その後、より最適な回復ポイントを探します。
コードスニペット
// 例:ボラティリティの異常検出(ストップハント対策フィルター) double matrix_value = MatrixEngine.Calculate(1, high, low, close); // ATRはボラティリティの基準指標として機能する double atr_baseline = iATR(_Symbol, _Period, 14); // 予想ボラティリティの範囲に対する市場の異常な拡大を検出する if(matrix_value > (atr_baseline * 2.5)) { Print("Warning: Volatility anomaly detected. Quantum SL Defense activated."); // 防護措置: // - 新規ポジションの開設を防止する。 // - 既存のポジションのストップロスを動的に拡大する // ストップハント現象が発生する確率を低減するため。 ModifySLToSafeZone(matrix_value); }
2. 適応型スマートグリッド&平均化アルゴリズム
標準的なグリッドシステムの弱点の一つは、間隔(ステップ)が固定されていることであり、これは一方向のトレンドが強い場合に特に危険です。
- ロジック:グリッドの間隔を、静的な値(ポイント)から、KCI ボラティリティ・ディスタンスの出力結果に掛け合わせた動的な係数に変換します。
- 実装:市場が横ばい(マトリックスが拡大)の場合、グリッドライン間の距離も広がります。これにより、EAが単一のコンソリデーションエリアで過度に多くのポジションを建てることを防ぎ、XAUUSD、BTC、US30のような値動きの激しい資産におけるドローダウンにも非常に安全に耐えることができます。
コードスニペット
// 例:適応型グリッドの距離計算 input double GridMultiplier = 1.5; // 最新の方向行列の測定値を取得する double current_matrix = MatrixEngine.Calculate(0, high, low, close); // 行列の値を用いて適応型格子間隔を導出する // 現在の市場状況を動的に表したものとして double dynamic_grid_step = current_matrix * GridMultiplier; // 相場が動いた後にのみ、新しいグリッドポジションを開く // 動的に計算された間隔の閾値を超える場合 if(MathAbs(CurrentPrice - LastOrderPrice) >= dynamic_grid_step) { // 次のグリッド注文/平均化注文を実行する ExecuteGridOrder(); }
3. 機械学習(ML)のための特徴量正規化
モジュール:ニューラルネットワークモデルは、ブローカー間や資産クラス間の価格桁数の違い(例:WTI原油価格とマイナーなFXペアとの著しい価格差)による歪みを受けずに、パターンを正確に認識するために、正規化された入力データを必要とします。
- ロジック:KCIボラティリティ・ディスタンスの計算式には、効率比(ER)の算出が含まれており、これにより自然に0から1のスケール比が生成されます。
- 実装:OOPクラスを若干修正して、純粋なER値を返すようにすることができます。この行列値の配列は、パターンラーナー向けの非常にクリーンでノイズのないトレーニングデータセットとして配列に抽出されます。
--------- その他のオプション ---------
モジュール型 ヘッダーファイルの例 (KCIVD.mqh)
以下のコードを MQL5\Include\ フォルダに KCIVD.mqh として保存してください。このファイルは、インジケーター、エキスパートアドバイザー、および ML モジュールから呼び出されるメインエンジンとなります。
コードスニペット
//+------------------------------------------------------------------+ //| KCIVD.mqh | //| Copyright 2026, KCI Developer | //| https://www.mql5.com/ja/users/ritzfalih | //+------------------------------------------------------------------+ #property copyright "Copyright 2026, KCI Developer" #property link "https://www.mql5.com/ja/users/ritzfalih" #property version "1.0" class CKCIVolatilityDistance { private: int m_kinetic_period; double m_point; public: CKCIVolatilityDistance(void); ~CKCIVolatilityDistance(void); bool Init(const int period); double Calculate(const int index, const double &high[], const double &low[], const double &close[]); }; //+------------------------------------------------------------------+ //| コンストラクタ | //+------------------------------------------------------------------+ CKCIVolatilityDistance::CKCIVolatilityDistance(void) { m_kinetic_period = 14; m_point = _Point; } //+------------------------------------------------------------------+ //| デストラクタ | //+------------------------------------------------------------------+ CKCIVolatilityDistance::~CKCIVolatilityDistance(void) { } //+------------------------------------------------------------------+ //| 初期化 | //+------------------------------------------------------------------+ bool CKCIVolatilityDistance::Init(const int period) { if(period < 2) { Print("[KCI VD Error] Period must be at least 2"); return(false); } m_kinetic_period = period; m_point = _Point; if(m_point <= 0) m_point = 0.00001; // 安全のためのフォールバック return(true); } //+------------------------------------------------------------------+ //| コア計算エンジン(CPUおよび処理速度に最適化) | //| 注:配列は Series として設定する必要があります(ArraySetAsSeries = true) | //+------------------------------------------------------------------+ double CKCIVolatilityDistance::Calculate(const int index, const double &high[], const double &low[], const double &close[]) { double sum_TR = 0.0; double sum_sq_TR = 0.0; double path_length = 0.0; // --- 1. ネストされた関数を使わない最適化されたループ --- for(int j = 0; j < m_kinetic_period; j++) { int curr_idx = index + j; // トゥルーレンジの比較速度の最適化(多重のMathMaxを回避) double hl = high[curr_idx] - low[curr_idx]; double hc = MathAbs(high[curr_idx] - close[curr_idx + 1]); double lc = MathAbs(low[curr_idx] - close[curr_idx + 1]); double tr = hl; if(hc > tr) tr = hc; if(lc > tr) tr = lc; sum_TR += tr; sum_sq_TR += (tr * tr); // 終値の変動幅(効率比率) if(j < m_kinetic_period - 1) { path_length += MathAbs(close[curr_idx] - close[curr_idx + 1]); } } // --- 2. 効率比の計算 --- double net_distance = MathAbs(close[index] - close[index + m_kinetic_period - 1]); if(path_length < net_distance) path_length = net_distance; // 論理的な制限 if(path_length == 0.0) path_length = m_point; // ゼロ除算の防止 double efficiency_ratio = net_distance / path_length; // --- 3. KCIの標準偏差の算出 --- double mean_TR = sum_TR / m_kinetic_period; double variance = (sum_sq_TR / m_kinetic_period) - (mean_TR * mean_TR); if(variance < 0.0) variance = 0.0; // 浮動小数点数の精度補正 double std_TR = MathSqrt(variance); // --- 4. KCI VD の最終値の出力 --- return(std_TR * (2.0 - efficiency_ratio)); }
ビジュアルインジケーターファイル (KCI_Volatility_Distance.mq5)--- その他のオプション ---
このコードを MQL5\Indicators\ フォルダに保存してください。このインジケーターは、上記の .mqh ファイルから OOP 構造を呼び出すため、非常にすっきりとした構成になっています。
コードスニペット
//+------------------------------------------------------------------+ //| KCI Volatility Distance.mq5 | //| Copyright 2026, KCI Developer | //| https://www.mql5.com/ja/users/ritzfalih | //+------------------------------------------------------------------+ #property copyright "Copyright 2026, KCI Developer" #property link "https://www.mql5.com/ja/users/ritzfalih" #property description "KCI Volatility Distance - Indicator Module" #property indicator_separate_window #property indicator_buffers 1 #property indicator_plots 1 #property indicator_label1 "KCI-VD" #property indicator_type1 DRAW_LINE #property indicator_color1 clrGold #property indicator_style1 STYLE_SOLID #property indicator_width1 1 // Mesin Utama KCIVD をインクルードする #include <KCIVD.mqh> // --- 入力 --- input group "=== KCI Volatility Settings ===" input int KineticPeriod = 14; // 計算期間(2以上) // --- バッファ --- double KVR_Buffer[]; // グローバルオブジェクトのインスタンス CKCIVolatilityDistance kci_engine; //+------------------------------------------------------------------+ //| カスタムインジケーターの初期化関数 | //+------------------------------------------------------------------+ int OnInit() { if(!kci_engine.Init(KineticPeriod)) return(INIT_PARAMETERS_INCORRECT); SetIndexBuffer(0, KVR_Buffer, INDICATOR_DATA); PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0.0); ArraySetAsSeries(KVR_Buffer, true); IndicatorSetInteger(INDICATOR_DIGITS, _Digits); IndicatorSetString(INDICATOR_SHORTNAME, "KCI-VD(" + IntegerToString(KineticPeriod) + ")"); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| カスタムインジケーターの反復処理関数 | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { if(rates_total < KineticPeriod + 2) return(0); // 組み込みの配列をシリーズとして設定する ArraySetAsSeries(high, true); ArraySetAsSeries(low, true); ArraySetAsSeries(close, true); if(prev_calculated == 0) { ArrayInitialize(KVR_Buffer, 0.0); } int limit = (prev_calculated == 0) ? (rates_total - KineticPeriod - 2) : (rates_total - prev_calculated + 1); // オブジェクト指向プログラミング(OOP)のオブジェクトを介して計算エンジンを実行する for(int i = limit; i >= 0 && !IsStopped(); i--) { KVR_Buffer[i] = kci_engine.Calculate(i, high, low, close); } return(rates_total); }
クロス機能統合ガイド(EA/MLでの使用方法)
CKCIVolatilityDistance クラス構造を使用すれば、あらゆるエキスパート・アドバイザーで直接利用でき、最高のパフォーマンスを発揮できます。以下に、その論理的な実装例を示します:
機械学習モジュールへの統合(特徴量抽出/シグナル検証)
入力特徴量としてボラティリティの正規化を必要とするニューラルネットワークやパターン学習モジュールがある場合、KCI VD値を純粋に抽出することができます:
コードスニペット
#include <KCIVD.mqh> CKCIVolatilityDistance KCI_ML; int OnInit() { // KCIボラティリティ・ディスタンス・エンジンを初期化する // 希望する計算期間を指定して。 KCI_ML.Init(14); return(INIT_SUCCEEDED); } void GetMLFeatures() { double high[], low[], close[]; // 十分な量の過去の価格データをコピーする // (例:直近の50バー)をローカル配列に格納する。 CopyHigh(_Symbol, _Period, 0, 50, high); CopyLow(_Symbol, _Period, 0, 50, low); CopyClose(_Symbol, _Period, 0, 50, close); ArraySetAsSeries(high, true); ArraySetAsSeries(low, true); ArraySetAsSeries(close, true); // のKCIボラティリティ・ディスタンス値を計算する // 現在のバー(インデックス 0)または直近の終値バー(インデックス 1)。 double kci_current_volatility = KCI_ML.Calculate(0, high, low, close); // 「kci_current_volatility」をニューラルネットワークに入力する // 信号の検証または予測のための特徴ベクトル。 }
4. マルチシンボル・スキャナー(ダッシュボード指標)
KCIDirectionalMatrixはiCustomに依存せず、ローカルメモリを迅速に解放するため、マルチシンボルダッシュボード上のシグナル検索エンジンとして最適です。
- ロジック:1つのチャートに1つのダッシュボードインジケーターをインストールしますが、マトリックス計算ループを反復させ、20~30の異なる銘柄を同時に処理します。
- 実装:このインジケーターは、マーケットウォッチ全体(メジャー通貨、クロス通貨、貴金属、指数)をスキャンし、マトリックス値が収縮している(ブレイクアウトの準備中)か、あるいは強いトレンドの勢いを見せている資産を特定します。これにより、Windows Server VPSの遅延やCPUへの過負荷を防ぐことができます。
コードスニペット
// 例:マルチアセット市場スキャンエンジン string symbols[] = {"EURUSD", "GBPUSD", "XAUUSD", "BTCUSD", "US30"}; for(int s = 0; s < ArraySize(symbols); s++) { // 必要な過去の市場データを読み込む // 現在の取引銘柄について。 // ... // 方向性の強さを評価する // 直近で形成されたローソク足の。 double strength = MatrixEngine.Calculate(1, h, l, c); // 以下の条件が満たされた場合にのみ、売買シグナルを生成する // 方向性の強さが設定された閾値を超えています。 if(strength > Threshold) { // 検出した情報をダッシュボードに反映する // 現在の銘柄の買い・売りのチャンス。 DrawDashboardSignal(symbols[s], strength); } }
これはKCIボラティリティ・ディスタンスのコードです。少なくとも、このコードは様々な目的に利用可能です。標準のMT5インジケーターやカスタムMT5インジケーターと組み合わせてさらに開発を進めれば、より高い精度と緻密な分析を実現できます。
MetaQuotes Ltdによって英語から翻訳されました。
元のコード: https://www.mql5.com/en/code/74838
Double Enevlopes (Historical Gauged)
ベビーシッター業務管理ツールおよびシステム :D
KCI Directional Matrix
KCI-Directional Matrix(KCI-DX)は、価格の推移距離とボラティリティエネルギーを測定することで市場の運動学を抽出する、物理学に着想を得た高度な分析ツールです。 従来のモメンタム分析ツールとは異なり、KCI-DXはシグモイド活性化関数と組み合わせた動的なZスコア正規化を採用しています。これにより、出力値が0から100の範囲に確実に収まるよう保証され、過去の極端な値による歪みなく、極めて反応性の高いトレンドの強さの特定と方向性のバイアスを提供します。


