Chiến lược đột phá đường trung bình động kép


Ngày tạo: 2023-12-11 15:21:58 sửa đổi lần cuối: 2023-12-11 15:21:58
sao chép: 0 Số nhấp chuột: 637
1
tập trung vào
1621
Người theo dõi

Chiến lược đột phá đường trung bình động kép

Tổng quan

Chiến lược phá vỡ hai đường ngang là một chiến lược theo dõi xu hướng dựa trên sự giao thoa của đường trung bình di chuyển với hai chu kỳ khác nhau làm tín hiệu mua và bán. Chiến lược này sử dụng đường trung bình nhanh và điểm giao thoa của đường trung bình chậm làm điểm vào giao dịch, sau khi giao thoa, xác định hướng xu hướng và thiết lập vị trí đầu hoặc đầu không tương ứng.

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

Chiến lược này sử dụng hai đường trung bình di chuyển: một đường MA nhanh và đường MA chậm. Chu kỳ MA nhanh thường được thiết lập trong một chu kỳ ngắn hơn (như giai đoạn 15), để nắm bắt biến động giá trong thời gian ngắn; chu kỳ MA chậm thường được thiết lập trong một chu kỳ dài hơn (như giai đoạn 21), để xác định hướng của xu hướng chính.

Bằng cách thiết lập các cặp MA khác nhau, bạn có thể điều chỉnh thời gian chiến lược bắt được xu hướng. Các cặp MA ngắn hơn có thể bắt được cơ hội biến động giá trong các chu kỳ ngắn hơn; Các cặp MA dài hơn có thể lọc các biến động và chỉ bắt được xu hướng ở cấp độ dài hơn.

Chiến lược này cũng bao gồm các mô-đun quản lý rủi ro: Stop Loss, Stop Loss, Move Loss. Điều này có thể giới hạn mức lỗ tối đa cho mỗi giao dịch, giúp bảo vệ lợi nhuận tổng thể.

Lợi thế chiến lược

Chiến lược hai đường đều có những lợi thế sau:

  1. Khái niệm đơn giản, dễ hiểu và dễ thực hiện;
  2. Có thể nắm bắt xu hướng trong các khoảng thời gian khác nhau bằng cách điều chỉnh chu kỳ MA để thích ứng với các môi trường thị trường khác nhau;
  3. Các nhà đầu tư có thể sử dụng các giao dịch này để tạo ra các giao dịch ổn định và tránh giao dịch quá thường xuyên.
  4. Kết hợp với Stop Loss Stop, bạn có thể kiểm soát rủi ro một cách hiệu quả.
  5. Dễ dàng tối ưu hóa, có thể điều chỉnh chu kỳ MA, tham số quản lý rủi ro, v.v., để cải thiện hiệu quả hơn nữa.

Phân tích rủi ro

Chiến lược hai đường một cũng có một số rủi ro, chủ yếu tập trung vào các khía cạnh sau:

  1. Trong giai đoạn hồi phục chấn động, tín hiệu chéo MA có thể quá thường xuyên, dẫn đến vấn đề tần suất giao dịch quá cao;
  2. Trong một số trường hợp, giá cả của một giao dịch được xác định bởi các nhà đầu tư và các nhà đầu tư.
  3. Không có khả năng lọc hiệu quả các vụ đột phá giả mạo, có thể gây ra tổn thất không cần thiết;
  4. Chính MA đã chậm phản ứng với giá cả và không thể theo dõi hoàn toàn sự thay đổi của giá cả.

Những rủi ro này có thể được cải thiện và tối ưu hóa bằng cách điều chỉnh tham số MA, thêm các điều kiện lọc và tối ưu hóa logic dừng lỗ.

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

Chiến lược hai đường thẳng có thể được tối ưu hóa từ các khía cạnh sau:

  1. Thêm các bộ lọc như khối lượng giao dịch hoặc các chỉ số dao động để tránh thường xuyên xây dựng kho trong các cơn chấn động và phá vỡ giả;
  2. Chu kỳ và sự kết hợp của MA có thể được điều chỉnh đa dạng để phù hợp với các đặc điểm của các chu kỳ và giống khác nhau;
  3. Có thể thử nghiệm các loại MA khác nhau, chẳng hạn như EMA, LWMA, v.v., để chọn dạng MA nhạy cảm nhất với phản ứng giá;
  4. Thêm các thuật toán học máy để tự động tìm các tham số MA, các tham số siêu như độ dừng lỗ;
  5. Có thể thử nghiệm các phương thức dừng khác nhau, chẳng hạn như dừng nhảy, dừng theo dõi, dừng trung bình.

Bằng cách tối ưu hóa và cải tiến, chiến lược có thể cải thiện đáng kể tỷ lệ chiến thắng, lợi nhuận và lợi nhuận của rủi ro.

Tóm tắt

Chiến lược đột phá hai dòng đồng đều là một chiến lược theo dõi xu hướng dễ thực hiện và tối ưu hóa. Nó có những ưu điểm như hoạt động đơn giản, linh hoạt và có thể điều chỉnh rủi ro, rất phù hợp với chiến lược nhập cảnh cho giao dịch định lượng. Bằng cách liên tục kiểm tra và tối ưu hóa, chiến lược này có thể được cải thiện liên tục và có tiềm năng trở thành chiến lược tối ưu hóa.

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