Chiến lược giao dịch EMA Cross Quant hai chiều

Tác giả:ChaoZhang, Ngày: 2024-01-24 17:31:41
Tags:

img

Tổng quan

Chiến lược này sử dụng các chỉ số EMA hai chiều để xác định hướng xu hướng chính của thị trường, và kết hợp chỉ số RSI như thời gian lựa chọn nhập cảnh, thuộc về xu hướng sau chiến lược giao dịch thuật toán.

Nguyên tắc chiến lược

  1. Tính toán nhiều nhóm EMA với các chu kỳ khác nhau để xác định hướng xu hướng chính của thị trường theo ba chiều: ngắn hạn, trung hạn và dài hạn
  2. Khi đường EMA ngắn hạn vượt qua đường EMA trung dài hạn, nó được xác định rằng một xu hướng tăng đã hình thành
  3. Khi EMA ngắn hạn vượt qua dưới EMA trung dài hạn, nó được xác định rằng một xu hướng giảm đã hình thành
  4. Kết hợp chỉ số RSI để tìm thời gian nhập cảnh phù hợp. Chỉ số RSI có thể được sử dụng để xác định các vùng mua quá mức và bán quá mức
  5. Trong xu hướng tăng, đi dài khi chỉ số RSI ở mức thấp; Trong xu hướng giảm, đi ngắn khi chỉ số RSI ở mức cao

Chiến lược trên chủ yếu áp dụng chỉ số EMA hai chiều để xác định hướng xu hướng chính và sử dụng chỉ số RSI như là lựa chọn tín hiệu đầu vào, thuộc về một xu hướng điển hình sau chiến lược giao dịch thuật toán.

Phân tích lợi thế

Ưu điểm lớn nhất của chiến lược này là nó có thể xác định rõ hướng xu hướng chính của thị trường và chọn thời gian nhập cảnh tốt hơn dựa trên chỉ số RSI.

  1. Sử dụng nhiều bộ EMA để xác định hướng xu hướng chính của thị trường theo nhiều chiều dài thời gian
  2. Tính toán chỉ số EMA đơn giản với ít tiếng ồn và xác định xu hướng chính của thị trường chính xác và đáng tin cậy
  3. Chỉ số RSI có thể xác định hiệu quả điểm nhập và dừng lỗ để tối ưu hóa đáng kể lợi nhuận
  4. Cấu trúc thuật toán là rõ ràng và dễ hiểu và sửa đổi.
  5. Nó có thể được kết hợp linh hoạt với các chỉ số kỹ thuật khác để tiếp tục cải thiện hiệu suất chiến lược

Phân tích rủi ro

Chiến lược này cũng có một số rủi ro, chủ yếu trong các khía cạnh sau:

  1. Khi xu hướng đảo ngược, điểm dừng lỗ có thể quá lý tưởng, do đó làm tăng tổn thất
  2. Không thể xác định hiệu quả điểm đảo ngược xu hướng, có thể bỏ lỡ cơ hội dừng lỗ kịp thời
  3. Các thông số EMA và các thông số RSI cần thử nghiệm và tối ưu hóa nhiều lần, nếu không nó có thể gây bất ổn
  4. Không thể đảm bảo rằng mỗi mục nhập là thời gian hoàn hảo, có thể có nhiều lần lặp lại không cần thiết
  5. Thật khó để tránh hiệu quả các khoảng cách lớn dưới ảnh hưởng của các sự kiện đột ngột

Để giải quyết các rủi ro trên, các tối ưu hóa có thể được thực hiện trong các lĩnh vực sau:

  1. Đặt các điểm dừng lỗ hợp lý để ngăn ngừa tổn thất quá mức
  2. Tăng các chỉ số khác để xác định sự đảo ngược xu hướng để đảm bảo dừng lỗ kịp thời
  3. Tối ưu hóa sự kết hợp các tham số để thích nghi với các điều kiện thị trường rộng lớn hơn
  4. Thay đổi nhập và dừng lỗ logic để giảm số lần lặp lại
  5. Tăng phán quyết ngoại lệ để tránh tác động tiêu cực của khoảng trống thị trường

Hướng dẫn tối ưu hóa

Từ những lợi thế và rủi ro của chiến lược này, chúng ta có thể nhận được các hướng tối ưu hóa sau:

  1. Trên khuôn khổ EMA hai chiều hiện có, giới thiệu các chỉ số như MACD và BOLL để đánh giá các điểm đảo ngược xu hướng, do đó tối ưu hóa chiến lược lấy lợi nhuận và dừng lỗ
  2. giới thiệu các mô hình học máy để dự đoán xác suất đảo ngược xu hướng và tiếp tục cải thiện hiệu suất chiến lược
  3. Áp dụng các bộ lọc tiên tiến để tự động xác định các điều kiện thị trường bất thường và ngăn ngừa thiệt hại hiệu quả
  4. Sử dụng thuật toán di truyền, học tăng cường sâu và các phương pháp khác để tự động tối ưu hóa các thông số để các chiến lược có thể thích nghi với nhiều loại thị trường hơn
  5. Thêm mô-đun dừng mất mát tự động, có thể điều chỉnh động điểm dừng mất mát theo tình huống thực tế

