다이나믹 레인지 브레이크아웃 전략


생성 날짜: 2023-11-21 15:03:19 마지막으로 수정됨: 2023-12-01 15:00:31
복사: 0 클릭수: 691
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

다이나믹 레인지 브레이크아웃 전략

개요

이 전략은 브린 띠 지표에 기반한 동적인 돌파 거래 전략을 설계했다. K선 엔티티 필터링과 컬러 필터링의 조건을 결합하여 브린 띠 하단 궤도 인근에서 돌파 엔트리 기회를 찾았다. 엑시트는 엔티티 필터링을 기반으로했다. 이 전략은 자동으로 포지션 수와 위험을 관리했다.

전략 원칙

지표 계산

먼저, 부린역의 기점과 하위 궤도를 낮은 지점으로 계산해보자:

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

여기서 src는 낮은 점, length는 계산 주기,basis는 평균선,dev는 표준 편차,lower은 하향선이다.

일반적으로 mult은 2로 설정되어, 하차는 표준차량이다.

필터 조건

정책은 두 가지 필터링 조건을 추가합니다.

K선 엔티티 필터 개체 크기의 nbody와 그 평균 abody를 이용하여 판단하면, nbody가 abody의 절반보다 크면 거래 신호가 발생한다.

색상 필터 K선 종료 ([[close > open]]) 에 추가 작업을 하지 마십시오. 이것은 hbox 헤드의 가짜 돌파구를 피하기 위한 것입니다.

거래 신호

다음 조건이 충족되면 복수 신호가 발생한다:

low < lower  // 价格突破下轨
close < open or usecol == false // 色彩过滤
nbody > abody / 2 or usebod == false // 实体过滤

개체 크기가 다시 평균의 절반보다 크면 평준상태가 발생합니다:

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

전략적 이점

동적 거래 구역

브린은 역동적인 지지 영역으로, 시장 추세에 따른 반발 기회를 잡을 수 있습니다.

이중 필터링

K선 엔티티와 색상의 판단을 결합하여, 가짜 돌파구를 효과적으로 필터링한다.

자동 포지션 관리

포지션은 지수적으로 100%로 증가하고, 자동으로 위험을 관리한다.

거래 시간 범위를 지정합니다.

날짜 범위를 설정하여 특정 시간대의 시장 변동률으로 인한 위험을 줄입니다.

전략적 위험

빈 시간이 너무 길다.

시장이 긴 황소 시장일 때, 부린 벨트 중철과 상철이 빠르게 올라가고, 무고 시간이 너무 길어질 수 있다.

해결 방법

트렌드 지표 판단과 결합하여 중장선이 황소 시장으로 판단될 때 전략을 일시 중지하여 공백이 너무 길지 않도록 할 수 있다.

파격적인 실패

하계 궤도 돌파 후 회귀 및 하계 궤도 재실험이 발생할 수 있는 상황.

해결 방법

스톱 라인을 추가하여 지탱 아래의 일정 비율의 스톱 을 추가하거나 실패의 판단 논리를 추가하여 빠른 스톱 을 추가합니다.

전략 최적화

스톱 로직을 추가합니다.

재검토 데이터에 따라 합리적인 지원 아래의 중지 손실 위치를 설정하십시오.

필터링 조건을 최적화합니다.

엔티티 필터의 abody 사이클을 조정하고, COLOR 필터의 사용 등. 최적의 파라미터 조합을 찾는다.

트렌드 판단과 함께

중·장기선 추세 판단을 높이고, 불시장이라고 판단할 때 전략을 중단한다. 공백 시간을 줄인다.

요약하다

이 전략은 브린 밴드 지원과 결합하여, 실물 필터, 컬러 필터 및 돌파 거래의 전략 논리를 설계하여 높은 확률의 반발 기회를 찾습니다. 실제 응용에서는, 피드백 결과에 따라 변수를 지속적으로 최적화하고, 스톱로스 및 트렌드 판단 모듈을 추가하여 위험을 제어하여 더 나은 성과를 얻을 수 있습니다.

전략 소스 코드
/*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()