KCI Standard: A Pure Kinematic Computing Engine for Market Singularity Detection - MetaTrader 5脚本
- 显示:
- 9
- 等级:
- 已发布:
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
摘要
动能压缩指数(KCI)是一种专为检测市场动能枯竭及局部压缩事件而设计的自定义振荡指标。 KCI 通过在内部计算其运动学指标,而非依赖外部标准指标参数,从而降低了系统开销,并简化了专家顾问(EA)集成中的缓冲区管理。本文详细介绍了该工具的数学基础、系统架构、缓冲区映射以及实用的集成指南,供希望在 MetaTrader 5 中实现该工具的开发者参考。引言
在算法交易中,减少对多个外部指标句柄的依赖可以简化专家顾问(EA)的架构。调用多个 iCustom 或标准指标句柄(如移动平均线和标准差)有时会使缓冲区管理和初始化过程变得复杂。
KCI 旨在通过单个文件原生处理价格和成交量数据。通过识别价格走势的快速减速与成交量下降的组合,该指标旨在精准定位动能耗尽事件——即从统计学角度看局部均值回归极有可能发生的点位。
问题陈述
KCI 架构的主要目标是:
-
减少句柄依赖: 在指标循环内部原生计算移动平均值和偏差,以最大限度地减少对外部句柄的使用。
-
提供可复现的指标: 向EA提供清晰、透明的数学指标(速度、偏差和离散度)。
-
确保异步安全性: 构建仅在收盘K线时进行验证的信号缓冲区,保护EA免受K线内重绘和异步 tick 数据延迟的影响。
理论与数学基础
KCI 基于四项基本指标构建。为确保完全可重现性,核心公式定义如下(其中$n$ 为基准周期):

图文说明:
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 分数标准化: 由于这四项指标的量纲不同(例如,价格点与纯比率),因此在汇总为 Raw_KCI 之前,会使用在定义的 ZScorePeriod 内计算的滚动 Z 分数对其进行标准化。
系统架构与统一缓冲区映射
为防止在调用 CopyBuffer() 时出现常见的“索引越界”或缓冲区不匹配错误,KCI 严格遵循以下统一的缓冲区映射。该映射在 #property 声明、SetIndexBuffer() 以及 EA 集成中保持一致。| 缓冲区索引 | 缓冲区名称 | 类型 | 用途 |
| 0 | KCI_Main | INDICATOR_DATA | 可视偏振振荡器线路 |
| 1 | KCI_Color | 指标_颜色_索引 | 主线的动态颜色映射 |
| 2 | 买入信号 | INDICATOR_DATA | 买入信号(1.0 = 买入,0.0 = 中性) |
| 3 | 卖出信号 | 指标数据 | 卖出信号(1.0 = 卖出,0.0 = 中性) |
| 4 | 内部_VQ | 指标_计算 | 速度商数组 |
| 5 | Internal_KD | 指标计算 | 动能位移数组 |
| 6 | Internal_ED | 指标计算 | 能量色散数组(用于SL/TP) |
| 7 | Internal_PV | 指标计算 | 相速度数组 |
| 8 | 原始KCI | 指标计算 | 归一化矩阵之和 |
代码详解: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; // 基本过滤器:每个符号仅保留一个位置 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"); } }
性能与限制
为了确保预期符合实际情况,开发者必须考虑以下结构性限制:
-
tick_volume 依赖性: 对于外汇/差价合约(CFDs),tick_volume 代表价格变动的频率,而非实际流动性。在可获取真实成交量的中心化交易所(股票/期货)中,成交量压缩指标的表现可能有所不同。
-
均值回归风险: 作为一种有界震荡指标,KCI旨在捕捉动能耗尽的信号。在趋势强劲的市场中,它可能会连续产生过早的反转信号。应将其与更高时间周期的趋势过滤器(例如200日指数移动平均线)配合使用。
-
低时间周期噪声: 在M1或M5时间周期上使用该指标,会使指标逻辑受到微观结构噪声的影响。Z分值标准化需要稳定的分布,而这种分布在M15及以上时间周期上更易实现。
结论
动能压缩指数(KCI)提供了一种透明且原生计算的替代方案,无需叠加多个标准指标。通过统一的缓冲图同时展示收盘K线上的方向性信号和动态波动率代理指标(能量分散),它可作为MQL5专家顾问中可靠的结构组件。图表上的实现:(KCI 自定义)
由MetaQuotes Ltd译自英文
原代码: https://www.mql5.com/en/code/74580
EA KCI Embeded Sniper
KCI 嵌入式狙击手是一款专为高精度反转入场而设计的算法交易解决方案。与依赖外部指标(往往存在线程不同步和延迟问题)的传统专家顾问不同,该专家顾问搭载了完全嵌入式的动能压缩指数(KCI)引擎。 通过将 KCI 的完整数学框架——包括速度商、动能位移、能量散布和相速度的计算——直接移植到 EA 的核心逻辑中,我们消除了“异步延迟”。 其结果是一款闪电般迅捷的“狙击”引擎,能够以微秒级精度验证市场耗竭(奇点)和动量极端值(威廉姆斯%R),且仅基于已完成的K线运行,从而确保零重绘性能。
Multi-Timeframe Candle Map
一个教育类MT5面板,它将实时价格垂直映射到四根正在形成的K线内,并汇总显示位置对齐情况、分散程度、K线方向以及剩余时间。
