Chiến lược này kết hợp nhiều chỉ số trung bình chuyển động nhân tố (EMA), chỉ số sức mạnh tương đối (RSI) và điều kiện thoát dựa trên độ lệch chuẩn để xác định các cơ hội mua và bán tiềm năng. Nó sử dụng EMA ngắn hạn (6, 8, 12 ngày), trung hạn (55 ngày) và dài hạn (150, 200, 250 ngày) để phân tích hướng và sức mạnh của xu hướng thị trường. RSI, với ngưỡng mua (30) và bán (70) có thể cấu hình, được sử dụng để đánh giá đà và xác định các điều kiện mua quá mức hoặc bán quá mức. Chiến lược cũng có một cơ chế thoát duy nhất kích hoạt khi giá đóng đạt phạm vi lệch chuẩn có thể cấu hình được (mất định 0,5) từ EMA 12 ngày, cung cấp một phương pháp để bảo vệ lợi nhuận hoặc giảm thiểu tổn thất tiềm ẩn.
Bài viết này đề xuất một chiến lược giao dịch đột phá chiều cao nến dựa trên nhiều đường trung bình động, RSI và lối thoát lệch chuẩn. Chiến lược phân tích thị trường từ cả hai chiều xu hướng và động lực trong khi sử dụng một cơ chế thoát lệch chuẩn độc đáo để nắm bắt các cơ hội xu hướng và quản lý rủi ro. Logic chiến lược rõ ràng, nghiêm ngặt và việc thực hiện mã là ngắn gọn và hiệu quả. Với tối ưu hóa thích hợp, chiến lược này có tiềm năng trở thành một chiến lược giao dịch tần suất trung bình đến cao mạnh mẽ. Tuy nhiên, điều quan trọng cần lưu ý là bất kỳ chiến lược nào cũng có những hạn chế của nó, và việc sử dụng mù có thể giới thiệu rủi ro.
/*backtest start: 2023-03-22 00:00:00 end: 2024-03-27 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Candle Height Breakout with Configurable Exit and Signal Control", shorttitle="CHB Single Signal", overlay=true) // Input parameters for EMA filter and its length useEmaFilter = input.bool(true, "Use EMA Filter", group="Entry Conditions") emaFilterLength = input.int(55, "EMA Filter Length", minval=1, group="Entry Conditions") candleCount = input.int(4, "SamG Configurable Candle Count for Entry", minval=3, maxval=4, step=1, group="Entry Conditions") exitEmaLength = input.int(12, "Exit EMA Length", minval=1, group="Exit Conditions", defval=12) exitStdDevMultiplier = input.float(0.5, "Exit Std Dev Multiplier", minval=0.1, maxval=2.0, step=0.1, group="Exit Conditions") // State variables to track if we are in a long or short position var bool inLong = false var bool inShort = false // Calculating EMAs with fixed periods for visual reference ema6 = ta.ema(close, 6) ema8 = ta.ema(close, 8) ema12 = ta.ema(close, 12) ema55 = ta.ema(close, 55) ema100 = ta.ema(close, 100) ema150 = ta.ema(close, 150) ema200 = ta.ema(close, 200) emaFilter = ta.ema(close, emaFilterLength) exitEma = ta.ema(close, exitEmaLength) // Plotting EMAs plot(ema6, "EMA 6", color=color.red) plot(ema8, "EMA 8", color=color.orange) plot(ema12, "EMA 12", color=color.yellow) plot(ema55, "EMA 55", color=color.green) plot(ema100, "EMA 100", color=color.blue) plot(ema150, "EMA 150", color=color.purple) plot(ema200, "EMA 200", color=color.fuchsia) plot(emaFilter, "EMA Filter", color=color.black) plot(exitEma, "Exit EMA", color=color.gray) // Calculating the highest and lowest of the last N candles based on user input highestOfN = ta.highest(high[1], candleCount) lowestOfN = ta.lowest(low[1], candleCount) // Entry Conditions with EMA Filter longEntryCondition = not inLong and not inShort and (close > highestOfN) and (not useEmaFilter or (useEmaFilter and close > emaFilter)) shortEntryCondition = not inLong and not inShort and (close < lowestOfN) and (not useEmaFilter or (useEmaFilter and close < emaFilter)) // Update position state on entry if (longEntryCondition) strategy.entry("Buy", strategy.long, comment="B") inLong := true inShort := false if (shortEntryCondition) strategy.entry("Sell", strategy.short, comment="S") inLong := false inShort := true // Exit Conditions based on configurable EMA and Std Dev Multiplier smaForExit = ta.sma(close, exitEmaLength) upperExitBand = smaForExit + exitStdDevMultiplier * ta.stdev(close, exitEmaLength) lowerExitBand = smaForExit - exitStdDevMultiplier * ta.stdev(close, exitEmaLength) exitConditionLong = inLong and (close < upperExitBand or close < exitEma) exitConditionShort = inShort and (close > lowerExitBand or close > exitEma) // Strategy exits if (exitConditionLong) strategy.close("Buy", comment="Exit") inLong := false if (exitConditionShort) strategy.close("Sell", comment="Exit") inShort := false // Visualizing entry and exit points plotshape(series=longEntryCondition, style=shape.labelup, location=location.belowbar, color=color.green, size=size.tiny, title="Buy Signal", text="B") plotshape(series=shortEntryCondition, style=shape.labeldown, location=location.abovebar, color=color.red, size=size.tiny, title="Sell Signal", text="S")