듀얼 모멘텀 이동 평균 거래 전략


생성 날짜: 2024-02-19 14:36:37 마지막으로 수정됨: 2024-02-19 14:36:37
복사: 1 클릭수: 590
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

듀얼 모멘텀 이동 평균 거래 전략

개요

쌍동력 평선 거래 전략은 OTT 지표와 Wavetrend 진동기 지표를 결합한 전략이다. Anıl Özekşi 선생님이 개발한 OTT 지표와 lonestar108의 Wavetrend 진동기 지표를 결합하여 성공적인 거래 지표를 형성한다. 이 전략은 양방향 시장에서 다중 하위권 조작을 할 수 있다.

전략 원칙

쌍동력 평행선 거래 전략은 먼저 브린 밴드 중궤도를 계산한다. 즉, 이동 평균 MAvg. 그리고 사용자가 설정한 비율 범위와 주기에 따라 긴 스톱 (longStop) 와 짧은 스톱 (shortStop) 을 계산한다. 가격이 상궤도를 돌파할 때 더하고, 상궤도를 돌파할 때 공백을 한다. 닫기 신호는 가격이 평행선 근처로 돌아가는 것이다.

구체적으로, 이 전략의 핵심 지표는 OTT 지표이다. OTT 지표는 평균선과 경계선으로 구성되어 있으며, 특정 알고리즘에 따라 시장의 변동 정도에 따라 경계선의 위치를 조정한다. 가격이 하위 경계선 OTT 아래로 떨어지면 공백을; 가격이 상위 경계선 OTT을 넘으면 더 많은 것을 한다.

이 전략은 동시에 Wavetrend 지표를 사용하여 가격 트렌드 방향을 판단하고, 하향 트렌드라고 판단하면, 더 많은 것을하지 않고, 더 많은 것을하지 않고, 더 많은 것을하지 않습니다.

우위 분석

쌍동력 평선 거래 전략은 이동 평균, 브린 밴드 및 OTT 지표의 장점을 결합하여 자동으로 스톱 포지션을 조정하여 스톱 손실이 활성화 될 확률을 줄일 수 있습니다. 동시에 추세를 판단하는 지표와 결합하여 흔들리는 추세에 갇히지 않도록합니다.

특히, 이 전략의 주요 장점은 다음과 같습니다.

  1. 자동으로 스톱 리스를 조정하여 위험을 효과적으로 제어할 수 있습니다.
  2. OTT 지표는 전환점을 더 정확하게 판단할 수 있습니다.
  3. 동향을 판단하는 지표와 함께, 흔들리는 시장의 교도소를 피하십시오.
  4. 규칙은 비교적 간단하고 명확하며 사용법을 이해하기 쉽습니다.

위험 분석

이중 동력 일직선 거래 전략에는 다음과 같은 몇 가지 측면에 초점을 맞춘 위험이 있습니다.

  1. 급격한 상황에서는 스톱 손실 라인이 뚫려 큰 손실을 초래할 수 있습니다.
  2. OTT 지표 판단의 역전 신호는 정확하지 않으며, 오류 신호가 발생할 수 있다.
  3. 트렌드 판단이 잘못되고, 하향 진동으로 인해 손실이 발생할 수 있습니다.
  4. 잘못된 변수 설정은 정책 효과에도 영향을 미칠 수 있습니다.

그 대책은 다음과 같습니다.

  1. 스톱 라인이 쉽게 활성화되지 않도록 스톱 라인을 적절하게 느슨하게 합니다.
  2. 다른 지표와 함께 OTT 신호의 신뢰성을 판단하여 가짜 신호를 피하십시오.
  3. 트렌드 판단을 위해 파라미터를 적절하게 조정합니다.
  4. 최적화 매개 변수, 최적의 매개 변수 조합

최적화 방향

이중 동력 일선 거래 전략에는 더 많은 최적화 가능성이 있습니다.

  1. 다른 지표와 결합하여 신호 판단의 정확성을 향상시킬 수 있습니다.
  2. 시장의 변동에 따라 스톱 라인을 조정할 수 있도록 적응형 스톱 알고리즘을 연구할 수 있습니다.
  3. 거래량 지표를 추가하여 낮은 양의 가짜 돌파구를 방지할 수 있습니다.
  4. 다른 종류의 이동 평균을 테스트하여 가장 잘 맞는 평균을 찾을 수 있습니다.
  5. 기계학습과 같은 방법을 시도해 볼 수 있습니다.

