Sumber dimuat naik... memuat...

SR Strategi Penembusan

Penulis:ChaoZhang, Tarikh: 2024-05-15 16:30:14
Tag:

img

Ringkasan

SR Breakout Strategy adalah strategi support dan resistance breakout yang dibangunkan berdasarkan LonesomeTheBlues breakout finder indicator. Idea utama strategi ini adalah untuk menjana isyarat panjang atau pendek dengan menilai sama ada harga penutupan memecahkan tahap sokongan atau rintangan. Tetapan lalai adalah berdasarkan carta lilin 8 jam, tetapi terdapat tetapan parameter yang lebih optimum pada carta lilin 4 jam. Strategi ini menggunakan fungsi pivothigh dan pivotlow untuk menentukan tahap sokongan dan rintangan, dan menggunakan harga tertinggi dan terendah untuk menentukan breakout.

Prinsip Strategi

  1. Gunakan fungsi pivothigh dan pivotlow untuk mengira paras tertinggi dan terendah dalam tempoh masa tertentu dan menyimpannya dalam array.
  2. Tentukan sama ada harga penutupan semasa lebih tinggi daripada tahap rintangan. Jika ya, ia dinilai sebagai pecah menaik dan isyarat panjang dihasilkan.
  3. Tentukan sama ada harga penutupan semasa adalah lebih rendah daripada tahap sokongan. Jika ya, ia dinilai sebagai pecah menurun dan isyarat pendek dihasilkan.
  4. Selepas menghasilkan isyarat dagangan, mengira harga stop loss dan mengambil keuntungan berdasarkan nisbah stop loss dan mengambil keuntungan yang ditetapkan, dan menetapkan stop loss dan mengambil keuntungan yang sepadan.
  5. Menggambar julat pecah yang sepadan mengikut arah pecah.

Kelebihan Strategi

  1. Pemecahan sokongan dan rintangan adalah strategi perdagangan klasik dengan asas praktikal tertentu.
  2. Dengan menggunakan fungsi pivothigh dan pivotlow untuk mengira tahap sokongan dan rintangan, peluang pecah boleh ditangkap dengan agak tepat.
  3. Struktur kod strategi ini jelas, dan dengan menyimpan puncak dan terendah dalam array, ia mudah untuk backtesting dan pengoptimuman.
  4. Stop loss dan mengambil keuntungan ditetapkan, yang boleh mengawal risiko dengan agak baik.

Risiko Strategi

  1. Strategi pecah sokongan dan rintangan berprestasi buruk di pasaran yang bergolak dan cenderung untuk pecah palsu yang kerap.
  2. Nisbah stop loss dan mengambil keuntungan tetap mungkin tidak dapat menyesuaikan diri dengan keadaan pasaran yang berbeza, mengakibatkan ketidakseimbangan risiko dan pulangan.
  3. Strategi ini hanya mempertimbangkan faktor harga dan tidak mempertimbangkan penunjuk penting lain seperti jumlah dagangan, yang mungkin terlepas beberapa isyarat penting.

Arah Pengoptimuman Strategi

  1. Pertimbangkan untuk memperkenalkan lebih banyak penunjuk teknikal, seperti jumlah dagangan, MACD, dll., Untuk meningkatkan ketepatan dan kebolehpercayaan isyarat.
  2. Untuk stop loss dan mengambil keuntungan, pertimbangkan untuk menggunakan stop trailing atau stop loss dinamik dan mengambil nisbah keuntungan untuk menyesuaikan diri dengan lebih baik dengan keadaan pasaran yang berbeza.
  3. Pertimbangkan untuk memperkenalkan keadaan penapisan, seperti penapisan trend, penapisan turun naik, dan lain-lain, untuk mengurangkan pecah palsu di pasaran yang bergolak.
  4. Pertimbangkan untuk mengoptimumkan tahap sokongan dan rintangan, seperti menggunakan tempoh penyesuaian, memperkenalkan tahap Fibonacci, dll.

Ringkasan

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')

Lebih lanjut