SR Breakout Strategy adalah strategi support dan resistance breakout yang dibangunkan berdasarkan LonesomeTheBlue
SR Breakout Strategy adalah strategi perdagangan berdasarkan idea klasik support and resistance breakout. Dengan menggunakan fungsi pivothigh dan pivotlow untuk mengira tahap sokongan dan rintangan, dan dengan menilai sama ada harga penutupan menembusi tahap ini untuk menjana isyarat perdagangan. Kelebihan strategi ini adalah bahawa idenya jelas dan mudah dilaksanakan dan dioptimumkan; pada masa yang sama, terdapat juga beberapa risiko, seperti prestasi yang buruk di pasaran yang berbelit-belit, dan risiko yang mungkin disebabkan oleh nisbah stop loss dan take profit tetap. Pada masa akan datang, kita boleh mempertimbangkan untuk mengoptimumkan dan meningkatkan strategi ini dari aspek seperti penunjuk teknikal, stop loss dan take profit, syarat penapisan, pengoptimuman sokongan dan rintangan, dll., untuk meningkatkan kestabilan dan keuntungan.
/*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')