Смотри, как бесплатно скачать роботов
Ищи нас в Twitter!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале 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.
| Russian English 中文 Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
Просмотров:
301
Рейтинг:
(2)
Опубликован:
Обновлен:
MQL5 Фриланс Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

Введение:

KCI Volatility Distance — это передовой адаптивный алгоритм, тщательно разработанный для точного отображения рыночного импульса и направления тренда. Используя запатентованный метод расчета на основе матриц, этот инструмент динамически отфильтровывает рыночный шум и предоставляет строго количественную оценку силы тренда. Построенный на основе высокооптимизированного ядра объектно-ориентированного программирования (ООП), он разработан как для наглядного отображения торговых сигналов, так и для беспроблемной интеграции в советники или обучающие

обучения, обеспечивая минимальную нагрузку на процессор при работе с несколькими активами.

Функции и пояснения

  • Матричный движущий механизм: вычисляет внутреннюю динамику цен в рамках многомерной матрицы. Функция: определяет истинную, базовую силу текущего направления рынка до того, как произойдет значительный прорыв, обеспечивая преимущество в раннем обнаружении тренда.
  • Dynamic Noise Filter: адаптивный механизм, который перенастраивается в зависимости от текущих рыночных условий. Функция: автоматически подавляет ложные сигналы и хаотичные скачки цен во время консолидации или периодов низкого объема торгов, защищая автоматизированные алгоритмы от совершения преждевременных сделок.
  • Вывод показателя силы тренда: преобразует сложные математические матричные значения в понятный, самостоятельный числовой поток. Функция: служит надежным индикатором для точного определения точек входа, подтверждения паттернов продолжения тренда или динамического определения размера лота в автоматизированных системах.

Требования

  • Технический индикатор / Ядро алгоритмической торговли / Инструмент количественного анализа.
  • Высокооптимизированное исполнение, чрезвычайно компактный размер для низкого потребления ресурсов ЦП в средах VPS (< 50 КБ).
  • Скрипт с открытым исходным кодом (файл .mq5) со встроенной объектно-ориентированной архитектурой классов.

Рис. 1

KCI-VD

Рис. 3


Простая настройка параметров

Рис. 2



Руководство по интеграции KCI Volatility Distance в советник (EA)

Существует два основных метода интеграции этого алгоритма в советник (EA). Первый метод (встроенный объектно-ориентированный подход) настоятельно рекомендуется для обеспечения максимальной эффективности использования процессора и сбора наборов данных для машинного обучения. Второй метод (вызов iCustom) подходит для быстрого тестирования прототипов.

Метод 1: Прямое использование через встроенный класс ООП (ультра-легкий)

  • Этот метод встраивает движок непосредственно в советник без вызова внешних индикаторов. Код размещается на глобальном уровне, инициализируется в функции OnInit и выполняется в функции OnTick.

Фрагмент кода

// --- 1. Разместите класс ООП в начале файла 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» в вашу нейронную сеть
   // или вектор характеристик ИИ в качестве входной переменной.

   // --- Б. Модуль принятия торговых решений (фильтрация сигналов) ---
   if(current_matrix_strength > EntryThreshold)
     {
      // Проверка импульса пройдена.
      // Тенденция рынка считается достаточно сильной.

      // -> Здесь выполняются ордера на ПОКУПКУ или ПРОДАЖУ в соответствии с
      //    в стратегию вашего советника, ориентированную на определённое направление.

      // -> В качестве альтернативы можно использовать это значение для динамического
      //    настроить интервал «Smart Grid» или другие адаптивные параметры.
     }
  }

Метод 2: Вызов через iCustom()

Если вы выпускаете файл .mq5 индикатора KCI Volatility Distance отдельно и хотите, чтобы советник считывал его через стандартный буфер индикаторов.

Фрагмент кода

// --- 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;
     }

   // Значение матрицы по последней закрывшейся свече
   double current_matrix_strength = MatrixBuffer[1];

   // Значение матрицы для формирующейся в данный момент свечи (в режиме реального времени)
   double previous_matrix_strength = MatrixBuffer[0];

   // --- Логика принятия торговых решений ---
   if(current_matrix_strength > previous_matrix_strength)
     {
      // «Momentum» расширяется.
      // -> Используйте это в качестве дополнительного подтверждения для
      //    увеличить расстояние до уровня «Тейк-профит».
      //
      // -> В качестве альтернативы можно использовать его для запуска адаптивного
      //    Корректировка трейлинг-стопа.
     }
  }

Учитывая высокоадаптивную и нетребовательную к ресурсам процессора архитектуру KCI Volatility Distance, его потенциал выходит за пределы традиционных визуальных индикаторов. Гибкость кода, основанного на объектно-ориентированном программировании (ООП), позволяет ему служить движком для разнообразных сложных алгоритмических сценариев.

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

Ниже приведены некоторые стратегические варианты реализации индикатора KCI Volatility Distance для разработки различных советников и сложных индикаторов:

1. Система защиты от «охоты за стопами» (динамические SL и TP)

