Chiến lược giao dịch đột phá chỉ số MACD

Tác giả:ChaoZhang, Ngày: 2023-09-12 15:32:12
Tags:

Chiến lược này giao dịch các tín hiệu chéo MACD cho các quyết định nhập và ra. MACD bao gồm EMA nhanh và chậm, và chéo đường MACD trên không tạo ra các tín hiệu giao dịch. Đây là một chiến lược định lượng theo xu hướng điển hình.

Chiến lược logic:

  1. Tính toán EMA nhanh và EMA chậm, sự khác biệt của chúng tạo thành đường MACD.

  2. Làm mịn đường MACD bằng cách sử dụng một EMA khác để dẫn ra đường tín hiệu.

  3. Đi dài trên MACD vượt trên tín hiệu, và ngắn trên vượt dưới.

  4. Đặt tỷ lệ dừng lỗ và lấy lợi nhuận để quản lý rủi ro.

Ưu điểm:

  1. MACD cải thiện trên EMA duy nhất để xác định xu hướng rõ ràng hơn.

  2. Giao dịch đột phá nắm bắt các bước ngoặt kịp thời.

  3. Các cơ chế dừng lỗ / lấy lợi nhuận giúp kiểm soát rủi ro thương mại.

Rủi ro:

  1. Thêm những đợt đột phá sai gần đường 0 của MACD.

  2. Điều chỉnh tham số cần thiết cho các công cụ giao dịch khác nhau.

  3. Giao dịch xu hướng dễ bị rủi ro sự kiện, đòi hỏi dừng.

Tóm lại, chiến lược này giao dịch dựa trên MACD và đường truyền tín hiệu. Điểm mạnh của MACD có lợi cho hiệu suất nhưng rủi ro phá vỡ sai vẫn còn. Kiểm soát rủi ro thận trọng vẫn cần thiết để có lợi nhuận ổn định trong dài hạn.


/*backtest
start: 2023-01-01 00:00:00
end: 2023-09-11 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3 
strategy("uray MACD", overlay=false, pyramiding = 0, calc_on_every_tick=true, precision=2, currency="USD", default_qty_value=10, default_qty_type=strategy.cash,initial_capital=100,commission_type=strategy.commission.percent,commission_value=0.1) 

// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 6, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 2017)
ToMonth   = input(defval = 6, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2020, title = "To Year", minval = 2017)

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
inTimeframe()  => true


isPosLong    = strategy.position_size > 0
isPosShort   = strategy.position_size < 0
isNoMarginPos= strategy.position_size == 0

fastLength    = input(12, minval = 1, title = "MACD fast")
slowlength    = input(26, minval = 1, title = "MACD slow")
MACDLength    = input( 9, minval = 1, title = "MACD length")
stopLoss      = input( 10, minval = 1, title = "Stop Loss (price %)", type=float)
takeProfit    = input( 50, minval = 1, title = "Take Profit (price %)", type=float)
src           = close   // Source of Calculations (Close of Bar)

MACD  = ta.ema(src, fastLength) - ta.ema(src, slowlength)
aMACD = ta.ema(MACD, MACDLength)
delta = MACD - aMACD
stopLossValue      = close*(stopLoss/100)/syminfo.mintick
takeProfitValue    = close*(takeProfit/100)/syminfo.mintick
switchLongTrigger  = ta.crossover(delta, 0)
switchShortTrigger = ta.crossunder(delta, 0)
closeLongTrigger   = ta.crossunder(delta, 0)
closeShortTrigger  = ta.crossover(delta, 0)
entryLongTrigger   = ta.crossover(delta, 0)
entryShortTrigger  = ta.crossunder(delta, 0)

// if inTimeframe()
//     if isNoMarginPos
//         if entryLongTrigger
//             strategy.entry("Long", strategy.long,  comment="Entry Long")
//             strategy.exit("Stop (long SL/TP)", loss=stopLossValue, profit=takeProfitValue)   
//         if entryShortTrigger
//             strategy.entry("Short", strategy.short, comment="Entry Short")  
//             strategy.exit("Stop (short SL/TP)", loss=stopLossValue, profit=takeProfitValue)   
//     if isPosShort
//         if switchLongTrigger
//             strategy.close_all()    
//             strategy.entry("Long", strategy.long, comment="switch Long")
//             strategy.exit("Stop (long SL/TP)", loss=stopLossValue, profit=takeProfitValue)   
//         if closeLongTrigger
//             strategy.close_all()    
//     if isPosLong 
//         if switchShortTrigger
//             strategy.close_all()   
//             strategy.entry("Short", strategy.short, comment="switch Short")
//             strategy.exit("Stop (short SL/TP)", loss=stopLossValue, profit=takeProfitValue) 
//         if closeShortTrigger
//             strategy.close_all()   

if inTimeframe()
    strategy.entry("Long", strategy.long,  comment="Entry Long", when=entryLongTrigger)
    strategy.close("Long", when=entryShortTrigger)
    strategy.entry("Short", strategy.short,  comment="Entry Short", when=entryShortTrigger)
    strategy.close("Short", when=entryLongTrigger)
    strategy.exit("Stop (short SL/TP)", loss=stopLossValue, profit=takeProfitValue, when=entryShortTrigger) 
    strategy.exit("Stop (long SL/TP)", loss=stopLossValue, profit=takeProfitValue, when=entryLongTrigger) 




Thêm nữa