無料でロボットをダウンロードする方法を見る
Twitter上で私たちを見つけてください。
私たちのファンページに参加してください
興味深いスクリプト?
それではリンクにそれを投稿してください。-
他の人にそれを評価してもらいます
スクリプトを気に入りましたか?MetaTrader 5ターミナルの中でそれを試してみてください。
インディケータ

KCI Standard: A Pure Kinematic Computing Engine for Market Singularity Detection - MetaTrader 5のためのインディケータ

Syamsurizal Dimjati
Syamsurizal Dimjati
Hello traders, I design and develop high-quality indicators and Expert Advisors (EAs) for MT5 (since 2023), built to help you achieve more consistent and reliable trading results.
| Japanese English Русский 中文 Español Deutsch Português 한국어 Français Italiano Türkçe
ビュー:
9
評価:
(1)
パブリッシュ済み:
MQL5フリーランス このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動

要旨

キネティック・コンプレッション・インデックス(KCI)は、市場の疲弊や局所的な価格圧縮現象を検知するために設計された独自のオシレーターです。 KCIは、外部の標準的なインジケーターのハンドルに依存するのではなく、内部で運動学的指標を計算することで、オーバーヘッドを低減し、エキスパートアドバイザー(EA)への統合におけるバッファ管理を簡素化します。本記事では、MetaTrader 5にこのツールを実装しようとする開発者向けに、その数学的基礎、システムアーキテクチャ、バッファマッピング、および実践的な統合ガイドについて詳しく解説します。


はじめに

アルゴリズム取引において、複数の外部インジケーターハンドルへの依存度を低減することで、エキスパートアドバイザー(EA)のアーキテクチャを合理化できます。複数のiCustomや標準インジケーターハンドル(移動平均や標準偏差など)を呼び出すと、バッファ管理や初期化プロセスが複雑になる場合があります。

KCIは、価格データと出来高データを単一のファイル内でネイティブに処理するように設計されています。価格変動の急激な減速と出来高の減少を組み合わせて識別することで、局所的な平均回帰が統計的に起こりやすい「枯渇イベント」を特定することを目的としています。

問題の定義

KCIアーキテクチャの主な目標は以下の通りです:

  1. ハンドルへの依存を低減する: 移動平均や偏差をインジケータのループ内でネイティブに計算し、外部ハンドルの使用を最小限に抑える。

  2. 再現可能な指標の提供: クリーンで透明性の高い数学的指標(速度、偏差、分散)をEAに公開する。

  3. 非同期処理の安全性を確保する: クローズされたバーでのみ検証を行うシグナルバッファを構築し、バー内での再描画や非同期ティックデータの遅延からEAを保護する。

理論と数学的基礎

KCIは4つの基本指標に基づいて構築されています。完全な再現性を確保するため、中核となる数式は次のように定義されます(ここで$n$は BasePeriodです):

理論と数学的基礎

図の説明:

1. **Velocity Quotient (VQ)** – Measures the rate of price change.
VQ_i=\frac{Close_i-Close_{i-n}}{n}
Where:
- \(Close_i\) = current closing price
- \(Close_{i-n}\) = closing price \(n\) bars ago
- \(n\) = lookback period

2. **Kinetic Displacement (KD)** – Measures the deviation of the current price from its local mean.
KD_i=Close_i-SMA(Close,n)_i
Where:
- \(SMA(Close,n)_i\) = Simple Moving Average of the closing price over the last \(n\) periods.
3. **Energy Dispersion (ED)** – Acts as a dynamic volatility proxy, calculated as the standard deviation of the closing price.
ED_i=\sqrt{\frac{\sum_{j=0}^{n-1}\left(Close_{i-j}-SMA_i\right)^2}{n}}
Where:
- \(SMA_i\) = local Simple Moving Average at bar \(i\).

4. **Phase Velocity (PV)** – Tracks the immediate momentum of the Velocity Quotient.
PV_i=VQ_i-VQ_{i-1}
Where:
- \(VQ_i\) = current Velocity Quotient
- \(VQ_{i-1}\) = previous Velocity Quotient

// Or

1. Velocity Quotient (VQ)
VQ(i) = (Close(i) - Close(i-n)) / n

