이동 평균 추적 중지 손실 전략

저자:차오장, 날짜: 2023-10-24 11:21:57
태그:

img

전반적인 설명

이 전략의 핵심 아이디어는 트렌딩 시장에서 수익을 창출할 수 있는 자동화 거래 시스템을 설계하는 것이며, 이동 평균과 트레일링 스톱 로스 메커니즘을 사용하여 드라우다운을 제어하는 것입니다.

전략 논리

  1. 이 전략은 사용자가 간단한 이동 평균, 기하급수 이동 평균, 가중 이동 평균 등을 포함한 다양한 유형의 이동 평균 중에서 선택할 수 있습니다. 사용자는 선호도에 따라 이동 평균 유형을 선택할 수 있습니다.

  2. 사용자는 이동 평균의 기간을 설정해야합니다. 일반적으로 기간은 중장기 거래를 위해 20-60 사이입니다.

  3. 이동 평균이 선택되면 전략은 실시간으로 계산합니다. 가격이 이동 평균보다 높을 때 길게 가고 이동 평균보다 낮을 때 짧게됩니다.

  4. 이 전략은 트레일링 스톱 로스 메커니즘을 사용합니다. 포지션을 열고 나면 이동 평균과 가격 사이의 관계를 지속적으로 모니터링하고 동적으로 스톱 로스 수준을 조정합니다. 구체적으로, 스톱 로스는 사용자에 의해 설정된 이동 평균 더하기 / 마이너스 스톱 로스 비율로 설정됩니다.

  5. 사용자가 스톱 로스 비율을 설정할 수 있습니다. 더 큰 비율은 더 넓은 스톱 로스 범위와 덜 민감함을 의미합니다. 더 작은 비율은 더 긴 스톱 로스 및 낮은 위험을 의미합니다. 스톱 로스 비율은 일반적으로 2%-5% 사이로 설정됩니다.

  6. 포지션을 열고 나면, 가격이 이동 평균을 넘어선다면 포지션은 닫을 것입니다.

장점

  • 트렌드를 따라 포지션을 열고 트렌딩 시장에서 더 큰 이익을 얻을 수 있습니다.
  • 가격 동작에 따라 스톱 레벨을 조정하기 위해 트레일링 스톱 손실을 사용합니다. 너무 긴 스톱을 피합니다.
  • 이동 평균 및 위험 욕구에 따라 중지 손실 비율의 사용자 정의를 허용
  • 테스트를 통해 최적화를 가능하게 다양한 이동 평균 유형을 지원합니다.
  • 단순하고 명확한 논리, 이해하기 쉽고 수정하기 쉽다

위험성

  • 가격은 범위에 묶인 시장에서 이동 평균 주위에서 변동할 수 있으며 과도한 거래로 이어질 수 있습니다.
  • 너무 큰 스톱 로스 비율은 손실을 증가시킬 수 있습니다.
  • 이동평균과 스톱 로스의 최적 매개 변수는 제품과 시간 프레임에 따라 다를 수 있습니다.
  • 주요 뉴스 사건 근처에서 이 전략을 사용하지 마십시오

위험은 다음과 같이 최적화되고 통제될 수 있습니다.

  • 명백한 추세를 보이는 제품과 시간 프레임에서 전략을 사용하는 것
  • 장기 이동 평균을 이용한 이동 평균 기간 조정
  • 적당히 줄이는 스톱 로스 비율을 강화한 위험 통제를 위해
  • 최적의 매개 변수를 찾기 위해 각 제품에 개별적으로 테스트
  • 주요 뉴스 이벤트 전에 거래를 중지

더 나은 기회

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

  1. 확인을 위해 다른 지표를 추가하여 범위 제한 시장에서 과도한 거래를 피합니다. MACD, KD를 추가 할 수 있으므로 신호가 정렬 될 때만 취합니다.

  2. 이동 평균의 조합을 사용하십시오. 예를 들어, 5 일 MA와 20 일 MA는 함께 사용할 수 있으므로 거래가 동일한 방향으로 정렬 될 때만 취합니다.

  3. 각 제품에 대해 개별적으로 매개 변수를 테스트하고 최적의 매개 변수를 설정합니다. 매개 변수는 제품과 기간에 따라 다릅니다. 따라서 별도의 테스트가 필요합니다.

  4. 포지션 사이즈링 규칙을 추가합니다. 예를 들어, 초기 포지션에 대한 고정된 양, 그리고 Stop Loss 거리를 기반으로 포지션에 추가합니다.

  5. 하루에 거래의 최대 수 또는 거래 사이의 최소 시간을 설정합니다. 이것은 과도한 거래를 제한합니다.

  6. 기계 학습 알고리즘을 추가하여 역학적 데이터에 기반한 매개 변수를 동적으로 최적화하여 정적 매개 변수 설정을 피합니다.

  7. 가격 동향을 예측하기 위해 딥러닝 모델을 통합하여 동향 방향 판단에 도움이 됩니다.

결론

