이중 이동 평균 역 트렌드 전략

저자:차오장, 날짜: 2024-01-08 11:01:11
태그:

img

전반적인 설명

이중 이동 평균 카운터 트렌드 전략은 주로 FOREX 시장에 적용되는 스윙 트레이딩을 위해 설계되었습니다. 이 전략은 서로 다른 시간 프레임의 두 이동 평균을 사용하여 거래 신호를 생성합니다. 빠른 이동 평균이 느린 이동 평균보다 높을 때 반전을 추구하기 위해 짧은 지위를 취하고, 빠른 이동 평균이 느린 이동 평균보다 낮을 때 반전을 추구하기 위해 긴 지위를 취합니다.

전략 원칙

이 전략은 1 시간 및 1 일 시간 프레임의 이동 평균을 사용합니다. 1 시간 이동 평균은 가격 변화를 더 민감하게 반영하고 빠른 이동 평균으로 작용할 수 있습니다. 1 일 이동 평균은 가격 변화에 더 느리게 반응하고 느린 이동 평균으로 작용할 수 있습니다. 빠른 이동 평균이 느린 이동 평균을 넘으면 현재 시장이 상승하고 짧은 신호가 생성 될 것으로 간주됩니다. 빠른 이동 평균이 느린 이동 평균을 넘으면 현재 시장이 하락하고 긴 신호가 생성 될 것으로 간주됩니다.

빠른 이동 평균과 느린 이동 평균이 황금 십자가 또는 죽은 십자가를 가지고있을 때 반전을 추구하기 위해 길거나 짧게 들어가는 원리는 빠른 이동 평균과 느린 이동 평균이 교차 할 때 시장이 반전되었을 수 있음을 나타냅니다. 빠른 라인과 느린 라인의 교차는 반전 신호를 생성하는 타이밍입니다. 반전 거래 이론에 따르면 가격은 일반적으로 한 방향으로 상승하거나 떨어지지 않으며 중요한 지원 및 저항 수준이 돌파 될 때 가격 반전의 시간이 될 수 있습니다. 따라서이 전략은 반전 기회를 포착하기 위해 이중 이동 평균 반전 신호를 사용합니다.

이 전략은 또한 거래 시간 및 날짜 스크리닝 조건을 설정합니다. 적당한 기간 동안 거래를 피하기 위해 설정된 날짜 범위 및 거래 시간 내에서만 거래합니다.

이점 분석

이중 이동평균 반 트렌드 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 반전 전략은 큰 수익 공간을 가진 장점이 있습니다. 반전 거래는 주요 지점에서 카운터 거래를 통해 변동적인 시장 조건에서 더 높은 수익을 얻을 수 있습니다.

  2. 이중 이동 평균 조합을 사용하면 신호를 필터링하고 잘못된 신호를 피합니다. 단일 지표는 잘못된 신호에 취약하지만 이중 지표 조합은 일부 잘못된 신호를 필터링하여 신호의 신뢰성을 향상시켜 거래 기회를 더 신뢰할 수 있습니다.

  3. 거래 시간 및 날짜 조건을 설정하면 비활성 시장 기간을 피하고 함락되는 것을 피합니다. 설정된 거래 시간 및 날짜 범위 내에서만 거래하면 극적인 가격 변동 기간을 피하고 정지된 거래를 피할 수 있습니다.

  4. 반전 전략은 중장기 거래에 적합합니다. 고 빈도 거래와 비교하면 중장기 거래 전략은 과도한 빈번한 구매 및 판매를 피하여 더 안정적입니다.

  5. 최대 유출 통제는 자본 관리에 유리합니다. 최대 유출 비율을 설정하면 하루 하루 위험을 효과적으로 제어하고 막대한 자금 손실을 피할 수 있습니다.

위험 분석

이중 이동평균 역동 트렌드 전략은 또한 다음과 같은 위험을 가지고 있습니다.

  1. 반전 신호는 손실로 이어질 수 있습니다. 가격 반전 신호는 항상 신뢰할 수 없습니다. 가격이 반전없이 트렌드를 계속하면 손실 위험이 있습니다. 손실은 스톱 로스를 설정하여 제어 할 수 있습니다.

  2. 트렌드의 오차는 손실로 이어집니다. 두 이동 평균이 반전 전에 크게 분리되었을 때 손실 위험이 발생할 수 있습니다. 반전 시기는 이동 평균 사이의 거리를 관찰하여 결정할 수 있습니다.

  3. 부적절한 거래 시간 설정은 기회를 놓칠 수 있습니다. 거래 시간이 너무 엄격하게 설정되면 일부 거래 기회가 놓칠 수 있습니다. 거래 시간은 적절하게 확장 될 수 있습니다.

  4. 반전 후 손실을 즉시 중단하지 않으면 손실이 확대됩니다. 반전 후, 손실을 제어하기 위해 가격이 원래 추세를 계속하면 손실을 즉시 중단해야합니다.

최적화 방향

