Chiến lược chéo trung bình di chuyển kép

Tác giả:ChaoZhang, Ngày: 2023-12-11 15:21:58
Tags:

img

Tổng quan

Chiến lược chéo trung bình động đôi là một chiến lược theo xu hướng sử dụng chéo của hai trung bình động của các giai đoạn khác nhau như tín hiệu giao dịch. Nó đi vào các vị trí dài hoặc ngắn khi MA nhanh vượt qua trên hoặc dưới MA chậm và xác định hướng xu hướng sau khi chéo. Nó có thể nắm bắt xu hướng trung hạn trong khi giảm tần suất giao dịch không cần thiết từ biến động quá mức.

Chiến lược logic

Chiến lược sử dụng hai đường trung bình động: MA nhanh với thời gian ngắn hơn (ví dụ 15 thời gian) để nắm bắt các biến động giá ngắn hạn và MA chậm với thời gian dài hơn (ví dụ 21 thời gian) để xác định hướng xu hướng chính.

Bằng cách điều chỉnh các kết hợp thời gian MA, chiến lược có thể điều chỉnh khung thời gian của xu hướng để nắm bắt.

Chiến lược cũng kết hợp các mô-đun quản lý rủi ro bao gồm lấy lợi nhuận, dừng lỗ và dừng lỗ.

Ưu điểm

Chiến lược MA đôi có những lợi thế sau:

  1. Logic đơn giản và dễ hiểu/tiếp tục;
  2. Tính linh hoạt để thích nghi với điều kiện thị trường bằng cách điều chỉnh thời gian MA;
  3. Sự ổn định từ ít tín hiệu giao dịch hơn;
  4. Kiểm soát rủi ro hiệu quả thông qua dừng lỗ;
  5. Dễ dàng tối ưu hóa về MA, các tham số rủi ro vv

Rủi ro

Ngoài ra còn có một số rủi ro cần xem xét:

  1. Crossover quá mức và tần suất giao dịch trong các thị trường giới hạn phạm vi;
  2. Các MAs chậm có thể bỏ lỡ các điểm đảo ngược giá và không thể ngăn chặn lỗ kịp thời;
  3. Sự dễ bị tổn thương đối với các vụ phá vỡ giả tạo dẫn đến tổn thất không cần thiết;
  4. Sự không chính xác của việc theo dõi giá chung do sự chậm trễ của MAs.

Những điểm yếu này có thể được giảm thiểu thông qua tối ưu hóa như lọc tín hiệu, dừng lỗ kéo dài vv.

Cơ hội gia tăng

Chiến lược có thể được tăng cường trong các khía cạnh như:

  1. Thêm các bộ lọc về khối lượng hoặc độ biến động để tránh chém;
  2. Kiểm tra nhiều loại MA và thời gian / công thức tinh chỉnh để phù hợp với các sản phẩm và khung thời gian khác nhau;
  3. Kiểm tra các loại MA như EMA, LWMA để theo dõi giá nhanh nhất;
  4. Tự động hóa điều chỉnh MA và kích thước dừng mất mát bằng máy học;
  5. Phương pháp dừng lỗ thay thế, ví dụ như khoảng cách, giá trung bình, đèn chùm.

Sự gia tăng đáng kể trong tỷ lệ chiến thắng, lợi nhuận điều chỉnh rủi ro được mong đợi từ những tăng này.

Kết luận

Nhìn chung, chiến lược chéo trung bình động kép cung cấp tính đơn giản, linh hoạt và rủi ro có thể kiểm soát được. Sự dễ dàng thực hiện và tối ưu hóa của nó làm cho nó trở thành một chiến lược lượng ban đầu lý tưởng. Với thử nghiệm và điều chỉnh lặp đi lặp lại, nó có thông tin để phát triển thành một hệ thống mạnh mẽ theo thời gian.


/*backtest
start: 2022-12-10 00:00:00
end: 2023-06-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title = "Silent Trader Strategy", shorttitle = "Silent Trader", overlay = true, pyramiding = 0, default_qty_type = strategy.cash, default_qty_value = 1000, commission_value = 0.0675, initial_capital = 1000, currency = currency.USD, calc_on_order_fills = true, calc_on_every_tick = true)

maFastSource   = input(defval = ohlc4, title = "Fast MA Source")
maFastLength   = input(defval = 15, title = "Fast MA Period", minval = 1)
maSlowSource   = input(defval = ohlc4, title = "Slow MA Source")
maSlowLength   = input(defval = 21, title = "Slow MA Period", minval = 1)

tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
inpTakeProfit   = input(defval = 100, title = "Take Profit percentage(0.1%)", minval = 0)
inpStopLoss     = input(defval = 100, title = "Stop Loss", minval = 0)
inpTrailStop    = input(defval = 0, title = "Trailing Stop Loss", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0)

useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

useTimeLimit    = input(defval = true, title = "Use Start Time Limiter?")
startYear       = input(defval = 2018, title = "Start From Year",  minval = 0, step = 1)
startMonth      = input(defval = 05, title = "Start From Month",  minval = 0,step = 1)
startDay        = input(defval = 01, title = "Start From Day",  minval = 0,step = 1)
startHour       = input(defval = 00, title = "Start From Hour",  minval = 0,step = 1)
startMinute     = input(defval = 00, title = "Start From Minute",  minval = 0,step = 1)

startTimeOk() =>
    inputTime = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute)
    timeOk = time > inputTime ? true : false
    r = (useTimeLimit and timeOk) or not useTimeLimit

maFast = ema(maFastSource, maFastLength)
maSlow = sma(maSlowSource, maSlowLength)

fast = plot(maFast, title = "Fast MA", color = #26A69A, linewidth = 1, style = line, transp = 50)
slow = plot(maSlow, title = "Slow MA", color = #EF5350, linewidth = 1, style = line, transp = 50)

aboveBelow = maFast >= maSlow ? true : false
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false

if( startTimeOk() )
    enterLong = not tradeDirection[1] and tradeDirection
    exitLong = tradeDirection[1] and not tradeDirection
    strategy.entry( id = "Long", long = true, when = enterLong )
    //strategy.close( id = "Long", when = exitLong )
    
    enterShort = tradeDirection[1] and not tradeDirection
    exitShort = not tradeDirection[1] and tradeDirection
    strategy.entry( id = "Short", long = false, when = enterShort )
    //strategy.close( id = "Short", when = exitShort )
    
    strategy.exit("Exit Long", from_entry = "Long",  profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)
    strategy.exit("Exit Short", from_entry = "Short", profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)

Thêm nữa