Một chiến lược chéo động cơ dựa trên đường trung bình động hàm số

Tác giả:ChaoZhang, Ngày: 2024-01-23 14:18:26
Tags:

img

Tổng quan

Chiến lược này xác định hướng xu hướng dựa trên sự chéo chéo của các đường EMA với các giai đoạn khác nhau và tạo ra tín hiệu dài và ngắn theo đó. Nó chủ yếu sử dụng hai đường trung bình động - EMA 10 ngày và EMA 20 ngày. Khi EMA 10 ngày vượt qua dưới EMA 20 ngày, một tín hiệu ngắn được kích hoạt. Khi EMA 10 ngày vượt qua trên EMA 20 ngày, một tín hiệu dài được kích hoạt. Chiến lược này thuộc về các chiến lược giao dịch trung hạn.

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

Chiến lược sử dụng hai đường EMA, bao gồm đường EMA 10 ngày và đường EMA 20 ngày. Các đường EMA có thể phản ánh xu hướng giá hiệu quả. Khi đường EMA ngắn hạn vượt qua trên đường EMA dài hạn, nó cho thấy xu hướng giá đang chuyển từ giảm lên tăng, đó là một tín hiệu dài. Khi đường EMA ngắn hạn vượt qua dưới đường EMA dài hạn, nó cho thấy xu hướng giá đang chuyển từ tăng xuống giảm, đó là một tín hiệu ngắn.

Chiến lược này cũng kết hợp các giá trị tối đa và tối thiểu của biến động giá để lọc một số tín hiệu giao dịch.

Cụ thể, bằng cách theo dõi thời gian đạt được giá trị tối đa và tối thiểu, chiến lược đánh giá liệu xu hướng giá có hình thành hay không.

Phân tích lợi thế

Chiến lược có những lợi thế sau:

  1. Sử dụng đường EMA để xác định hướng xu hướng có thể theo dõi các chuyển động thị trường hiệu quả
  2. Kết hợp các dòng EMA của các giai đoạn khác nhau có thể nắm bắt các cơ hội giao dịch trong trung hạn
  3. Việc lọc tín hiệu theo các giá trị cực đoan có thể loại bỏ một số tiếng ồn và tránh bỏ lỡ cơ hội giao dịch
  4. Logic là đơn giản và rõ ràng, dễ hiểu và sửa đổi
  5. Các tham số có thể được điều chỉnh cho các sản phẩm và ưu đãi thương mại khác nhau, cho thấy khả năng thích nghi mạnh mẽ

Phân tích rủi ro

Ngoài ra còn có một số rủi ro với chiến lược này:

  1. Các đường EMA có hiệu ứng chậm lại, có thể bỏ lỡ sự đảo ngược xu hướng ngắn hạn
  2. Việc lọc tiếng ồn là không hoàn hảo, một số giao dịch sai có thể xảy ra
  3. Các thông số cần phải được điều chỉnh thích hợp để phù hợp với môi trường thị trường khác nhau

Các rủi ro có thể được giảm thiểu thông qua:

  1. Thêm các chỉ số khác để xác nhận tín hiệu để tránh các vấn đề chậm trễ đường EMA
  2. Tối ưu hóa điều kiện lọc giá trị cực để cải thiện độ tin cậy tín hiệu
  3. Điều chỉnh các tham số dựa trên kết quả backtest để tối ưu hóa chiến lược

Hướng dẫn để cải thiện

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

  1. Kết hợp các chỉ số kỹ thuật khác như MACD và KD để cải thiện độ chính xác tín hiệu
  2. Tối ưu hóa các thông số dòng EMA để phù hợp hơn với các sản phẩm cụ thể
  3. Cải thiện các tham số giá trị cực để đánh giá tốt hơn sự biến động giá
  4. Thêm các cơ chế dừng lỗ để kiểm soát lỗ tối đa cho mỗi giao dịch
  5. Kiểm tra chiến lược trên các sản phẩm khác nhau để đánh giá khả năng thích nghi

Tóm lại

