EMA Slope Cross Trend Theo chiến lược

Tác giả:ChaoZhang, Ngày: 2023-10-17 17:02:30
Tags:

img

Tổng quan

Chiến lược này sử dụng đường chéo của độ dốc của hai EMA với chiều dài khác nhau để tạo ra xu hướng sau tín hiệu.

Các điều kiện để đưa chiến lược vào thị trường là:

  • EMA 200: đi dài
  • Fast Slope < Slow Slope và giá < EMA 200: đi ngắn

Khi các độ dốc đơn giản vượt qua theo hướng ngược lại, nó đóng vị trí.

Chiến lược này hoạt động tốt nhất trên Bitcoin và các altcoin thanh khoản và vốn hóa nhất, nhưng cũng hoạt động rất tốt trên các tài sản biến động, đặc biệt là nếu chúng thường đi xu hướng. Làm việc tốt nhất trong khoảng thời gian 4h.

Ngoài ra còn có bộ lọc biến động tùy chọn, chỉ mở vị trí nếu sự khác biệt giữa hai độ dốc lớn hơn một giá trị cụ thể.

Thưởng thức đi!

Chiến lược logic

Cốt lõi của chiến lược này là so sánh độ dốc của hai EMA với chiều dài khác nhau.

Đầu tiên, EMA với chiều dài 130 và 400 được tính toán, sau đó độ dốc của mỗi người được tính toán, sau đó EMA dài 3 được tính toán trên mỗi độ dốc để có được đường cong độ dốc mịn.

Khi độ dốc EMA nhanh vượt qua độ dốc EMA chậm, một tín hiệu mua được tạo ra. Khi độ dốc EMA nhanh vượt qua độ dốc EMA chậm, một tín hiệu bán được tạo ra.

Để lọc ra tiếng ồn, EMA 200 giai đoạn có thể được sử dụng như một bộ lọc xu hướng, chỉ xem xét tín hiệu dài khi giá trên EMA, và tín hiệu ngắn chỉ khi dưới EMA.

Ngoài ra, một bộ lọc biến động có thể được sử dụng, tạo ra tín hiệu chỉ khi sự khác biệt giữa hai độ dốc lớn hơn một ngưỡng, để tránh các trường hợp khi độ dốc giao nhau nhưng độ biến động không đủ.

Khi độ dốc nhanh và chậm giao nhau ngược lại, các vị trí được đóng để dừng lợi nhuận / lỗ.

Phân tích lợi thế

  1. Sử dụng đường chéo độ dốc để tạo tín hiệu có thể theo dõi xu hướng hiệu quả

  2. Điều chỉnh sự kết hợp thời gian EMA có thể thích nghi với các điều kiện thị trường khác nhau

  3. Bộ lọc xu hướng tránh bị đánh lừa bởi hành động giá hỗn loạn

  4. Bộ lọc biến động lọc ra các tín hiệu sai

  5. Logic đơn giản và rõ ràng, dễ hiểu và thực hiện

  6. Có thể được sử dụng trên nhiều khung thời gian

Phân tích rủi ro

  1. Có thể xảy ra mở và đóng thường xuyên trên các thị trường có phạm vi rộng

  2. Thời gian EMA không phù hợp có thể bỏ lỡ các điểm chuyển hướng xu hướng

  3. Các thông số nên được điều chỉnh để thích nghi với các điều kiện thị trường thay đổi

  4. Giống như các hệ thống MA, các xu hướng lớn có thể đảo ngược ở mức cực

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

  1. Thử các kết hợp thời gian EMA khác nhau để tìm các thông số tối ưu

  2. Chọn các tham số theo đặc điểm tài sản và điều kiện thị trường

  3. Xem xét thêm các chiến lược dừng lỗ để kiểm soát rủi ro

  4. Xem xét điều chỉnh năng động các giai đoạn EMA

  5. Kiểm tra các ngưỡng biến động khác nhau

  6. Hiệu quả thử nghiệm trên các khung thời gian

Tóm lại

