Chiến lược giao dịch chéo giữa động lực chuyển động trung bình

Tác giả:ChaoZhang, Ngày: 2024-01-24 11:09:58
Tags:

img

Tổng quan

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

Chiến lược logic

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

  1. Tính toán EMA 8 ngày và EMA 21 ngày
  2. Khi đường EMA 8 ngày vượt qua đường EMA 21 ngày, nó được xác định rằng xu hướng thị trường đã đảo ngược và xu hướng tăng đã bắt đầu.
  3. Khi đường EMA 8 ngày vượt dưới đường EMA 21 ngày, nó được xác định rằng xu hướng thị trường đã đảo ngược và xu hướng giảm đã bắt đầu
  4. Trong một xu hướng tăng, tín hiệu mua được tạo ra. Trong một xu hướng giảm, tín hiệu bán được tạo ra
  5. Đặt giá dừng lỗ và lấy lợi nhuận để quản lý rủi ro cho mỗi vị trí

Chiến lược kết hợp các chỉ số động lực và phân tích xu hướng để nắm bắt hiệu quả hướng thị trường và các điểm đảo ngược.

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ác đường EMA nhanh và chậm có thể xác định hiệu quả xu hướng thị trường và tín hiệu giao dịch
  2. Không gian tối ưu hóa lớn cho các tham số chiến lược nơi các giai đoạn EMA có thể được điều chỉnh thêm
  3. Các tín hiệu tiếng ồn có thể được lọc hiệu quả bằng cách kết hợp các chỉ số động lượng
  4. Kiểm soát rủi ro tích cực bằng cách cấu hình logic dừng lỗ và lấy lợi nhuận

Tóm lại, chiến lược kết hợp các chỉ số xu hướng và động lực. Thông qua điều chỉnh tham số, nó có thể thích nghi với các môi trường thị trường khác nhau và 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

Ngoài ra còn có một số rủi ro với chiến lược này:

  1. Trong các thị trường dao động, các tín hiệu chéo EMA thường xuyên có thể tạo ra nhiều giao dịch sai
  2. Rủi ro khoảng cách không được xử lý hiệu quả
  3. Không xem xét hướng xu hướng dài hạn

Để giải quyết những rủi ro này, một số tối ưu hóa có thể được thực hiện:

  1. Thêm các bộ lọc khác như Bollinger Bands, KDJ để giảm tín hiệu sai
  2. Bao gồm các chỉ số khung thời gian cao hơn để xác định xu hướng dài hạn
  3. Tối ưu hóa các thông số như chiều dài EMA để thích nghi với các thị trường khác nhau
  4. Can thiệp thủ công để tránh tổn thất trượt lớn từ các lỗ hổng

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

Vẫn còn nhiều chỗ để tối ưu hóa chiến lược này:

  1. Tối ưu hóa các thông số giai đoạn EMA dựa trên hiệu suất lịch sử
  2. Thêm các chỉ số kỹ thuật khác để lọc tín hiệu, ví dụ: KDJ, MACD để cải thiện độ chính xác
  3. Tối ưu hóa các thiết lập dừng lỗ và lấy lợi nhuận để phù hợp hơn với các đặc điểm của thị trường
  4. Sử dụng các kỹ thuật học máy để tối ưu hóa tham số tự động

Các biện pháp này có thể cải thiện đáng kể sự ổn định, khả năng thích nghi và lợi nhuận của chiến lược.

Kết luận

Tóm lại, đây 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à dấu hiệu động lực vượt qua. Nó kết hợp logic chéo EMA và dừng lỗ / lấy lợi nhuận để nhanh chóng nắm bắt các cơ hội thị trường theo hướng. Có nhiều chỗ để tối ưu hóa bằng cách giới thiệu các chỉ số hỗ trợ khác và các phương pháp điều chỉnh tham số tự động, có thể làm cho hiệu suất chiến lược ổn định hơn và xuất sắc hơn. Nó phù hợp với các nhà đầu tư có một số hiểu biết về thị trường và sẵn sàng giao dịch thường xuyên.


/*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)

Thêm nữa