Thông qua việc giới thiệu nhiều chỉ số, mô hình dự đoán, tối ưu hóa tham số, các mô-đun kiểm soát rủi ro và các phương tiện khác, chiến lược này có thể được cải thiện hơn nữa để thích nghi với các điều kiện thị trường phức tạp và biến động hơn.

Kết luận

Bài viết này đã giới thiệu chi tiết nội dung chính của chiến lược giao dịch định lượng chéo EMA hai chiều. Đầu tiên, nó phác thảo các ý tưởng chính và nguyên tắc hoạt động của chiến lược. Sau đó, lợi thế của chiến lược được phân tích đầy đủ. Đồng thời, nó cũng phân tích các rủi ro tiềm năng chính trong chiến lược. Trên cơ sở này, một số hướng tối ưu hóa chính đã được đề xuất. Tóm lại, chiến lược này có lợi thế xác định xu hướng chính của thị trường, và cũng có một số không gian tối ưu hóa, đó là một chiến lược giao dịch định lượng điển hình. Thông qua cải tiến và tối ưu hóa liên tục, chiến lược này có thể trở thành một lựa chọn quan trọng cho các nhà đầu tư giao dịch thuật toán.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Investoz
// Indikatorn är byggd som ett utbildningsyfte och är därför ingen rekommendation för köp/sälj av aktier. Tanken är att skapa en visuell form i en graf
// som visar om det finns någon trend såväl positiv som negativ. En dialogruta med en varning talar om vilken trend som råder. I koden finns en möjlighet
// att ta position eller gå ur position om man vill skapa en startegi kring denna trendindikator. Rekommenderar dock starkt att inte enbart förlita sig på denna
// indikator som beslut för köp/sälj då resultaten blir negativa om man köper på psoitiv trend och säljer på negativ trend. Det måste kombineras med andra idéer
// och därför fungerar denna skript mer som ett komplement till sin egen strategi.
// Det är fritt fram för vem som helst att använda sig av denna indikator.  
//@version=4
//Skapar en strategiskript med 5 % av eget kapital som ett exempel. Detta går att ändra i skriptets inställningar, välj egenskaper och sedan ändra orderstorlek
//till ett annat värde av % på eget kapital.
strategy("© Investoz trendvarningar", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=5)
//Lägger till inmatningar till skriptindikatorn. Användaren kan se och redigera inmatningar i objektdialogen efter eget val.
ema1 = input(21, minval=1, maxval=500, title="Lila linje")
valema1=input(true, title="Visa lila linje")
ema2 = input(34, minval=1, maxval=500, title="Blå linje")
valema2=input(true, title="Visa blå linje")
ema3 = input(55, minval=1, maxval=500, title="Grön linje")
valema3=input(true, title="Visa grön linje")
ema4 = input(89, minval=1, maxval=500, title="Gul linje")
valema4=input(true, title="Visa gul linje")
ema5 = input(141, minval=1, maxval=500, title="Orange linje")
valema5=input(true, title="Visa orange linje")
ema6 = input(230, minval=1, maxval=500, title="Röd linje")
valema6=input(true, title="Visa röd linje")
ema7 = input(371, minval=1, maxval=500, title="Röd linje")
valema7=input(true, title="Visa röd linje")
//Inmatningar för antal staplar
startbar = input(1, minval=1, maxval=1, title="Första stapeln")
Endbar = bar_index
//Källa input, stängning. Användaren kan själv byta till vilken källa som önskas.
src = input(close, title="Source")
//Antal staplar sedan den längsta ema började och framåt. 
tid=Endbar + startbar - 371
//EMA loop
aema1 = ema(src, ema1)
bema2 = ema(src, ema2)
cema3 = ema(src, ema3)
dema4 = ema(src, ema4)
eema5 = ema(src, ema5)
fema6 = ema(src, ema6)
gema7 = ema(src, ema7)
//Skriver ut linjer i diagrammet om förhållandet är sant, annars falskt.
h=plot(valema1 ? aema1 : na, title="Lila linje", style=plot.style_line, linewidth=1, color=color.purple)
i=plot(valema2 ? bema2 : na, title="Blå linje", style=plot.style_line, linewidth=1, color=color.blue)
j=plot(valema3 ? cema3 : na, title="Grön linje", style=plot.style_line, linewidth=1, color=color.green)
k=plot(valema4 ? dema4 : na, title="Gul linje", style=plot.style_line, linewidth=1, color=color.yellow)
l=plot(valema5 ? eema5 : na, title="Orange linje", style=plot.style_line, linewidth=1, color=color.orange)
m=plot(valema6 ? fema6 : na, title="Röd linje", style=plot.style_line, linewidth=1, color=color.red)
n=plot(valema7 ? gema7 : na, title="Brun linje", style=plot.style_line, linewidth=1, color=color.maroon)
//Fyller bakgrunden mellan två linjer med en viss färg.
fill(h, i, color = color.purple,transp=34)
fill(i, j, color = color.blue,transp=34)
fill(j, k, color = color.green,transp=34)
fill(k, l, color = color.yellow,transp=34)
fill(l, m, color = color.orange,transp=34)
fill(m, n, color = color.red,transp=34)
//Skapa en algoritm för positiv trend
PositivTrend = crossover(aema1,gema7)?1:0
TrendPositiv = ema(close,1) > aema1 and aema1 > bema2?1:0
//Skapa en algoritm för negativ trend
NegativTrend = crossunder(aema1,gema7)?1:0
TrendNegativ = ema(close,1) < aema1 and aema1 < bema2?1:0
//Skapar en textruta med varningstext för positiv trend
varningtextpositiv = "Varning för positiv trend."+"\n" + "Leta efter att ta position!"
// if PositivTrend
//     varningpositiv=label.new(
//      bar_index, 
//      low,  
//      xloc=xloc.bar_index, 
//      yloc=yloc.price,
//      color=color.black, 
//      textcolor=color.green,
//      text=varningtextpositiv,
//      style=label.style_label_down,
//      textalign=text.align_left)
//Skapar en textruta med varningstext för negativ trend
varningtextnegativ = "Varning för negativ trend."+"\n" + "Leta efter utgången!"
// if NegativTrend
//     varningnegativ=label.new(
//      bar_index, 
//      low,  
//      xloc=xloc.bar_index, 
//      yloc=yloc.price,
//      color=color.black, 
//      textcolor=color.red,
//      text=varningtextnegativ,
//      style=label.style_label_up,
//      textalign=text.align_left)
//Köp om positiv trend
if (PositivTrend) 
    strategy.entry("Ta position", strategy.long, when = PositivTrend)