2. Kinetic Displacement (KD)
KD(i) = Close(i) - SMA(Close, n)

3. Energy Dispersion (ED)
                n-1
               -----
               \
ED(i) = sqrt(  /    (Close(i-j) - SMA(i))² / n )
               -----
               j=0

4. Phase Velocity (PV)
PV(i) = VQ(i) - VQ(i-1)



Zスコア正規化:
これら4つの指標はスケールが異なる(例:価格ポイント対純粋なレート)ため、Raw_KCI に合算される前に、定義された ZScorePeriod におけるローリングZスコアを用いて正規化されます。

    システムアーキテクチャと統一バッファマップ

    CopyBuffer() の呼び出し中に頻繁に発生する「インデックス範囲外」やバッファの不一致によるエラーを防ぐため、KCI は以下の統一バッファマップを厳格に遵守しています。このマッピングは、#property 宣言、SetIndexBuffer()、および EA 統合において一貫しています。

    バッファインデックス バッファ名 目的
    0 KCI_Main INDICATOR_DATA 可視偏光発振器ライン
    1 KCI_Color INDICATOR_COLOR_INDEX メインラインの動的カラーマッピング
    2 Signal_Buy INDICATOR_DATA 買いシグナル (1.0 = 買い、0.0 = 中立)
    3 売りシグナル INDICATOR_DATA 売りシグナル (1.0 = 売り、0.0 = 中立)
    4 Internal_VQ INDICATOR_CALCULATIONS ベロシティ・クオティエント配列
    5 Internal_KD INDICATOR_CALCULATIONS 運動変位配列
    6 Internal_ED INDICATOR_CALCULATIONS エネルギー分散配列(SL/TP用)
    7 Internal_PV INDICATOR_CALCULATIONS 位相速度配列
    8 Raw_KCI INDICATOR_CALCULATIONS 正規化行列の和

    コード解説:EAの統合とリスク管理

    EAからKCIを呼び出す際、コードではインジケーターのハンドルのライフサイクルを適切に処理し、CopyBufferがデータを正常に取得できたことを確認するとともに、ストップロス(SL)およびテイクプロフィット(TP)の価格計算を、銘柄の桁数に応じて正規化する必要があります。

    以下に、修正済みで堅牢なEA統合テンプレートを示します:

    #include <Trade\Trade.mqh>
    CTrade trade;
    
    int handle_kci;
    datetime last_bar_time = 0;
    double buf_buy[], buf_sell[], buf_ed[];
    
    int OnInit()
    {
        // KCIハンドルを初期化する
        handle_kci = iCustom(_Symbol, _Period, "KCI", 50, 2.0, 14);
        
        if(handle_kci == INVALID_HANDLE) 
        {
            Print("Failed to create KCI handle!");
            return(INIT_FAILED);
        }
        
        ArraySetAsSeries(buf_buy, true);
        ArraySetAsSeries(buf_sell, true);
        ArraySetAsSeries(buf_ed, true);
        
        return(INIT_SUCCEEDED);
    }
    
    void OnDeinit(const int reason)
    {
        if(handle_kci != INVALID_HANDLE)
            IndicatorRelease(handle_kci);
    }
    
    void OnTick()
    {
        datetime current_time = (datetime)SeriesInfoInteger(_Symbol, _Period, SERIES_LASTBAR_DATE);
        if(current_time == last_bar_time) return; 
        
        // 基本フィルター:シンボルごとに1つのポジションのみ
        if(PositionsTotal() > 0) 
        {
            for(int i = PositionsTotal() - 1; i >= 0; i--)
            {
                if(PositionGetSymbol(i) == _Symbol) return; 
            }
        }
    
        // データの取得(バッファ2=買い、バッファ3=売り、バッファ6=ED)
        if(CopyBuffer(handle_kci, 2, 1, 1, buf_buy) <= 0) return;
        if(CopyBuffer(handle_kci, 3, 1, 1, buf_sell) <= 0) return;
        if(CopyBuffer(handle_kci, 6, 1, 1, buf_ed) <= 0) return;
    
        // データのコピーが正常に完了した後にのみ、時間をロックする
        last_bar_time = current_time;
    
        double dynamic_volatility = buf_ed[0];
        if(dynamic_volatility == 0) return;
    
        double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
        int digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS);
        double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
        double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
    
        // 正規化された動的ボラティリティ・ストップロスを用いた実行ロジック
        if(buf_buy[0] == 1.0)
        {
            double sl = NormalizeDouble(ask - (dynamic_volatility * 1.5), digits);
            double tp = NormalizeDouble(ask + (dynamic_volatility * 3.0), digits);
            trade.Buy(0.01, _Symbol, ask, sl, tp, "KCI Buy");
        }
        
        if(buf_sell[0] == 1.0)
        {
            double sl = NormalizeDouble(bid + (dynamic_volatility * 1.5), digits);
            double tp = NormalizeDouble(bid - (dynamic_volatility * 3.0), digits);
            trade.Sell(0.01, _Symbol, bid, sl, tp, "KCI Sell");
        }
    }

    性能と制限事項

    現実的な期待値を設定するためには、開発者は以下の構造上の制限を考慮する必要があります:

    1. ティック・ボリュームへの依存性: FX/CFDにおいて、tick_volumeは価格変動の頻度を表すものであり、実際の流動性を表すものではありません。実際の出来高が把握できる集中型取引所(株式/先物)では、出来高圧縮指標の挙動が異なる場合があります。

    2. 平均回帰への脆弱性: KCIは境界付きオシレーターとして、トレンドの枯渇を捉えることを目的としています。強いトレンド相場では、時期尚早な反転シグナルが連続して発生する可能性があります。より高い時間足でのトレンドフィルター(例:EMA 200)と組み合わせて使用する必要があります。

    3. 低時間足におけるノイズ: この指標をM1やM5で利用すると、ロジックがマイクロストラクチャのノイズの影響を受けやすくなります。Zスコアの正規化には安定した分布が必要であり、これはM15以上の時間足でより適切に得られます。

    結論

    キネティック・コンプレッション・インデックス(KCI)は、複数の標準的な指標を積み重ねる代わりに、透明性が高く、ネイティブに計算される代替手段を提供します。統一されたバッファマップを通じて、クローズしたバーにおける方向性シグナルと動的なボラティリティの代用指標(エネルギー分散)の両方を提示することで、MQL5エキスパートアドバイザーにとって信頼性の高い構造的コンポーネントとして機能します。

    チャート上での実装:(KCIカスタム)

    キネティック圧縮指数(KCI)カスタム

    MetaQuotes Ltdによって英語から翻訳されました。
    元のコード: https://www.mql5.com/en/code/74580

    EA KCI Embeded Sniper EA KCI Embeded Sniper

    KCI Embedded Sniperは、高精度な反転エントリーを目的として設計されたアルゴリズム取引ソリューションです。外部インジケーターへの依存(スレッドの非同期化や遅延の問題が生じやすい)に頼る従来のエキスパートアドバイザーとは異なり、このEAは完全に組み込まれたキネティック圧縮指数(KCI)エンジンを特徴としています。 KCIの数学的フレームワーク全体(速度商、運動変位、エネルギー分散、位相速度の計算)をEAの中核ロジックに直接組み込むことで、「非同期による遅延」を排除しました。 その結果、市場の枯渇(シンギュラリティ)やモメンタムの極値(ウィリアムズ%R)をマイクロ秒単位の精度で検証する、超高速のスナイパーエンジンが実現しました。このエンジンは、完了したバーのみを基に動作するため、リペイントゼロのパフォーマンスを保証します。

    Multi-Timeframe Candle Map Multi-Timeframe Candle Map

    4本の形成中のローソク足の中にリアルタイムの価格を縦軸でプロットし、位置の整列状況、ばらつき、ローソク足の方向、および残り時間をまとめて表示する、教育用MT5パネルです。

    Adaptive Moving Average (AMA) Adaptive Moving Average (AMA)

    適応移動平均線は、ノイズの影響を受けにくい移動平均線を作るときに使われ、トレンドを検知する際にラグが最小に抑えられるという特徴を持ちます。

    Accelerator Oscillator (AC) Accelerator Oscillator (AC)

    アクセルレーション/デセレレーションインジケーター(AC)は現在の市場を動かす力の加速と減速を測ります。