다중 지표 조건 필터링에 기반한 양적 전략을 따르는 일내 트렌드

저자:차오장, 날짜: 2023-12-15 15:59:37
태그:

img

전반적인 설명

이 전략은 가격 동향을 판단하기 위해 PSAR, 추세 강도를 판단하기 위해 ADX, 과잉 구매 및 과잉 판매 구역을 파악하기 위해 RSI, 그리고 주기를 넘나들며 내일 추세를 따르는 양적 거래 전략을 구축하기 위해 자금 흐름을 판단하기 위해 CMF를 결합합니다. 가격이 통합을 깨고 새로운 추세를 형성 할 때 새로운 추세 방향을 빠르게 파악하고 추세를 추적합니다. 주요 추세 이득이 포착되는 것을 보장하면서 보유 위험을 줄이기 위해 필터링 조건도 설정됩니다.

원칙

이 전략의 주요 판단 규칙은 다음과 같습니다.

  1. PSAR 지표를 사용하여 가격이 상승 추세에 있는지 판단합니다. PSAR의 가격 이하의 하락은 상승 추세의 끝과 하락 추세의 시작을 나타냅니다.

  2. RSI가 50의 중간 지점을 넘어야 합니다. 과잉 판매 구역에서 발생하는 가짜 브레이크를 필터링하기 위해서요.

  3. ADX가 EMA 라인 위에 있어야 합니다. 트렌드 분석에서 지속 가능한 신호를 나타냅니다.

  4. CMF가 0보다 크도록 요구합니다. 증가한 자금 유입을 판단합니다.

사기 신호는 위의 네 가지 조건이 모두 충족되면 생성됩니다. 판매 조건은 PSAR가 가격 이상으로 상승하고 RSI가 50 이하로 떨어지고 ADX가 EMA 이하로 떨어지고 CMF가 0 이하로 떨어지면 발생합니다.

이 전략은 거래 규칙을 설정 할 때 가격 트렌드 방향, 트렌드 강도, 과소 구매/ 과소 판매 상태 및 자금 흐름을 포괄적으로 고려합니다. 거래 신호를 생성 할 때 엄격한 논리적 규칙을 설정함으로써 잘못된 브레이크를 효과적으로 필터링하고 높은 확률의 지속 가능한 트렌드 방향을 파악 할 수 있습니다.

장점

이 전략의 주요 장점은 다음과 같습니다.

  1. 거래 규칙을 설정하는 데 여러 지표를 결합하면 잘못된 브레이크를 효과적으로 예방하고 신호 품질을 보장 할 수 있습니다.

  2. 급속히 성장하는 트렌드 방향을 파악하고 추적하면 대부분의 트렌드 수익을 얻을 수 있습니다.

  3. 프로세스 필터링 조건을 설정하면 위험을 효과적으로 제어하고 추적 효과를 보장 할 수 있습니다.

  4. 트렌드 강도를 고려하면 거래 범위의 혼잡을 피할 수 있습니다.

위험 분석

이 전략의 주요 위험은 다음과 같습니다.

  1. 단일 전략 축적은 포트폴리오 위험을 야기하며 적절한 포지션 크기를 요구합니다.

  2. 추적 중 필터링 상태 변경을 면밀히 모니터링하여 취소 시 손실을 피합니다.

  3. 이 중장기 전략은 단기적으로 변동에 의해 방해를 받을 수 있고, 스톱 로스 위험을 초래할 수 있습니다.

이에 따른 위험 관리 조치는 다음과 같습니다. 포지션 크기를 최적화하는 규칙, 위험 경고 라인 설정 및 정지 거리를 넓히는 등.

최적화 방향

최적화 공간은 다음과 같습니다.

  1. 현재 주관적 설정에 따라 기계 학습을 통해 매개 변수 최적화

  2. 위치 크기를 측정하는 모듈을 추가합니다.

  3. 후속 정지, 시간 정지 또는 브레이크 정지 등의 정지 메커니즘을 강화하십시오.

결론

이 지표를 결합한 전략은 태생적인 트렌드를 빠르게 찾아 추적하는 데 효과적임을 입증했으며, 트렌드와 펀드와 같은 여러 차원에 기반한 양적 거래를 검증했습니다. 기본으로, 그것은 주기에 걸쳐 인덱스 될 수 있습니다. 매개 변수 조정 및 모듈 개선으로 안정적인 중장기 전략이 될 수 있습니다.


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

//@version=4
strategy("psar+ adx + cmf + rsi Strategy", overlay=true,initial_capital = 1000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent , commission_value=0.1 )

start = input(1.02)
increment = input(1.02)
maximum = input(1.2)
var bool uptrend = na
var float EP = na
var float SAR = na
var float AF = start
var float nextBarSAR = na
if bar_index > 0
	firstTrendBar = false
	SAR := nextBarSAR
	if bar_index == 1
		float prevSAR = na
		float prevEP = na
		lowPrev = low[1]
		highPrev = high[1]
		closeCur = close
		closePrev = close[1]
		if closeCur > closePrev
			uptrend := true
			EP := high
			prevSAR := lowPrev
			prevEP := high
		else
			uptrend := false
			EP := low
			prevSAR := highPrev
			prevEP := low
		firstTrendBar := true
		SAR := prevSAR + start * (prevEP - prevSAR)
	if uptrend
		if SAR > low
			firstTrendBar := true
			uptrend := false
			SAR := max(EP, high)
			EP := low
			AF := start
	else
		if SAR < high
			firstTrendBar := true
			uptrend := true
			SAR := min(EP, low)
			EP := high
			AF := start
	if not firstTrendBar
		if uptrend
			if high > EP
				EP := high
				AF := min(AF + increment, maximum)
		else
			if low < EP
				EP := low
				AF := min(AF + increment, maximum)
	if uptrend
		SAR := min(SAR, low[1])
		if bar_index > 1
			SAR := min(SAR, low[2])
	else
		SAR := max(SAR, high[1])
		if bar_index > 1
			SAR := max(SAR, high[2])
	nextBarSAR := SAR + AF * (EP - SAR)

//rsi strat
length = input( 50 )
middle_RSI=input(49)
price = close
vrsi = rsi(price, length)

//cmf
lengthCMF = input(20, minval=1)
ad = close==high and close==low or high==low ? 0 : ((2*close-low-high)/(high-low))*volume
mf = sum(ad, lengthCMF) / sum(volume, lengthCMF)

//ADX
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
dirmov(len) =>
	up = change(high)
	down = -change(low)
	plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
	minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(plusDM, len) / truerange)
	minus = fixnan(100 * rma(minusDM, len) / truerange)
	[plus, minus]
adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)
ema_length=input(10)
ema_sig= ema(sig,ema_length)


long = not uptrend  and vrsi > middle_RSI and sig > ema_sig   and mf>0 
short= uptrend   and vrsi < middle_RSI and sig<ema_sig and mf<0

strategy.entry("long",1,when=long)
strategy.close('long',when=short)

더 많은