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

KCI Volatility Distance - 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
显示:
220
等级:
(2)
已发布:
已更新:
MQL5自由职业者 需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务

简介:

KCI波动率距离 指标是一种经过精心设计的先进自适应算法,旨在以极高的精度精准描绘市场动能与趋势方向。 该工具采用专有的矩阵计算方法,能够动态过滤市场噪音,并从严格的定量角度分析趋势强度。其核心基于高度优化的面向对象编程(OOP)架构,既能提供直观的交易视图,又能无缝集成到专家顾问或机器

学习模块,确保在多种资产上实现超轻量级的CPU性能。

功能与说明

  • 矩阵动量引擎: 在多维数组框架内计算内部价格动态。功能: 在重大突破发生之前,识别当前市场方向的真实、潜在强度,为早期趋势检测提供优势。
  • 动态噪声过滤器: 一种根据实时市场状况自动重新校准的自适应机制。功能: 在盘整或成交量低迷期间自动抑制虚假信号和异常价格飙升,防止自动化算法执行过早的交易。
  • 趋势强度输出: 将复杂的数学矩阵值转化为清晰、独立的数值流。功能: 作为自动化系统中精准入场触发、趋势延续形态验证或动态仓位调整的权威指标。

系统要求

  • 技术指标 / 算法交易核心 / 定量分析工具。
  • 高度优化的执行性能,极其轻量级,在VPS环境下CPU占用率极低(< 50 KB)。
  • 开源脚本(.mq5 文件),采用嵌入式面向对象编程(OOP)类架构。

图 1

KCI-VD

图 3


简单的参数设置

图 2



KCI 波动率距离 集成指南:将其集成到专家顾问(EA)中

将该算法集成到EA中有两种主要方法。强烈建议采用第一种方法(嵌入式面向对象编程),以实现最高的CPU效率和机器学习数据集的收集。第二种方法(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 表示最新 K 线)
   ArraySetAsSeries(high, true);
   ArraySetAsSeries(low, true);
   ArraySetAsSeries(close, true);

   // 计算最近收盘K线(索引为1)的矩阵输出
   double current_matrix_strength = MatrixEngine.Calculate(1, high, low, close);

   // --- A. 机器学习/特征提取模块 ---
   // 将“current_matrix_strength”作为输入 feeding 到你的神经网络中
   // 或将 AI 特征向量作为输入变量。

   // --- B. 交易决策模块(信号过滤) ---
   if(current_matrix_strength > EntryThreshold)
     {
      // 动量验证通过。
      // 市场走势被认为足够强劲。

      // -> 根据此处执行买入或卖出订单
      //    与您的EA的方向性策略相匹配。

      // -> 或者,使用此值来动态
      //    调整智能电网的间距或其他自适应参数。
     }
  }

方法 2:通过 iCustom() 调用

如果您单独发布 KCI 波动距离指标的 .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 线)中读取最近的两个值
   if(CopyBuffer(MatrixHandle, 0, 0, 2, MatrixBuffer) <= 0)
     {
      Print("Failed to copy matrix buffer data.");
      return;
     }

   // 来自最近收盘K线的矩阵值
   double current_matrix_strength = MatrixBuffer[1];

   // 当前正在形成的K线(实时)的矩阵值
   double previous_matrix_strength = MatrixBuffer[0];

   // --- 交易决策逻辑 ---
   if(current_matrix_strength > previous_matrix_strength)
     {
      // 势头正在扩大。
      // -> 将此作为额外确认手段,用于
      //    增加止盈距离。
      //
      // -> 或者,将其用于触发自适应
      //    追踪止损调整。
     }
  }

鉴于 KCI 波动距离指标具有高度适应性和低 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波动距离的一些战略性实现方案:

1. 反止损猎杀防御系统(动态止损与止盈)

