Многомерный алгоритм K-ближайших соседей и стратегия анализа объема и цены свечного паттерна

SMA KNN RSI VOL MA SD
Дата создания: 2025-01-17 16:10:07 Последнее изменение: 2025-01-17 16:10:07
Копировать: 0 Количество просмотров: 436
1
Подписаться
1617
Подписчики

Многомерный алгоритм K-ближайших соседей и стратегия анализа объема и цены свечного паттерна

Обзор

Стратегия представляет собой комплексную торговую систему, которая объединяет алгоритм машинного обучения K-ближайшего соседа (KNN), распознавание свечных паттернов и анализ объема. Стратегия формирует трехмерную структуру анализа рынка с помощью методов многомерного анализа, включая каналы скользящих средних, проверку пороговых значений объема и статистику вероятностей, тем самым выявляя потенциальные торговые возможности.

Стратегический принцип

Основная логика стратегии основана на следующих ключевых элементах:

  1. Используйте скользящую среднюю (SMA) и стандартное отклонение для построения ценовых каналов с целью определения зон перекупленности и перепроданности.
  2. Определите девять классических моделей свечей с помощью программно заданных условий, включая молот, падающую звезду, поглощение и т. д.
  3. Внедрение алгоритма KNN для изучения исторических ценовых тенденций и прогнозирования возможных будущих ценовых тенденций.
  4. Использование объема торговли в качестве индикатора подтверждения сигнала требует, чтобы объем торговли превышал установленный порог при срабатывании сигнала.
  5. Рассчитайте распределение вероятностей подъема и спада и используйте его как одно из условий фильтрации сигнала.

Стратегические преимущества

  1. Многоуровневый механизм подтверждения сигналов значительно повышает надежность транзакций.
  2. Внедрение алгоритма KNN обеспечивает перспективу машинного обучения для традиционного технического анализа.
  3. Механизм проверки объема эффективно предотвращает ложные прорывы
  4. Динамическое построение линий поддержки и сопротивления помогает определить важные ценовые уровни
  5. Комплексная система оповещений гарантирует, что вы не упустите важные торговые возможности.
  6. Параметры стратегии легко настраиваются и могут адаптироваться к различным рыночным условиям.

Стратегический риск

  1. Алгоритм KNN может отставать на нестабильных рынках
  2. Слишком много условий фильтрации сигналов могут привести к упущению некоторых торговых возможностей.
  3. Фиксированные пороговые значения объема могут потребовать динамической корректировки в различные периоды.
  4. Во время боковых фаз может генерироваться слишком много ложных сигналов. Рекомендуется:
  • Динамически настраивать параметры алгоритма
  • Внедрение механизма идентификации рыночной среды
  • Установите максимальный лимит потерь
  • Внедрение системы управления складом

Направление оптимизации стратегии

  1. Внедрение механизма адаптивной настройки параметров, позволяющего стратегии автоматически настраивать параметры в соответствии с рыночными условиями.
  2. Интеграция алгоритмов глубокого обучения для повышения точности прогнозов
  3. Добавление дополнительных индикаторов микроструктуры рынка
  4. Оптимизация динамического метода расчета порогового значения объема торгов
  5. Создать более полную систему контроля рисков

Подвести итог

Стратегия создает надежную торговую систему, сочетая традиционный технический анализ с современными методами машинного обучения. Многомерная структура анализа стратегии и строгий механизм подтверждения сигналов обеспечивают надежную основу для торговых решений. Ожидается, что благодаря постоянной оптимизации и контролю рисков стратегия будет поддерживать стабильную эффективность в различных рыночных условиях.

