Chiến lược dừng lỗ theo dõi trung bình di chuyển

Tác giả:ChaoZhang, Ngày: 2023-10-24 11:21:57
Tags:

img

Tổng quan

Ý 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 có thể kiếm lợi nhuận trong các thị trường xu hướng trong khi kiểm soát rút tiền bằng cách sử dụng đường trung bình động và cơ chế dừng lỗ.

Chiến lược logic

  1. Chiến lược cho phép người dùng lựa chọn từ nhiều loại trung bình động khác nhau, bao gồm trung bình động đơn giản, trung bình động theo cấp số nhân, trung bình động trọng số, v.v. Người dùng có thể chọn loại trung bình động dựa trên sở thích của họ.

  2. Người dùng cần thiết lập khoảng thời gian của đường trung bình động.

  3. Một khi trung bình động được chọn, chiến lược sẽ tính toán nó trong thời gian thực. Nó sẽ đi dài khi giá phá vỡ trên trung bình động và đi ngắn khi giá phá vỡ dưới trung bình động.

  4. Chiến lược này sử dụng một cơ chế dừng lỗ. Sau khi mở một vị trí, nó sẽ liên tục theo dõi mối quan hệ giữa đường trung bình động và giá, và điều chỉnh động mức dừng lỗ. Cụ thể, mức dừng lỗ được đặt ở đường trung bình động cộng với/từ tỷ lệ giảm lỗ dừng được thiết lập bởi người dùng.

  5. Người dùng có thể thiết lập tỷ lệ stoploss. tỷ lệ stoploss lớn hơn có nghĩa là phạm vi stop loss rộng hơn và nhạy cảm ít hơn. tỷ lệ stoploss nhỏ hơn có nghĩa là stop loss chặt chẽ hơn và rủi ro thấp hơn. tỷ lệ stoploss thường được thiết lập trong khoảng 2% -5%.

  6. Sau khi mở một vị trí, nếu giá vượt qua đường trung bình động, vị trí sẽ được đóng.

Ưu điểm

  • Có thể mở các vị trí dọc theo xu hướng và kiếm được lợi nhuận lớn hơn trong thị trường xu hướng
  • Sử dụng dừng lỗ để điều chỉnh mức dừng dựa trên hành động giá, tránh dừng quá chặt chẽ
  • Cho phép tùy chỉnh các đường trung bình động và tỷ lệ dừng lỗ theo sự thèm rủi ro
  • Hỗ trợ các loại trung bình động khác nhau, cho phép tối ưu hóa thông qua thử nghiệm
  • Logic đơn giản và rõ ràng, dễ hiểu và sửa đổi

Rủi ro

  • Giá có thể dao động xung quanh trung bình động trong các thị trường giới hạn phạm vi, gây ra giao dịch quá mức
  • Một tỷ lệ dừng lỗ quá lớn có thể dẫn đến tổn thất lớn hơn
  • Các thông số tối ưu cho đường trung bình động và dừng lỗ có thể khác nhau giữa các sản phẩm và khung thời gian
  • Tránh sử dụng chiến lược này gần các sự kiện tin tức lớn

Các rủi ro có thể được tối ưu hóa và kiểm soát bằng cách:

  • Sử dụng chiến lược trong các sản phẩm và khung thời gian có xu hướng rõ ràng
  • Điều chỉnh thời gian trung bình động, sử dụng trung bình động dài hạn hơn
  • Giảm thích hợp tỷ lệ dừng lỗ để kiểm soát rủi ro chặt chẽ hơn
  • Kiểm tra riêng biệt trên mỗi sản phẩm để tìm các thông số tối ưu
  • Ngừng giao dịch trước các sự kiện tin tức lớn

Cơ hội gia tăng

Chiến lược có thể được tối ưu hóa thêm trong các khía cạnh sau:

  1. Thêm các chỉ số khác để xác nhận, tránh giao dịch quá mức trong các thị trường giới hạn phạm vi.

  2. Sử dụng sự kết hợp của các đường trung bình động. ví dụ, MA 5 ngày và MA 20 ngày có thể được sử dụng cùng nhau, để giao dịch chỉ được thực hiện khi cả hai đều liên kết theo cùng một hướng.

  3. Kiểm tra các thông số riêng biệt trên mỗi sản phẩm và thiết lập các thông số tối ưu.

  4. Thêm quy tắc định kích thước vị trí. ví dụ, số lượng cố định cho vị trí ban đầu, sau đó thêm vào vị trí dựa trên khoảng cách dừng lỗ.

  5. Đặt số lượng giao dịch tối đa mỗi ngày hoặc thời gian tối thiểu giữa các giao dịch.

  6. Thêm các thuật toán học máy để tối ưu hóa các tham số một cách năng động dựa trên dữ liệu lịch sử, tránh cài đặt tham số tĩnh.

  7. Kết hợp các mô hình học sâu để dự đoán xu hướng giá, hỗ trợ đánh giá hướng xu hướng.

Kết luận

Nhìn chung, đây là một chiến lược theo xu hướng rất thực tế. Nó sử dụng trung bình động để xác định hướng xu hướng và dừng lại để kiểm soát rủi ro. Nó có thể tạo ra lợi nhuận tốt trong các thị trường xu hướng. Kết hợp tối ưu hóa tham số và tích hợp với các chỉ số hoặc mô hình khác có thể tăng thêm sự ổn định và lợi nhuận. Người dùng cần lưu ý sự khác biệt trong cài đặt tham số giữa các sản phẩm và khung thời gian, cũng như tác động của các sự kiện lớn. Nhìn chung chiến lược này phù hợp với các quỹ phòng hộ cấp trung bình và các nhà đầu tư bán lẻ có một số kinh nghiệm.


/*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())

Thêm nữa