价格的突然波动往往是流动性陷阱(liquidity grab 或stop-hunt),而非真实的趋势。KCI 波动距离能够检测到这种异常情况。

  • 逻辑:若出现价格急剧飙升,但矩阵值显示效率(方向性)较低,EA将判定其为潜在的止损猎杀。
  • 实现方式:EA 不会执行止损或设置静态止损,而是会自动扩大止损保护范围(动态止损),直至波动性平息,随后寻找更优的回调点。

代码片段

// 示例:波动率异常检测(反止损猎杀过滤器)
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原油价格与次要外汇货币对之间的巨大差异)。

  • 逻辑:在 KCI 波动率距离公式中,包含效率比率(ER)的计算,该计算会自然生成 0 到 1 之间的比例值。
  • 实现:您可以对面向对象编程(OOP)类进行微调,使其返回纯ER值。该矩阵值数组被提取为一个数组,作为“模式学习器”的训练数据集,其结构非常简洁且无噪声。

--------- 其他选项 ---------

模块化 头文件示例 (KCIVD.mqh)

将以下代码保存为 KCIVD.mqh,并放置在 MQL5\Include\ 文件夹中。该文件将成为指标、专家顾问和机器学习模块所调用的核心引擎。

代码片段

//+------------------------------------------------------------------+
//|                                                        KCIVD.mqh |
//|                                   版权所有 2026,KCI Developer |
//|                         https://www.mql5.com/zh/users/ritzfalih |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, KCI Developer"
#property link      "https://www.mql5.com/zh/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 和速度进行了优化)              |
//| 注意:数组必须设置为系列(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;
      
      // 优化真实波动范围(True Range)的比较速度(避免多级 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 波动率距离.mq5 |
//|                                   版权所有 2026,KCI Developer |
//|                         https://www.mql5.com/zh/users/ritzfalih |
//+------------------------------------------------------------------+
#property copyright   "Copyright 2026, KCI Developer"
#property link        "https://www.mql5.com/zh/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 个 K 线)存入局部数组中。
   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 波动距离值,针对
   // 当前K线(索引为0)或上一根收盘K线(索引为1)。
   double kci_current_volatility = KCI_ML.Calculate(0, high, low, close);

   // 将“kci_current_volatility”作为输入 feeding 到神经网络中
   // 用于信号验证或预测的特征向量。
  }

4. 多符号扫描器(仪表盘指标)

由于 KCIDirectionalMatrix 不依赖 iCustom 且能快速释放本地内存,因此非常适合作为多符号仪表盘上的信号搜索引擎。

  • 工作原理:在单张图表上安装一个仪表盘指标,但通过迭代矩阵计算循环,同时对20-30个不同符号进行处理。
  • 实现:该指标将扫描整个“市场观察”(主要货币对、交叉货币对、贵金属、指数),以识别矩阵值正在收缩(准备突破)或呈现强劲趋势动能的资产。这将防止 Windows Server VPS 出现延迟或导致 CPU 过载。

代码片段

// 示例:多资产市场扫描引擎
string symbols[] = {"EURUSD", "GBPUSD", "XAUUSD", "BTCUSD", "US30"};

for(int s = 0; s < ArraySize(symbols); s++)
  {
   // 加载所需的历史市场数据
   // 针对当前交易品种。
   // ...

   // 评估方向强度
   // 最近收盘K线的。
   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) Double Enevlopes (Historical Gauged)

一款保姆服务管理工具和系统 :D简体中文(大陆)

KCI Directional Matrix KCI Directional Matrix

KCI-方向矩阵(KCI-DX)是一种受物理学启发的先进分析工具,通过测量价格路径长度和波动能来提取市场运动学特征。 与传统的动量工具不同,KCI-DX 采用了动态 Z 分数归一化,并结合了 sigmoid 激活函数。这确保了输出值完美地限定在 0 到 100 之间,能够对趋势强度和方向偏好进行超灵敏的识别,且不会受到历史极端值的影响。

Market Miner Market Miner

一款多策略EA,简直是座金矿 :)

MA + Envelope Breakouts MA + Envelope Breakouts

基于包络通道或包络带的突破策略,将多种EA逻辑整合于一个EA之中