Внезапные ценовые скачки зачастую являются ловушкой ликвидности (liquidity grab или stop-hunt), а не реальным трендом. Индикатор KCI Volatility Distance способен обнаруживать такие аномалии.

  • Логика: если происходит резкий скачок цены, но значения матрицы показывают низкий уровень эффективности (направленности), советник распознает это как потенциальный стоп-хантинг.
  • Реализация: вместо того, чтобы выполнять Cut Loss или устанавливать статический SL, советник автоматически расширит зону защиты SL (Dynamic 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 Volatility Distance.
  • Реализация: когда рынок находится в боковом тренде (матрица расширяется), расстояние между линиями сетки также увеличивается. Это предотвращает открытие советником слишком большого количества позиций в одной зоне консолидации, что делает его очень безопасным для противостояния просадкам на активах с широкими колебаниями, таких как 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.
  • Реализация: Вы можете слегка модифицировать объектно-ориентированный класс, чтобы он возвращал чистые значения ER. Этот массив матричных значений извлекается в массив в качестве очень чистого и свободного от шума обучающего набора данных для Pattern Learner.

--------- Другие варианты ---------

Пример модульного заголовочного файла (KCIVD.mqh)

Сохраните приведенный ниже код как KCIVD.mqh в папке MQL5\Include\. Этот файл будет основным движком, вызываемым индикаторами, советниками и модулями машинного обучения.

Фрагмент кода

//+------------------------------------------------------------------+
//|                                                        KCIVD.mqh |
//|                                   Авторские права 2026, KCI Developer |
//|                         https://www.mql5.com/ru/users/ritzfalih |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, KCI Developer"
#property link      "https://www.mql5.com/ru/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);
     }

//+------------------------------------------------------------------+
//| Основной вычислительный движок (оптимизирован для ЦП и скорости)              |
//| Примечание: массивы должны быть заданы как серии (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.

Фрагмент кода

//+------------------------------------------------------------------+
//|                                      KCI Volatility Distance.mq5 |
//|                                   Авторские права 2026, KCI Developer |
//|                         https://www.mql5.com/ru/users/ritzfalih |
//+------------------------------------------------------------------+
#property copyright   "Copyright 2026, KCI Developer"
#property link        "https://www.mql5.com/ru/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);

   // Запустить вычислительную машину с помощью объекта ООП
   for(int i = limit; i >= 0 && !IsStopped(); i--)
     {
      KVR_Buffer[i] = kci_engine.Calculate(i, high, low, close);
     }

   return(rates_total);
  }

Руководство по межфункциональной интеграции (как использовать в советниках/ML)

Благодаря структуре класса CKCIVolatilityDistance вы можете использовать его напрямую в любом советнике для достижения максимальной производительности. Вот пример его логической реализации:

Интеграция в модуль машинного обучения (извлечение признаков / валидация сигналов)

Если у вас есть модуль нейронной сети или модуль обучения по шаблонам, который требует нормализации волатильности в качестве входной характеристики, вы можете извлечь значение KCI VD следующим образом:

Фрагмент кода

#include <KCIVD.mqh>

CKCIVolatilityDistance KCI_ML;

int OnInit()
  {
   // Инициализация модуля KCI Volatility Distance
   // с указанием желаемого периода расчета.
   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 Volatility Distance» для
   // текущий бар (индекс 0) или последний закрытый бар (индекс 1).
   double kci_current_volatility = KCI_ML.Calculate(0, high, low, close);

   // Подавать данные из «kci_current_volatility» в нейронную сеть
   // вектор признаков для проверки или прогнозирования сигнала.
  }

4. Сканер нескольких символов (индикатор панели инструментов)

Поскольку KCIDirectionalMatrix не зависит от iCustom и быстро освобождает локальную память, он идеально подходит в качестве механизма поиска сигналов на панели инструментов с несколькими символами.

  • Алгоритм: установите один индикатор панели инструментов на один график, но запустите цикл вычисления матрицы одновременно для 20–30 различных символов.
  • Реализация: Индикатор просканирует весь список «Market Watch» (основные валюты, кросс-пары, металлы, индексы) для выявления активов, значения матрицы которых сжимаются (готовится прорыв) или демонстрируют сильный трендовый импульс. Это предотвратит задержки на VPS с Windows Server и перегрузку процессора.

Фрагмент кода

// Пример: механизм сканирования рынка различных активов
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 Volatility Distance; по крайней мере, этот код можно использовать для различных целей. Вы можете доработать его с помощью стандартных индикаторов MT5 и пользовательских индикаторов MT5 для достижения ещё большей точности и тщательного анализа.

Перевод с английского произведен MetaQuotes Ltd.
Оригинальная публикация: https://www.mql5.com/en/code/74838

Double Enevlopes (Historical Gauged) Double Enevlopes (Historical Gauged)

Инструмент и система для управления бизнесом по уходу за детьми :D

Daily Zone Recovery EA mt5 for GOLD Daily Zone Recovery EA mt5 for GOLD

Daily Zone Recovery — это многостратегический торговый советник для MetaTrader 5, работающий на основе максимумов и минимумов предыдущего торгового дня. Советник отслеживает поведение цен вблизи дневных экстремумов, использует три независимые стратегии входа и может управлять позициями с помощью сетки фиксированного объема.

Market Miner Market Miner

Многостратегический советник — настоящая золотая жила :)

MA + Envelope Breakouts MA + Envelope Breakouts

Прорывы на основе канала или полосы огибающей, логика нескольких советников в одном советнике