请观看如何免费下载自动交易
请在Facebook上找到我们!
加入我们粉丝页
有趣的脚本?
因此发布一个链接 -
让其他人评价
喜欢这个脚本? 在MetaTrader 5客户端尝试它
指标

KCI Directional Matrix - 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.
| Chinese English Русский Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
显示:
10
等级:
(2)
已发布:
MQL5自由职业者 需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务

KCI方向矩阵(KCI-DX)

是一种受物理学启发的先进分析工具,通过测量价格路径长度和波动率能量来提取市场运动学特征。 与传统的动量工具不同,KCI-DX 采用了动态 Z 分数归一化,并结合了 sigmoid 激活函数。这确保了输出值完美地限定在 0 到 100 之间,能够提供超敏捷的趋势强度识别和方向偏好,且不受历史极端值的影响。KCI 方向矩阵(KCI-DX) 是一款定量方向分析指标,旨在通过专有的动能压缩指数(Kinetic Compression Index)框架,衡量市场效率、方向压力及趋势扩张程度。

主要特点:

  • 运动学方向提取: 利用路径长度方差计算真实市场能量。
  • 动态S型缩放: 自适应归一化处理,防止指标出现平坦化。
  • 三线矩阵: 由主KCI(趋势/压缩强度)、+KDI(看涨运动学)和-KDI(看跌运动学)组成。

与传统的动量震荡指标不同,KCI-DX 将市场走势分解为三个独立维度:

  • 主KCI—— 衡量整体方向效率和趋势扩张强度。
  • +KDI(看涨动量方向指数)——量化看涨方向的主导性。
  • -KDI(看跌动量方向指数)——量化看跌方向的主导性。

该指标结合了:

  • 运动学方向提取
  • 路径效率分析
  • 能量加权走势评分
  • 动态Z分值标准化
  • S型曲线自适应缩放

最终生成一个稳定的0–100方向矩阵,能够识别:

  • 趋势扩张
  • 方向性主导
  • 压缩阶段
  • 动量加速
  • 波动率异常
  • 市场状态转换

KCI-DX 既可作为独立的交易工具使用,也可作为专家顾问、机器学习系统、市场扫描器、自适应网格、动态止损管理以及投资组合级决策引擎的特征工程组件。

输入参数:


KCI-DX:可视化快速入门指南

  • 可视化界面(所见即所得)
将 KCI-DX 添加到图表后,它会显示在主价格图表下方的独立窗口中。该界面由三条独立线两个关键区域 组成。
视觉元素 颜色与样式 含义
KCI 主线 金色(实线) 趋势强度与压缩。 显示市场中蕴含的动能大小,无论趋势方向如何。
+KDI线 蓝色(虚线) 看涨动能。 反映价格上涨的强度。
-KDI线 红色(虚线) 看跌动能。 价格下跌的强度。
80.0水平 灰色(点线) 极端/耗尽区。 趋势已达到极限。
20.0水平 灰色(虚线) 压缩/横盘区。 市场正在积蓄能量。

  • 市场阶段可视化(各区域)

观察黄金线(KCI主线) 的位置,即可瞬间掌握市场环境:

图1


    • 休眠区(0 至 20):
  • 视觉特征: 黄金线呈平缓状态,位于底部盘整。
  • 操作: 切勿交易。 市场处于横盘整理状态,被困在窄幅震荡区间内。

    • 行动区(20至80):
  • 视觉特征: 金线突破20水平线并陡峭上行。
  • 操作: 寻找入场点。 新趋势已形成。请参考蓝色或红色虚线判断方向。


    • 危险区(80至100):
  • 图示: 黄金线触及上档阻力位(80以上)。
  • 操作: 准备平仓。 当前趋势已严重超买,反转或深度回调迫在眉睫。

