
이 전략은 이동 평균의 교차와 운동량 지표를 결합하여 트렌드를 효과적으로 추적하고 적시에 역전한다. 전략은 먼저 빠른 이동 평균과 느린 이동 평균을 사용하여 골드포크 더하고 데드포크 신호를 형성한다. 그리고는 특정 파라미터의 운동량 지표를 결합하여 골드포크 더하면 빠른 이동 평균의 운동량 지표가 다시 상승하면 트렌드가 계속되고 더 많은 것을 유지한다.
이 전략의 핵심 논리는 이동 평균의 교차로 형성된 트렌드 신호와 동력 지표에 기반하여 트렌드 반전을 결정한다. 핵심 부분의 코드 논리는 다음과 같다:
빠른 이동 평균 price1과 느린 이동 평균 price2를 계산한다. 여기서 price1은 5주기 HMA이고, price2는 7주기 HMA이다.
가격1이 가격2을 통과하면 다중 신호가 생성되고 가격1이 가격2을 통과하면 공백 신호가 생성된다. 이것은 이동 평균을 기반으로 한 일반적인 사용법이다.
다중 신호의 발동 후, 만약 cmo1의 동력 지표roc1이 다시 상승하면, 트렌드가 계속되는 것으로 간주되어, 다중 상태를 유지한다.
동력 지표roc1이 하락하면, 트렌드가 반전되었다고 생각하여 평준을 수행한다. 공백 신호의 처리 논리는 동일하다.
ADX 값을 도입하여, 비 트렌드 상태의 오류 신호를 필터링하기 위해 사용되며, ADX가 값보다 높을 때만 실질적으로 더 많은 코카이도 신호를 생성한다.
간단한 이동 평균 전략에 비해, 이 전략의 가장 큰 장점은 동력 지표가 도입되어 트렌드 반전을 결정하는 것이므로, 더 신속하고 정확하게 트렌드 및 반전을 추적 할 수 있습니다. 구체적인 장점은 다음과 같습니다:
이동 평균 자체는 가격 변화에 지연적으로 반응하며, 동력 지표는 반전 신호를 더 빨리 포착하여 적시에 상쇄 또는 반전 입장을 개시하는 데 도움이 된다.
동력 지표에 기반한 역전 신호는 더 신뢰할 수 있으며, 트렌드 트레이딩에서 불필요한 반복적 평점을 줄일 수 있다.
ADX 지표의 적용은 비 트렌드 시장에서 잘못된 신호를 피하고, 전략이 트렌드 단계에 더 집중하여 수익을 올릴 확률을 높인다.
전략 논리는 명확하고 간단하며, 이해하기 쉽고 추적할 수 있으며, 알고리즘 거래 초보자 학습에 적합하다.
지표 변수 최적화 공간은 넓고, 이동 평균 주기, 운동량 변수 등을 조정하여 다른 시장을 대상으로 최적화를 구현할 수 있다.
이 전략의 주요 위험은 다음과 같습니다.
이동 평균 자체는 가격 변화에 대한 반응 지연으로 인해 신호가 지연되어 최적의 진입 시기를 놓치게 될 수 있습니다.
허위 돌파는 불필요한 포지션 개시 또는 평형으로 이어지며 지표 파라미터를 추가적으로 최적화하거나 추가 필터링 조건을 도입해야 합니다.
트렌드 반향 판단은 동력 지표에 의존하며, 시장이 급격히 변할 때 동력 지표의 효과는 할인될 수 있다.
ADX 지수는 트렌드 및 조정을 완벽하게 판단할 수 없으며, 너무 높거나 너무 낮은 값을 설정하면 문제가 발생할 수 있습니다.
전략은 거래 비용을 고려하지 않고, 실제 사용 시 위험을 제어하기 위해 스톱로스를 설정하는 것에 주의해야 한다.
이 전략은 다음의 몇 가지 측면에서 더 개선될 수 있습니다.
다른 유형의 이동 평균을 시도하거나 이동 평균 변수를 조정하여 지표의 평형 효과를 최적화하십시오.
동력 지표의 길이 변수를 최적화하여 가격 역동에 더 민감하게 잡을 수 있도록 한다.
동력 지표가 반전할 때 가격 필터를 설정하여 짧은 기간의 작은 변동에 미혹되는 것을 피하십시오.
다른 ADX 레벨에서 다른 파라미터를 사용하는 것과 같은 ADX의 사용을 더욱 강화합니다.
거래량 지표와 같은 보조 조건을 도입하고, 신호 품질을 향상시키고, 가짜 돌파구를 필터링한다.
단일 손실을 제어하기 위해 스톱스 메커니즘을 추가하십시오. 실제 시장의 수수료 수준을 평가하고 합리적인 스톱스톱을 설정하십시오.
이 전략은 이동 평균 지표와 동력 지표의 장점을 통합하여 트렌드 추적과 반전의 포착을 구현한다. 순수 트렌드 추적과 비교하여 이 전략은 시장의 다양한 단계에 더 유연하게 대응할 수 있으며, 트렌드 거래를 유지하면서 오퍼 하우스로 인한 손실을 피할 수 있다. 매개 변수 최적화 및 보조 조건의 도입을 통해 전략 효과는 더 향상될 여지가 있다.
/*backtest
start: 2023-09-23 00:00:00
end: 2023-10-23 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
//study(title="MA Crossover Strategy", overlay = true)
strategy("MA Crossover Strategy with MA Turning Point Exits", overlay=true)
src = input(open, title="Source")
price = request.security(syminfo.tickerid, timeframe.period, src)
ma1 = input(5, title="1st MA Length")
type1 = input("HMA", "1st MA Type", options=["SMA", "EMA", "HMA"])
ma2 = input(7, title="2nd MA Length")
type2 = input("HMA", "2nd MA Type", options=["SMA", "EMA", "HMA"])
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
adxthreshold = input(20, title="ADX threshold")
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)
//study("Average Directional Index", shorttitle="ADX", format=format.price, precision=2, resolution="")
//plot(sig, color=color.red, title="ADX")
f_hma(_src, _length)=>
_return = wma((2*wma(_src, _length/2))-wma(_src, _length), round(sqrt(_length)))
price1 = if (type1 == "SMA")
sma(price, ma1)
else
if (type1 == "EMA")
ema(price, ma1)
else
f_hma(price, ma1)
price2 = if (type2 == "SMA")
sma(price, ma2)
else
if (type2 == "EMA")
ema(price, ma2)
else
f_hma(price, ma2)
//plot(series=price, style=line, title="Price", color=black, linewidth=1, transp=0)
plot(series=price1, style=line, title="1st MA", color=blue, linewidth=2, transp=0)
plot(series=price2, style=line, title="2nd MA", color=green, linewidth=2, transp=0)
//longCondition = price1> price2
longCondition = price1> price2 and sig > adxthreshold
if (longCondition)
strategy.entry("Long", strategy.long)
shortCondition = price1 < price2 and sig > adxthreshold
if (shortCondition)
strategy.entry("Short", strategy.short)
lookback1 = input(1, "Lookback 1")
roc1 = roc(price1, lookback1)
ma1up = false
ma1down = false
ma2up = false
ma2down = false
ma1up := nz(ma1up[1])
ma1down := nz(ma1down[1])
ma2up := nz(ma2up[1])
ma2down := nz(ma2down[1])
trendStrength1 = input(2, title="Minimum slope magnitude * 100", type=float) * 0.01
if crossover(roc1, trendStrength1)
ma1up := true
ma1down := false
if crossunder(roc1, -trendStrength1)
ma1up := false
ma1down := true
shortexitCondition = ma1up and ma1down[1] and sig > adxthreshold
if (shortexitCondition)
strategy.close("Short")
longexitCondition = ma1down and ma1up[1] and sig > adxthreshold
if (longexitCondition)
strategy.close("Long")