이 전략은 존 엘러스 (John Ehlers) 가 그의 책상 주식과 선물에 대한 제어 분석 에서 제시한 엘러스-피셔 무작위 상대 역동성 지수 지수를 기반으로 개발되었다. 이 전략은 엘러스-피셔 지수를 사용하여 주식의 상대적인 강점을 판단하고, 맞춤형 거래 규칙과 결합하여 구매 및 판매한다.
이 전략은 먼저 closing price - opening price, 즉 주식의 실물 부분을 계산한다. 다음으로 high price - low price, 즉 주식의 그림자 부분. 각각이 두 부분의 합계 평균을 취함으로써 주식의 동력을 계산한다. 그리고 이 동력 값을 사용하여 주식의 변동성을 나누고 상대적인 활력 지수를 얻는다.
다음으로, RVI에 엘레스-피쉬르 지표의 계산 공식을 적용하여 신호값을 얻는다. 신호값 위에 트리거값을 뚫을 때 더하고, 밑에 뚫을 때 공백한다. 또한, 고정 스톱 손실과 추적 스톱 손실을 설정하여 위험을 제어한다.
이 전략은 종합적으로 주식의 동적 특성과 무작위 지표를 활용하여 시장의 상대적인 강점을 효과적으로 판단할 수 있다. 엘레스-피셔 지표의 디자인은 소음의 영향을 줄여서 보다 신뢰할 수 있는 거래 신호를 생성한다. 역동 지수는 주식의 경향성과 변동성을 반영하는 동적 지표이다.
동적 지표 또는 무작위 지표를 단독으로 사용하는 것에 비해, 이 전략은 지표와 모델을 유기적으로 결합하여 신호 품질을 향상시킬 수 있다. 엄격한 스톱 로즈 규칙으로 이 전략은 수익성을 보장하는 전제 하에서 위험을 통제할 수 있게 한다.
이 전략은 주로 엘레스-피셜 지수에 의존하며, 시장이 급격히 변화할 때 지표 매개 변수가 새로운 환경에 적응하기 위해 최적화되어야 합니다. 지표 매개 변수가 잘못 설정되면 잘못된 신호 또는 신호 지연이 발생할 수 있습니다.
또한, 전략 자체에도 어느 정도의 곡선 적합의 위험이 있습니다. 테스트 및 실전 시장 환경이 크게 변하면 전략 성능이 큰 편차를 일으킬 수 있습니다. 이 시에는 전략 매개 변수를 조정하거나 새로운 시장 상황에 맞게 거래 규칙을 최적화해야합니다.
이 전략은 다음의 몇 가지 측면에서 더 개선될 수 있습니다.
엘레스-피쉬어 지표의 파라미터를 최적화하여 더 민감하거나 소음을 필터링한다.
기계 학습 알고리즘을 사용하여 LSTM와 같은 지표를 모델링하여 더 신뢰할 수있는 거래 신호를 생성합니다.
ATR와 같은 시장 변동률 지표와 결합하여 스톱 라인지를 동적으로 조정하십시오.
다중 인자 모델에 대한 지원을 추가하고, 다른 기술 지표와 기본 지표를 통합하여 신호 품질을 향상시킵니다.
평정 포지 논리를 최적화하고, 동적 출전 조건을 설정한다. 적응형 손해 중지 및 정지 기술을 도입한다.
이 전략은 시장의 경향과 강점을 판단하기 위해 엘레스-피셔 무작위 상대적 활력 지수 지표를 사용하여 합리적인 스톱 메커니즘 제어 위험을 설정합니다. 단일 지표에 비해 이 전략은 여러 지표와 모델의 유기적 결합을 수행하여 잡음을 필터링하여 고품질의 신호를 제공합니다. 매개 변수 최적화, 모델 통합, 적응 조정 등의 방법으로 전략 성능이 더 향상 될 여지가 있습니다.
/*backtest
start: 2022-12-15 00:00:00
end: 2023-12-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy("Ehlers Fisher Stochastic Relative Vigor Index Strategy", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 1, commission_type = strategy.commission.percent, commission_value = 0.1)
p = input(10, title = "Length")
FisherStoch(src, len) =>
val1 = stoch(src, src, src, len) / 100
val2 = (4 * val1 + 3 * val1[1] + 2 * val1[2] + val1[3]) / 10
FisherStoch = 0.5 * log((1 + 1.98 * (val2 - 0.5)) / (1 - 1.98 * (val2 - 0.5))) / 2.64
CO = close - open
HL = high - low
value1 = (CO + 2 * CO[1] + 2 * CO[2] + CO[3]) / 6
value2 = (HL + 2 * HL[1] + 2 * HL[2] + HL[3]) / 6
num = sum(value1, p)
denom = sum(value2, p)
RVI = denom != 0 ? num / denom : 0
signal = FisherStoch(RVI, p)
trigger = signal[1]
oppositeTrade = input(true)
barsSinceEntry = 0
barsSinceEntry := nz(barsSinceEntry[1]) + 1
if strategy.position_size == 0
barsSinceEntry := 0
if ((crossover(signal, trigger) and not oppositeTrade) or (oppositeTrade and crossunder(signal, trigger))) and abs(signal) > 2 / 2.64
strategy.entry("Long", strategy.long)
barsSinceEntry := 0
if ((crossunder(signal, trigger) and not oppositeTrade) or (oppositeTrade and crossover(signal, trigger))) and abs(signal) > 2 / 2.64
strategy.entry("Short", strategy.short)
barsSinceEntry := 0
if strategy.openprofit < 0 and barsSinceEntry > 8
strategy.close_all()
barsSinceEntry := 0
hline(0, title="ZeroLine", color=gray)
signalPlot = plot(signal, title = "Signal", color = blue)
triggerPlot = plot(trigger, title = "Trigger", color = green)
fill(signalPlot, triggerPlot, color = signal < trigger ? red : lime, transp = 50)