Chiến lược theo dõi xu hướng giao cắt độ dốc trung bình động


Ngày tạo: 2023-10-17 17:02:30 sửa đổi lần cuối: 2023-10-17 17:02:30
sao chép: 0 Số nhấp chuột: 848
1
tập trung vào
1617
Người theo dõi

Chiến lược theo dõi xu hướng giao cắt độ dốc trung bình động

Tổng quan

Chiến lược này sử dụng độ lệch chéo của hai đường trung bình di chuyển chỉ số ((EMA) với độ dài khác nhau để tạo ra tín hiệu theo dõi xu hướng. Sử dụng EMA với độ dài 130 và 400 theo mặc định, sự kết hợp của hai tham số này hoạt động tốt.

Làm nhiều khi đường thẳng EMA trên đường thẳng EMA đi qua đường thẳng EMA và giá trên EMA 200 chu kỳ; làm trống khi đường thẳng EMA dưới đường thẳng EMA đi qua đường thẳng EMA và giá dưới 200 chu kỳ.

Hạ điểm khi giao ngược chiều nghiêng.

Chiến lược này hoạt động tốt nhất trên Bitcoin và các Altcoin có giá trị thị trường cao và có tính thanh khoản cao, nhưng cũng hoạt động tốt trên các tài sản có tính biến động cao, đặc biệt là khi các tài sản này thường xuyên xuất hiện trong các xu hướng.

Tốt nhất là trong khung thời gian 4 giờ.

Nó cũng đi kèm với một bộ lọc tỷ lệ dao động tùy chọn, chỉ mở vị trí khi chênh lệch giữa hai độ dốc lớn hơn một ngưỡng nhất định, nhằm tránh mở vị trí khi tiếng ồn lớn hơn tín hiệu khi giá dao động ngang.

Hãy thưởng thức!

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

Cốt lõi của chiến lược này là so sánh độ lệch của hai đường trung bình di chuyển của chỉ số EMA với độ dài khác nhau.

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

Tín hiệu mua được tạo ra khi đường thẳng EMA trên đường thẳng EMA đi qua đường thẳng EMA; Tín hiệu bán được tạo ra khi đường thẳng EMA dưới đường thẳng EMA đi qua đường thẳng EMA.

Để lọc biến động, bạn có thể chọn EMA 200 chu kỳ làm bộ lọc xu hướng, chỉ xem xét nhiều tín hiệu khi giá cao hơn EMA và xem xét tín hiệu trống khi giá thấp hơn.

Ngoài ra, một bộ lọc tỷ lệ dao động có thể được tùy chọn, chỉ phát ra tín hiệu khi chênh lệch giữa hai độ dốc lớn hơn so với giá trị giới hạn mặc định, do đó lọc các trường hợp có độ dao động không đủ.

Khi đường nghiêng ngược lại, vị trí dừng lỗ khi cân bằng.

Phân tích lợi thế

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

  2. Điều chỉnh các tham số EMA chu kỳ để phù hợp với các môi trường thị trường khác nhau

  3. Bộ lọc xu hướng có thể tránh bị lừa bởi các biến động

  4. Bộ lọc tỷ lệ dao động có thể lọc tín hiệu giả

  5. Quy tắc đơn giản, rõ ràng và dễ hiểu

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

Phân tích rủi ro

  1. Có thể xảy ra nhiều Open và Close trong các trường hợp sốc lớn

  2. Các tham số EMA không đúng chu kỳ có thể bỏ lỡ điểm biến động xu hướng

  3. Cần điều chỉnh hợp lý các tham số để phù hợp với môi trường thị trường thay đổi

  4. Tương tự như hệ thống MA, cuối xu hướng lớn có thể đảo ngược tổn thất

Hướng tối ưu hóa

  1. Thử các tham số kết hợp khác nhau của chu kỳ EMA để tìm tham số tốt nhất

  2. Các tham số lựa chọn dựa trên các đặc điểm của các loại tiền tệ khác nhau và môi trường thị trường

  3. Có thể xem xét thêm các chiến lược kiểm soát rủi ro để ngăn chặn tổn thất

  4. Có thể xem xét động điều chỉnh EMA tham số chu kỳ

  5. Thử các tham số giá trị mốc khác nhau

  6. Kiểm tra hiệu quả trên các khung thời gian khác nhau

Tóm tắt

Chiến lược tổng thể của chiến lược này rất rõ ràng và dễ hiểu, sử dụng EMA để tạo tín hiệu chéo, có thể theo dõi xu hướng một cách hiệu quả; bộ lọc xu hướng và bộ lọc tỷ lệ dao động có thể làm giảm tiếng ồn giao dịch. Bằng cách điều chỉnh các tham số EMA theo chu kỳ, nó có thể thích ứng với các môi trường thị trường khác nhau.

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