Chiến lược theo xu hướng dựa trên đường trung bình động


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

Tổng quan

Chiến lược này phát ra tín hiệu mua và bán bằng cách tính toán các đường trung bình di chuyển trong các chu kỳ khác nhau, xác định hướng xu hướng hiện tại và kết hợp với chỉ số RSI. Khi đường trung bình di chuyển ngắn hạn đi qua đường trung bình di chuyển dài hạn, cho rằng xu hướng đi lên, thực hiện giao dịch mua.

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

  1. Tính trung bình di chuyển đơn giản 10, 20, 50, 100 và 200 ngày.

  2. Tính RSI 14 ngày.

  3. Mua được khi SMA 50 trên SMA 10 và RSI lớn hơn 30 và SMA 20 cao hơn hoặc bằng SMA 100 hoặc SMA 50 cao hơn hoặc bằng SMA 100 ngày.

  4. Đặt giá dừng là điểm mua nhân 1 trừ phần trăm dừng.

  5. Bán hàng được thực hiện khi:

    • Xu hướng bán tháo dưới đường SMA ngày 10 và bán tháo dưới đường SMA ngày 20
    • Giá mua thấp hơn 95%: Cấm lỗ bán
    • Giá đóng cửa thấp hơn giá dừng lỗ: Xu hướng theo dõi dừng lỗ bán ra

Chiến lược này sử dụng đường trung bình di chuyển để đánh giá xu hướng của thị trường và thiết lập điểm dừng để kiểm soát rủi ro. Chỉ số RSI được sử dụng để lọc các đợt phá vỡ giả. Mua khi SMA ngắn hạn vượt qua SMA dài, cho thấy xu hướng lên, đặt đường dừng khi giữ cổ phiếu để kiểm soát rủi ro. Bán cổ phiếu khi có tín hiệu đảo ngược xu hướng hoặc khi giá dừng được kích hoạt.

Phân tích lợi thế

  • Sử dụng đường trung bình di chuyển để xác định xu hướng, mua ở giai đoạn xu hướng tăng, có thể tránh giao dịch trong thị trường biến động
  • Sử dụng trung bình di chuyển đa chu kỳ để tránh bị lừa bởi biến động giá ngắn hạn
  • Kiểm tra các tín hiệu giả mạo kết hợp với chỉ số RSI
  • Thiết lập đường dừng để kiểm soát rủi ro mất mát đơn lẻ
  • Sử dụng Trend Tracking Stop Loss để khóa lợi nhuận

Phân tích rủi ro

  • Đường trung bình di chuyển bị tụt hậu, có thể bỏ lỡ thời điểm tốt nhất để giá đảo ngược
  • Cài đặt dừng lỗ quá thoải mái có thể dẫn đến tổn thất lớn
  • Cài đặt dừng quá chặt có thể gây ra dừng quá thường xuyên
  • Theo dõi xu hướng dừng lỗ có thể bỏ lỡ nhiều tiền hơn khi ra đi sớm

Các phương pháp tối ưu hóa có thể được thực hiện bằng cách điều chỉnh chu kỳ trung bình di chuyển, điều chỉnh điểm dừng lỗ, v.v. Cũng có thể xem xét kết hợp với các chỉ số khác để tăng độ chính xác của quyết định.

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

  • Điều chỉnh chu kỳ trung bình di chuyển để phù hợp hơn với các môi trường thị trường khác nhau
  • Tối ưu hóa các tham số RSI để tăng độ chính xác trong việc đánh giá quá mua quá bán
  • Thiết lập điểm dừng tĩnh và trail stop hợp lý cho các giống khác nhau
  • Thêm các chỉ số khác để tránh tín hiệu sai
  • Có thể điều chỉnh điểm dừng theo động lực của các chỉ số như biến động
  • Các tham số có thể được tự động tối ưu hóa thông qua phương pháp học máy

Tóm tắt

Chiến lược tổng thể của chiến lược này rõ ràng, sử dụng xu hướng đánh giá xu hướng trung bình di chuyển và thiết lập dừng để kiểm soát rủi ro, là một chiến lược theo dõi xu hướng điển hình. Bằng cách điều chỉnh tham số và thêm các chỉ số đánh giá khác, bạn có thể cải thiện hơn nữa chiến lược phản hồi và hiệu suất thị trường. Nhưng không có chiến lược nào hoàn hảo, cần phải liên tục điều chỉnh và tối ưu hóa theo môi trường thị trường, phối hợp với quản lý rủi ro để đối phó với sự không chắc chắn của thị trường.

