Sumber daya yang dimuat... Pemuatan...

SR Strategi Breakout

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

img

Gambaran umum

SR Breakout Strategy adalah strategi support dan resistance breakout yang dikembangkan berdasarkan LonesomeTheBlues breakout finder indicator. Ide utama strategi ini adalah untuk menghasilkan sinyal panjang atau pendek dengan menilai apakah harga penutupan melanggar level support atau resistance. Pengaturan default didasarkan pada grafik candlestick 8 jam, tetapi ada pengaturan parameter yang lebih optimal pada grafik candlestick 4 jam. Strategi ini menggunakan fungsi pivothigh dan pivotlow untuk menentukan level support dan resistance, dan menggunakan harga tertinggi dan terendah untuk menentukan breakout.

Prinsip Strategi

  1. Gunakan fungsi pivothigh dan pivotlow untuk menghitung puncak dan terendah selama periode waktu tertentu dan menyimpannya dalam array.
  2. Tentukan apakah harga penutupan saat ini lebih tinggi dari level resistance. Jika demikian, itu dinilai sebagai bullish breakout dan sinyal panjang dihasilkan.
  3. Tentukan apakah harga penutupan saat ini lebih rendah dari level support. Jika demikian, itu dinilai sebagai penembusan bearish dan sinyal pendek dihasilkan.
  4. Setelah menghasilkan sinyal perdagangan, hitung harga stop loss dan take profit berdasarkan rasio stop loss dan take profit yang ditetapkan, dan atur stop loss dan take profit yang sesuai.
  5. Gambar rentang pecah yang sesuai sesuai dengan arah pecah.

Keuntungan Strategi

  1. Support dan resistance breakout adalah strategi trading klasik dengan dasar praktis tertentu.
  2. Dengan menggunakan fungsi pivothigh dan pivotlow untuk menghitung level support dan resistance, peluang breakout dapat ditangkap dengan relatif akurat.
  3. Struktur kode dari strategi ini jelas, dan dengan menyimpan highs dan lows dalam array, itu nyaman untuk backtesting dan pengoptimalan.
  4. Stop loss dan take profit ditetapkan, yang dapat mengendalikan risiko relatif baik.

Risiko Strategi

  1. Strategi support dan resistance breakout berkinerja buruk di pasar yang bergolak dan cenderung sering terjadi false breakout.
  2. Rasio stop loss dan take profit yang tetap mungkin tidak dapat beradaptasi dengan kondisi pasar yang berbeda, yang mengakibatkan ketidakseimbangan risiko dan pengembalian.
  3. Strategi ini hanya mempertimbangkan faktor harga dan tidak mempertimbangkan indikator penting lainnya seperti volume perdagangan, yang mungkin kehilangan beberapa sinyal penting.

Arah Optimasi Strategi

  1. Pertimbangkan untuk memperkenalkan lebih banyak indikator teknis, seperti volume perdagangan, MACD, dll, untuk meningkatkan akurasi dan keandalan sinyal.
  2. Untuk stop loss dan take profit, pertimbangkan untuk menggunakan trailing stop atau dynamic stop loss dan take profit ratio untuk lebih beradaptasi dengan kondisi pasar yang berbeda.
  3. Pertimbangkan untuk memperkenalkan kondisi penyaringan, seperti penyaringan tren, penyaringan volatilitas, dll, untuk mengurangi pecah palsu di pasar bergolak.
  4. Pertimbangkan untuk mengoptimalkan level support dan resistance, seperti menggunakan periode adaptif, memperkenalkan level Fibonacci, dll.

Ringkasan

SR Breakout Strategy adalah strategi trading yang didasarkan pada ide klasik support dan resistance breakout. Dengan menggunakan fungsi pivothigh dan pivotlow untuk menghitung level support dan resistance, dan dengan menilai apakah harga penutupan menembus level-level ini untuk menghasilkan sinyal trading. Keuntungan dari strategi ini adalah bahwa idenya jelas dan mudah diterapkan dan dioptimalkan; pada saat yang sama, ada juga beberapa risiko, seperti kinerja yang buruk di pasar yang bergolak, dan risiko yang mungkin disebabkan oleh rasio stop loss dan take profit tetap. Di masa depan, kita dapat mempertimbangkan untuk mengoptimalkan dan meningkatkan strategi ini dari aspek-aspek seperti indikator teknis, stop loss dan take profit, kondisi penyaringan, optimalisasi support dan resistance, dll, untuk meningkatkan stabilitas dan profitabilitasnya.


/*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 banyak