리소스 로딩... 로딩...

동력 이동 평균 크로스오버 트렌드 전략

저자:차오장, 날짜: 2023-10-24 12:31:44
태그:

img

전반적인 설명

이 전략은 유동 평균 크로스오버와 모멘텀 지표를 결합하여 트렌드를 효과적으로 추적하고 역전화합니다. 먼저 금색 십자가 긴 신호와 죽음의 십자가 짧은 신호를 생성하기 위해 빠르고 느린 움직이는 평균을 사용합니다. 다음 특정 매개 변수의 모멘텀 지표로, 금색 십자가 후에 빠른 MA의 모멘텀이 다시 나타나면 트렌드가 계속되고 긴 지위가 유지될 것으로 간주됩니다. 모멘텀이 떨어지면 트렌드 역전으로 간주되며 기존 지위가 닫힐 것입니다. 트렌드 역전 추적시 죽음의 십자가 짧은 신호에도 동일한 논리가 적용됩니다. ADX 필터는 트렌드 상태가 아닌 경우 잘못된 신호를 피하기 위해 사용됩니다.

전략 논리

이 전략의 핵심 논리는 MA 크로스오버로부터의 트렌드 신호와 모멘텀 지표로부터의 트렌드 역전 신호에 기반합니다. 주요 부분은 다음과 같습니다.

  1. 빠른 MA 가격1 (5기 HMA) 및 느린 MA 가격2 (7기 HMA) 을 계산합니다.

  2. 가격1이 가격2보다 높으면 긴 신호를 생성합니다. 가격1이 가격2보다 낮으면 짧은 신호를 생성합니다. 이것은 MAs의 일반적인 사용입니다.

  3. 긴 신호 후에, 가격의 동력 roc1이 다시 나타나면, 트렌드가 계속되는 것으로 간주되며 긴 포지션은 유지됩니다.

  4. 모멘텀 roc1가 낮아지면 트렌드 반전으로 간주되며 기존 포지션은 닫힐 것입니다. 짧은 신호에도 같은 논리가 적용됩니다.

  5. 트렌드 상태가 아닌 경우 잘못된 신호를 피하기 위해 ADX 문턱을 입력합니다. ADX가 문턱을 넘었을 때만 신호가 생성됩니다.

이점 분석

간단한 MA 전략에 비해 이 전략의 가장 큰 장점은 동력 지표를 도입하여 동향 반전을 보다 신속하고 정확하게 결정하는 것입니다.

  1. MAs 자체는 가격 변화를 지연시키고, 모멘텀 인디케이터는 신속한 스톱 로스 또는 리버스 트레이딩을 위해 반전 신호를 빠르게 캡처 할 수 있습니다.

  2. 동력에 기반한 반전 신호는 더 신뢰할 수 있으며 트렌드 거래 중 불필요한 오픈/클로즈 오더를 피합니다.

  3. ADX는 트렌드가 아닌 시장에서 잘못된 신호를 피하고 전략은 더 높은 승률을 가진 트렌드에 더 집중됩니다.

  4. 이 논리는 간단하고 이해하기 쉬우며, 알고 트레이딩 초보자에게 적합합니다.

  5. 다양한 시장에 대한 MA 기간, 추진량 매개 변수 등을 조정함으로써 최적화 할 수있는 넓은 공간.

위험 분석

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

  1. MA의 지연성, 이는 지연된 신호를 유발할 수 있으며 가장 좋은 입구 지점을 놓칠 수 있습니다.

  2. 잘못된 브레이크업으로 인해 불필요한 입력 또는 출구가 발생합니다. 매개 변수 또는 추가 필터의 추가 최적화가 필요합니다.

  3. 트렌드 역전 감지에는 시장의 큰 변동이 있을 때 흔들릴 수 있는 추진력에 의존합니다.

  4. ADX는 추세와 통합을 감지하는 데 불완전합니다. 부적절한 임계 설정은 문제를 일으킬 수 있습니다.

  5. 거래 비용을 고려하지 않습니다. 실제 거래에 적용되면 적절한 스톱 로스를 설정해야합니다.

최적화 방향

이 전략은 다음 측면에서 더 이상 최적화 될 수 있습니다.

  1. 다른 종류의 MA를 시도하거나 더 나은 부드러운 효과를 위해 MA 매개 변수를 조정하십시오.

  2. 가격 반전을 잡기 위해 더 높은 감수성을 위해 모멘텀 지표 길이를 최적화하십시오.

  3. 단기 변동으로 오해받지 않도록 추진력이 역전될 때 가격 필터를 설정합니다.

  4. 다른 ADX 레벨에서 다른 매개 변수를 사용하여 ADX 사용량을 향상시킵니다.

  5. 신호 품질을 개선하고 거짓 브레이크를 필터하기 위해 볼륨 지표 등을 도입합니다.

  6. 단일 거래 손실을 제어하기 위해 스톱 손실 메커니즘을 추가하십시오. 적절한 수익 목표와 스톱 손실을 설정하기 위해 현실적인 거래 비용을 평가하십시오.

요약

이 전략은 트렌드를 추적하고 반전을 포착하기 위해 MA와 모멘텀 지표의 장점을 결합합니다. 순수한 트렌드 다음 전략에 비해 다른 시장 단계를 처리하는 데 더 유연할 수 있으며, 트렌드 무역을 유지하면서 트렌드 클라이맥에서 손실을 피할 수 있습니다. 매개 변수 최적화 및 보조 조건을 도입함으로써 추가 개선이 가능합니다. 전반적으로, 전략은 명확하고 간단한 논리를 가지고 있으며, 알고 트레이딩 초보자가 배우고 적용하기에 매우 적합합니다.


/*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")
    
    



더 많은