Mã nguồn chiến lược
/*backtest
start: 2022-09-30 00:00:00
end: 2023-10-06 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("MA_Script", overlay=true)

// STEP 1:
// Configure trail stop level with input options (optional)
longTrailPerc=input(title="Trail Long Loss (%)", type=input.float, minval=0.0, step=0.05, defval=0.1)

// Configure backtest start date with inputs
startDate=input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=31)
startMonth=input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12)
startYear=input(title="Start Year", type=input.integer, defval=2020, minval=1800, maxval=2100)

// See if this bar's time happened on/after start date
afterStartDate=(time >=timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0))

// Calculate Relative Strength Index
rsiValue=rsi(close, 14)

// Calculate moving averages
MA10_Val =sma(close, 10)
//plot(MA10_Val, color=color.yellow, linewidth=1)

MA20_Val =sma(close, 20)
plot(MA20_Val, color=color.green, linewidth=1)

MA50_Val =sma(close, 50)
plot(MA50_Val, color=color.red, linewidth=1)

MA100_Val =sma(close, 100)
plot(MA100_Val, color=color.blue, linewidth=1) 

MA200_Val =sma(close, 200)
plot(MA200_Val, color=color.purple, linewidth=1) 

// Calculate candlestick
C_BodyHi = max(close, open)
C_BodyLo = min(close, open)
C_Body = C_BodyHi - C_BodyLo
C_UpShadow = high - C_BodyHi
C_DnShadow = C_BodyLo - low

// STEP 2:
// Calculate entry trading conditions
buyCondition_1=crossover(MA10_Val, MA50_Val) and (rsiValue > 30) and ((MA20_Val >=  MA100_Val) or (MA50_Val >=  MA100_Val))
avg_price = (close + open)/2

// First Entry
if (afterStartDate)
    strategy.entry(id="Entry_Trade_1", long=true, limit=avg_price, when=buyCondition_1)

plotchar(afterStartDate and crossover(MA10_Val, MA50_Val), textcolor = color.blue, text = 'MA\n')

// Determine trail stop loss prices
longStopPrice=0.0

longStopPrice :=if (strategy.position_size > 0)
    stopValue=C_BodyHi * (1 - longTrailPerc)
    max(stopValue, longStopPrice[1])
else
    0
plot(longStopPrice, color=color.orange, linewidth=1)

bought_1=strategy.position_size[0] > strategy.position_size[1]
entry_Point_1=valuewhen(bought_1, avg_price, 0)

// STEP 3:
// Calculate exit trading conditions
sellCondition_2=crossunder(MA10_Val, MA50_Val) and (close < MA20_Val)
sellCondition_3_temp=valuewhen((C_BodyHi >= entry_Point_1*1.2), 1, 0)
sellCondition_1=(entry_Point_1*0.95 > close) and (sellCondition_3_temp != 1)
sellCondition_3=(sellCondition_3_temp == 1) and (strategy.position_size > 0) and close <= longStopPrice
plotchar((sellCondition_3 == 1) and (strategy.position_size > 0) and close <= longStopPrice, textcolor = color.red, text = 'TS\n', show_last = 11)
plotchar(crossunder(MA10_Val, MA50_Val), textcolor = color.red, text = 'MA\n')

id_val = ""
stop_val = close
condition = false

if sellCondition_1
    id_val := "Exit By Stop Loss At 7%"
    stop_val := entry_Point_1*0.93
    condition := true
else if sellCondition_2
    id_val := "Exit By Take Profit based on MA"
    stop_val := close
    condition := true
else if sellCondition_3
    id_val := "Exit By Trailing Stop"
    stop_val := longStopPrice
    condition := true

// Submit exit orders for trail stop loss price
if (strategy.position_size > 0)
    //strategy.exit(id="Exit By Stop Loss At 7%", from_entry="Entry_Trade_1", stop=entry_Point_1*0.93, when=sellCondition_1)
    //strategy.exit(id="Exit By Take Profit based on MA", from_entry="Entry_Trade_1", stop=close, when=sellCondition_2)
    strategy.exit(id=id_val, from_entry="Entry_Trade_1", stop=stop_val, when=condition)