Chiến lược giao dịch đường trung bình động Momentum


Ngày tạo: 2024-01-24 11:09:58 sửa đổi lần cuối: 2024-01-24 11:09:58
sao chép: 0 Số nhấp chuột: 614
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch đường trung bình động Momentum

Tổng quan

Chiến lược này dựa trên sự giao thoa của các đường trung bình di chuyển nhanh và chậm để đánh giá xu hướng thị trường và điểm mua và bán. Khi EMA nhanh vượt qua EMA chậm, thị trường được đánh giá là đang có xu hướng tăng và tạo ra tín hiệu mua; khi EMA nhanh vượt qua EMA chậm, thị trường được đánh giá là đang có xu hướng giảm và tạo ra tín hiệu bán. Chiến lược cũng đặt giá dừng và giá dừng để quản lý rủi ro.

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

Chiến lược này sử dụng giao điểm giữa EMA nhanh (đường 8 ngày) và EMA chậm (đường 21 ngày) để đánh giá xu hướng thị trường.

  1. Tính toán EMA ngày 8 và EMA ngày 21
  2. Khi EMA ngày 8 vượt qua EMA ngày 21, thị trường được đánh giá là chuyển hướng, xu hướng tăng bắt đầu
  3. Khi EMA ngày 8 đi xuống EMA ngày 21, thị trường được đánh giá là chuyển hướng, xu hướng giảm bắt đầu
  4. Tạo tín hiệu mua khi xu hướng tăng; tạo tín hiệu bán khi xu hướng giảm
  5. Thiết lập giá dừng và giá dừng để quản lý rủi ro cho mỗi lệnh

Chiến lược này kết hợp các chỉ số động lực và phân tích xu hướng để có thể nắm bắt hiệu quả các hướng và điểm đảo ngược của thị trường. Các đường EMA chậm và kết hợp với đường trung bình di chuyển trơn sẽ lọc ra một số tín hiệu giao dịch ồn ào.

Phân tích lợi thế

Chiến lược này có những lợi thế chính như sau:

  1. EMA nhanh và EMA chậm giao nhau có thể đánh giá hiệu quả xu hướng thị trường và điểm mua và bán
  2. Các tham số chiến lược có thể được tối ưu hóa, chu kỳ EMA có thể được điều chỉnh thêm
  3. Kết hợp với chỉ số động lượng, có thể lọc hiệu quả tín hiệu tiếng ồn
  4. Cài đặt logic dừng lỗ để chủ động kiểm soát rủi ro

Nhìn chung, chiến lược này kết hợp xu hướng và các chỉ số động lực, có thể điều chỉnh các tham số để thích ứng với các môi trường thị trường khác nhau, là một chiến lược giao dịch ngắn hạn tương đối linh hoạt.

Phân tích rủi ro

Chiến lược này cũng có một số rủi ro:

  1. Trong các trường hợp chấn động, các tín hiệu giao chéo của EMA thường xuyên và sẽ tạo ra nhiều giao dịch sai
  2. Không thể xử lý hiệu quả các trường hợp xảy ra lỗ hổng nhảy vọt
  3. Không xem xét xu hướng dài hạn ở cấp độ lớn

Chúng ta có thể tối ưu hóa đối với những rủi ro này bằng cách:

  1. Thêm các bộ lọc cho các chỉ số khác, chẳng hạn như băng tần Brin, KDJ, để giảm khả năng tín hiệu sai
  2. Xác định xu hướng dài hạn kết hợp với các chỉ số chu kỳ cấp độ lớn hơn
  3. Tối ưu hóa tham số, điều chỉnh độ dài EMA để phù hợp với môi trường thị trường khác nhau
  4. Sự can thiệp của con người trong giao dịch, tránh lỗ hổng phá vỡ gây ra tổn thất lớn hơn mức dừng lỗ

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

Chiến lược này có rất nhiều khả năng để tối ưu hóa, chủ yếu từ các hướng sau:

  1. Tối ưu hóa các tham số EMA chu kỳ, kiểm tra các tham số khác nhau về lợi nhuận trên dữ liệu lịch sử
  2. Thêm các chỉ số kỹ thuật khác để lọc, chẳng hạn như KDJ, MACD và nhiều hơn nữa, để tăng độ chính xác của chiến lược
  3. Tối ưu hóa thiết lập Stop Loss để phù hợp hơn với đặc điểm của hành trình
  4. Tự động tối ưu hóa tham số thông qua phương pháp học máy

Những biện pháp tối ưu hóa này có thể cải thiện đáng kể tính ổn định, khả năng thích ứng và khả năng sinh lợi của chiến lược.

Tóm tắt

Chiến lược này nói chung là một chiến lược giao dịch ngắn hạn điển hình dựa trên xu hướng theo dõi và giao điểm động lực. Nó kết hợp với giao điểm EMA nhanh và chậm và logic dừng lỗ, có thể nhanh chóng nắm bắt cơ hội theo hướng thị trường.

Mã nguồn chiến lược
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © TradersPostInc

//@version=5
strategy('TradersPost Example MOMO Strategy', overlay=true)

