
Ý tưởng chính của chiến lược này là xác định thời điểm vào thị trường, kết hợp với sự phá vỡ của ngưỡng kháng cự hỗ trợ và khối lượng giao dịch, và sử dụng chỉ số ATR để thực hiện động điều chỉnh giá theo dõi dừng lỗ sau khi đạt được lợi nhuận, do đó thu được nhiều lợi nhuận tiềm năng hơn.
Chiến lược này bao gồm các phần logic sau:
Sử dụng hàm ta.pivothigh và ta.pivotlow để tính giá trị tối đa của đường L_Bars gốc K và giá trị tối thiểu của đường R_Bars gốc K, làm đường kháng và đường hỗ trợ.
Khi giá đóng cửa vượt qua ngưỡng kháng cự và khối lượng giao dịch vượt qua ngưỡng volumeRange, hãy làm nhiều hơn; Khi giá đóng cửa vượt qua ngưỡng hỗ trợ và khối lượng giao dịch vượt qua ngưỡng volumeRange, hãy làm trống.
Sau khi thực hiện nhiều, sử dụng close-ATR_LO làm dừng dài; sau khi thực hiện ngắn, sử dụng close+ATR_SH làm dừng ngắn, để thực hiện dừng theo dõi động.
Trong thời gian giao dịch ((0915-1445), mỗi ngày thực hiện tín hiệu giao dịch đầu tiên, không mở lệnh mới sau khi thu nhập hoặc lỗ đạt mức rủi ro.
Sử dụng lý thuyết kháng cự hỗ trợ, kết hợp với chỉ số khối lượng giao thông, làm cho thời gian nhập cảnh chính xác hơn.
Sử dụng chỉ số ATR để theo dõi dừng lỗ, có thể điều chỉnh vị trí dừng lỗ một cách linh hoạt theo mức độ biến động của thị trường, giảm khả năng quay trở lại lợi nhuận sau khi đạt được lợi nhuận.
Kiểm soát đúng số lần giao dịch trong ngày và rủi ro giao dịch đơn lẻ sẽ giúp nắm bắt xu hướng và tránh lỗ quá nhiều.
Hỗ trợ kháng cự có thể bị hỏng và không cung cấp tín hiệu nhập cảnh hiệu quả.
Thiết lập ATR quá lớn có thể dẫn đến việc dừng lỗ quá xa, làm tăng nguy cơ thua lỗ.
Thiết lập chỉ số giao dịch quá nhỏ có thể dẫn đến cơ hội bị bỏ lỡ; thiết lập quá lớn có thể dẫn đến tín hiệu sai lầm.
Giải pháp:
Điều chỉnh tham số kháng cự hỗ trợ theo đặc điểm của các giống khác nhau
Tối ưu hóa số ATR và tham số giá trị giảm khối lượng giao dịch
Kết hợp với các chỉ số khác để đánh giá thời gian nhập cảnh
Kết hợp với các chỉ số khác để đánh giá thời gian nhập cảnh, chẳng hạn như trung bình di chuyển
Tối ưu hóa các tham số ATR và các tham số giá trị giao dịch
Tối ưu hóa tham số động kết hợp với thuật toán học máy
Mở rộng đến các giống khác, tìm các tham số chính xác
Chiến lược này tích hợp nhiều công cụ phân tích và đạt được hiệu quả tốt hơn trong giai đoạn đo lường bằng cách sử dụng phương pháp hỗ trợ kháng cự, khối lượng giao dịch và dừng lỗ. Tuy nhiên, trong thực tế, có thể phải đối mặt với nhiều sự không chắc chắn hơn, cần phải tăng cường hiệu suất thực tế hơn nữa bằng cách tối ưu hóa tham số và giới thiệu các chỉ số phán đoán khác.
/*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)