Ý tưởng chính của chiến lược này là kết hợp các mức hỗ trợ/kháng cự và các mức đột phá khối lượng để xác định các tín hiệu nhập cảnh và sử dụng chỉ số ATR để điều chỉnh stop loss cho việc lấy lợi nhuận một cách năng động, để nắm bắt nhiều lợi nhuận tiềm năng hơn.
Chiến lược bao gồm các logic chính sau:
Sử dụng ta.pivothigh và ta.pivotlow để tính giá cao nhất của nến L_Bars trước và giá thấp nhất của nến R_Bars trước, như mức kháng cự và hỗ trợ.
Khi giá đóng vượt qua ngưỡng kháng cự và khối lượng vượt qua ngưỡng VolumeRange, mua mua. Khi giá đóng vượt qua mức hỗ trợ và khối lượng vượt qua ngưỡng VolumeRange, mua mua.
Sau khi bước vào dài, đặt stop loss ở mức close-ATR_LO. Sau khi bước vào ngắn, đặt stop loss ở mức close+ATR_SH. Điều này thực hiện điều chỉnh stop loss theo dõi năng động.
Chỉ nhận tín hiệu đầu tiên trong giờ giao dịch (0915-1445) mỗi ngày. Không có lệnh mới sau khi đạt đến giới hạn rủi ro hàng ngày được xác định bởi đầu vào rủi ro.
Sử dụng lý thuyết hỗ trợ / kháng cự kết hợp với chỉ số khối lượng để cải thiện độ chính xác nhập.
Trailing stop loss dựa trên ATR có thể điều chỉnh mức dừng linh hoạt dựa trên biến động thị trường, làm giảm cơ hội thu lại lợi nhuận.
Kiểm soát thích hợp về thời gian giao dịch hàng ngày và rủi ro theo giao dịch giúp bắt được xu hướng và tránh dừng lỗ quá mức.
Mức hỗ trợ/kháng cự có thể thất bại và không thể cung cấp tín hiệu nhập cảnh hiệu quả.
Lượng nhân ATR được đặt quá cao có thể dẫn đến việc dừng lỗ quá xa, làm tăng rủi ro mất mát.
Mức giới hạn khối lượng đặt quá thấp có thể bỏ lỡ cơ hội, quá cao có thể gây ra tín hiệu sai.
Giải pháp:
Điều chỉnh các thông số hỗ trợ / kháng dựa trên các đặc điểm sản phẩm khác nhau.
Tối ưu hóa các thông số nhân ATR và ngưỡng khối lượng.
Thêm các chỉ số khác để xác nhận tín hiệu nhập cảnh.
Thêm các chỉ số khác như đường trung bình động để giúp xác định tín hiệu nhập cảnh.
Tối ưu hóa các thông số như ATR nhân và ngưỡng khối lượng.
Sử dụng thuật toán học máy để nhận ra tối ưu hóa tham số động.
Mở rộng chiến lược đến các sản phẩm khác để tìm các mẫu tham số.
Chiến lược tích hợp các công cụ phân tích khác nhau, áp dụng các phương pháp hỗ trợ / kháng cự, khối lượng và dừng lỗ, và đạt được kết quả backtest tốt. Nhưng có thể có nhiều sự không chắc chắn hơn trong giao dịch trực tiếp, đòi hỏi phải cải thiện thêm như tối ưu hóa tham số và các chỉ số xác nhận nhập thêm để cải thiện hiệu suất trong thế giới thực. Nhìn chung, chiến lược có logic rõ ràng và dễ hiểu, cung cấp một trường hợp tham chiếu tốt cho các chiến lược giao dịch định lượng.
/*backtest start: 2024-01-03 00:00:00 end: 2024-01-10 00:00:00 period: 30m basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // ____________ _________ _____________ // |____________| ||________| ||__________| // || ____ || || || ______ ________ _____ ________ // || | || || ||________|| | || || || || | || /\\ | // |______| || || |______| // || |===|| |=== ||__________ | || || || || |===|| /__\\ |=== || || \\ || // || | || ||___ || || |___|| ||___ ||___ || | || / \\ | \\ || || ___|| || // || ||________|| ||__________ // || ||________| ||__________| //@version=5 strategy("SUPPORT RESISTANCE STRATEGY [5MIN TF]",overlay=true ) L_Bars = input.int(defval = 10, minval = 1 , maxval = 50, step =1) R_Bars = input.int(defval = 15, minval = 1 , maxval = 50, step =1) volumeRange = input.int(20, title='Volume Break [threshold]', minval = 1) // ═══════════════════════════ // // ——————————> INPUT <——————— // // ═══════════════════════════ // EMA1 = input.int(title='PRICE CROSS EMA', defval = 150, minval = 10 ,maxval = 400) factor1 = input.float(title='_ATR LONG',defval = 3.2 , minval = 1 , maxval = 5 , step = 0.1, tooltip = "ATR TRAIL LONG") factor2 = input.float(title='_ATR SHORT',defval = 3.2 , minval = 1 , maxval = 5 , step = 0.1, tooltip = "ATR TRAIL SHORT") risk = input.float(title='RISK',defval = 200 , minval = 1 , maxval = 5000 , step = 50, tooltip = "RISK PER TRADE") var initialCapital = strategy.equity t = time(timeframe.period, '0915-1445:1234567') time_cond = not na(t) // ══════════════════════════════════ // // ———————————> EMA DATA <——————————— // // ══════════════════════════════════ // ema1 = ta.ema(close, EMA1) plot(ema1, color=color.new(color.yellow, 0), style=plot.style_linebr, title='ema1') // ══════════════════════════════════ // // ————————> TRAIL DATA <———————————— // // ══════════════════════════════════ // // *******Calculate LONG TRAIL data***** ATR_LO = ta.atr(14)*factor1 // *******Calculate SHORT TRAIL data***** ATR_SH = ta.atr(14)*factor2 long_trail = close - ATR_LO short_trail = close + ATR_SH // Plot atr data //plot(longStop, color=color.new(color.green, 0), style=plot.style_linebr, title='Long Trailing Stop') //plot(shortStop , color=color.new(color.red, 0), style=plot.style_linebr, title='Short Trailing Stop') // ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ // // ————————————————————————————————————————————————————————> RESISTANCE/SUPPORT LEVELS DATA <————————————————————————————————————————————————————————————————————————————————————————————— // // ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ // Resistance_pi = fixnan(ta.pivothigh(L_Bars, R_Bars)[1]) Support_pi = fixnan(ta.pivotlow(L_Bars, R_Bars)[1]) r1 = plot(Resistance_pi, color=ta.change(Resistance_pi) ? na : color.red, offset=-(R_Bars + 1),linewidth=2, title='RESISTANCE') s1 = plot(Support_pi, color=ta.change(Support_pi) ? na : color.green, offset=-(R_Bars + 1),linewidth=2, title='SUPPORT') //Volume vol_1 = ta.ema(volume, 5) vol_2 = ta.ema(volume, 10) osc_vol = 100 * (vol_1 - vol_2) / vol_2 // ══════════════════════════════════// // ————————> LONG POSITIONS <————————// // ══════════════════════════════════// //******barinstate.isconfirmed used to avoid repaint in real time******* if ( ta.crossover(close, Resistance_pi) and osc_vol > volumeRange and not(open - low > close - open) and strategy.opentrades==0 and barstate.isconfirmed and time_cond and close >= ema1 ) strategy.entry(id= "Long" ,direction = strategy.long, comment = "BUY") plot(long_trail , color=color.new(color.blue, 0), style=plot.style_linebr, title='long Stop') if strategy.position_size > 0 strategy.exit("long tsl", "Long" , stop = long_trail ,comment='SELL') // ═════════════════════════════════════// // ————————> SHORT POSITIONS <————————— // // ═════════════════════════════════════// if ( ta.crossunder(close, Support_pi) and osc_vol > volumeRange and not(open - close < high - open) and strategy.opentrades==0 and barstate.isconfirmed and time_cond and close <= ema1 ) strategy.entry(id = "Short" ,direction = strategy.short, comment = "SELL") if strategy.position_size < 0 strategy.exit("short tsl", "Short" , stop = short_trail ,comment='BUY') // ════════════════════════════════════════════════// // ————————> CLOSE ALL POSITIONS BY 3PM <————————— // // ════════════════════════════════════════════════// strategy.close_all(when = hour == 14 and minute == 55) // ════════════════════════════════════════// // ————————> MAX INTRADAY LOSS <————————— // // ════════════════════════════════════════// // strategy.risk.max_intraday_loss(type = strategy.cash, value = risk)