Chiến lược có logic rõ ràng, dễ hiểu, sử dụng đường chéo độ nghiêng EMA để tạo ra tín hiệu và theo dõi xu hướng hiệu quả. Các bộ lọc xu hướng và biến động làm giảm các giao dịch ồn ào. Điều chỉnh các kết hợp thời gian EMA điều chỉnh nó theo các điều kiện thị trường khác nhau. Nhìn chung là một chiến lược theo xu hướng đơn giản và thực tế đáng để thử nghiệm và tối ưu hóa trong giao dịch trực tiếp.


/*backtest
start: 2023-10-09 00:00:00
end: 2023-10-16 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// strategy(title="Slopes",initial_capital=1000, default_qty_type=strategy.percent_of_equity, commission_type=strategy.commission.percent, commission_value=0.06, slippage = 2, default_qty_value=30, overlay=false)

//definizione input

start = timestamp(input(2018, "start year"), input(1, "start month"), input(1, "start day"), 00, 00)
end = timestamp(input(2020, "end year"), input(1, "end month"), input(1, "end day"), 00, 00)

average = input (title="Source MA Type", type=input.string, defval="EMA",options=["EMA","SMA"])

len1=input(130,title="Fast MA Length")
len2=input(400,title="Slow MA Length")

smoothingavg = input (title="Smoothing MAs Type", type=input.string, defval="EMA",options=["EMA","SMA"])
smoothingavglen = input (3,title="Smoothing MAs Length")

trendfilter=input(true,title="Trend Filter")
trendfilterperiod=input(200,title="Trend Filter MA Period")
trendfiltertype=input (title="Trend Filter MA Type", type=input.string, defval="EMA",options=["EMA","SMA"])

volatilityfilter=input(false,title="Volatility Filter")
volatilitydelta=input(0.0003,step=0.0001,title="Delta Slopes EMA")

//variabili

m1 = if average == "EMA" 
    ema(close,len1)
else
    sma(close,len1)

m2=if average == "EMA" 
    ema(close,len2)
else
    sma(close,len2)

slp1=(m1-m1[1])/m1
slp2=(m2-m2[1])/m2

e1=if smoothingavg == "EMA" 
    ema(slp1,smoothingavglen)
else
    sma(slp1,smoothingavglen)

e2=if smoothingavg == "EMA" 
    ema(slp2,smoothingavglen)
else
    sma(slp2,smoothingavglen)

plot(e1,color=color.yellow)
plot(e2,color=color.red)
//plot (abs(e1-e2),color=color.white)
//plot (ema(e1-e2,9),color=color.yellow)

//variabili accessorie e condizioni

TrendConditionL=if trendfiltertype =="EMA"
    close>ema(close,trendfilterperiod)
else
    close>sma(close,trendfilterperiod)
    
TrendConditionS=if trendfiltertype =="EMA"
    close<ema(close,trendfilterperiod)
else
    close<sma(close,trendfilterperiod)
    
VolatilityCondition = abs(e1-e2) > volatilitydelta

ConditionEntryL= if trendfilter == true
    if volatilityfilter == true
        e1>e2 and TrendConditionL and VolatilityCondition
    else
        e1>e2 and TrendConditionL
else
    if volatilityfilter == true
        e1>e2 and VolatilityCondition
    else 
        e1>e2

ConditionEntryS= if trendfilter == true
    if volatilityfilter == true
        e1<e2 and TrendConditionS and VolatilityCondition
    else 
        e1<e2 and TrendConditionS
else
    if volatilityfilter == true
        e1<e2 and VolatilityCondition
    else
        e1<e2

ConditionExitL=crossunder(e1,e2)
ConditionExitS=crossover(e1,e2)

if true
    if ConditionExitS
        if strategy.position_size < 0
            strategy.close("SLPShort")

if true
    if ConditionExitL
        if strategy.position_size > 0
            strategy.close("SLPLong")

if true
    if ConditionEntryL
        strategy.entry ("SLPLong",long=true)
        
if true
    if ConditionEntryS 
        strategy.entry("SLPShort",long=false)

Thêm nữa