이중 이동 평균 역 트렌드 전략은 다음 측면에서도 최적화 될 수 있습니다:

  1. 더 나은 거래 신호를 찾기 위해 더 많은 지표의 조합을 테스트하십시오. MACD, KDJ와 같은 지표는 신호 정확성을 향상시키기 위해 이중 이동 평균과 결합하여 테스트 할 수 있습니다.

  2. 최적의 매개 변수를 찾기 위해 이동 평균 사이클 매개 변수를 최적화한다. 최고의 사이클 숫자는 다른 길이의 이동 평균을 백테스팅하여 결정될 수 있다.

  3. 최적의 거래 시간을 찾기 위해 거래 시간을 확장하거나 좁히고 다른 제품 특성에 따라 거래 시간을 조정하는 효과를 테스트하십시오.

  4. 트렌드 필터링 조건을 추가하여 오차를 피합니다. ADX와 같은 지표는 트렌드의 강도를 판단하고 명백한 트렌드가 없을 때 반전을 피하기 위해 추가 될 수 있습니다.

  5. 신호 검증을 위한 머신러닝 모델을 추가합니다. 모델은 역전 신호의 신뢰성을 판단하고 낮은 품질의 신호를 필터링할 수 있습니다.

요약

이중 이동 평균 카운터 트렌드 전략은 외환 시장에서 중장기 거래에 적합합니다. 그것은 반전 신호를 생성하기 위해 빠르고 느린 이동 평균 사이의 황금 십자가와 죽은 십자가를 사용하여 주요 시장 지점에서 카운터 작업을 수행하며 큰 수익 공간을 가지고 있습니다. 동시에 위험 통제를 위해 거래 시간 및 최대 인하와 같은 설정을 사용합니다. 이것은 위험을 제어하면서 높은 수익을 창출 할 수있는 비교적 안정적인 반전 시스템입니다. 미래에,이 전략은 지표 및 매개 변수 최적화 및 기계 학습 모델의 응용과 같은 방법을 통해 개선 및 최적화 될 수 있습니다.


/*backtest
start: 2023-12-08 00:00:00
end: 2024-01-07 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © SoftKill21

//@version=4
strategy("gbpnzd 1h", overlay=true)

src = close
useCurrentRes = input(true, title="Use Current Chart Resolution?")
resCustom = input(title="Use Different Timeframe? Uncheck Box Above", type=input.resolution, defval="60")
len = input(28, title="Moving Average Length - LookBack Period")
//periodT3 = input(defval=7, title="Tilson T3 Period", minval=1) 
factorT3 = input(defval=7, title="Tilson T3 Factor - *.10 - so 7 = .7 etc.", minval=0) 
atype = input(2,minval=1,maxval=8,title="1=SMA, 2=EMA, 3=WMA, 4=HullMA, 5=VWMA, 6=RMA, 7=TEMA, 8=Tilson T3")

fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2000, title = "From Year", minval = 1970)
 //monday and session 
// To Date Inputs
toDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2020, title = "To Year", minval = 1970)

startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true

res = useCurrentRes ? timeframe.period : resCustom
resCustom2 = input(title="plm", type=input.resolution, defval="D")
res2 = resCustom2
//hull ma definition
hullma = wma(2*wma(src, len/2)-wma(src, len), round(sqrt(len)))
//TEMA definition
ema1 = ema(src, len)
ema2 = ema(ema1, len)
ema3 = ema(ema2, len)
tema = 3 * (ema1 - ema2) + ema3

//Tilson T3
factor = factorT3 *.10
gd(src, len, factor) => ema(src, len) * (1 + factor) - ema(ema(src, len), len) * factor 
t3(src, len, factor) => gd(gd(gd(src, len, factor), len, factor), len, factor) 
tilT3 = t3(src, len, factor) 
 

avg = atype == 1 ? sma(src,len) : atype == 2 ? ema(src,len) : atype == 3 ? wma(src,len) : atype == 4 ? hullma : atype == 5 ? vwma(src, len) : atype == 6 ? rma(src,len) : atype == 7 ? 3 * (ema1 - ema2) + ema3 : tilT3

out = avg 

ema20 = security(syminfo.tickerid, res, out)



plot3 = security(syminfo.tickerid, res2, ema20)

plot33 = security(syminfo.tickerid, res, ema20)

plot(plot3,linewidth=2,color=color.red) 
plot(plot33,linewidth=2,color=color.white) 

// longC = crossover(close[2], plot3) and close[1] > close[2] and close > close[1]
// shortc = crossunder(close[2],plot3)  and close[1] < close[2] and close < close[1]

volumeMA=input(24)
ema_1 = ema(volume, volumeMA)

timeinrange(res, sess) => time(res, sess) != 0
//entrytime = timeinrange(timeframe.period, "0900-0915")

myspecifictradingtimes = input('0900-2300', type=input.session, title="My Defined Hours")


entrytime = time(timeframe.period, myspecifictradingtimes) != 0

longC = crossover(plot33,plot3)  and time_cond and entrytime
shortc = crossunder(plot33,plot3) and time_cond and entrytime

// exitlong = crossunder(plot33,plot3)
// exitshort = crossover(plot33,plot3)

distanta=input(1.0025)
exitshort = plot33/plot3 > distanta
exitlong  = plot3/plot33 > distanta

inverse = input(true)
exit = input(false)
if(inverse==false)

    strategy.entry("long",1,when=longC)
    strategy.entry("short",0,when=shortc)
if(inverse)
    strategy.entry("long",1,when=shortc)
    strategy.entry("short",0,when=longC)

if(exit)
    strategy.close("long",when=exitlong)
    strategy.close("short",when=exitshort)

// if(dayofweek==dayofweek.friday)
//     strategy.close_all()

// risk = input(25)
// strategy.risk.max_intraday_loss(risk, strategy.percent_of_equity)

더 많은