Chiến lược đột phá SR


Ngày tạo: 2024-05-15 16:30:14 sửa đổi lần cuối: 2024-05-15 16:30:14
sao chép: 1 Số nhấp chuột: 568
1
tập trung vào
1617
Người theo dõi

Chiến lược đột phá SR

Tổng quan

Chiến lược SR Breakout là một chiến lược phá vỡ kháng cự dựa trên chỉ số breakout finder của LonesomeTheBlue. Ý tưởng chính của chiến lược này là tạo ra tín hiệu mua hoặc bán bằng cách xác định liệu giá đóng cửa có phá vỡ ngưỡng hỗ trợ hoặc ngưỡng kháng cự hay không.

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

  1. Sử dụng các hàm pivothigh và pivotlow để tính toán các điểm cao và thấp trong một khoảng thời gian nhất định trong quá khứ và lưu trữ trong mảng.
  2. Xác định liệu giá đóng cửa hiện tại có cao hơn mức kháng cự hay không, và nếu có, hãy đánh giá nó là một đợt phá vỡ của người đầu cơ, tạo ra tín hiệu đa.
  3. Xác định liệu giá đóng cửa hiện tại có thấp hơn mức hỗ trợ hay không, nếu có, hãy đánh giá là phá vỡ giảm giá, tạo ra tín hiệu giảm giá.
  4. Sau khi tạo ra tín hiệu giao dịch, giá dừng và giá dừng được tính theo tỷ lệ dừng lỗ đã đặt và đặt lệnh dừng và lệnh dừng tương ứng.
  5. Hình vẽ khoảng cách đột phá tương ứng theo hướng đột phá.

Lợi thế chiến lược

  1. Bước pháo hỗ trợ là một chiến lược giao dịch cổ điển với một số cơ sở chiến đấu.
  2. Bằng cách sử dụng các hàm pivothigh và pivotlow để tính toán các vị trí hỗ trợ và kháng cự, bạn có thể nắm bắt chính xác hơn các trường hợp phá vỡ.
  3. Cấu trúc mã của chiến lược này rõ ràng và có thể dễ dàng được kiểm soát và tối ưu hóa bằng cách lưu trữ các điểm cao và thấp vào mảng.
  4. Cài đặt Stop Loss và Stop Stop để kiểm soát rủi ro tốt hơn

Rủi ro chiến lược

  1. Chiến lược phá vỡ kháng cự hỗ trợ không hoạt động tốt trong tình huống chấn động, dễ bị phá vỡ sai thường xuyên.
  2. Tỷ lệ dừng lỗ cố định có thể không phù hợp với các tình huống khác nhau, dẫn đến sự mất cân bằng lợi nhuận rủi ro.
  3. Chiến lược này chỉ tính đến yếu tố giá mà không tính đến 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.

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

  1. Có thể xem xét giới thiệu nhiều chỉ số kỹ thuật hơn, chẳng hạn như số 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 và dừng, bạn có thể xem xét sử dụng tỷ lệ dừng di chuyển hoặc dừng động để thích ứng tốt hơn với các tình huống khác nhau.
  3. Có thể xem xét việc đưa ra các điều kiện lọc như lọc xu hướng, lọc tỷ lệ dao động, v.v. để giảm đột phá giả trong các trường hợp xung đột.
  4. Có thể xem xét tối ưu hóa vị trí hỗ trợ và kháng cự, chẳng hạn như sử dụng chu kỳ thích ứng, giới thiệu cấp Fibonacci.

Tóm tắt

Chiến lược SR Breakout là một chiến lược giao dịch dựa trên ý tưởng phá vỡ kháng cự hỗ trợ cổ điển, tính toán mức hỗ trợ và kháng cự bằng cách sử dụng các hàm pivothigh và pivotlow và tạo ra tín hiệu giao dịch bằng cách đánh giá liệu giá đóng cửa có phá vỡ các vị trí này hay không. Ưu điểm của chiến lược này là ý tưởng rõ ràng, dễ thực hiện và tối ưu hóa; đồng thời có một số rủi ro, chẳng hạn như hoạt động kém trong tình trạng biến động và tỷ lệ dừng lỗ cố định.

Mã nguồn chiến lược
/*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')