Chiến lược đột phá cú sốc xu hướng đơn phương là một chiến lược đột phá sử dụng các kênh giá và đánh giá xu hướng. Nó nhằm mục đích xác định hướng xu hướng, nhập vào các đột phá trong thời gian giới hạn phạm vi và thoát khi đạt được mục tiêu lợi nhuận.
Chiến lược tính toán các băng tần trên và dưới của kênh giá bằng cách sử dụng giá cao nhất và thấp nhất trong một thời gian N gần đây. Sau đó, nó tính toán đường trung bình giá. Khoảng cách giữa giá và đường trung bình được tính trung bình để có được các băng tần kênh.
Để phát hiện xu hướng, chiến lược kiểm tra xem các ngọn nến gần đây đều đóng trên kênh (bullish) hoặc bên dưới (bearish). Sau khi xác nhận xu hướng, nó chờ các cú sốc giá gần các dải và đi theo hướng ngược lại.
Phá vỡ cơ thể bổ sung cho các tín hiệu nhập cảnh khi chiều dài cơ thể vượt quá gấp đôi chiều dài cơ thể trung bình. Chiến lược đặt mục tiêu lợi nhuận sau khi nhập và kiếm lợi nhuận khi giá đạt được nó.
Những lợi thế chính của chiến lược này là:
Ngoài ra còn có một số rủi ro:
Những điều này có thể được giải quyết thông qua điều chỉnh tham số, tránh đảo ngược trong thời gian xu hướng mạnh mẽ, tối ưu hóa logic thoát vv.
Một số cách để cải thiện chiến lược:
Chiến lược đột phá cú sốc xu hướng một bên có lợi từ các sự đột phá chống lại xu hướng trong các khoảng thời gian khác nhau. Nó có lợi thế xác định xu hướng và thu lợi nhuận tích cực, nhưng cũng có một số rủi ro. Những rủi ro này có thể được giảm thông qua xác nhận đa yếu tố, tối ưu hóa tham số vv. Chiến lược phù hợp với giao dịch ngắn hạn và có thể bổ sung cho các chiến lược theo xu hướng.
/*backtest start: 2024-01-10 00:00:00 end: 2024-01-17 00:00:00 period: 3m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("Noro's Bands Scalper Strategy v1.5", shorttitle = "Scalper str 1.5", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value=100.0, pyramiding=0) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(true, defval = true, title = "Short") takepercent = input(0, defval = 0, minval = 0, maxval = 1000, title = "take, %") needbe = input(true, defval = true, title = "Bands Entry") needct = input(false, defval = false, title = "Counter-trend entry") bodylen = input(10, defval = 10, minval = 0, maxval = 50, title = "Body length") trb = input(1, defval = 1, minval = 1, maxval = 5, title = "Trend bars") len = input(20, defval = 20, minval = 2, maxval = 200, title = "Period") needbb = input(true, defval = true, title = "Show Bands") needbg = input(true, defval = true, title = "Show Background") src = close //PriceChannel 1 lasthigh = highest(src, len) lastlow = lowest(src, len) center = (lasthigh + lastlow) / 2 //Distance dist = abs(src - center) distsma = sma(dist, len) hd = center + distsma ld = center - distsma hd2 = center + distsma * 2 ld2 = center - distsma * 2 //Trend chd = close > hd cld = close < ld uptrend = trb == 1 and chd ? 1 : trb == 2 and chd and chd[1] ? 1 : trb == 3 and chd and chd[1] and chd[2] ? 1 : trb == 4 and chd and chd[1] and chd[2] and chd[3] ? 1 : trb == 5 and chd and chd[1] and chd[2] and chd[3] and chd[4] ? 1 : 0 dntrend = trb == 1 and cld ? 1 : trb == 2 and cld and cld[1] ? 1 : trb == 3 and cld and cld[1] and cld[2] ? 1 : trb == 4 and cld and cld[1] and cld[2] and cld[3] ? 1 : trb == 5 and cld and cld[1] and cld[2] and cld[3] and cld[4] ? 1 : 0 trend = dntrend == 1 and high < center ? -1 : uptrend == 1 and low > center ? 1 : trend[1] //trend = close < ld and high < center ? -1 : close > hd and low > center ? 1 : trend[1] //Lines colo = needbb == false ? na : black plot(hd2, color = colo, linewidth = 1, transp = 0, title = "High band 2") plot(hd, color = colo, linewidth = 1, transp = 0, title = "High band 1") plot(center, color = colo, linewidth = 1, transp = 0, title = "center") plot(ld, color = colo, linewidth = 1, transp = 0, title = "Low band 1") plot(ld2, color = colo, linewidth = 1, transp = 0, title = "Low band 2") //Background col = needbg == false ? na : trend == 1 ? lime : red bgcolor(col, transp = 80) //Body body = abs(close - open) smabody = ema(body, 30) / 10 * bodylen //Signals bar = close > open ? 1 : close < open ? -1 : 0 up7 = trend == 1 and ((bar == -1 and bar[1] == -1) or (body > smabody and bar == -1)) ? 1 : 0 dn7 = trend == 1 and ((bar == 1 and bar[1] == 1) or (close > hd and needbe == true)) and close > strategy.position_avg_price * (100 + takepercent) / 100 ? 1 : 0 up8 = trend == -1 and ((bar == -1 and bar[1] == -1) or (close < ld2 and needbe == true)) and close < strategy.position_avg_price * (100 - takepercent) / 100 ? 1 : 0 dn8 = trend == -1 and ((bar == 1 and bar[1] == 1) or (body > smabody and bar == 1)) ? 1 : 0 if up7 == 1 or up8 == 1 strategy.entry("Long", strategy.long, needlong == false ? 0 : trend == -1 and needct == false ? 0 : na) if dn7 == 1 or dn8 == 1 strategy.entry("Short", strategy.short, needshort == false ? 0 : trend == 1 and needct == false ? 0 : na)