Chiến lược Crossover Trung bình Di chuyển theo dõi xu hướng

Tác giả:ChaoZhang, Ngày: 2024-01-29 16:52:46
Tags:

img

Tổng quan

Đây là một chiến lược dựa trên trung bình động đơn giản hoạt động tốt với các cặp tiền xu khác nhau. Nó vẽ ra giá mở và giá đóng trung bình động, và quyết định nhập vào một vị trí dài hoặc thoát ra dựa trên việc hai đường đã vượt qua nhau hay không. Ý tưởng là nó vào một vị trí khi giá đóng trung bình tăng, có thể chỉ ra đà tăng giá. Sau đó nó thoát khỏi vị trí khi giá đóng trung bình giảm, có thể chỉ ra đà giảm. Đây là suy đoán, nhưng đôi khi nó có thể dự đoán hành động giá rất tốt.

Chiến lược logic

Chiến lược này đầu tiên chọn loại trung bình động, bao gồm EMA, SMA, RMA, WMA và VWMA. Sau đó, nó thiết lập thời gian xem lại cho trung bình động, thường là từ 10 đến 250 thanh.

Logic giao dịch cụ thể là:

  1. Tính toán trung bình động của giá mở và giá đóng;
  2. So sánh các giá trung bình động giữa giá đóng và giá mở;
  3. Nhập một vị trí dài nếu giá trung bình động của giá đóng vượt trên giá trung bình động của giá mở;
  4. Đóng vị trí dài nếu giá trung bình động của giá đóng vượt dưới giá trung bình động mở.

Nhập vào vị trí coi đó là một dấu hiệu của chuyển động giá tăng, trong khi ra khỏi xem xét chuyển động giá giảm.

Phân tích lợi thế

Những lợi thế chính của chiến lược này là:

  1. Cài đặt tham số linh hoạt có thể được tối ưu hóa cho các cặp tiền tệ khác nhau để có độ cụ thể tốt hơn;
  2. Logic đơn giản dễ hiểu và thực hiện;
  3. Lợi nhuận rất cao có thể đạt được cho một số cặp tiền xu, nói chung ổn định tốt;
  4. Khả năng tùy chỉnh cao trong việc hiển thị các chỉ số khác nhau.

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. Đối với một số cặp tiền và các thông số, lợi nhuận và sự ổn định có thể thấp;
  2. Không thể đáp ứng tốt với biến động giá ngắn hạn, hiệu suất kém đối với các đồng tiền biến động cao;
  3. Sự lựa chọn của thời gian xem lại trung bình không đủ khoa học, hơi chủ quan.

Giải pháp và tối ưu hóa:

  1. Sử dụng khung thời gian dài hơn như 12H, 1D để giảm giao dịch không cần thiết và cải thiện sự ổn định;
  2. Thêm các chức năng tối ưu hóa tham số để tự động kiểm tra các kết hợp tham số khác nhau cho các tham số tốt nhất;
  3. Thêm lựa chọn thích nghi của thời gian xem lại trung bình động để hệ thống tự động quyết định thời gian tối ưu.

Kết luận

Tóm lại, đây là một chiến lược đơn giản sử dụng các chỉ số trung bình động để xác định xu hướng giá và các điểm uốn cong. Nó có thể đạt được kết quả rất tốt bằng cách điều chỉnh các tham số, và là một chiến lược theo dõi xu hướng hiệu quả đáng được cải thiện và áp dụng hơn nữa.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//Author @divonn1994

initial_balance = 100
strategy(title='Close v Open Moving Averages Strategy', shorttitle = 'Close v Open', overlay=true, pyramiding=0, default_qty_value=100, default_qty_type=strategy.percent_of_equity, precision=7, currency=currency.USD, commission_value=0.1, commission_type=strategy.commission.percent, initial_capital=initial_balance)

//Input for number of bars for moving average, Switch to choose moving average type, Display Options and Time Frame of trading----------------------------------------------------------------

