Chiến lược SPARK là một chiến lược giao dịch định lượng kết hợp kích cỡ vị trí động với xác nhận chỉ số kép. Chiến lược sử dụng chỉ số SuperTrend và Chỉ số Sức mạnh tương đối (RSI) để xác định các điểm vào và ra tiềm năng trong khi sử dụng cơ chế kích cỡ vị trí động để tối ưu hóa phân bổ vốn. Chiến lược cũng cung cấp các cài đặt lấy lợi nhuận và dừng lỗ linh hoạt, cũng như các tham số có thể tùy chỉnh như tần suất giao dịch tối thiểu và ưu tiên hướng.
Cốt lõi của chiến lược SPARK nằm trong việc áp dụng kết hợp của chỉ số SuperTrend và chỉ số RSI. Chỉ số SuperTrend xác định hướng xu hướng bằng cách so sánh giá đóng với mức hỗ trợ và kháng cự năng động, trong khi chỉ số RSI được sử dụng để xác định điều kiện thị trường mua quá mức và bán quá mức. Khi cả hai chỉ số SuperTrend và RSI đồng thời đáp ứng các tiêu chí cụ thể, chiến lược tạo ra một tín hiệu nhập cảnh.
Chiến lược này sử dụng một cơ chế kích thước vị trí động để tối ưu hóa phân bổ vốn cho mỗi giao dịch. Bằng cách thiết lập tỷ lệ phần trăm danh mục đầu tư và tỷ lệ đòn bẩy, chiến lược tự động tính toán kích thước vị trí tối ưu dựa trên điều kiện thị trường hiện tại và số dư tài khoản. Ngoài ra, chiến lược cung cấp các cài đặt lấy lợi nhuận và dừng lỗ linh hoạt, cho phép người dùng lựa chọn giữa tỷ lệ phần trăm cố định hoặc mức tính toán năng động.
Chiến lược SPARK cung cấp cho các nhà giao dịch một giải pháp giao dịch định lượng toàn diện bằng cách kết hợp các chỉ số SuperTrend và RSI, sử dụng cơ chế định kích thước vị trí năng động và cung cấp các công cụ quản lý rủi ro linh hoạt. Mặc dù chiến lược có thể đối mặt với một số rủi ro nhất định, với tối ưu hóa và tinh chỉnh liên tục, chiến lược SPARK có tiềm năng cung cấp hiệu suất nhất quán trong các điều kiện thị trường khác nhau.
/*backtest start: 2024-03-12 00:00:00 end: 2024-04-11 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("SPARK", shorttitle="SPARK", overlay=true) // Choose whether to activate the minimal bars in trade feature minBarsEnabled = input(true, title="Activate Minimal Bars in Trade") portfolioPercentage = input(10, title="Portfolio Percentage", minval=1, maxval=100) // Leverage Input leverage = input(1, title="Leverage", minval=1) // Calculate position size according to portfolio percentage and leverage positionSizePercent = portfolioPercentage / 100 * leverage positionSize = (strategy.initial_capital / close) * positionSizePercent // Take Profit and Stop Loss settings useFixedTPSL = input(1, title="Use Fixed TP/SL", options=[1, 0]) tp_sl_step = 0.1 fixedTP = input(2.0, title="Fixed Take Profit (%)", step=tp_sl_step) fixedSL = input(1.0, title="Fixed Stop Loss (%)", step=tp_sl_step) // Calculate Take Profit and Stop Loss Levels takeProfitLong = close * (1 + fixedTP / 100) takeProfitShort = close * (1 - fixedTP / 100) stopLossLong = close * (1 - fixedSL / 100) stopLossShort = close * (1 + fixedSL / 100) // Plot TP and SL levels on the chart plotshape(series=takeProfitLong, title="Take Profit Long", color=color.green, style=shape.triangleup, location=location.abovebar) plotshape(series=takeProfitShort, title="Take Profit Short", color=color.red, style=shape.triangledown, location=location.belowbar) plotshape(series=stopLossLong, title="Stop Loss Long", color=color.red, style=shape.triangleup, location=location.abovebar) plotshape(series=stopLossShort, title="Stop Loss Short", color=color.green, style=shape.triangledown, location=location.belowbar) // Minimum Bars Between Trades Input minBarsBetweenTrades = input(5, title="Minimum Bars Between Trades") // Inputs for selecting trading direction tradingDirection = input("Both", "Choose Trading Direction", options=["Long", "Short", "Both"]) // SuperTrend Function trendFlow(src, atrLength, multiplier) => atr = atr(atrLength) up = hl2 - (multiplier * atr) dn = hl2 + (multiplier * atr) trend = 1 trend := nz(trend[1], 1) up := src > nz(up[1], 0) and src[1] > nz(up[1], 0) ? max(up, nz(up[1], 0)) : up dn := src < nz(dn[1], 0) and src[1] < nz(dn[1], 0) ? min(dn, nz(dn[1], 0)) : dn trend := src > nz(dn[1], 0) ? 1 : src < nz(up[1], 0)? -1 : nz(trend[1], 1) [up, dn, trend] // Inputs for SuperTrend settings atrLength1 = input(7, title="ATR Length for Trend 1") multiplier1 = input(4.0, title="Multiplier for Trend 1") atrLength2 = input(14, title="ATR Length for Trend 2") multiplier2 = input(3.618, title="Multiplier for Trend 2") atrLength3 = input(21, title="ATR Length for Trend 3") multiplier3 = input(3.5, title="Multiplier for Trend 3") atrLength4 = input(28, title="ATR Length for Trend 4") multiplier4 = input(3.382, title="Multiplier for Trend 4") // Calculate SuperTrend [up1, dn1, trend1] = trendFlow(close, atrLength1, multiplier1) [up2, dn2, trend2] = trendFlow(close, atrLength2, multiplier2) [up3, dn3, trend3] = trendFlow(close, atrLength3, multiplier3) [up4, dn4, trend4] = trendFlow(close, atrLength4, multiplier4) // Entry Conditions based on SuperTrend and Elliott Wave-like patterns longCondition = trend1 == 1 and trend2 == 1 and trend3 == 1 and trend4 == 1 shortCondition = trend1 == -1 and trend2 == -1 and trend3 == -1 and trend4 == -1 // Calculate bars since last trade barsSinceLastTrade = barssince(tradingDirection == "Long" ? longCondition : shortCondition) // Strategy Entry logic based on selected trading direction and minimum bars between trades if tradingDirection == "Long" or tradingDirection == "Both" if longCondition and (not minBarsEnabled or barsSinceLastTrade >= minBarsBetweenTrades) strategy.entry("Long", strategy.long, qty=positionSize) strategy.exit("TP/SL Long", from_entry="Long", stop=stopLossLong, limit=takeProfitLong) if tradingDirection == "Short" or tradingDirection == "Both" if shortCondition and (not minBarsEnabled or barsSinceLastTrade >= minBarsBetweenTrades) strategy.entry("Short", strategy.short, qty=positionSize) strategy.exit("TP/SL Short", from_entry="Short", stop=stopLossShort, limit=takeProfitShort) // Color bars based on position var color barColor = na barColor := strategy.position_size > 0 ? color.green : strategy.position_size < 0 ? color.red : na // Plot colored bars plotcandle(open, high, low, close, color=barColor) // Plot moving averages plot(sma(close, 50), color=color.blue) plot(sma(close, 200), color=color.orange) // More customizable trading bot - adding a new indicator // This indicator is the RSI (Relative Strength Index) // RSI Inputs rsi_length = input(14, title="RSI Length") rsi_oversold = input(30, title="RSI Oversold") rsi_overbought = input(70, title="RSI Overbought") // Calculate RSI rsi = rsi(close, rsi_length) // Plot RSI plot(rsi, color=color.purple, title="RSI") // Entry Conditions based on RSI rsi_long_condition = rsi < rsi_oversold rsi_short_condition = rsi > rsi_overbought // Strategy Entry logic based on RSI if tradingDirection == "Long" or tradingDirection == "Both" if rsi_long_condition and (not minBarsEnabled or barsSinceLastTrade >= minBarsBetweenTrades) strategy.entry("Long_RSI", strategy.long, qty=positionSize) strategy.exit("TP/SL Long_RSI", from_entry="Long_RSI", stop=stopLossLong, limit=takeProfitLong) if tradingDirection == "Short" or tradingDirection == "Both" if rsi_short_condition and (not minBarsEnabled or barsSinceLastTrade >= minBarsBetweenTrades) strategy.entry("Short_RSI", strategy.short, qty=positionSize) strategy.exit("TP/SL Short_RSI", from_entry="Short_RSI", stop=stopLossShort, limit=takeProfitShort)