Эта стратегия представляет собой комплексную торговую систему, которая сочетает в себе алгоритм машинного обучения K-Nearest Neighbors (KNN), распознавание моделей свечей и анализ объема.
Основная логика стратегии основана на нескольких ключевых элементах: 1. Использование простой скользящей средней (SMA) и стандартного отклонения для построения ценовых каналов для определения перекупленных и перепроданных областей 2. Определение девяти классических моделей свечей с помощью программно определенных условий, включая модели "Молоток", "Стреляющая звезда", "Поглощение" и т.д. Включение алгоритма KNN для изучения исторических движений цен и прогнозирования будущих направлений цен 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!")