可视化交易设置(分步指南)

    • 情景A:看涨突破(买入)
  • 观察黄金线: 必须呈向上 交叉并突破20 水平线。
  • 检查虚线: 蓝线(+KDI) 必须上穿 红线(-KDI)
  • 操作: 建立多头 头寸。

    • 情景B:看跌突破(卖出)
  • 检查金色线: 它必须向上 交叉并突破20 水平线。(是的,即使在下跌趋势中它也会向上,因为下行动能正在增强!)
  • 检查虚线: 红线(-KDI) 必须向上 穿越并突破蓝线(+KDI)
  • 操作: 建立卖出 头寸。


    • 情景C:获利了结(平仓)
  • 观察黄金线: 您已持有头寸,且黄金线 触及或上穿80 水平线。
  • 操作: 将止损位移至盈亏平衡点,设置紧跟的追踪止损,或平仓以锁定利润。

图2


专业提示:蓝线红线 在20水平线下方缠绕在一起,切勿进行交易。请等待两线明确分离且黄金线突破!


KCI Directional Matrix Logic for Expert Advisors (EAs)

若在EA中使用该指标,可应用以下交易规则:

    • 买入入场逻辑(看涨):
  • KDI_Plus上穿KDI_Minus(金叉)。
  • 过滤条件:KCI_Main必须高于20水平(确认市场已脱离压缩/横盘区间)。

    • 卖出入场逻辑(看跌):
  • KDI Minus 向上穿越 KDI Plus(交叉)。
  • 筛选条件:KCI_Main必须高于20水平。

    • 平仓/止盈/追踪止损逻辑:
  • 若 KCI_Main 达到 80 水平(极端趋势),EA 应激活紧跟止损或进行部分止盈,因为趋势动能已达峰值,且存在回调的可能。


    • 不交易逻辑(横盘):
  • 若 KCI_Main 低于 20,EA 禁止开立新仓位,因为市场处于压缩区(能量较低)。


使用iCustom Call的EA代码示例

这是最优且推荐的方法。EA将调用位于Indicators文件夹中的KCI-Directional_X.ex5文件。

代码片段:

//+------------------------------------------------------------------+
//|                                                 EA_KCI_iCustom.mq5 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, Ritz"
#property version   "1.00"

int kci_handle;
double KCI_Main[], KDI_Plus[], KDI_Minus[];

int OnInit()
  {
   // 创建自定义指标句柄。
   // 确保“KCI-Directional_X.ex5”文件位于此处
   // 位于 MQL5/Indicators 目录中。
   kci_handle = iCustom(_Symbol, _Period, "KCI-Directional_X", 9, 30, 1.5);

   if(kci_handle == INVALID_HANDLE)
     {
      Print("Failed to load the KCI-DX indicator.");
      return(INIT_FAILED);
     }

   // 将指标缓冲区配置为时间序列
   //(索引 0 = 当前K线)。
   ArraySetAsSeries(KCI_Main, true);
   ArraySetAsSeries(KDI_Plus, true);
   ArraySetAsSeries(KDI_Minus, true);

   return(INIT_SUCCEEDED);
  }

void OnTick()
  {
   // 获取最新指标值
   //(当前K线和最近收盘的K线)。
   if(CopyBuffer(kci_handle, 0, 0, 2, KCI_Main) <= 0)
      return;

   if(CopyBuffer(kci_handle, 1, 0, 2, KDI_Plus) <= 0)
      return;

   if(CopyBuffer(kci_handle, 2, 0, 2, KDI_Minus) <= 0)
      return;

   // ------------------------------------------------------------
   // KCI-DX 交易逻辑
   // 所有交易决策均基于最后一根已收盘的K线
   // (索引 1) 以避免受到仍在形成中的K线发出的信号影响。
   // ------------------------------------------------------------

   // 检测市场是否处于趋势状态。
   bool isTrending = KCI_Main[1] > 20.0;

   // 检测看涨方向性交叉。
   bool buySignal  = (KDI_Plus[1] > KDI_Minus[1]) &&
                     (KDI_Plus[2] <= KDI_Minus[2]);

   // 检测看跌方向的交叉信号。
   bool sellSignal = (KDI_Minus[1] > KDI_Plus[1]) &&
                     (KDI_Minus[2] <= KDI_Plus[2]);

   // 检测极端趋势扩张。
   bool isExtreme  = KCI_Main[1] >= 80.0;

   // 交易执行逻辑示例。
   if(isTrending && buySignal)
     {
      Print("KCI-DX BUY signal detected.");

      // 下达买入订单并执行
      // 此处为 (OrderSend 或 CTrade::Buy)。
     }
   else if(isTrending && sellSignal)
     {
      Print("KCI-DX SELL signal detected.");

      // 下达卖单并执行
      // 此处为 (OrderSend 或 CTrade::Sell)。
     }

   // 针对强劲市场趋势的可选交易管理策略。
   if(isExtreme)
     {
      Print("Extreme trend detected. Consider activating a trailing stop or managing existing positions.");
     }
  }


