이중 이동 평균 역전 전략

저자:차오장, 날짜: 2023-10-24 10:56:08
태그:

img

전반적인 설명

이 전략은 주로 트렌드 반전으로부터 이익을 얻기 위해 이중 이동 평균을 구매 및 판매 신호로 사용합니다. 단기 이동 평균이 장기 이동 평균보다 높을 때 길게 이동하고 단기 이동 평균이 장기 이동 평균보다 낮을 때 짧게 이동합니다. 일반적인 트레일링 스톱 손실 전략에 속합니다.

전략 논리

전략은 먼저 두 개의 이동 평균을 설정합니다. 한 가지 짧은 기간 20 일 MA와 한 가지 장기 60 일 MA. 두 가지 MA 사이의 교차 상황을 판단하여 진입을 결정합니다.

구체적으로, 단기 MA가 장기 MA를 넘으면 상승 추세를 나타냅니다. 그래서 길게 가십시오. 단기 MA가 장기 MA를 넘으면 하락 추세를 나타냅니다. 그래서 짧게 가십시오.

긴 또는 짧은 후에 손실을 멈추는 방법은 최대 이익을 잠금하기 위해 가장 높은 가격과 가장 낮은 가격에 기반한 후속 중지입니다.

이 규범의 주요 논리는 다음과 같습니다.

  1. 20일 EMA와 60일 EMA를 계산합니다
  2. 20 일간의 EMA가 60 일간의 EMA를 넘어서면 판단합니다.
  3. 20일 EMA가 60일 EMA 아래로 넘어갈 경우 판단합니다.
  4. 긴 후에 가장 높은 가격의 3% 아래로 손실을 중지 설정
  5. 쇼트 후, 최저 가격보다 3%의 스톱 로스를 설정
  6. 포지션에 있을 때 Stop Loss를 계속 조정합니다.

이점 분석

이 전략의 장점은 다음과 같습니다.

  1. 간단한 논리, 쉽게 구현할 수 있는
  2. 이중 MA는 거짓 파열을 효과적으로 필터할 수 있습니다.
  3. 최대의 수익을 내기 위해 후속 스톱 잠금
  4. 트렌드가 변할 때 신호를 적시에 감지할 수 있습니다.
  5. 적당한 수축 통제, 비교적 안정적인.

위험 분석

또한 몇 가지 위험이 있습니다.

  1. 트렌드가 불분명할 때 MA가 자주 교차하여 손실을 과다하게 만듭니다.
  2. 잘못된 스톱 손실 설정은 너무 느슨하거나 너무 공격적일 수 있습니다.
  3. 잘못된 매개 변수 설정, 예를 들어 기간 길이는 주요 신호를 놓칠 수 있습니다.
  4. 높은 거래 비용은 수익률을 떨어뜨립니다.

위험을 해결하기 위해:

  1. 트렌드가 불분명할 때 필터를 사용해서 블라인드 트레이딩을 피하세요.
  2. 테스트하고 적절한 설정에 대한 중지 손실 범위를 최적화합니다.
  3. 백테스트와 튜닝을 통해 최적의 매개 변수를 찾습니다.
  4. 거래 비용을 낮추기 위해 포지션 크기를 줄이세요.

최적화 아이디어

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

  1. 여러 조건으로 입력하기 위해 RSI 같은 다른 필터를 추가하여 잘못된 브레이크를 피합니다.

  2. 가장 좋은 매개 변수 믹스를 찾기 위해 MA 기간을 최적화합니다. 추가적으로 앞으로 걸어 다른 기간을 테스트 할 수 있습니다.

  3. 최적의 범위를 찾기 위해 백테스트 계산을 통해 스톱 손실 범위를 최적화합니다. 또한 동적 스톱 손실을 사용할 수 있습니다.

  4. 거래 빈도를 줄이기 위해 스톱 로스 출구 후 재입구 논리를 설정합니다.

  5. 트렌드가 명확하지 않을 때 트렌드 지표와 결합하여 거래를 중단합니다.

  6. 시장 조건에 따라 포지션 크기와 동적 스톱 로스를 추가합니다.

요약

요약하자면, 이중 MA 역전 전략은 전체적으로 간단하고 실용적이며, 이중 MA 크로스오버를 통해 트렌드 전환점을 식별합니다. 그러나 매개 변수 조정, 스톱 로스 최적화 및 전략 효과를 극대화하기 위해 필터를 추가해야하는 위험이 있습니다. 세심한 최적화와 규율적인 위험 관리로 안정적인 수익을 창출하는 스윙 거래 전략이 될 수 있습니다.


/*backtest
start: 2023-09-23 00:00:00
end: 2023-10-15 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/


//@version=2
strategy("Noro's Bands Scalper Strategy v1.4", shorttitle = "Scalper str 1.4", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value=100.0, pyramiding=0)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
takepercent = input(0, defval = 0, minval = 0, maxval = 1000, title = "take, %")
needbe = input(true, defval = true, title = "Bands Entry")
needct = input(false, defval = false, title = "Counter-trend entry")
needdb = input(true, defval = true, title = "Double Body")
len = input(20, defval = 20, minval = 2, maxval = 200, title = "Period")
needbb = input(true, defval = true, title = "Show Bands")
needbg = input(true, defval = true, title = "Show Background")
src = close

//PriceChannel 1
lasthigh = highest(src, len)
lastlow = lowest(src, len)
center = (lasthigh + lastlow) / 2

//Distance
dist = abs(src - center)
distsma = sma(dist, len)
hd = center + distsma
ld = center - distsma
hd2 = center + distsma * 2
ld2 = center - distsma * 2

//Trend
trend = close < ld and high < center ? -1 : close > hd and low > center ? 1 : trend[1]

//Lines
colo = needbb == false ? na : black
plot(hd2, color = colo, linewidth = 1, transp = 0, title = "High band 2")
plot(hd, color = colo, linewidth = 1, transp = 0, title = "High band 1")
plot(center, color = colo, linewidth = 1, transp = 0, title = "center")
plot(ld, color = colo, linewidth = 1, transp = 0, title = "Low band 1")
plot(ld2, color = colo, linewidth = 1, transp = 0, title = "Low band 2")

//Background
col = needbg == false ? na : trend == 1 ? lime : red
bgcolor(col, transp = 80)

//Body
body = abs(close - open)
smabody = needdb == false ? ema(body, 30) : ema(body, 30) * 2
candle = high - low

//Signals
bar = close > open ? 1 : close < open ? -1 : 0
up7 = trend == 1 and ((bar == -1 and bar[1] == -1) or (body > smabody and bar == -1)) ? 1 : 0
dn7 = trend == 1 and ((bar == 1 and bar[1] == 1) or (close > hd and needbe == true)) and close > strategy.position_avg_price * (100 + takepercent) / 100 ? 1 : 0
up8 = trend == -1 and ((bar == -1 and bar[1] == -1) or (close < ld2 and needbe == true)) and close < strategy.position_avg_price * (100 - takepercent) / 100 ? 1 : 0
dn8 = trend == -1 and ((bar == 1 and bar[1] == 1) or (body > smabody and bar == 1)) ? 1 : 0

if up7 == 1 or up8 == 1 
    strategy.entry("Long", strategy.long, needlong == false ? 0 : trend == -1 and needct == false ? 0 : na)

if dn7 == 1 or dn8 == 1
    strategy.entry("Short", strategy.short, needshort == false ? 0 : trend == 1 and needct == false ? 0 : na)

더 많은