En la carga de los recursos... Cargando...

Algorismo KNN multidimensional con estrategia de negociación de patrones de candelabro de volumen-precio

El autor:¿ Qué pasa?, Fecha: 2025-01-17 16:10:07
Las etiquetas:La SMAN.N.C.N.Indicador de riesgoVOL- ¿Qué es?- ¿ Qué?

 Multi-Dimensional KNN Algorithm with Volume-Price Candlestick Pattern Trading Strategy

Resumen general

Esta estrategia es un sistema de negociación integral que combina el algoritmo de aprendizaje automático K-Nearest Neighbors (KNN), el reconocimiento de patrones de velas y el análisis de volumen.

Principios de estrategia

La lógica central de la estrategia se basa en varios elementos clave: 1. Utilizar la media móvil simple (SMA) y la desviación estándar para construir canales de precios para identificar áreas de sobrecompra y sobreventa 2. Identificar nueve patrones clásicos de velas a través de condiciones definidas programáticamente, incluidos patrones de martillo, estrella de disparo, engulfamiento, etc. 3. Incorporar el algoritmo KNN para aprender de los movimientos históricos de precios y predecir las direcciones futuras de los precios 4. Utilizando el volumen como indicador de confirmación de la señal, que requiere que el volumen esté por encima del umbral establecido cuando las señales se activan 5. El cálculo de las distribuciones de probabilidad para los movimientos ascendentes y descendentes como una de las condiciones de filtración de la señal

Ventajas estratégicas

  1. Mecanismo de confirmación de señales a varios niveles mejora significativamente la fiabilidad de las operaciones
  2. La introducción del algoritmo KNN proporciona una perspectiva de aprendizaje automático al análisis técnico tradicional
  3. El mecanismo de verificación del volumen evita eficazmente las falsas interrupciones
  4. El trazado dinámico de líneas de soporte y resistencia ayuda a comprender los niveles de precios importantes
  5. Un sistema de alerta completo garantiza que no se pierdan oportunidades comerciales importantes
  6. Gran capacidad de ajuste de parámetros para adaptarse a los diferentes entornos del mercado

Riesgos estratégicos

  1. El algoritmo KNN puede retrasarse en mercados volátiles
  2. Las condiciones de filtración de señales múltiples podrían causar la pérdida de algunas oportunidades comerciales
  3. Los umbrales de volumen fijos pueden necesitar un ajuste dinámico en diferentes períodos
  4. Puede generar excesivas señales falsas durante las fases de consolidación Soluciones recomendadas:
  • Ajuste de parámetros del algoritmo dinámico
  • Introducción de un mecanismo de reconocimiento del entorno de mercado
  • Establecimiento de límites máximos de pérdidas
  • Establecimiento de un sistema de gestión de posiciones

Direcciones de optimización

  1. Introducir un mecanismo de ajuste de parámetros adaptativo para ajustar automáticamente los parámetros en función de las condiciones del mercado
  2. Integrar algoritmos de aprendizaje profundo para mejorar la precisión de las predicciones
  3. Añadir más indicadores de la microestructura del mercado
  4. Optimizar el método de cálculo dinámico para los umbrales de volumen
  5. Establecer un sistema de control de riesgos más completo

Resumen de las actividades

Esta estrategia construye un sistema de negociación robusto mediante la combinación de análisis técnico tradicional con métodos modernos de aprendizaje automático. El marco de análisis multidimensional de la estrategia y el estricto mecanismo de confirmación de señales proporcionan una base confiable para las decisiones comerciales.


/*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!")


Relacionados

Más.