요약하다

쌍동력 평행선 거래 전략은 여러 지표의 장점을 통합하여 자동으로 스톱로스를 조정하고, 반전 신호를 판단하고, 트렌드 방향을 식별할 수 있다. 위험 제어 능력이 강하고, 사용하기 쉬운 등의 장점이 있다. 하지만, 도피, 신호 부정확성 등의 위험도 존재한다. 이 전략은 다른 지표 조합과 함께 사용, 자율적 알고리즘 연구 등으로 더 이상 최적화 될 수 있다.

전략 소스 코드
/*backtest
start: 2023-02-12 00:00:00
end: 2024-02-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Bugra trade strategy", shorttitle="Bugra trade strategy", overlay=true)

// Kullanıcı Girdileri
length = input(5, title="Period", minval=1)
percent = input(1, title="Sihirli Yüzde", type=input.float, step=0.1, minval=0)
mav = input(title="Hareketli Ortalama Türü", defval="VAR", options=["SMA", "EMA", "WMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF"])
wt_n1 = input(10, title="Kanal Periyodu")
wt_n2 = input(21, title="Averaj Uzunluğu")
src = close

// Tarih Aralığı Girdileri
startDate = input(20200101, title="Başlangıç Tarihi (YYYYMMDD)")
endDate = input(20201231, title="Bitiş Tarihi (YYYYMMDD)")

// Tarih Filtresi Fonksiyonu
isDateInRange() => true
// Özel Fonksiyonlar
Var_Func(src, length) =>
    valpha = 2 / (length + 1)
    vud1 = src > src[1] ? src - src[1] : 0
    vdd1 = src < src[1] ? src[1] - src : 0
    vUD = sum(vud1, length)
    vDD = sum(vdd1, length)
    vCMO = (vUD - vDD) / (vUD + vDD)
    varResult = 0.0
    varResult := nz(valpha * abs(vCMO) * src + (1 - valpha * abs(vCMO)) * nz(varResult[1]))
    varResult

Wwma_Func(src, length) =>
    wwalpha = 1 / length
    wwma = 0.0
    wwma := wwalpha * src + (1 - wwalpha) * nz(wwma[1])
    wwma

Zlema_Func(src, length) =>
    zxLag = floor(length / 2)
    zxEMAData = src + (src - src[zxLag])
    zlema = ema(zxEMAData, length)
    zlema

Tsf_Func(src, length) =>
    lrc = linreg(src, length, 0)
    lrs = lrc - linreg(src, length, 1)
    tsf = lrc + lrs
    tsf

getMA(src, length) =>
    ma = mav == "SMA" ? sma(src, length) :
         mav == "EMA" ? ema(src, length) :
         mav == "WMA" ? wma(src, length) :
         mav == "TMA" ? sma(sma(src, ceil(length / 2)), floor(length / 2) + 1) :
         mav == "VAR" ? Var_Func(src, length) :
         mav == "WWMA" ? Wwma_Func(src, length) :
         mav == "ZLEMA" ? Zlema_Func(src, length) :
         mav == "TSF" ? Tsf_Func(src, length) : na

// Strateji Hesaplamaları
MAvg = getMA(src, length)
fark = MAvg * percent * 0.01
longStop = MAvg - fark
longStopPrev = nz(longStop[1], longStop)
longStop := MAvg > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop = MAvg + fark
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := MAvg < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop

dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and MAvg > shortStopPrev ? 1 : dir == 1 and MAvg < longStopPrev ? -1 : dir
MT = dir==1 ? longStop: shortStop
OTT = MAvg > MT ? MT*(200+percent)/200 : MT*(200-percent)/200

plot(OTT, title="BugRA", color=color.rgb(251, 126, 9))

// Alım ve Satım Koşulları
longCondition = crossover(src, OTT) and isDateInRange()
shortCondition = crossunder(src, OTT) and isDateInRange()

// Strateji Giriş ve Çıkış Emirleri
if (longCondition)
    strategy.entry("Long", strategy.long)

if (shortCondition)
    strategy.close("Long")