
엘러스의 무작위 주기 전략은 엘러스의 무작위 주기 지표를 사용하여 거래 신호를 생성하는 정량 거래 전략이다. 이 전략은 시장에서 주기적 기회를 잡기 위해 무작위 지표와 주기 지표의 장점을 결합한다.
이 전략은 우선 smoothed 주기적 지표를 구성하고, 그 지표에 기초하여 무작위 지표 값을 구성한다. 거래 신호의 발생은 이 무작위 지표 값의 이동 평균의 교차에 따라 결정된다.
구체적으로, smoothed 주기 지표의 계산 방법은 다음과 같습니다:
smooth = (src + 2 * src[1] + 2 * src[2] + src[3]) / 6
여기서 src는 종전 가격과 같은 입력된 가격 데이터이다. 이 지표는 현재 가격과 이전 3 시간대의 가격을 결합하여 부드러운 주기적 신호를 구성한다.
이 smoothed 지수를 기반으로, 무작위 지수 cycle를 계산할 수 있다:
cycle := (1 - .5 * alpha) * (1 - .5 * alpha) *
(smooth - 2 * smooth[1] + smooth[2]) +
2 * (1 - alpha) * cycle[1] -
(1 - alpha) * (1 - alpha) * cycle[2]
이 계산 공식에는 평준화 후의 주기적 신호의 2차분수와 이전 두 주기의 값이 포함되어 있다…α는 평준화 인자이며, 새롭고 오래된 주기적 값의 무게를 조정한다.
마지막으로, 이 사이클 지표에 따라 0-100의 임의값 value1을 계산하고 value1의 10일 이동 평균에 따라 신호값 signal을 구성한다. 신호의 이동 평균을 넘거나 넘으면 거래 신호를 발송한다.
이 전략은 무작위 지표와 주기 지표를 결합하여 둘의 장점을 통합한다. 간단한 이동 평균과 같은 트렌드 전략에 비해 이 전략은 주기적 기회를 더 잘 포착하여 더 나은 효과를 얻을 수 있다.
주요 장점은:
이 전략에는 다음과 같은 위험들이 있습니다.
최적화 매개 변수 설정, 정지점 설정, 다른 필터링 지표와 결합한 방법 등으로 위험을 제어할 수 있다.
이 전략은 다음과 같은 방향으로 최적화될 수 있습니다.
엘러스의 무작위 주기 전략은 무작위 지표와 주기 지표의 통합 사용의 장점을 가지고 있으며, 이중 신호 디자인을 통해 위험을 효과적으로 제어하여 주기적으로 강한 시장에서 더 나은 수익을 얻을 수 있다. 이 전략을 추가로 최적화하면 추천할 만한 양적 거래 전략이 될 수 있다.
/*backtest
start: 2024-01-09 00:00:00
end: 2024-01-16 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy("Ehlers Stochastic Cyber Cycle 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)
src = input(hl2, title = "Source")
alpha = input(.07, title = "Alpha")
lag = input(9, title = "Lag")
smooth = (src + 2 * src[1] + 2 * src[2] + src[3]) / 6
len = input(8, title = "Stochastic len")
cycle = na
if na(cycle[7])
cycle := (src - 2 * src[1] + src[2]) / 4
else
cycle := (1 - .5 * alpha) * (1 - .5 * alpha) * (smooth - 2 * smooth[1] + smooth[2]) + 2 * (1 - alpha) * cycle[1] - (1 - alpha) * (1 - alpha) * cycle[2]
value1 = stoch(cycle, cycle, cycle, len) / 100
value2 = 2 * ((4 * value1 + 3 * value1[1] + 2 * value1[2] + value1[3]) / 10 - 0.5)
signal = value2
oppositeTrade = input(true)
barsSinceEntry = 0
barsSinceEntry := nz(barsSinceEntry[1]) + 1
if strategy.position_size == 0
barsSinceEntry := 0
if (crossover(signal, signal[1]) and not oppositeTrade) or (oppositeTrade and crossunder(signal, signal[1]))
strategy.entry("Long", strategy.long)
barsSinceEntry := 0
if (crossunder(signal, signal[1]) and not oppositeTrade) or (oppositeTrade and crossover(signal, signal[1]))
strategy.entry("Short", strategy.short)
barsSinceEntry := 0
if strategy.openprofit < 0 and barsSinceEntry > 8
strategy.close_all()
barsSinceEntry := 0
plot(0, title="ZeroLine", color=gray)
plotSrc = signal
cyclePlot = plot(plotSrc, title = "CyberCycle", color = blue)
triggerPlot = plot(plotSrc[1], title = "Trigger", color = green)
fill(cyclePlot, triggerPlot, color = plotSrc < plotSrc[1] ? red : lime, transp = 50)