Chiến lược này sử dụng đường cong chênh lệch của chỉ số MACD để đưa ra quyết định giao dịch. MACD bao gồm các EMA nhanh và chậm, tạo ra tín hiệu giao dịch khi đường cong chênh lệch vượt qua trục 0 . Chiến lược này là một chiến lược giao dịch định lượng theo dõi điển hình.
Nguyên tắc chiến lược:
Tính toán đường EMA nhanh và đường EMA chậm, và sự chênh lệch giữa hai đường tạo thành đường cong MACD.
EMA được làm mịn trên đường cong MACD để có được đường tín hiệu MACD.
Khi MACD trên đi qua dây tín hiệu, làm nhiều, khi đi qua dây tín hiệu, làm trống.
Thiết lập điểm dừng lỗ phần trăm và quản lý rủi ro.
Những lợi thế của chiến lược này:
Chỉ số MACD tốt hơn EMA đơn, có thể đánh giá xu hướng rõ ràng hơn.
Tạo ra các phương thức giao dịch để nắm bắt các cơ hội chuyển đổi kịp thời.
Cơ chế ngăn chặn lỗ hổng giúp kiểm soát rủi ro giao dịch.
Rủi ro của chiến lược này:
Có thể có nhiều tín hiệu phá vỡ giả ở gần đường cong MACD.
Các tham số cần được tối ưu hóa để phù hợp với các loại giao dịch khác nhau.
Các giao dịch theo xu hướng dễ bị ảnh hưởng bởi các sự kiện bất ngờ và phải đặt lệnh dừng lỗ.
Tóm lại, chiến lược này sử dụng mối quan hệ đột phá của đường cong chênh lệch MACD để đánh giá. Những lợi thế của chỉ số MACD có lợi cho hiệu quả, nhưng cần cảnh giác về rủi ro đột phá giả và thực hiện các biện pháp quản lý rủi ro thích hợp để có được lợi nhuận ổn định lâu dài.
/*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)