//Sälj om negativ trend
if (NegativTrend)
    strategy.close("Ta position", when = NegativTrend, comment="Gå ur position")
//Beräkning av positiv trend
vspositiv(positiv)=>valuewhen(Endbar==startbar,positiv,0)
vepositiv(positiv)=>valuewhen(Endbar==Endbar,positiv,0)
positivmean(TrendPositiv)=>
    csumpositiv = cum(TrendPositiv)
//Slut//   
    a = vepositiv(csumpositiv)
//Start//
    b = vspositiv(csumpositiv)
//Slut - Start// 
    (a - b)/(tid)
positivmeanpositiv = positivmean(TrendPositiv) 
//Beräkning av negativ trend
vsnegativ(negativ)=>valuewhen(Endbar==startbar,negativ,0)
venegativ(negativ)=>valuewhen(Endbar==Endbar,negativ,0)
negativmean(TrendNegativ)=>
    csumnegativ = cum(TrendNegativ)
//Slut//   
    a = venegativ(csumnegativ)
//Start//
    b = vsnegativ(csumnegativ)
//Slut - Start// 
    (a - b)/(tid)
negativmeannegativ = negativmean(TrendNegativ) 
//Inmatning av text som ska in i texruta som visar antal staplar i trend
logga = "© Investoz: Trend i tid"+ "\n"
streck = "--------------------------------------------------------"
totalastaplar = "\n" + "Dagar totalt: " + tostring(tid)+ " dagar "+"\n"+ streck + "\n"
totalpositiv = "Dagar totalt i positiv trend "+" 📈 : "  +tostring(positivmeanpositiv*tid, "##.##") +" dagar " + "\n"
totalnegativ = "\n" + "Dagar totalt i negativ trend" + " 📉 : "  +tostring(negativmeannegativ*tid, "##.##") +" dagar " 
//Textruta för antal staplar i trend
// if barstate.ishistory
//     barcountlbl=label.new(
//      bar_index, 
//      low,  
//      xloc=xloc.bar_index, 
//      yloc=yloc.price,
//      color=color.black, 
//      textcolor=color.yellow,
//      text=logga+streck+totalastaplar+totalpositiv+streck+totalnegativ,
//      style=label.style_label_lower_left,
//      textalign=text.align_left)
//     label.delete(barcountlbl[1])
////////////////////////////////// 

Thêm nữa