bars = input.int(66, "Moving average length (number of bars)", minval=1, group='Strategy') //66 bars and VWMA for BTCUSD on 12 Hours.. 35 bars and VWMA for BTCUSD on 1 Day
strategy = input.string("VWMA", "Moving Average type", options = ["EMA", "SMA", "RMA", "WMA", "VWMA"], group='Strategy')

redOn = input.string("On", "Red Background Color On/Off", options = ["On", "Off"], group='Display')
greenOn = input.string("On", "Green Background Color On/Off", options = ["On", "Off"], group='Display')
maOn = input.string("On", "Moving Average Plot On/Off", options = ["On", "Off"], group='Display')

startMonth = input.int(title='Start Month 1-12 (set any start time to 0 for furthest date)', defval=1, minval=0, maxval=12, group='Beginning of Strategy')
startDate = input.int(title='Start Date 1-31 (set any start time to 0 for furthest date)', defval=1, minval=0, maxval=31, group='Beginning of Strategy')
startYear = input.int(title='Start Year 2000-2100 (set any start time to 0 for furthest date)', defval=2011, minval=2000, maxval=2100, group='Beginning of Strategy')

endMonth = input.int(title='End Month 1-12 (set any end time to 0 for today\'s date)', defval=0, minval=0, maxval=12, group='End of Strategy')
endDate = input.int(title='End Date 1-31 (set any end time to 0 for today\'s date)', defval=0, minval=0, maxval=31, group='End of Strategy')
endYear = input.int(title='End Year 2000-2100 (set any end time to 0 for today\'s date)', defval=0, minval=0, maxval=2100, group='End of Strategy')

//Strategy Calculations-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

inDateRange = true

maMomentum = switch strategy
    "EMA" => (ta.ema(close, bars) > ta.ema(open, bars)) ? 1 : -1
    "SMA" => (ta.sma(close, bars) > ta.sma(open, bars)) ? 1 : -1
    "RMA" => (ta.rma(close, bars) > ta.rma(open, bars)) ? 1 : -1
    "WMA" => (ta.wma(close, bars) > ta.wma(open, bars)) ? 1 : -1
    "VWMA" => (ta.vwma(close, bars) > ta.vwma(open, bars)) ? 1 : -1
    =>
        runtime.error("No matching MA type found.")
        float(na)

openMA = switch strategy
    "EMA" => ta.ema(open, bars)
    "SMA" => ta.sma(open, bars)
    "RMA" => ta.rma(open, bars)
    "WMA" => ta.wma(open, bars)
    "VWMA" => ta.vwma(open, bars)
    =>
        runtime.error("No matching MA type found.")
        float(na)
        
closeMA = switch strategy
    "EMA" => ta.ema(close, bars)
    "SMA" => ta.sma(close, bars)
    "RMA" => ta.rma(close, bars)
    "WMA" => ta.wma(close, bars)
    "VWMA" => ta.vwma(close, bars)
    =>
        runtime.error("No matching MA type found.")
        float(na)

//Enter or Exit Positions--------------------------------------------------------------------------------------------------------------------------------------------------------------------

if ta.crossover(maMomentum, 0)
    if inDateRange
        strategy.entry('long', strategy.long, comment='long')
if ta.crossunder(maMomentum, 0)
    if inDateRange
        strategy.close('long')

//Plot Strategy Behavior---------------------------------------------------------------------------------------------------------------------------------------------------------------------

plot(series = maOn == "On" ? openMA : na, title = "Open moving Average", color = color.new(color.purple,0), linewidth=3, offset=1)
plot(series = maOn == "On" ? closeMA : na, title = "Close Moving Average", color = color.new(color.white,0), linewidth=2, offset=1)
bgcolor(color = inDateRange and (greenOn == "On") and maMomentum > 0 ? color.new(color.green,75) : inDateRange and (redOn == "On") and maMomentum <= 0 ? color.new(color.red,75) : na, offset=1)

Thêm nữa