Исходный код стратегии
/*backtest
start: 2024-01-17 00:00:00
end: 2025-01-16 00:00:00
period: 2d
basePeriod: 2d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

//@version=6
strategy("Candle Pattern Analyzer with Volume", overlay=true)

// Input parameters
length = input.int(20, "Channel Length", minval=1)
mult = input.float(2.0, "Volatility Multiplier", minval=0.1)
candleLength = input.int(5, "Candle Length", minval=1)
k = input.int(5, "KNN Neighbors", minval=1)
volumeThreshold = input.int(100000, "Volume Threshold", minval=1)

// Calculate channel
basis = ta.sma(close, length)
dev = mult * ta.stdev(close, length)
upper = basis + dev
lower = basis - dev

// Plot channel
plot(basis, color=color.blue)
plot(upper, color=color.green)
plot(lower, color=color.red)

// Identify candle patterns
isBullish = close > open
isBearish = close < open

// Pre-calculate SMAs
smaLow = ta.sma(low, candleLength)
smaHigh = ta.sma(high, candleLength)
smaClose = ta.sma(close, candleLength)

// Hammer pattern
isHammer = isBullish and 
           low < smaLow and 
           close > smaClose and 
           (close - low) / (high - low) > 0.6 and
           low < low[1]

// Shooting Star pattern
isShootingStar = isBearish and 
                 high > smaHigh and 
                 close < smaClose and 
                 (high - close) / (high - low) > 0.6 and
                 high > high[1]

// Inverse Hammer pattern
isInverseHammer = isBullish and 
                   high > smaHigh and 
                   close < smaClose and 
                   (high - close) / (high - low) > 0.6 and
                   high > high[1]

// Bullish Engulfing pattern
isBullishEngulfing = isBullish and 
                      close > high[1] and 
                      open < low[1]

// Bearish Engulfing pattern
isBearishEngulfing = isBearish and 
                      close < low[1] and 
                      open > high[1]

// Morning Star pattern
isMorningStar = isBullish and close[2] < open[2] and close[1] < open[1] and  close > open[1]

// Evening Star pattern
isEveningStar = isBearish and  close[2] > open[2] and  close[1] > open[1] and  close < open[1]

// Three Black Crows pattern
isThreeBlackCrows = isBearish and 
                     close < close[1] and 
                     close[1] < close[2] and 
                     close[2] < close[3]

// Three White Soldiers pattern
isThreeWhiteSoldiers = isBullish and close > close[1] and  close[1] > close[2] and  close[2] > close[3]

// Compare previous candles
prevCandleUp = close[1] > open[1]
prevCandleDown = close[1] < open[1]

// Calculate probability
probUp = ta.sma(close > open ? 1 : 0, candleLength) / candleLength
probDown = ta.sma(close < open ? 1 : 0, candleLength) / candleLength

// Generate signals
buySignal = isHammer and prevCandleDown and probUp > probDown and volume > volumeThreshold
sellSignal = isShootingStar and prevCandleUp and probDown > probUp and volume > volumeThreshold

// Highlight patterns
color candleColor = na
if (isHammer)
    candleColor := color.green
    label.new(bar_index, high, "Hammer", color=color.green, style=label.style_label_up)

else if (isShootingStar)
    candleColor := color.red
    label.new(bar_index, low, "Shooting Star", color=color.red, style=label.style_label_down)
else if (isInverseHammer)
    candleColor := color.blue
    label.new(bar_index, high, "Inverse Hammer", color=color.blue, style=label.style_label_up)
else if (isBullishEngulfing)
    candleColor := color.yellow
    label.new(bar_index, high, "Bullish Engulfing", color=color.yellow, style=label.style_label_up)
else if (isBearishEngulfing)
    candleColor := color.purple
    label.new(bar_index, low, "Bearish Engulfing", color=color.purple, style=label.style_label_down)

else if (isMorningStar)
    candleColor := color.orange
    label.new(bar_index, high, "Morning Star", color=color.orange, style=label.style_label_up)

else if (isEveningStar)
    candleColor := color.new(color.red, 80)
    label.new(bar_index, low, "Evening Star", color=color.new(color.red, 80), style=label.style_label_down)

else if (isThreeBlackCrows)
    candleColor := color.black
    label.new(bar_index, low, "Three Black Crows", color=color.black, style=label.style_label_down)

else if (isThreeWhiteSoldiers)
    candleColor := color.white
    label.new(bar_index, high, "Three White Soldiers", color=color.white, style=label.style_label_up)


// Plot candles
barcolor(candleColor)

// KNN algorithm
var float[] knnData = array.new_float(k, na)
var float[] knnLabels = array.new_float(k, na) // Create an array to store KNN labels
array.set(knnLabels, 0, 1.0) // Label for "up" movement

// Shift KNN dataset to make room for new data point
for i = 1 to k-1
    array.set(knnData, i, array.get(knnData, i-1))
    array.set(knnLabels, i, array.get(knnLabels, i-1))

// Predict next movement using KNN algorithm
float prediction = 0.0
for i = 0 to k-1
    float distance = math.abs(close - array.get(knnData, i))
    prediction += array.get(knnLabels, i) / distance

prediction /= k

// Plot prediction
// line.new(bar_index, close, bar_index + 1, prediction, color=color.purple)

// Plot resistance and support lines
float resistance = ta.sma(high, length)
float support = ta.sma(low, length)
// line.new(bar_index, resistance, bar_index + 1, resistance, color=color.green, style=line.style_dashed)
// line.new(bar_index, support, bar_index + 1, support, color=color.red, style=line.style_dashed)

// Plot buy and sell signals with prices
if (buySignal)
    // label.new(bar_index, low, "Buy at " + str.tostring(low), color=color.green, style=label.style_label_up)
    strategy.entry("Buy", strategy.long, comment="Buy at " + str.tostring(low))
if (sellSignal)
    // label.new(bar_index, high, "Sell at " + str.tostring(high), color=color.red, style=label.style_label_down)
    strategy.entry("Sell", strategy.short, comment="Sell at " + str.tostring(high))

// Create alerts
alertcondition(buySignal, title="Buy Signal", message="Buy signal generated!")
alertcondition(sellSignal, title="Sell Signal", message="Sell signal generated!")