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

Tác giả:ChaoZhang, Ngày: 2023-10-07 15:04:00
Tags:

Tổng quan

Chiến lược này xác định hướng xu hướng hiện tại bằng cách tính toán trung bình động của các giai đoạn khác nhau và tạo ra các tín hiệu giao dịch kết hợp với chỉ số RSI. Khi trung bình động thời gian ngắn vượt qua mức trung bình động thời gian dài, xu hướng được xem xét và tạo ra tín hiệu mua. Khi trung bình động thời gian ngắn vượt qua mức trung bình động thời gian dài, xu hướng được coi là đảo ngược và một tín hiệu bán được tạo ra. Chỉ số RSI được sử dụng để tránh các tín hiệu sai do biến động giá nhỏ.

Chiến lược logic

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

  2. Tính toán giá trị RSI 14 ngày.

  3. Khi SMA 10 ngày vượt trên SMA 50 ngày, và RSI lớn hơn 30, và SMA 20 ngày lớn hơn hoặc bằng SMA 100 ngày hoặc SMA 50 ngày lớn hơn hoặc bằng SMA 100 ngày, mua.

  4. Thiết lập giá dừng lỗ với giá đầu vào nhân với (1 - tỷ lệ phần trăm dừng lỗ).

  5. Bán khi:

    • SMA 10 ngày vượt dưới SMA 50 ngày và đóng là dưới SMA 20 ngày: tín hiệu bán ngược xu hướng
    • Close dưới 95% giá nhập cảnh: bán dừng lỗ
    • Đóng là dưới giá dừng lỗ: bán dừng lỗ

Chiến lược này đánh giá xu hướng thị trường bằng cách sử dụng đường trung bình động và thiết lập stop loss để kiểm soát rủi ro. RSI lọc ra các đột phá sai. Nó mua khi SMA ngắn hạn vượt qua SMA dài hạn, cho thấy xu hướng tăng, và thiết lập một đường stop loss để kiểm soát rủi ro trong thời gian nắm giữ. Nó bán khi có tín hiệu đảo ngược xu hướng hoặc giá stop loss được kích hoạt.

Phân tích lợi thế

  • Sử dụng đường trung bình động để xác định hướng xu hướng, mua trong thời gian xu hướng tăng tránh giao dịch trong thị trường giới hạn phạm vi
  • Sử dụng các đường trung bình động nhiều thời gian tránh bị đánh lừa bởi biến động giá ngắn hạn
  • Kết hợp với RSI lọc ra các tín hiệu sai
  • Thiết lập các biện pháp kiểm soát rủi ro giảm giá cho mỗi giao dịch
  • Sử dụng lệnh dừng lỗ để khóa lợi nhuận

Phân tích rủi ro

  • Các đường trung bình động có sự chậm trễ và có thể bỏ lỡ thời điểm tốt nhất để đảo ngược giá
  • Đặt lệnh dừng lỗ quá lỏng lẻo có thể dẫn đến lỗ lớn cho các giao dịch đơn
  • Đặt stop loss quá chặt có thể gây ra quá thường xuyên stop loss kích hoạt
  • Chế độ dừng lỗ có thể thoát quá sớm thiếu lợi nhuận lớn hơn

Tối ưu hóa có thể được thực hiện bằng cách điều chỉnh thời gian trung bình động, mức dừng lỗ vv. Cũng xem xét kết hợp với các chỉ số khác để tăng độ chính xác.

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

  • Điều chỉnh các giai đoạn trung bình động để phù hợp với các điều kiện thị trường khác nhau
  • Tối ưu hóa các thông số RSI để xác định tốt hơn các điều kiện mua quá mức / bán quá mức
  • Đặt mức dừng tĩnh và dừng đường mòn hợp lý dựa trên các đặc điểm của thiết bị
  • Thêm các chỉ số khác để tránh tín hiệu sai
  • Điều chỉnh stop loss dựa trên biến động, v.v.
  • Tự động tối ưu hóa các tham số thông qua máy học

Tóm lại

Chiến lược có logic rõ ràng nói chung, sử dụng đường trung bình động để xác định xu hướng và thiết lập stop loss để kiểm soát rủi ro. Đây là một chiến lược theo dõi xu hướng điển hình. Những cải tiến hơn nữa có thể đạt được thông qua điều chỉnh tham số và thêm các chỉ số khá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)
    
    


Thêm nữa