동적 범위를 깨는 전략

저자:차오장, 날짜: 2023-11-21 15:03:19
태그:

img

전반적인 설명

이 전략은 동적인 브레이크아웃 트레이딩 전략을 만들기 위해 볼링거 밴드 지표를 기반으로 설계되었습니다. 이 전략은 촛불 몸 필터와 컬러 필터의 조건을 결합하여 볼링거 하부 밴드 주변의 브레이크아웃 진입 기회를 찾습니다. 출구는 몸 필터를 기반으로합니다. 이 전략은 자동으로 포지션 크기와 위험을 관리합니다.

전략 논리

지표 계산

먼저, 낮은 가격에 기초하여 볼링거 밴드의 기본선과 하위 대역을 계산합니다.

src = low
basis = sma(src, length) 
dev = mult * stdev(src, length)
lower = basis - dev

src는 낮은 가격이고, 길이는 계산 기간이고, 기본은 이동 평균이고, dev는 표준편차이고, 아래쪽은 하위 밴드입니다.

mult은 보통 2로 설정되는데, 이는 하위 대역이 표준편차 1개 떨어져 있다는 것을 의미합니다.

필터 조건

이 전략은 두 가지 필터 조건을 포함합니다.

촛불 몸체 필터몸 크기를 nbody와 평균 체량을 사용해서 결정합니다. nbody가 체량의 절반보다 크면만 거래 신호를 생성합니다.

색상 필터
촛불이 긍정적으로 닫을 때 오래 가지 마십시오. 이것은 hbox의 머리에있는 거짓 파업을 피합니다.

거래 신호

아래 조건이 충족되면 긴 신호를 생성합니다.

low < lower // price breaks lower band
close < open or usecol == false // color filter
nbody > abody / 2 or usebod == false // body filter  

몸집 크기가 다시 평균의 절반을 초과하면, 근접 위치:

close > open and nbody > abody / 2  

위치 크기

전략은 거래 크기를 자동으로 계산합니다.

lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 : lot[1] 

위험 관리

연간, 달 및 날짜에 대한 제한을 추가하여 특정 날짜 범위에서만 거래를 제한합니다.

when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))

장점

동적 거래 범위

볼링거 하단 밴드는 트렌드를 따르는 리트레이싱을 포착하기 위한 동적 지원 영역을 제공합니다.

이중 필터

촛불 몸체와 컬러 필터의 조합은 가짜 브레이크를 효과적으로 방지합니다.

자동 위치 크기

포지션 크기가 100%까지 급격히 늘어나고 자동으로 위험을 관리합니다.

날짜 범위

날짜 범위를 설정하면 특정 기간의 시장 변동과 관련된 위험을 줄일 수 있습니다.

위험성

장기적 인 인출

강한 상승 추세가 있을 때 BB 중위와 상위 띠는 빠르게 상승할 수 있어 장기적인 하락을 초래할 수 있습니다.

해결책

트렌드 지표와 결합해서, 장기적인 마감을 피하기 위해 황소 시장으로 판단될 때 전략을 멈추세요.

실패한 탈출

복귀가 실패할 수도 있고 하단역을 다시 테스트할 수도 있습니다.

해결책

지원 수준 아래로 스톱 로스를 추가하거나 빠른 스톱 로스를 위해 실패한 재테스트를 감지하는 논리를 추가합니다.

개선

스톱 로스를 추가합니다

백테스트 결과를 기반으로 지원 아래로 스톱 손실을 최적화합니다.

매개 변수를 최적화

몸의 필터를 잘 조율하여 체류 기간, 컬러 필터 등을 최적으로 찾습니다.

트렌드 필터를 추가합니다

시장이 상승할 때 전략을 중단하고, 철수 시간을 줄여라

결론

이 전략은 BB 지원, 보디 필터, 컬러 필터 및 브레이크아웃 로직을 결합하여 높은 확률의 리트레이스를 캡처합니다. 실제로는 역 테스트를 기반으로 매개 변수를 최적화 할 수 있으며, 개선된 성능을 위해 위험을 제어하기 위해 스톱 로스와 트렌드 필터를 추가합니다.


/*backtest
start: 2022-11-14 00:00:00
end: 2023-11-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Wizard Strategy v1.0", shorttitle = "Wizard str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 10)

//Settings
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
length = input(25, defval = 25, minval = 1, maxval = 200, title = "BB Period")
usebod = input(false, defval = false, title = "Use Body-Filter")
usecol = input(false, defval = false, title = "Use Color-Filter")
showar = input(false, defval = false, title = "Show Arrows")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Bollinger
src = low
mult = 2
basis = sma(src, length)
dev = mult * stdev(src, length)
lower = basis - dev
plot(lower, color = lime, linewidth = 3, title="Bottom Line")

//Body Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 2 or usebod == false

//Signals
up1 = low < lower and (close < open or usecol == false) and body
exit = close > open and nbody > abody / 2

//Arrows
needar = up1 and showar
plotarrow(needar ? 1 : na)

//Trading
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 : lot[1]

if up1
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("Long", strategy.long, lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

더 많은