Chiến lược theo dõi xu hướng chéo hai MA

Tác giả:ChaoZhang, Ngày: 2023-12-21 16:10:22
Tags:

img

Tổng quan

Chiến lược này áp dụng phương pháp theo dõi xu hướng điển hình của giao thoa trung bình động kép, kết hợp với các cơ chế quản lý rủi ro như dừng lỗ, lấy lợi nhuận và dừng lỗ theo dõi, nhằm mục đích thu lợi nhuận lớn từ các thị trường xu hướng.

Chiến lược logic

  1. Tính toán đường EMA n ngày như đường nhanh cho ngắn hạn;
  2. Tính toán đường EMA m-day như đường chậm cho dài hạn;
  3. Đi dài khi đường nhanh phá vỡ đường chậm lên, và đi ngắn khi phá vỡ xuống;
  4. Dấu hiệu thoát: chuyển ngược (ví dụ: thoát dài khi chuyển dài xảy ra).
  5. Sử dụng stop loss, take profit, trailing stop loss để quản lý rủi ro.

Phân tích lợi thế

  1. Việc áp dụng hai đường EMA có thể xác định tốt hơn các điểm đảo ngược xu hướng giá và nắm bắt các chuyển động xu hướng.
  2. Kết hợp stop loss, take profit và trailing stop giúp hạn chế lỗ giao dịch duy nhất, khóa lợi nhuận và giảm rút tiền.
  3. Có nhiều thông số có thể tùy chỉnh để điều chỉnh và tối ưu hóa cho các sản phẩm và môi trường thị trường khác nhau.
  4. Chiến lược logic là đơn giản và rõ ràng, dễ hiểu và sửa đổi.
  5. Hỗ trợ cả các hoạt động dài và ngắn hạn, thích nghi với các điều kiện thị trường khác nhau.

Phân tích rủi ro

  1. Chiến lược MA kép rất nhạy cảm với các vụ phá vỡ sai và dễ bị mắc kẹt.
  2. Cài đặt tham số không chính xác có thể dẫn đến giao dịch thường xuyên, tăng chi phí giao dịch và mất mát trượt.
  3. Chính chiến lược không thể xác định các điểm đảo ngược xu hướng, cần được kết hợp với các chỉ số khác.
  4. Thật dễ dàng để tạo ra các tín hiệu giao dịch trong các thị trường khác nhau, nhưng lợi nhuận thực tế có xu hướng thấp.
  5. Các thông số cần được tối ưu hóa cho các sản phẩm và môi trường thị trường khác nhau.

Các rủi ro có thể được giảm bằng cách:

  1. lọc tín hiệu sai với các chỉ báo khác.
  2. Tối ưu hóa các thông số để giảm tần suất giao dịch.
  3. Thêm các chỉ số đánh giá xu hướng để tránh giao dịch thị trường giới hạn phạm vi.
  4. Điều chỉnh kích thước vị trí để giảm rủi ro giao dịch duy nhất.

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

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

  1. Tối ưu hóa thời gian MA nhanh và chậm cho các sản phẩm và thị trường khác nhau.
  2. Thêm các chỉ số khác để xác định xu hướng và lọc các tín hiệu sai, ví dụ như MACD, KDJ vv.
  3. Xem xét thay thế EMA bằng SMA hoặc WMA.
  4. Điều chỉnh động stop loss dựa trên ATR.
  5. Điều chỉnh linh hoạt kích thước vị trí đơn dựa trên phương pháp định kích thước vị trí.
  6. Tối ưu hóa tự điều chỉnh tham số dựa trên các chỉ số tương quan và biến động.

Tóm lại

Tóm lại, đây là một chiến lược theo dõi xu hướng chéo EMA kép điển hình. Nó có lợi thế nắm bắt các chuyển động xu hướng, tích hợp với các cơ chế quản lý rủi ro như dừng lỗ, lấy lợi nhuận và dừng lỗ. Nhưng nó cũng có một số điểm yếu điển hình, như nhạy cảm cao đối với tiếng ồn và thị trường giới hạn phạm vi, dễ bị mắc kẹt. Có thể cải thiện thêm bằng cách giới thiệu các chỉ số bổ sung, tối ưu hóa tham số, điều chỉnh năng động và sử dụng danh mục đầu tư để nâng cao hiệu suất của chiến lược. Nhìn chung, với việc điều chỉnh tham số thích hợp và phù hợp với sản phẩm và điều kiện thị trường, chiến lược này có thể đạt được kết quả tốt.


/*backtest
start: 2023-11-20 00:00:00
end: 2023-12-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2

strategy(title = "Strategy Code Example", shorttitle = "Strategy Code Example", overlay = true)

// Revision:        1
// Author:          @JayRogers
//
// *** THIS IS JUST AN EXAMPLE OF STRATEGY RISK MANAGEMENT CODE IMPLEMENTATION ***

// === GENERAL INPUTS ===
// short ma
maFastSource   = input(defval = open, title = "Fast MA Source")
maFastLength   = input(defval = 14, title = "Fast MA Period", minval = 1)
// long ma
maSlowSource   = input(defval = open, title = "Slow MA Source")
maSlowLength   = input(defval = 21, title = "Slow MA Period", minval = 1)

// === STRATEGY RELATED INPUTS ===
tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
// the risk management inputs
inpTakeProfit   = input(defval = 1000, title = "Take Profit", minval = 0)
inpStopLoss     = input(defval = 200, title = "Stop Loss", minval = 0)
inpTrailStop    = input(defval = 200, title = "Trailing Stop Loss", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0)

// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

// === SERIES SETUP ===
/// a couple of ma's..
maFast = ema(maFastSource, maFastLength)
maSlow = ema(maSlowSource, maSlowLength)

// === PLOTTING ===
fast = plot(maFast, title = "Fast MA", color = green, linewidth = 2, style = line, transp = 50)
slow = plot(maSlow, title = "Slow MA", color = red, linewidth = 2, style = line, transp = 50)

// === LOGIC ===
// is fast ma above slow ma?
aboveBelow = maFast >= maSlow ? true : false
// are we inverting our trade direction?
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false

// === STRATEGY - LONG POSITION EXECUTION ===
enterLong() => not tradeDirection[1] and tradeDirection // functions can be used to wrap up and work out complex conditions
exitLong() => tradeDirection[1] and not tradeDirection
strategy.entry(id = "Long", long = true, when = enterLong()) // use function or simple condition to decide when to get in
strategy.close(id = "Long", when = exitLong()) // ...and when to get out
// === STRATEGY - SHORT POSITION EXECUTION ===
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 RISK MANAGEMENT EXECUTION ===
// finally, make use of all the earlier values we got prepped
strategy.exit("Exit Long", from_entry = "Long", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)
strategy.exit("Exit Short", from_entry = "Short", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)


Thêm nữa