包含嵌入式计算的EA代码示例(直接嵌入)(嵌入在EA的KCI-N Matrix引擎中)

此方法将您的数学算法直接集成到EA中,无需外部指标文件。由于Z-Score的计算需要历史数据,我们使用EA内部的特殊函数来处理价格数组。

代码片段:

//+------------------------------------------------------------------+
//|                                              EA_KCI_Embedded.mq5 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, Ritz"
#property version   "1.00"

input int    InpBasePeriod   = 9;
input int    InpZScorePeriod = 30;
input double InpSensitivity  = 1.5;

// 用于返回全部三个 KCI-DX 值的结构体
// 来自一次计算。
struct KCI_Result
  {
   double main;
   double plus;
   double minus;
  };

// 计算用于
// 动态归一化。
double EmbeddedZScore(double &data_array[], int period)
  {
   if(period < 2)
      return 0.0;

   double sum = 0.0;
   double sum_sq = 0.0;

   for(int i = 0; i < period; i++)
     {
      sum += data_array[i];
      sum_sq += data_array[i] * data_array[i];
     }

   double mean = sum / period;
   double variance = (sum_sq / period) - (mean * mean);

   if(variance <= 1 e-10)
      return 0.0;

   return (data_array[0] - mean) / MathSqrt(variance);
  }

// 计算指定
// 历史柱线(Shift)。
KCI_Result CalculateKCI(int shift)
  {
   KCI_Result res;
   res.main = 0.0;
   res.plus = 0.0;
   res.minus = 0.0;

   // 获取足够数量的历史收盘价
   // 同时适用于基准期和Z分值窗口。
   int required_bars = InpZScorePeriod + InpBasePeriod;

   double close[];
   ArraySetAsSeries(close, true);

   if(CopyClose(_Symbol, _Period, shift, required_bars, close) < required_bars)
      return res;   // 历史数据不足。

   double raw_plus[];
   double raw_minus[];
   double raw_trend[];

   ArrayResize(raw_plus, InpZScorePeriod);
   ArrayResize(raw_minus, InpZScorePeriod);
   ArrayResize(raw_trend, InpZScorePeriod);

   // ------------------------------------------------------------
   // 第一阶段:
   // 运动学方向提取
   // ------------------------------------------------------------
   for(int i = 0; i < InpZScorePeriod; i++)
     {
      double path_len = 0.000001;
      double net_up = 0.0;
      double net_dn = 0.0;
      double mean_p = 0.0;

      for(int j = 0; j < InpBasePeriod; j++)
        {
         double diff = close[i + j] - close[i + j + 1];

         path_len += MathAbs(diff);

         if(diff > 0)
            net_up += diff;
         else
            net_dn -= diff;

         mean_p += close[i + j];
        }

      mean_p /= InpBasePeriod;

      double var_p = 0.0;

      for(int j = 0; j < InpBasePeriod; j++)
         var_p += MathPow(close[i + j] - mean_p, 2);

      double energy = MathSqrt(var_p / InpBasePeriod);

      raw_plus[i]  = (net_up / path_len) * energy;
      raw_minus[i] = (net_dn / path_len) * energy;
      raw_trend[i] = (MathAbs(net_up - net_dn) / path_len) * energy;
     }

   // ------------------------------------------------------------
   // 第二阶段:
   // 动态 sigmoid 归一化
   // ------------------------------------------------------------
   double z_plus  = EmbeddedZScore(raw_plus, InpZScorePeriod);
   double z_minus = EmbeddedZScore(raw_minus, InpZScorePeriod);
   double z_trend = EmbeddedZScore(raw_trend, InpZScorePeriod);

   res.plus  = 100.0 / (1.0 + MathExp(-InpSensitivity * z_plus));
   res.minus = 100.0 / (1.0 + MathExp(-InpSensitivity * z_minus));
   res.main  = 100.0 / (1.0 + MathExp(-InpSensitivity * z_trend));

   return res;
  }

