Strategi Pemecahan SR


Tarikh penciptaan: 2024-05-15 16:30:14 Akhirnya diubah suai: 2024-05-15 16:30:14
Salin: 1 Bilangan klik: 568
1
fokus pada
1617
Pengikut

Strategi Pemecahan SR

Gambaran keseluruhan

Strategi SR Breakout adalah strategi penembusan rintangan sokongan yang dibangunkan berdasarkan indikator penemu penembusan LonesomeTheBlue. Gagasan utama strategi ini adalah untuk menghasilkan isyarat melakukan atau melakukan dengan menilai sama ada harga tutup telah memecahkan tahap sokongan atau rintangan.

Prinsip Strategi

  1. Fungsi pivothigh dan pivotlow digunakan untuk mengira tinggi dan rendah pada tempoh tertentu yang lalu, dan disimpan ke dalam array.
  2. Menentukan sama ada harga penutupan semasa berada di atas tahap rintangan, dan jika ya, ia dianggap sebagai penembusan bullish yang menghasilkan isyarat lebih banyak.
  3. Menentukan sama ada harga penutupan semasa berada di bawah tahap sokongan, dan jika ya, ia dianggap sebagai pecah penurunan, menghasilkan isyarat shorting.
  4. Selepas menghasilkan isyarat dagangan, harga hentian dan hentian dihitung mengikut perkadaran hentian dan hentian yang ditetapkan, dan pesanan hentian dan hentian yang sesuai ditetapkan.
  5. Menggambar jarak yang sesuai mengikut arah penembusan.

Kelebihan Strategik

  1. Penembusan rintangan sokongan adalah strategi dagangan klasik yang mempunyai asas pertempuran.
  2. Dengan menggunakan fungsi pivothigh dan pivotlow, anda boleh mengira kedudukan sokongan dan rintangan dengan lebih tepat.
  3. Strategi ini mempunyai struktur kod yang jelas, dan dapat dengan mudah dikesan dan dioptimumkan dengan menyimpan titik tinggi dan rendah ke dalam array.
  4. Ia juga mempunyai penghalang dan penangguhan untuk mengawal risiko.

Risiko Strategik

  1. Strategi penembusan rintangan sokongan tidak berfungsi dengan baik dalam keadaan gegaran, mudah untuk berlaku penembusan palsu yang kerap.
  2. Nisbah Hentian Kerugian Tetap mungkin tidak dapat disesuaikan dengan keadaan yang berbeza, menyebabkan ketidakseimbangan Risiko-Penghasilan.
  3. Strategi ini hanya mempertimbangkan faktor harga dan tidak mempertimbangkan petunjuk penting lain seperti jumlah transaksi, dan mungkin terlepas beberapa isyarat penting.

Arah pengoptimuman strategi

  1. Ia boleh mempertimbangkan untuk memperkenalkan lebih banyak petunjuk teknikal, seperti jumlah lalu lintas, MACD dan lain-lain, untuk meningkatkan ketepatan dan kebolehpercayaan isyarat.
  2. Untuk hentikan dan hentikan, anda boleh mempertimbangkan untuk menggunakan hentikan bergerak atau kadar hentikan hentikan dinamik untuk menyesuaikan diri dengan keadaan yang berbeza.
  3. Anda boleh mempertimbangkan untuk memperkenalkan syarat penapis, seperti penapis trend, penapis kadar turun naik, dan lain-lain untuk mengurangkan pecah palsu dalam keadaan gegaran.
  4. Anda boleh mempertimbangkan untuk mengoptimumkan kedudukan sokongan dan rintangan, seperti menggunakan kitaran penyesuaian, memperkenalkan Fibonacci.

ringkaskan

Strategi SR Breakout adalah strategi perdagangan berdasarkan idea pemecahan rintangan sokongan klasik, dengan menggunakan fungsi pivothigh dan pivotlow untuk mengira tahap sokongan dan rintangan, dan menghasilkan isyarat perdagangan dengan menilai sama ada harga penutupan menembusi kedudukan tersebut. Kelebihan strategi ini adalah pemikiran yang jelas, mudah dilaksanakan dan dioptimumkan; tetapi terdapat juga beberapa risiko, seperti prestasi yang buruk dalam keadaan yang bergolak, dan risiko yang mungkin dibawa oleh kadar stop loss yang tetap.

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