startTime = input(defval = timestamp('01 Jan 2021 00:00 +0000'), title = 'Start Time', group = 'Date Range')
endTime = input(defval = timestamp('31 Dec 2023 23:59 +0000'), title = 'End Time', group = 'Date Range')
timeCondition = true
timeConditionEnd = timeCondition[1] and not timeCondition

fastEmaLength = input.int(defval = 8, title = 'Fast EMA Length')
slowEmaLength = input.int(defval = 21, title = 'Slow EMA Length')
sides = input.string(defval = 'Both', title = 'Sides', options = ['Long', 'Short', 'Both', 'None'])

fastEma = ta.ema(close, fastEmaLength)
slowEma = ta.ema(close, slowEmaLength)

isUptrend = fastEma >= slowEma
isDowntrend = fastEma <= slowEma
trendChanging = ta.cross(fastEma, slowEma)

ema105 = request.security(syminfo.tickerid, '30', ta.ema(close, 105)[1], barmerge.gaps_off, barmerge.lookahead_on)
ema205 = request.security(syminfo.tickerid, '30', ta.ema(close, 20)[1], barmerge.gaps_off, barmerge.lookahead_on)
plot(ema105, linewidth=4, color=color.new(color.purple, 0), editable=true)
plot(ema205, linewidth=2, color=color.new(color.purple, 0), editable=true)

aa = plot(fastEma, linewidth=3, color=color.new(color.green, 0), editable=true)
bb = plot(slowEma, linewidth=3, color=color.new(color.red, 0), editable=true)
fill(aa, bb, color=isUptrend ? color.green : color.red, transp=90)

tradersPostBuy = trendChanging and isUptrend and timeCondition
tradersPostSell = trendChanging and isDowntrend and timeCondition

pips = syminfo.pointvalue / syminfo.mintick

percentOrPipsInput = input.string('Percent', title='Percent or Pips', options=['Percent', 'Pips'])

stopLossLongInput = input.float(defval=0, step=0.01, title='Stop Loss Long', minval=0)
stopLossShortInput = input.float(defval=0, step=0.01, title='Stop Loss Short', minval=0)

takeProfitLongInput = input.float(defval=0, step=0.01, title='Target Profit Long', minval=0)
takeProfitShortInput = input.float(defval=0, step=0.01, title='Target Profit Short', minval=0)

stopLossPriceLong = ta.valuewhen(tradersPostBuy, close, 0) * (stopLossLongInput / 100) * pips
stopLossPriceShort = ta.valuewhen(tradersPostSell, close, 0) * (stopLossShortInput / 100) * pips

takeProfitPriceLong = ta.valuewhen(tradersPostBuy, close, 0) * (takeProfitLongInput / 100) * pips
takeProfitPriceShort = ta.valuewhen(tradersPostSell, close, 0) * (takeProfitShortInput / 100) * pips

takeProfitALong = takeProfitLongInput > 0 ? takeProfitLongInput : na
takeProfitBLong = takeProfitPriceLong > 0 ? takeProfitPriceLong : na

takeProfitAShort = takeProfitShortInput > 0 ? takeProfitShortInput : na
takeProfitBShort = takeProfitPriceShort > 0 ? takeProfitPriceShort : na

stopLossALong = stopLossLongInput > 0 ? stopLossLongInput : na
stopLossBLong = stopLossPriceLong > 0 ? stopLossPriceLong : na

stopLossAShort = stopLossShortInput > 0 ? stopLossShortInput : na
stopLossBShort = stopLossPriceShort > 0 ? stopLossPriceShort : na

takeProfitLong = percentOrPipsInput == 'Pips' ? takeProfitALong : takeProfitBLong
stopLossLong = percentOrPipsInput == 'Pips' ? stopLossALong : stopLossBLong
takeProfitShort = percentOrPipsInput == 'Pips' ? takeProfitAShort : takeProfitBShort
stopLossShort = percentOrPipsInput == 'Pips' ? stopLossAShort : stopLossBShort

buyAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "buy", "price": ' + str.tostring(close) + '}'
sellAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "sell", "price": ' + str.tostring(close) + '}'

exitLongAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit", "price": ' + str.tostring(close) + '}'
exitShortAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit", "price": ' + str.tostring(close) + '}'

if (sides != "None")
    if tradersPostBuy
        strategy.entry('Long', strategy.long, when = sides != 'Short', alert_message = buyAlertMessage)
        strategy.close('Short', when = sides == "Short" and timeCondition, alert_message = exitShortAlertMessage)

    if tradersPostSell
        strategy.entry('Short', strategy.short, when = sides != 'Long', alert_message = sellAlertMessage)
        strategy.close('Long', when = sides == 'Long', alert_message = exitLongAlertMessage)

exitAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit"}'

strategy.exit('Exit Long', from_entry = "Long", profit = takeProfitLong, loss = stopLossLong, alert_message = exitAlertMessage)
strategy.exit('Exit Short', from_entry = "Short", profit = takeProfitShort, loss = stopLossShort, alert_message = exitAlertMessage)

strategy.close_all(when = timeConditionEnd)