Chiến lược này là một hệ thống giao dịch định lượng tiên tiến kết hợp trung bình động với bộ lọc phạm vi động. Nó xác định xu hướng thị trường bằng cách phân tích mối quan hệ giữa chuyển động giá và khối lượng giao dịch, trong khi sử dụng bộ lọc phạm vi để loại bỏ các tín hiệu sai và cải thiện độ chính xác giao dịch. Chiến lược sử dụng các phương pháp tính toán thích nghi để xác định ranh giới thanh khoản thị trường và kết hợp trung bình động nhanh và chậm để xác nhận hướng xu hướng.
Logic cốt lõi của chiến lược dựa trên các tính toán chính sau:
Chiến lược xây dựng một hệ thống giao dịch định lượng hoàn chỉnh bằng cách kết hợp phân tích thanh khoản, theo dõi xu hướng và lọc phạm vi. Sức mạnh của nó nằm trong khả năng thích nghi với những thay đổi của thị trường và cung cấp các tín hiệu giao dịch đáng tin cậy, trong khi yêu cầu chú ý đến tối ưu hóa tham số và quản lý rủi ro. Thông qua tối ưu hóa và cải tiến liên tục, chiến lược cho thấy hứa hẹn trong việc duy trì hiệu suất ổn định trong các môi trường thị trường khác nhau.
/*backtest start: 2019-12-23 08:00:00 end: 2024-12-15 08:00:00 period: 1d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=6 strategy("Killer Coin V2 + Range Filter Strategy", shorttitle="KC-RF Strategy", overlay=true ) // === INPUT BACKTEST RANGE === useDate = input(true, title='---------------- Use Date ----------------', group="Backtest Settings") FromMonth = input.int(7, title="From Month", minval=1, maxval=12, group="Backtest Settings") FromDay = input.int(25, title="From Day", minval=1, maxval=31, group="Backtest Settings") FromYear = input.int(2019, title="From Year", minval=2017, group="Backtest Settings") ToMonth = input.int(1, title="To Month", minval=1, maxval=12, group="Backtest Settings") ToDay = input.int(1, title="To Day", minval=1, maxval=31, group="Backtest Settings") ToYear = input.int(9999, title="To Year", minval=2017, group="Backtest Settings") start = timestamp(FromYear, FromMonth, FromDay, 00, 00) finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) window() => time >= start and time <= finish // === KILLER COIN V2 INPUTS === outlierThreshold = input.int(10, "Outlier Threshold Length", group="Killer Coin Settings") fastMovingAverageLength = input.int(50, "Fast MA length", group="Killer Coin Settings") slowMovingAverageLength = input.int(100, "Slow MA length", group="Killer Coin Settings") // === RANGE FILTER INPUTS === sources = input(close, "Source", group="Range Filter Settings") isHA = input(false, "Use HA Candles", group="Range Filter Settings") per = input.int(50, "Sampling Period", minval=1, group="Range Filter Settings") mult = input.float(3.0, "Range Multiplier", minval=0.1, group="Range Filter Settings") // === KILLER COIN V2 CALCULATIONS === priceMovementLiquidity = volume / math.abs(close - open) liquidityBoundary = ta.ema(priceMovementLiquidity, outlierThreshold) + ta.stdev(priceMovementLiquidity, outlierThreshold) var liquidityValues = array.new_float(5) if ta.crossover(priceMovementLiquidity, liquidityBoundary) array.insert(liquidityValues, 0, close) fastEMA = ta.ema(array.get(liquidityValues, 0), fastMovingAverageLength) slowEMA = ta.ema(array.get(liquidityValues, 0), slowMovingAverageLength) // === RANGE FILTER CALCULATIONS === src = isHA ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, sources) : sources // Smooth Average Range smoothrng(x, t, m) => wper = (t*2) - 1 avrng = ta.ema(math.abs(x - x[1]), t) smoothrng = ta.ema(avrng, wper)*m smoothrng smrng = smoothrng(src, per, mult) // Range Filter rngfilt(x, r) => rngfilt = x rngfilt := x > nz(rngfilt[1]) ? ((x - r) < nz(rngfilt[1]) ? nz(rngfilt[1]) : (x - r)) : ((x + r) > nz(rngfilt[1]) ? nz(rngfilt[1]) : (x + r)) rngfilt filt = rngfilt(src, smrng) // Filter Direction upward = 0.0 upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1]) downward = 0.0 downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1]) // Target Bands hband = filt + smrng lband = filt - smrng // === PLOTTING === // Killer Coin V2 Plots bullColor = color.new(#00ffbb, 50) bearColor = color.new(#800080, 50) fastPlot = plot(fastEMA, "Fast EMA", color = fastEMA > slowEMA ? bullColor : bearColor) slowPlot = plot(slowEMA, "Slow EMA", color = fastEMA > slowEMA ? bullColor : bearColor) fill(fastPlot, slowPlot, color = fastEMA > slowEMA ? bullColor : bearColor) // Range Filter Plots filtcolor = upward > 0 ? color.new(color.lime, 0) : downward > 0 ? color.new(color.red, 0) : color.new(color.orange, 0) filtplot = plot(filt, "Range Filter", color=filtcolor, linewidth=3) hbandplot = plot(hband, "High Target", color=color.new(color.aqua, 90)) lbandplot = plot(lband, "Low Target", color=color.new(color.fuchsia, 90)) fill(hbandplot, filtplot, color=color.new(color.aqua, 90)) fill(lbandplot, filtplot, color=color.new(color.fuchsia, 90)) // === STRATEGY CONDITIONS === // Range Filter Conditions longCond = ((src > filt) and (src > src[1]) and (upward > 0)) or ((src > filt) and (src < src[1]) and (upward > 0)) shortCond = ((src < filt) and (src < src[1]) and (downward > 0)) or ((src < filt) and (src > src[1]) and (downward > 0)) CondIni = 0 CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1] longCondition = longCond and CondIni[1] == -1 shortCondition = shortCond and CondIni[1] == 1 // Combined Conditions finalLongSignal = longCondition and fastEMA > slowEMA and window() finalShortSignal = shortCondition and fastEMA < slowEMA and window() // === PLOTTING SIGNALS === plotshape(finalLongSignal, "Buy Signal", text="BUY", textcolor=color.white, style=shape.labelup, size=size.normal, location=location.belowbar, color=color.new(color.green, 0)) plotshape(finalShortSignal, "Sell Signal", text="SELL", textcolor=color.white, style=shape.labeldown, size=size.normal, location=location.abovebar, color=color.new(color.red, 0)) // === STRATEGY ENTRIES === if finalLongSignal strategy.entry("Long", strategy.long, stop=hband) if finalShortSignal strategy.entry("Short", strategy.short, stop=lband) // === ALERTS === alertcondition(finalLongSignal, "Strong Buy Signal", "🚨 Buy - Both Indicators Aligned!") alertcondition(finalShortSignal, "Strong Sell Signal", "🚨 Sell - Both Indicators Aligned!")