Chiến lược giao dịch định lượng giao cắt EMA hai chiều


Ngày tạo: 2024-01-24 17:31:41 sửa đổi lần cuối: 2024-01-24 17:31:41
sao chép: 0 Số nhấp chuột: 602
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch định lượng giao cắt EMA hai chiều

Tổng quan

Chiến lược này sử dụng 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 với chỉ số RSI để chọn thời gian vào, thuộc chiến lược giao dịch thuật toán theo kiểu xu hướng.

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

  1. Tính trung bình EMA của nhiều nhóm thời kỳ khác nhau, xác định xu hướng chính của thị trường trong ba chiều ngắn hạn, trung hạn và dài hạn
  2. Khi EMA ngắn hạn vượt qua EMA dài hạn, nó được coi là xu hướng lạc quan.
  3. Khi EMA ngắn hạn vượt qua EMA dài hạn, nó được coi là xu hướng giảm.
  4. Kết hợp với chỉ số RSI để tìm thời điểm thích hợp để tham gia, chỉ số RSI có thể được sử dụng để xác định các khu vực quá mua quá bán
  5. Trong xu hướng giảm giá, chỉ số RSI giữ vị trí dài khi thấp; trong xu hướng giảm giá, chỉ số RSI tham gia vào khi cao

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

Phân tích lợi thế chiến lược

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

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

Phân tích rủi ro chiến lược

Chiến lược này cũng có một số rủi ro, bao gồm:

  1. Khi xu hướng đảo ngược, điểm dừng có thể được lý tưởng hóa quá mức và làm tăng tổn thất
  2. Không có khả năng đánh giá hiệu quả điểm đảo ngược xu hướng, có thể bỏ lỡ cơ hội thoát khỏi lỗ hổng kịp thời
  3. Các tham số EMA và tham số RSI cần được kiểm tra và tối ưu hóa nhiều lần, nếu không có thể dẫn đến bất ổn
  4. Không thể đảm bảo rằng mọi lần nhập cảnh đều 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. Không thể tránh được sự đột ngột

Đối với các rủi ro trên, có thể tối ưu hóa từ các góc độ sau:

  1. Thiết lập điểm dừng hợp lý để tránh thua lỗ quá mức
  2. Thêm các chỉ số khác để xác định xu hướng đảo ngược và đảm bảo dừng lỗ kịp thời
  3. Tối ưu hóa các tham số để phù hợp với các tình huống thị trường rộng hơn
  4. Thay đổi logic nhập và dừng để giảm số lần lặp lại
  5. Tăng khả năng đánh giá bất thường, tránh tác động bất lợi của thị trường nhảy vọt

Hướng tối ưu hóa chiến lược

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

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

Chiến lược này có thể được nâng cao hơn nữa bằng cách giới thiệu nhiều chỉ số, mô hình dự đoán, tối ưu hóa tham số, mô-đun kiểm soát rủi ro, v.v.

Tóm tắt

Bài viết này mô tả chi tiết các yếu tố chính của chiến lược giao dịch định lượng chéo EMA hai chiều. Đầu tiên, nó tóm tắt 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 toàn diện. Đồng thời, cũng phân tích các điểm rủi ro chính có thể tồn tại trong chiến lược. Dựa trên đó, một số hướng tối ưu hóa quan trọng được đưa ra. Nói chung, chiến lược này có lợi thế trong việc đánh giá xu hướng thị trường chính và có một số không gian có thể tối ưu hóa, thuộc về một chiến lược giao dịch định lượng điển hình.

Mã nguồn chiến lược
/*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])
//////////////////////////////////