Tóm lại, chiến lược giao dịch qua đường EMA này là một chiến lược theo xu hướng đơn giản và thực tế. Nó sử dụng các đường EMA để xác định hướng xu hướng chính, kết hợp với lọc biến động giá để đưa ra quyết định giao dịch. Nó dễ hiểu và điều chỉnh các tham số, thích nghi với giao dịch trung hạn.


/*backtest
start: 2024-01-15 00:00:00
end: 2024-01-22 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("PierceMAStrat", overlay=true)

lenMA0 = input(title="Length 0",defval=2)
lenMA1=input(title="Length 1",defval=10)
lenMA2=input(title="Length 2", defval=20)
lenMA3 = input(title = "Length3", defval =50)




emaLen0 = ema(close, lenMA0)
emaLen1 = ema(close, lenMA1)
emaLen2 = ema(close, lenMA2)
emaLen3 = ema(close, lenMA3)

    
ascent = if emaLen1[1] < emaLen1[0]
    true
else
    false
    
descent = if emaLen1[1] > emaLen1[0]
    true
else
    false
    
TimeSinceAscensionStart = if ascent == true
    barssince(descent == true)
else
    0
    

StartUp = if TimeSinceAscensionStart < 1
    true
else
    false

StartDown = if TimeSinceAscensionStart < 1
    false
else
    true


AscentBarCounter = barssince(StartUp == true)

DescentBarCounter = barssince(StartDown == true)

MaxAscent = if AscentBarCounter[1] > AscentBarCounter[0] and AscentBarCounter[1] > 10
    true
else
    false
    
MaxDescent = if DescentBarCounter[1] > DescentBarCounter[0] and DescentBarCounter[1] > 5
    true
else
    false
    
longCond = if crossover(emaLen1, emaLen2) and barssince(MaxDescent == true) > 3
    true
else
    false
shortCond = if crossunder(emaLen1, emaLen2) and barssince(MaxAscent == true) > 3
    true
else
    false


//longCond = (crossover(emaLen1, emaLen2) and (emaLen2 > emaLen3))
//shortCond = crossunder(emaLen1, emaLen2) and (emaLen2 < emaLen3)



if longCond == true
    strategy.entry("LONG", strategy.long)

if shortCond == true
    strategy.entry("SHORT", strategy.short)
    


plotshape(series=MaxAscent, title="MaximaReached", style=shape.triangledown, location=location.abovebar, color=green, text="MaximaReached", size=size.small)
plotshape(series=MaxDescent, title="MinimaReached", style=shape.triangleup, location=location.belowbar, color=red, text="MinimaReached", size=size.small)
//plotshape(series=StartUp, title="StartUp", style=shape.triangleup, location=location.belowbar, color=red, text="StartUp", size=size.tiny)
//plotshape(series=StartDown, title="StartDown", style=shape.triangleup, location=location.belowbar, color=green, text="StartDown", size=size.tiny)

//plotshape(series=(crossover(emaLen1, emaLen3)), title="GBXOVER", style=shape.triangleup, location=location.belowbar, color=green, text="GBXO", size=size.small)
//plotshape(series=(crossover(emaLen2, emaLen3)), title="RBXOVER", style=shape.triangledown, location=location.abovebar, color=orange, text="RBXO", size=size.small)
//plotshape(series=(crossover(emaLen1, emaLen2)), title="GRXOVER", style=shape.triangledown, location=location.abovebar, color=teal, text="GRXO", size=size.small)
//plotshape(series=(crossunder(emaLen1, emaLen2)), title="GRXUNDER", style=shape.triangledown, location=location.abovebar, color=purple, text="GRXU", size=size.small)
//plotshape(series=(crossunder(emaLen1, emaLen3)), title="GBXOVER", style=shape.triangleup, location=location.belowbar, color=yellow, text="GBXU", size=size.small)
//plotshape(series=(crossunder(emaLen2, emaLen3)), title="RBXOVER", style=shape.triangledown, location=location.abovebar, color=yellow, text="RBXU", size=size.small)
    
//plotshape(convergence, color=lime, style=shape.arrowup, text="CROSS")
plot(emaLen1, color=green, transp=0, linewidth=2)
plot(emaLen2, color=red, transp=30, linewidth=2)
plot(emaLen3, color=blue, transp=30, linewidth=2)



Thêm nữa