Chiến lược SR Breakout là một chiến lược phá vỡ hỗ trợ và kháng cự được phát triển dựa trên chỉ số tìm kiếm phá vỡ của LonesomeTheBlue
Chiến lược SR Breakout là một chiến lược giao dịch dựa trên ý tưởng cổ điển của sự phá vỡ hỗ trợ và kháng cự. Bằng cách sử dụng các hàm pivothigh và pivotlow để tính toán mức hỗ trợ và kháng cự, và bằng cách đánh giá xem giá đóng phá vỡ các mức này để tạo ra tín hiệu giao dịch. Lợi thế của chiến lược này là ý tưởng rõ ràng và dễ thực hiện và tối ưu hóa; đồng thời, cũng có một số rủi ro, chẳng hạn như hiệu suất kém trong thị trường hỗn loạn, và những rủi ro có thể được gây ra bởi tỷ lệ dừng lỗ và lợi nhuận cố định. Trong tương lai, chúng ta có thể xem xét tối ưu hóa và cải thiện chiến lược này từ các khía cạnh như chỉ số kỹ thuật, dừng lỗ và lợi nhuận, điều kiện lọc, tối ưu hóa hỗ trợ và kháng cự, v.v., để cải thiện sự ổn định và lợi nhuận của nó.
/*backtest start: 2024-05-07 00:00:00 end: 2024-05-14 00:00:00 period: 10m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © LonesomeTheBlue © chanu_lev10k //@version=5 strategy('SR Breakout Strategy', overlay=true, max_bars_back=500, max_lines_count=400) prd = input.int(defval=5, title='Period', minval=2) bo_len = input.int(defval=71, title='Max Breakout Length', minval=30, maxval=300) cwidthu = input.float(defval=3., title='Threshold Rate %', minval=1., maxval=10) / 100 mintest = input.int(defval=2, title='Minimum Number of Tests', minval=1) bocolorup = input.color(defval=color.blue, title='Breakout Colors', inline='bocol') bocolordown = input.color(defval=color.red, title='', inline='bocol') // lstyle = input.string(defval=line.style_solid, title='Line Style') issl = input.bool(title='SL', inline='linesl1', group='Stop Loss / Take Profit:', defval=false) slpercent = input.float(title=', %', inline='linesl1', group='Stop Loss / Take Profit:', defval=18.0, minval=0.0, step=0.1) istp = input.bool(title='TP', inline='linetp1', group='Stop Loss / Take Profit:', defval=false) tppercent = input.float(title=', %', inline='linetp1', group='Stop Loss / Take Profit:', defval=18.0, minval=0.0, step=0.1) //width lll = math.max(math.min(bar_index, 300), 1) float h_ = ta.highest(lll) float l_ = ta.lowest(lll) float chwidth = (h_ - l_) * cwidthu // check if PH/PL ph = ta.pivothigh(prd, prd) pl = ta.pivotlow(prd, prd) //keep Pivot Points and their locations in the arrays var phval = array.new_float(0) var phloc = array.new_int(0) var plval = array.new_float(0) var plloc = array.new_int(0) // keep PH/PL levels and locations if bool(ph) array.unshift(phval, ph) array.unshift(phloc, bar_index - prd) if array.size(phval) > 1 // cleanup old ones for x = array.size(phloc) - 1 to 1 by 1 if bar_index - array.get(phloc, x) > bo_len array.pop(phloc) array.pop(phval) if bool(pl) array.unshift(plval, pl) array.unshift(plloc, bar_index - prd) if array.size(plval) > 1 // cleanup old ones for x = array.size(plloc) - 1 to 1 by 1 if bar_index - array.get(plloc, x) > bo_len array.pop(plloc) array.pop(plval) // check bullish cup float bomax = na int bostart = bar_index num = 0 hgst = ta.highest(prd)[1] if array.size(phval) >= mintest and close > open and close > hgst bomax := array.get(phval, 0) xx = 0 for x = 0 to array.size(phval) - 1 by 1 if array.get(phval, x) >= close break xx := x bomax := math.max(bomax, array.get(phval, x)) bomax if xx >= mintest and open <= bomax for x = 0 to xx by 1 if array.get(phval, x) <= bomax and array.get(phval, x) >= bomax - chwidth num += 1 bostart := array.get(phloc, x) bostart if num < mintest or hgst >= bomax bomax := na bomax // if not na(bomax) and num >= mintest // line.new(x1=bar_index, y1=bomax, x2=bostart, y2=bomax, color=bocolorup) // line.new(x1=bar_index, y1=bomax - chwidth, x2=bostart, y2=bomax - chwidth, color=bocolorup) // line.new(x1=bostart, y1=bomax - chwidth, x2=bostart, y2=bomax, color=bocolorup) // line.new(x1=bar_index, y1=bomax - chwidth, x2=bar_index, y2=bomax, color=bocolorup) plotshape(not na(bomax) and num >= mintest, location=location.belowbar, style=shape.triangleup, color=bocolorup, size=size.small) //alertcondition(not na(bomax) and num >= mintest, title='Breakout', message='Breakout') // check bearish cup float bomin = na bostart := bar_index num1 = 0 lwst = ta.lowest(prd)[1] if array.size(plval) >= mintest and close < open and close < lwst bomin := array.get(plval, 0) xx = 0 for x = 0 to array.size(plval) - 1 by 1 if array.get(plval, x) <= close break xx := x bomin := math.min(bomin, array.get(plval, x)) bomin if xx >= mintest and open >= bomin for x = 0 to xx by 1 if array.get(plval, x) >= bomin and array.get(plval, x) <= bomin + chwidth num1 += 1 bostart := array.get(plloc, x) bostart if num1 < mintest or lwst <= bomin bomin := na bomin // if not na(bomin) and num1 >= mintest // line.new(x1=bar_index, y1=bomin, x2=bostart, y2=bomin, color=bocolordown) // line.new(x1=bar_index, y1=bomin + chwidth, x2=bostart, y2=bomin + chwidth, color=bocolordown) // line.new(x1=bostart, y1=bomin + chwidth, x2=bostart, y2=bomin, color=bocolordown) // line.new(x1=bar_index, y1=bomin + chwidth, x2=bar_index, y2=bomin, color=bocolordown) plotshape(not na(bomin) and num1 >= mintest, location=location.abovebar, style=shape.triangledown, color=bocolordown, size=size.small) //alertcondition(not na(bomin) and num1 >= mintest, title='Breakdown', message='Breakdown') //alertcondition(not na(bomax) and num >= mintest or not na(bomin) and num1 >= mintest, title='Breakout or Breakdown', message='Breakout or Breakdown') // Long Short conditions longCondition = not na(bomax) and num >= mintest if longCondition strategy.entry('Long', strategy.long) shortCondition = not na(bomin) and num1 >= mintest if shortCondition strategy.entry('Short', strategy.short) // Entry price / Take Profit / Stop Loss //entryprice = strategy.position_avg_price entryprice = ta.valuewhen(condition=longCondition or shortCondition, source=close, occurrence=0) pm = longCondition ? 1 : shortCondition ? -1 : 1 / math.sign(strategy.position_size) takeprofit = entryprice * (1 + pm * tppercent * 0.01) stoploss = entryprice * (1 - pm * slpercent * 0.01) strategy.exit(id='Exit Long', from_entry='Long', stop=issl ? stoploss : na, limit=istp ? takeprofit : na, alert_message='Exit Long') strategy.exit(id='Exit Short', from_entry='Short', stop=issl ? stoploss : na, limit=istp ? takeprofit : na, alert_message='Exit Short')