전체적으로 이것은 트렌드 다음 전략의 매우 실용적인 방법이다. 트렌드 방향을 결정하고 위험을 제어하기 위해 트레일링 스톱을 사용한다. 트렌딩 시장에서 좋은 수익을 낼 수 있다. 매개 변수 최적화와 다른 지표 또는 모델과의 통합을 결합하면 안정성과 수익성을 더욱 향상시킬 수 있다. 사용자는 제품과 시간 프레임에 따라 매개 변수 설정의 차이와 주요 이벤트의 영향을 주목해야 한다. 전반적으로 이 전략은 중간 수준의 헤지 펀드와 약간의 경험을 가진 소매 투자자에게 적합하다.


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

//@version=3
//attoCryp, @HikmetSezen58
strategy("MOST Multi MAs", overlay=true, pyramiding=1, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
sx=input(defval = "close" ,title="Fiyat sec", options=[ "close", "high", "low", "open", "hl2", "hlc3", "hlco4", "hlcc4", "hlccc5"])
smox=input(defval = "HulleMA", title = "Hareketli Ortalama: ", options=["T3", "SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "EVWMA", "HullMA", "HulleMA", "LSMA", "ALMA", "TMA", "SSMA"])
timeFramemost = input(title="++++++++++++++++++++++++++++++++++++", defval="MOST Ayarlari:")
yuzde=input(defval=3.8, minval=0, step=0.1, title="Yuzde Oran")/100
ortalamauzunluk=input(defval=28, title="Periyot Uzunlugu", minval=1)
f=input(defval=0.4, step=0.1, title="T3 icin Factor", minval=0.01)
timeFrameadd=input(title="++++++++++++++++++++++++++++++++++++", defval="Diger Orta.Ayar:")
offsig=input(defval=4, title="LSMA icin Offset veya ALMA icin Sigma", minval=0)
offalma=input(defval=0.6, title="ALMA icin Offset", minval=0, step=0.01)
timeFramess=input(title="++++++++++++++++++++++++++++++++++++", defval="Baslangic-Bitis:")
gun_baslangic=input(defval=1, title="Baslangic Gunu", minval=1, maxval=31)
ay_baslangic=input(defval=1, title="Baslangic Ayi", minval=1, maxval=12)
yil_baslangic=input(defval=2017, title="Baslangic Yili", minval=2010)
gun_bitis=input(defval=1, title="Bitis Gunu", minval=1, maxval=31)
ay_bitis=input(defval=1, title="Bitis Ayi", minval=1, maxval=12)
yil_bitis = input(defval=2019, title="Bitis Yili", minval=2010)

// backtest icin baslangic ve bitis zamanlarini belirleme
baslangic=timestamp(yil_baslangic, ay_baslangic, gun_baslangic, 00, 00)
bitis=timestamp(yil_bitis, ay_bitis, gun_bitis, 23, 59) 
zamanaraligi() => true

//guncel fiyatti belirleme
guncelfiyat=sx=="high"?high : sx=="close"?close : sx=="low"?low : sx=="open"?open : sx=="hl2"?(high+low)/2 : sx=="hlc3"?(high+low+close)/3 : sx=="hlco4"?(high+low+close+open)/4 : sx=="hlcc4"?(high+low+close+close)/4 : sx=="hlccc5"?(high+low+close+close+close)/5 : close 

/////Ortalama Hesaplamalari/////
// Tillson T3
sm0(guncelfiyat,ortalamauzunluk,f) =>
    t3e1=ema(guncelfiyat, ortalamauzunluk)
    t3e2=ema(t3e1, ortalamauzunluk)
    t3e3=ema(t3e2, ortalamauzunluk)
    t3e4=ema(t3e3, ortalamauzunluk)
    t3e5=ema(t3e4, ortalamauzunluk)
    t3e6=ema(t3e5, ortalamauzunluk)
    c1=-f*f*f
    c2=3*f*f+3*f*f*f
    c3=-6*f*f-3*f-3*f*f*f
    c4=1+3*f+f*f*f+3*f*f
    s0=c1 * t3e6 + c2 * t3e5 + c3 * t3e4 + c4 * t3e3

// Basit ortalama
sm1(guncelfiyat,ortalamauzunluk) =>
    s1=sma(guncelfiyat, ortalamauzunluk)

// Ustel ortalama
sm2(guncelfiyat,ortalamauzunluk) =>
    s2=ema(guncelfiyat, ortalamauzunluk)

// Cift Ustel ortalama
sm3(guncelfiyat,ortalamauzunluk) =>
    s3=2*ema(guncelfiyat, ortalamauzunluk) - ema(ema(guncelfiyat, ortalamauzunluk), ortalamauzunluk)

// Uclu Ustel ortalama
sm4(guncelfiyat,ortalamauzunluk) =>
    s4=3*(ema(guncelfiyat, ortalamauzunluk) - ema(ema(guncelfiyat, ortalamauzunluk), ortalamauzunluk)) + ema(ema(ema(guncelfiyat, ortalamauzunluk), ortalamauzunluk), ortalamauzunluk)

// Agirlikli Ortalama  
sm5(guncelfiyat,ortalamauzunluk) =>
    s5=wma(guncelfiyat, ortalamauzunluk)

// Hacim Agirlikli Ortalama
sm6(guncelfiyat,ortalamauzunluk) =>
    s6=vwma(guncelfiyat, ortalamauzunluk)

// Smoothed
sm7(guncelfiyat,ortalamauzunluk) =>
    s7=0.0
    s7:=na(s7[1]) ? sma(guncelfiyat, ortalamauzunluk) : (s7[1] * (ortalamauzunluk - 1) + guncelfiyat) / ortalamauzunluk

// Hull Ortalama
sm8(guncelfiyat,ortalamauzunluk) =>
    s8=wma(2 * wma(guncelfiyat, ortalamauzunluk / 2) - wma(guncelfiyat, ortalamauzunluk), round(sqrt(ortalamauzunluk)))
    
// Hull Ustel Ortalama
sm81(guncelfiyat,ortalamauzunluk) =>
    s8=ema(2 * ema(guncelfiyat, ortalamauzunluk / 2) - ema(guncelfiyat, ortalamauzunluk), round(sqrt(ortalamauzunluk)))

// Least Square
sm9(guncelfiyat,ortalamauzunluk,offsig) =>
    s9=linreg(guncelfiyat, ortalamauzunluk, offsig)

// Arnaud Legoux
sm10(guncelfiyat, ortalamauzunluk, offalma, offsig) =>
    s10=alma(guncelfiyat, ortalamauzunluk, offalma, offsig)

// Triangular
sm11(guncelfiyat, ortalamauzunluk) =>
    s11=sma(sma(guncelfiyat, ortalamauzunluk),ortalamauzunluk)

// SuperSmoother filter
sm12(guncelfiyat,ortalamauzunluk) =>
    a1=exp(-1.414*3.14159 / ortalamauzunluk)
    b1=2*a1*cos(1.414*3.14159 / ortalamauzunluk)
    c2=b1
    c3=(-a1)*a1
    c1=1 - c2 - c3
    s12=0.0
    s12:=c1*(guncelfiyat + nz(guncelfiyat[1])) / 2 + c2*nz(s12[1]) + c3*nz(s12[2])
    
//Elastic Volume Weighted Moving Average
sm13(guncelfiyat,ortalamauzunluk) =>
    hacimtoplam=sum(volume, ortalamauzunluk)
    s13=0.0
    s13:=(nz(s13[1]) * (hacimtoplam - volume)/hacimtoplam) + (volume*guncelfiyat/hacimtoplam)

ortalamafiyat=smox=="T3"?sm0(guncelfiyat,ortalamauzunluk,f) : smox=="SMA"?sm2(guncelfiyat,ortalamauzunluk) : smox=="EMA"?sm2(guncelfiyat,ortalamauzunluk) : smox=="DEMA"?sm3(guncelfiyat,ortalamauzunluk) : smox=="TEMA"?sm4(guncelfiyat,ortalamauzunluk) : smox=="WMA"?sm5(guncelfiyat,ortalamauzunluk) : smox=="VWMA"?sm6(guncelfiyat,ortalamauzunluk) : smox=="SMMA"?sm7(guncelfiyat,ortalamauzunluk) : smox=="HullMA"?sm8(guncelfiyat,ortalamauzunluk) : smox=="HulleMA"?sm81(guncelfiyat,ortalamauzunluk) : smox=="LSMA"?sm9(guncelfiyat,ortalamauzunluk,offsig) : smox=="ALMA"?sm10(guncelfiyat, ortalamauzunluk, offalma, offsig) : smox=="TMA"?sm11(guncelfiyat,ortalamauzunluk) : smox=="SSMA"?sm12(guncelfiyat,ortalamauzunluk) : smox=="EVWMA"?sm13(guncelfiyat,ortalamauzunluk) : guncelfiyat

/////MOST'u hesaplama/////
stopfiyat=ortalamafiyat*yuzde
mostfiyat=0.0
mostfiyat:=iff(ortalamafiyat>nz(mostfiyat[1],0) and ortalamafiyat[1]>nz(mostfiyat[1],0),max(nz(mostfiyat[1],0),ortalamafiyat-stopfiyat),iff(ortalamafiyat<nz(mostfiyat[1],0) and ortalamafiyat[1]<nz(mostfiyat[1],0),min(nz(mostfiyat[1],0),ortalamafiyat+stopfiyat),iff(ortalamafiyat>nz(mostfiyat[1],0),ortalamafiyat-stopfiyat,ortalamafiyat+stopfiyat)))

mostcolor=ortalamafiyat>mostfiyat?lime:fuchsia
plot(mostfiyat, color=mostcolor, linewidth=4, title="Most-fiyat")

/////AL-SAT LONG-SHORT girislerini belirleme/////
long=ortalamafiyat>mostfiyat and ortalamafiyat[1]<mostfiyat[1]
short=ortalamafiyat<mostfiyat and ortalamafiyat[1]>mostfiyat[1]
if (long) 
    strategy.entry("AL-Long", strategy.long, when = zamanaraligi())
if (short) 
    strategy.entry("SAT-Short", strategy.short, when = zamanaraligi())

더 많은