void OnTick()
  {
   // 计算该指标的KCI-DX值
   // 最近收盘的两根K线。
   KCI_Result kci_current = CalculateKCI(1);
   KCI_Result kci_prev    = CalculateKCI(2);

   // ------------------------------------------------------------
   // 交易逻辑示例
   // 检测看涨方向性交叉。
   // ------------------------------------------------------------
   bool buySignal =
      (kci_current.plus > kci_current.minus) &&
      (kci_prev.plus <= kci_prev.minus);

   // 仅当市场
   // 处于有效的趋势状态。
   if(kci_current.main > 20.0 && buySignal)
     {
      Print("Embedded KCI-DX detected a BUY signal.");

      // 下达买入订单并执行
      // 此处为 (OrderSend 或 CTrade::Buy)。
     }
  }


获得最佳效果的建议

在编译和交易之前,请牢记以下最佳实践,以充分发挥 KCI-Directional Matrix 的优势:

  • 资产灵活性: 默认参数(BasePeriod=9,ZScorePeriod=30)响应迅速,在主要货币对上表现尤为出色。 但是,如果您将其应用于黄金(XAUUSD)、加密货币(BTC/ETH)或指数等高波动性交易品种,请考虑适当增加 ZScorePeriod(例如调整为 40 或 50),以过滤掉过多的噪音。

  • 算法优化: 对于开发复杂或多符号系统的EA开发者,强烈建议使用上述提供的“嵌入式计算” 方法。该方法能将CPU占用率控制在极低水平,并确保您的专家顾问完全自成体系,无需调用外部指标。

  • 协同搭配: KCI-DX 是一个专用的运动学与波动率引擎。虽然它能提供出色的独立方向性偏好,但当与您喜爱的结构性过滤器(如支撑/阻力区)或成交量异常检测器结合使用以验证最终入场点时,其威力将真正显现。

结语

作者注/结论: 感谢您探索 KCI-Directional Matrix。该代码库的设计初衷,是致力于为 MQL5 社区提供一款轻量级、数学严谨且高度适应性的分析工具。 无论您是寻求精准动量耗尽点的 manual trader,还是将机器可读数据集成到专家顾问中的开发者,我都希望该指标能为您的项目奠定坚实的基础。

如果您认为此代码对您的交易系统有价值,欢迎在下方评论区留下评价、分享您的创意修改,或提出问题。让我们携手继续拓展算法交易的边界!

祝您编程愉快,交易安全,——Ritz


由MetaQuotes Ltd译自英文
原代码: https://www.mql5.com/en/code/74839

EA KCI N-Matrix engine EA KCI N-Matrix engine

算法网格与动量交易的精髓。 欢迎使用 KCI 原生矩阵引擎——一款专为 MetaTrader 5 原生打造、由数学驱动且毫不留情的算法巨兽。该引擎专为高频交易(HFT)环境设计,摒弃了臃肿的标准库,直接在服务器路由层运行。

Envelope SAR Envelope SAR

该指标是一种趋势动量震荡指标,它利用抛物线SAR与包络线之间的标准化关系,追踪价格相对于其结构性波动通道的位置。

加速震荡(AC) 加速震荡(AC)

加速/减速技术指标(AC)用于衡量当前驱动力的加速和减速。

离散 离散

离散技术指标由价格和交易量的变化决定。