Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
KCI Standard: A Pure Kinematic Computing Engine for Market Singularity Detection - индикатор для MetaTrader 5
- Просмотров:
- 19
- Рейтинг:
- Опубликован:
-
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Аннотация
Индекс кинетического сжатия (KCI) — это пользовательский осциллятор, предназначенный для выявления истощения рынка и локальных событий сжатия. Благодаря внутреннему расчету кинематических показателей, а не использованию внешних стандартных индикаторов, KCI снижает нагрузку и упрощает управление буферами при интеграции в советники (EA). В данной статье подробно описаны математические основы, архитектура системы, схема буферов и практические рекомендации по интеграции для разработчиков, желающих внедрить этот инструмент в MetaTrader 5.Введение
В алгоритмической торговле снижение зависимости от множества дескрипторов внешних индикаторов позволяет оптимизировать архитектуру советника. Вызов множества дескрипторов пользовательских или стандартных индикаторов (таких как скользящие средние и стандартные отклонения) иногда может усложнять управление буферами и процессы инициализации.
KCI разработан для обработки данных о цене и объеме непосредственно в рамках одного файла. Выявляя резкое замедление движения цены в сочетании с падением объема, он нацелен на определение событий исчерпания — точек, в которых локальный возврат к среднему значению статистически вероятен.
Постановка задачи
Основными целями архитектуры KCI являются:
-
Снижение зависимости от дескрипторов: вычисление скользящих средних и отклонений непосредственно внутри цикла индикатора для минимизации использования внешних дескрипторов.
-
Обеспечение воспроизводимых метрик: предоставление советникам чистых и прозрачных математических метрик (скорость, отклонение и дисперсия).
-
Обеспечение безопасности асинхронной работы: создание буферов сигналов, проверка которых происходит только на закрытых свечах, что защищает советник от перерисовки внутри свечи и задержек асинхронных тиковых данных.
Теория и математические основы
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-скору: поскольку эти четыре показателя имеют разные шкалы (например, ценовые значения и чистые ставки), они нормализуются с помощью скользящего Z-скора за заданный период ZScorePeriod, а затем суммируются в показатель Raw_KCI.
Архитектура системы и унифицированная карта буферов
Чтобы предотвратить типичные ошибки «Index Out of Bounds» или несоответствия буферов при вызовах CopyBuffer(), KCI строго придерживается следующей унифицированной схемы буферов. Это сопоставление является единообразным для всех объявлений #property, вызовов SetIndexBuffer() и интеграции с советниками.| Индекс буфера | Имя буфера | Тип | Назначение |
| 0 | KCI_Main | INDICATOR_DATA | Линия визуального поляризованного генератора |
| 1 | KCI_Color | INDICATOR_COLOR_INDEX | Динамическое сопоставление цветов для основной линии |
| 2 | Signal_Buy | INDICATOR_DATA | Сигнал на покупку (1,0 = Покупка, 0,0 = Нейтрально) |
| 3 | Signal_Sell | INDICATOR_DATA | Сигнал на продажу (1,0 = Продажа, 0,0 = Нейтрально) |
| 4 | Internal_VQ | INDICATOR_CALCULATIONS | Массив коэффициентов скорости |
| 5 | Internal_KD | РАСЧЕТЫ_ИНДИКАТОРОВ | Массив кинетического смещения |
| 6 | Internal_ED | INDICATOR_CALCULATIONS | Массив дисперсии энергии (используется для SL/TP) |
| 7 | Internal_PV | РАСЧЕТЫ_ПОКАЗАТЕЛЕЙ | Массив фазовых скоростей |
| 8 | Raw_KCI | РАСЧЕТЫ_ПОКАЗАТЕЛЕЙ | Сумма нормированных матриц |
Пошаговое руководство по коду: интеграция советника и управление рисками
При вызове KCI из советника код должен учитывать жизненный цикл дескриптора индикатора, проверять успешность получения данных функцией CopyBuffer и нормализовать все расчеты цен для стоп-лосса (SL) и тейк-профита (TP) в соответствии с количеством знаков символа.
Вот исправленный и надёжный шаблон интеграции советника:
#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"); } }
Производительность и ограничения
Чтобы обеспечить реалистичные ожидания, разработчики должны учитывать следующие структурные ограничения:
-
Зависимость от тикового объема: для Forex/CFD показатель tick_volume отражает частоту ценовых изменений, а не фактическую ликвидность. Показатель объемного сжатия может вести себя иначе на централизованных биржах (акции/фьючерсы), где доступны реальные объемы.
-
Уязвимость к возврату к среднему значению: как ограниченный осциллятор, KCI нацелен на выявление исчерпания импульса. На рынке с сильным трендом он может генерировать последовательные преждевременные сигналы разворота. Его следует использовать в сочетании с трендовым фильтром на более высоком таймфрейме (например, EMA 200).
-
Шум на низких таймфреймах: использование этого индикатора на M1 или M5 подвергает его логику воздействию микроструктурного шума. Нормализация по Z-Score требует стабильного распределения, которое лучше наблюдается на M15 и выше.
Заключение
Индекс кинетической компрессии (KCI) представляет собой прозрачную, рассчитываемую на основе собственных алгоритмов альтернативу наложению нескольких стандартных индикаторов. Отображая как сигналы направления на закрытых свечах, так и динамический показатель волатильности (дисперсия энергии) через единую карту буфера, он служит надёжным структурным компонентом для советников MQL5.Реализация на графике: (KCI Custom)
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная публикация: https://www.mql5.com/en/code/74580
EA KCI Embeded Sniper
KCI Embedded Sniper — это алгоритмическое торговое решение, разработанное для высокоточного входа в рынок на разворотах. В отличие от традиционных советников, которые полагаются на внешние индикаторы (что часто приводит к десинхронизации потоков и задержкам), данный советник оснащен полностью встроенным движком Kinetic Compression Index (KCI). Благодаря переносу всей математической модели KCI — включая расчет коэффициентов скорости, кинетического смещения, дисперсии энергии и фазовой скорости — непосредственно в основную логику советника, нам удалось устранить «асинхронную задержку». Результатом стал молниеносный «снайперский» движок, который с точностью до микросекунд подтверждает исчерпание рынка (Singularity) и экстремумы импульса (Williams %R), работая исключительно на завершенных свечах, что гарантирует отсутствие перерисовки.
Multi-Timeframe Candle Map
Обучающая панель MT5, которая отображает текущие цены по вертикали внутри четырёх формирующихся свечей и обобщает данные о расположении, рассеивании, направлении свечей и оставшемся времени.
YURAZ_RSAXEL Скрипт рисует уровни Рудолфа Акселя
Скрипт рисует уровни Рудолфа Акселя
YURAZ_MCCH
Индикатор рассчитывает % роста или падения относительно CLOSE, написан с применением ООП, и легко интегрируется в любой советник или иной индикатор.
