
이 전략은 느린 하이켄 아시와 지수 이동 평균을 사용하여 트렌드를 식별하고, 트렌드 상황에서 양방향 거래를 수행합니다. 가격이 100 일간 EMA를 초과 할 때 장을하고, 100 일간 EMA를 초과 할 때 공백을하고, 특정 조건에서 공백을합니다.
이 전략은 다음과 같은 조합을 사용합니다.
느린 속도 Heiken Ashi: 특수한 유형의 K 선 도표, 이전 K 선의 평균값을 사용하여 그려지며, 시장 소음을 필터링하여 트렌드를 식별할 수 있다. 여기서는 카마 필터를 적응하여 구현한다.
지수 이동 평균: 가격에 대한 지수 평준화 후의 평균, 여기에는 5일에서 100일 이상의 주기들을 포함하는 EMA。
거래 논리는 다음과 같습니다.
가격이 100일 EMA를 넘으면 더 많이 하고, 가격이 100일 EMA를 넘으면 더 적게 한다.
평정 위치 조건: Heiken Ashi의 개시 가격이 그것의 닫기 가격을 가로질렀을 때 ((潜在反转信号), 대응하는 다중 헤드 포지션은 역으로 가로질러 평정되고, 빈 헤드 포지션은 동일하다.
이 전략은 트렌드 판단과 역전 신호를 결합하여, 트렌드 상황에서 더 큰 가격 변동을 포착할 수 있으며, 역전 신호를 통해 손실 확산을 방지할 수 있다.
EMA를 사용하여 전 세계 동향을 판단하여 지역적인 흔들림에 의해 오해받지 않도록하십시오.
하이켄 아시의 교차 신호는 역전 기회를 조기에 감지할 수 있다.
자기 적응 카마 필터는 가짜 신호의 가능성을 낮춘다.
크게 EMA를 다면 손실이 확대될 수 있다. 지분 기간을 적절히 단축하거나 스톱로스를 설정할 수 있다.
반전 신호가 지연될 수 있으며, 위험을 통제하기 위해 포지션 규모를 줄이는 것을 고려할 수 있다.
EMA 파라미터를 잘못 설정하는 것은 전략의 성과에 영향을 미치며, 다양한 품종과 시장 환경에 따라 조정되어야 한다.
여러 지표 판단을 결합하여, EMA와 Heiken Ashi가 모두 잘못된 신호를 보내는 확률을 피할 수 있다. 예를 들어 MACD, 브린 밴드 등을 더한다.
시장의 변동률에 따라 실시간으로 EMA 파라미터를 최적화할 수 있으며, 높은 변동이 있을 때 스톱로스를 강화하고 낮은 변동이 있을 때 슬라이드 포인트를 완화한다.
기계 학습 알고리즘을 기반으로 각 매개 변수 설정 및 필터링 규칙을 자동으로 최적화하여 전략을 더욱 안정화합니다.
이 전략은 전체적으로 비교적 간단하고 실용적이며, 동향과 반향을 결합하면서, 변수 최적화와 위험 통제가 자리 잡은 상태에서는 여전히 좋은 수익의 여지가 있다. 이후에는 최적화 방향에서 시작하여 전략을 시장 환경 변화에 더 잘 적응시킬 수 있다.
/*backtest
start: 2023-12-14 00:00:00
end: 2023-12-19 10:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=2
strategy("NoScoobies Slow Heiken Ashi and Exponential Moving average Strategy 2.2", overlay=true)
//SHA
p=input(6,title='Period')
fastend=input(0.666,step=0.001)
slowend=input(0.0645,step=0.0001)
kama(close,amaLength)=>
diff=abs(close[0]-close[1])
signal=abs(close-close[amaLength])
noise=sum(diff, amaLength)
efratio=noise!=0 ? signal/noise : 1
smooth=pow(efratio*(fastend-slowend)+slowend,2)
kama=nz(kama[1], close)+smooth*(close-nz(kama[1], close))
kama
hakamaper=1
Om=sma(open,p)
Hm=sma(high,p)
Lm=sma(low,p)
Cm=sma(close,p)
vClose=(Om+Hm+Lm+Cm)/4
vOpen= kama(vClose[1],hakamaper)
vHigh= max(Hm,max(vClose, vOpen))
vLow= min(Lm,min(vClose, vOpen))
asize=vOpen-vClose
size=abs(asize)
//MMAR
exponential = input(true, title="Exponential MA")
src = close
ma05 = exponential ? ema(src, 05) : sma(src, 05)
ma10 = exponential ? ema(src, 10) : sma(src, 10)
ma15 = exponential ? ema(src, 15) : sma(src, 15)
ma20 = exponential ? ema(src, 20) : sma(src, 20)
ma25 = exponential ? ema(src, 25) : sma(src, 25)
ma30 = exponential ? ema(src, 30) : sma(src, 30)
ma35 = exponential ? ema(src, 35) : sma(src, 35)
ma40 = exponential ? ema(src, 40) : sma(src, 40)
ma45 = exponential ? ema(src, 45) : sma(src, 45)
ma50 = exponential ? ema(src, 50) : sma(src, 50)
ma55 = exponential ? ema(src, 55) : sma(src, 55)
ma60 = exponential ? ema(src, 60) : sma(src, 60)
ma65 = exponential ? ema(src, 65) : sma(src, 65)
ma70 = exponential ? ema(src, 70) : sma(src, 70)
ma75 = exponential ? ema(src, 75) : sma(src, 75)
ma80 = exponential ? ema(src, 80) : sma(src, 80)
ma85 = exponential ? ema(src, 85) : sma(src, 85)
ma90 = exponential ? ema(src, 90) : sma(src, 90)
ma95 = exponential ? ema(src, 95) : sma(src, 95)
ma100 = exponential ? ema(src, 100) : sma(src, 100)
longcondition=src>ma100
shortcondition=src<ma100
long=longcondition and size<size[1] and (vOpen<vClose or vOpen>vClose)
short=shortcondition and size<size[1] and (vOpen>vClose or vOpen<vClose)
close_long=longcondition and crossunder(open, vClose)
close_short=shortcondition and crossover(open, vClose)
_close=close_long[2] or close_short[2]
if long
strategy.entry("LONG", strategy.long)
strategy.close("LONG", when = _close)
if short
strategy.entry("SHORT", strategy.short)
strategy.close("SHORT", when = _close)