Tài nguyên đang được tải lên... tải...

Chiến lược thoát khỏi SR

Tác giả:ChaoZhang, Ngày: 2024-05-15 16:30:14
Tags:

img

Tổng quan

Chiến lược SR Breakout là một chiến lược phá vỡ hỗ trợ và kháng cự được phát triển dựa trên chỉ số tìm kiếm phá vỡ của LonesomeTheBlue. Ý tưởng chính của chiến lược này là tạo ra tín hiệu dài hoặc ngắn bằng cách đánh giá xem giá đóng phá vỡ mức hỗ trợ hoặc kháng cự hay không. Các thiết lập mặc định dựa trên biểu đồ nến 8 giờ, nhưng có các thiết lập tham số tối ưu hơn trên biểu đồ nến 4 giờ. Chiến lược này sử dụng các hàm pivothigh và pivotlow để xác định mức hỗ trợ và kháng cự, và sử dụng giá cao nhất và thấp nhất để xác định phá vỡ.

Nguyên tắc chiến lược

  1. Sử dụng các hàm pivothigh và pivotlow để tính toán mức cao và thấp trong một khoảng thời gian nhất định và lưu trữ chúng trong mảng.
  2. Xác định xem giá đóng hiện tại có cao hơn mức kháng cự không. Nếu vậy, nó được đánh giá là đột phá tăng và một tín hiệu dài được tạo ra.
  3. Xác định xem giá đóng hiện tại có thấp hơn mức hỗ trợ không. Nếu vậy, nó được đánh giá là đột phá giảm và một tín hiệu ngắn được tạo ra.
  4. Sau khi tạo ra tín hiệu giao dịch, tính giá dừng lỗ và lấy lợi nhuận dựa trên tỷ lệ dừng lỗ và lấy lợi nhuận được đặt, và đặt lệnh dừng lỗ và lấy lợi nhuận tương ứng.
  5. Kéo phạm vi thoát tương ứng theo hướng thoát.

Ưu điểm chiến lược

  1. Sự phá vỡ hỗ trợ và kháng cự là một chiến lược giao dịch cổ điển với một cơ sở thực tế nhất định.
  2. Bằng cách sử dụng các hàm pivothigh và pivotlow để tính toán mức hỗ trợ và kháng cự, các cơ hội phá vỡ có thể được nắm bắt tương đối chính xác.
  3. Cấu trúc mã của chiến lược này là rõ ràng, và bằng cách lưu trữ điểm cao và thấp trong mảng, nó thuận tiện cho backtesting và tối ưu hóa.
  4. Dừng lỗ và lấy lợi nhuận được thiết lập, có thể kiểm soát rủi ro tương đối tốt.

Rủi ro chiến lược

  1. Chiến lược phá vỡ hỗ trợ và kháng cự hoạt động kém trong các thị trường hỗn loạn và dễ bị phá vỡ sai thường xuyên.
  2. Tỷ lệ dừng lỗ cố định và tỷ lệ lấy lợi nhuận có thể không thích nghi với các điều kiện thị trường khác nhau, dẫn đến sự mất cân bằng giữa rủi ro và lợi nhuận.
  3. Chiến lược này chỉ xem xét các yếu tố giá và không xem xét các chỉ số quan trọng khác như khối lượng giao dịch, có thể bỏ qua một số tín hiệu quan trọng.

Định hướng tối ưu hóa chiến lược

  1. Xem xét việc giới thiệu các chỉ số kỹ thuật hơn, chẳng hạn như khối lượng giao dịch, MACD, v.v., để cải thiện độ chính xác và độ tin cậy của tín hiệu.
  2. Đối với dừng lỗ và lấy lợi nhuận, hãy xem xét sử dụng stop trailing hoặc stop loss động và lấy tỷ lệ lợi nhuận để thích nghi tốt hơn với các điều kiện thị trường khác nhau.
  3. Xem xét việc giới thiệu các điều kiện lọc, chẳng hạn như lọc xu hướng, lọc biến động, v.v., để giảm sự đột phá sai trong các thị trường hỗn loạn.
  4. Xem xét tối ưu hóa các mức hỗ trợ và kháng cự, chẳng hạn như sử dụng các khoảng thời gian thích nghi, giới thiệu các mức Fibonacci, v.v.

Tóm lại

Chiến lược SR Breakout là một chiến lược giao dịch dựa trên ý tưởng cổ điển của sự phá vỡ hỗ trợ và kháng cự. Bằng cách sử dụng các hàm pivothigh và pivotlow để tính toán mức hỗ trợ và kháng cự, và bằng cách đánh giá xem giá đóng phá vỡ các mức này để tạo ra tín hiệu giao dịch. Lợi thế của chiến lược này là ý tưởng rõ ràng và dễ thực hiện và tối ưu hóa; đồng thời, cũng có một số rủi ro, chẳng hạn như hiệu suất kém trong thị trường hỗn loạn, và những rủi ro có thể được gây ra bởi tỷ lệ dừng lỗ và lợi nhuận cố định. Trong tương lai, chúng ta có thể xem xét tối ưu hóa và cải thiện chiến lược này từ các khía cạnh như chỉ số kỹ thuật, dừng lỗ và lợi nhuận, điều kiện lọc, tối ưu hóa hỗ trợ và kháng cự, v.v., để cải thiện sự ổn định và lợi nhuận của nó.


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

Thêm nữa