리소스 로딩... 로딩...

SR 탈락 전략

저자:차오장, 날짜: 2024-05-15 16:30:14
태그:

img

전반적인 설명

SR 브레이크아웃 전략 (SR Breakout Strategy) 은 LonesomeTheBlue의 브레이크아웃 피더 지표를 기반으로 개발된 지원 및 저항 브레이크아웃 전략이다. 이 전략의 주요 아이디어는 폐쇄 가격이 지원 또는 저항 수준을 깨는지를 판단하여 긴 또는 짧은 신호를 생성하는 것입니다. 기본 설정은 8 시간 촛불 차트에 기반하고 있지만 4 시간 촛불 차트에 더 최적의 매개 변수 설정이 있습니다. 이 전략은 지지 및 저항 수준을 결정하기 위해 피보트 하이 및 피보트 슬로 함수를 사용하고 브레이크아웃을 결정하기 위해 가장 높고 가장 낮은 가격을 사용합니다. 동시에이 전략은 스톱 로스를 설정하고 이익을 취합니다.

전략 원칙

  1. 피보트 하이와 피보트 로우 함수를 사용하여 일정 기간 동안의 최고와 최저를 계산하고 배열에 저장합니다.
  2. 현재 폐쇄 가격이 저항 수준보다 높는지 여부를 결정합니다. 만약 그렇다면, 상승 파업으로 판단되고 긴 신호가 생성됩니다.
  3. 현재 종료 가격이 지원 수준보다 낮는지 여부를 결정합니다. 그렇다면 하향 파업으로 판단되고 짧은 신호가 생성됩니다.
  4. 거래 신호를 생성한 후, 설정된 스톱 로스 및 스톱 로프 비율을 기반으로 스톱 로스 및 스톱 로프 가격을 계산하고 그에 따른 스톱 로스 및 스톱 로프 명령을 설정합니다.
  5. 부착 방향에 따라 해당 부착 범위를 그려라.

전략적 장점

  1. 지원과 저항의 파업은 특정 실용적인 기반을 가진 고전적인 거래 전략입니다.
  2. 피보트 하이와 피보트 로프 함수를 사용하여 지원 및 저항 수준을 계산하면 브레이크 기회는 비교적 정확하게 포착 될 수 있습니다.
  3. 이 전략의 코드 구조는 명확하고, 배열에 최고와 최저를 저장함으로써, 그것은 백테스팅과 최적화를 위해 편리합니다.
  4. 스톱 로즈와 영업이익을 설정하여 상대적으로 위험을 조절할 수 있습니다.

전략 위험

  1. 지원 및 저항 브레이크 전략은 불안정한 시장에서 성능이 좋지 않으며 빈번한 잘못된 브레이크로 유연합니다.
  2. 고정된 스톱 로즈 및 수익률은 다른 시장 조건에 적응하지 못할 수 있으며, 이로 인해 위험과 수익의 불균형이 발생할 수 있습니다.
  3. 이 전략은 가격 요소만을 고려하고 거래량과 같은 다른 중요한 지표를 고려하지 않습니다. 중요한 신호를 놓칠 수 있습니다.

전략 최적화 방향

  1. 신호의 정확성과 신뢰성을 향상시키기 위해 거래량, MACD 등과 같은 더 많은 기술 지표를 도입하는 것을 고려하십시오.
  2. 스톱 로스 및 영업 취득을 위해 트레일링 스톱 또는 동적 스톱 로스 및 영업 취득 비율을 사용하여 다른 시장 조건에 더 잘 적응하는 것을 고려하십시오.
  3. 트렌드 필터링, 변동성 필터링 등 필터링 조건을 도입하여 불안정한 시장에서 잘못된 브레이크를 줄이는 것을 고려하십시오.
  4. 적응 기간을 사용하거나 피보나치 레벨을 도입하는 등 지원 및 저항 수준을 최적화하는 것을 고려하십시오.

요약

SR 브레이크아웃 전략 (SR Breakout Strategy) 은 서포트 및 레지스탕스 브레이크아웃의 고전적인 아이디어에 기반한 거래 전략이다. 피보트 하이 및 피보트 로프 함수를 사용하여 서포트 및 레지스탕스 레벨을 계산하고, 클로징 가격이 이러한 레벨을 통과하여 거래 신호를 생성하는지 판단함으로써. 이 전략의 장점은 아이디어가 명확하고 구현 및 최적화하기가 쉽다는 것입니다. 동시에, 불안정한 시장에서 저성공과 고정 스톱 손실 및 수익률으로 인해 발생할 수있는 위험과 같은 몇 가지 위험도 있습니다. 미래에, 우리는 이 전략을 기술 지표, 스톱 손실 및 수익, 필터링 조건, 서포트 및 저항 최적화 등의 측면에서 최적화하고 개선하는 것을 고려하여 안정성과 수익성을 향상시킬 수 있습니다.


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

더 많은