Strategi Terobosan SR


Tanggal Pembuatan: 2024-05-15 16:30:14 Akhirnya memodifikasi: 2024-05-15 16:30:14
menyalin: 1 Jumlah klik: 568
1
fokus pada
1617
Pengikut

Strategi Terobosan SR

Ringkasan

SR Breakout Strategy adalah strategi support-resistance breakout yang dikembangkan berdasarkan indikator breakout finder dari LonesomeTheBlue. Ide utama strategi ini adalah untuk menghasilkan sinyal over atau under dengan menilai apakah harga close out telah menembus level support atau resistance. Setelan default didasarkan pada garis K 8 jam, tetapi ada pengaturan parameter yang lebih baik pada garis K 4 jam. Strategi ini menggunakan fungsi pivothigh dan pivotlow untuk menentukan level support dan resistance, dan menggunakan harga tertinggi dan terendah untuk menentukan penembusan.

Prinsip Strategi

  1. Fungsi pivothigh dan pivotlow digunakan untuk menghitung masing-masing titik tinggi dan rendah pada periode tertentu di masa lalu, dan disimpan dalam array.
  2. Periksa apakah harga penutupan saat ini berada di atas level resistensi, dan jika demikian, pertimbangkanlah untuk melakukan penembusan bullish, yang menghasilkan sinyal positif.
  3. Periksa apakah harga penutupan saat ini berada di bawah level dukungan, dan jika demikian, pertimbangkanlah untuk menembus penurunan harga dan menghasilkan sinyal shorting.
  4. Setelah menghasilkan sinyal perdagangan, stop loss dan stop loss dihitung berdasarkan rasio stop loss yang ditetapkan, dan stop loss dan stop loss yang sesuai ditetapkan.
  5. Menggambar jarak tembus yang sesuai dengan arah tembus.

Keunggulan Strategis

  1. Support-resistance breakout adalah strategi perdagangan klasik yang memiliki dasar pertempuran.
  2. Dengan menggunakan fungsi pivothigh dan pivotlow untuk menghitung support dan resistance, maka dapat lebih akurat menangkap situasi terobosan.
  3. Strategi ini memiliki struktur kode yang jelas, dan dapat dengan mudah diperiksa dan dioptimalkan dengan menyimpan titik tinggi dan rendah ke dalam array.
  4. Stop Loss dan Stop Stop telah disiapkan untuk mengendalikan risiko.

Risiko Strategis

  1. Strategi support-resistance breakout tidak bekerja dengan baik dalam situasi yang bergoyang, dan sering terjadi false breakout.
  2. Rasio Stop Loss Fixed mungkin tidak dapat disesuaikan dengan situasi yang berbeda, yang menyebabkan ketidakseimbangan risiko-penghasilan.
  3. Strategi ini hanya mempertimbangkan faktor harga, dan tidak mempertimbangkan indikator penting lainnya seperti volume transaksi, dan mungkin akan kehilangan beberapa sinyal penting.

Arah optimasi strategi

  1. Lebih banyak indikator teknis seperti volume transaksi, MACD, dan lain-lain dapat dipertimbangkan untuk meningkatkan akurasi dan keandalan sinyal.
  2. Untuk stop loss dan stop braking, pertimbangkan untuk menggunakan stop loss bergerak atau stop stop loss dinamis untuk lebih menyesuaikan dengan situasi yang berbeda.
  3. Hal ini dapat dipertimbangkan untuk memperkenalkan kondisi filter, seperti filter tren, filter volatilitas, dan lain-lain, untuk mengurangi false breakout dalam situasi getaran.
  4. Optimasi terhadap posisi dukungan dan resistensi dapat dipertimbangkan, seperti menggunakan siklus adaptasi, memperkenalkan Fibonacci dan lain-lain.

Meringkaskan

Strategi SR Breakout adalah strategi perdagangan yang didasarkan pada ide pemecahan resistensi dukungan klasik, dengan menggunakan fungsi pivothigh dan pivotlow untuk menghitung posisi dukungan dan resistensi, dan dengan menilai apakah harga penutupan akan menembus posisi tersebut untuk menghasilkan sinyal perdagangan. Keuntungan dari strategi ini adalah ide yang jelas, mudah diimplementasikan dan dioptimalkan; ada juga beberapa risiko, seperti kinerja yang buruk dalam situasi yang bergolak, dan risiko yang mungkin ditimbulkan oleh rasio stop loss yang tetap.

Kode Sumber Strategi
/*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')