
이 전략의 핵심 아이디어는 이동 평균과 스톱 로스를 추적하는 메커니즘을 사용하여 트렌드 상황에서 수익을 얻을 수 있는 자동 거래 시스템을 설계하는 동시에 회수를 제어하는 것입니다.
이 정책은 사용자가 간단한 이동 평균, 지수 이동 평균, 비용 이동 평균 등 다양한 유형의 이동 평균을 선택할 수 있습니다. 사용자는 자신의 취향에 따라 이동 평균의 유형을 선택할 수 있습니다.
사용자는 이동 평균의 주기 길이를 설정해야 한다. 일반적으로 중단계 거래에서 이동 평균의 주기 길이는 20~60 사이이다.
이동 평균을 선택한 후, 전략은 실시간으로 이동 평균을 계산합니다. 가격이 상승하면 이동 평균을 뚫고 더 많은 것을 할 수 있고, 가격이 떨어지면 이동 평균을 뚫고 더 많은 것을 할 수 없습니다.
전략은 트래킹 스톱스 메커니즘을 사용합니다. 입장을 열고 나서 전략은 이동 평균과 가격의 관계를 지속적으로 모니터링하고, 스톱스 라인의 위치를 동적으로 조정합니다. 구체적으로, 스톱스 라인의 위치는 이동 평균 더하기 / 사용자 설정의 스톱스 비율을 것입니다.
사용자는 스톱 손실 비율을 설정할 수 있다. 값이 클수록 스톱 손실 범위가 넓어지기 때문에 너무 민감한 스톱 손실을 방지할 수 있다. 값이 작을수록 스톱 손실이 더 엄격하여 위험을 줄일 수 있다. 스톱 손실 비율은 일반적으로 2%-5% 사이에 설정된다.
포지션 개설 후, 가격이 이동 평균을 다시 깨면, 포지션 정지한다.
위험은 다음과 같은 방법으로 최적화 및 통제할 수 있습니다.
이 전략은 다음의 몇 가지 측면에서 더 개선될 수 있습니다.
다른 지표의 확인을 추가하여 정리할 때 자주 거래되는 것을 피한다. MACD, KD 등의 지표에 가입할 수 있으며, 동시에 신호를 발산할 때만 포지션을 열 수 있다.
여러 가지 이동 평균을 사용하여 조합한다. 예를 들어, 5 일선과 20 일선이 동시에 사용되며, 두 개의 이동 평균이 동방향으로 신호를 발사할 때만 포지션이 열린다.
다양한 품종에 대해 개별적으로 테스트하는 파라미터를 설정하여 최적의 파라미터를 설정한다. 각 품종과 주기별로 다른 파라미터는 개별적으로 테스트해야 한다.
포지션 수를 관리하는 전략을 추가하십시오. 예를 들어, 고정된 수를 설정하여 포지션을 열고, 포지션을 추가하고 스톱 손실을 연결하십시오.
하루 최대 포지션 개시 횟수를 설정하거나 포지션 개시 간격을 설정하십시오. 너무 자주 거래하는 것을 제한하십시오.
기계 학습 알고리즘을 추가하여 역학적 데이터에 따라 동적으로 최적화 된 파라미터를 사용한다. 파라미터를 정적 설정하지 않는다.
딥러닝 모델을 사용하여 가격 추세를 예측할 수 있다. 시장 추세 방향에 대한 판단에 도움을 줄 수 있다.
이 전략은 전체적으로 매우 실용적인 트렌드 추적 전략이다. 이동 평균을 사용하여 트렌드 방향을 판단하고, 스톱 로스를 추적하여 위험을 제어하여, 트렌드 상황에서 더 나은 수익을 얻을 수 있다. 파라미터를 최적화하고, 다른 지표 또는 모델과 조합하여, 이 전략의 안정성과 수익률을 더욱 향상시킬 수 있다. 그러나 사용자는 다양한 품종과 주기 하의 파라미터 설정의 차이와 주요 이벤트의 영향에 주의를 기울여야 한다.
/*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())