
Ý tưởng cốt lõi của chiến lược này là thiết kế một hệ thống giao dịch tự động sử dụng các trung bình di chuyển và theo dõi các cơ chế dừng lỗ để có thể kiếm lợi nhuận trong các tình huống xu hướng, đồng thời có thể kiểm soát sự rút lui.
Chính sách này cho phép người dùng chọn nhiều loại moving average khác nhau, bao gồm moving average đơn giản, moving average chỉ số, moving average chi phí. Người dùng có thể chọn loại moving average theo sở thích của mình.
Người dùng cần thiết lập độ dài chu kỳ của đường trung bình di chuyển. Thông thường trong giao dịch đường ngắn trung bình, chu kỳ của đường trung bình di chuyển nằm trong khoảng 20-60
Sau khi chọn đường trung bình di chuyển, chiến lược sẽ tính toán đường trung bình di chuyển đó trong thời gian thực. Khi giá tăng vượt qua đường trung bình di chuyển, làm nhiều hơn; Khi giá giảm vượt qua đường trung bình di chuyển, làm trống.
Chiến lược sử dụng cơ chế theo dõi dừng lỗ. Sau khi mở vị trí, chiến lược sẽ liên tục giám sát mối quan hệ giữa trung bình di chuyển và giá, điều chỉnh động vị trí của đường dừng lỗ. Cụ thể, vị trí của đường dừng lỗ bằng trung bình di chuyển cộng / trừ phần trăm dừng lỗ của người dùng.
Người dùng có thể thiết lập tỷ lệ dừng lỗ. Càng lớn, phạm vi dừng lỗ càng rộng, tránh dừng lỗ quá nhạy cảm; càng nhỏ, dừng lỗ càng nghiêm ngặt, giảm nguy cơ.
Sau khi mở vị trí, nếu giá lại phá vỡ đường trung bình di chuyển, vị trí đóng cửa sẽ bị mất.
Bạn có thể tối ưu hóa và kiểm soát rủi ro bằng cách:
Chiến lược này có thể được tối ưu hóa hơn nữa ở những khía cạnh sau:
Thêm xác nhận các chỉ số khác, tránh giao dịch thường xuyên khi cân bằng. Các chỉ số như MACD, KD có thể được thêm vào, chỉ khi chúng phát ra tín hiệu đồng thời mới mở vị trí.
Sử dụng nhiều đường trung bình di chuyển để kết hợp. Ví dụ: sử dụng đường 5 ngày và đường 20 ngày cùng một lúc, chỉ có hai đường trung bình di chuyển đồng hướng phát tín hiệu khi mở lệnh.
Các tham số thử nghiệm cho các giống khác nhau, thiết lập tham số tối ưu. Các tham số khác nhau cho mỗi giống và chu kỳ, cần thử nghiệm riêng.
Chiến lược quản lý số lượng vị trí tăng. Ví dụ: thiết lập số lượng cố định để mở vị trí, sau đó tăng vị trí và dừng lỗ.
Thiết lập tối đa số lần mở vị trí mỗi ngày hoặc thiết lập khoảng thời gian mở vị trí. Hạn chế giao dịch quá thường xuyên
Thêm thuật toán học máy để tối ưu hóa các tham số động dựa trên dữ liệu lịch sử. Tránh đặt tham số tĩnh.
Sử dụng mô hình học tập sâu để dự đoán xu hướng giá. Nó có thể hỗ trợ định hướng xu hướng thị trường.
Chiến lược này nói chung là một chiến lược theo dõi xu hướng rất thực tế. Nó sử dụng đường trung bình di chuyển để xác định xu hướng và theo dõi dừng để kiểm soát rủi ro, có thể nhận được lợi nhuận tốt hơn trong tình huống xu hướng.
/*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())