Ý tưởng cốt lõi của chiến lược này là dự đoán xu hướng giá bằng cách phân tích xu hướng tương lai của chỉ số MacD. Chiến lược này tận dụng tối đa các tín hiệu giao dịch được tạo ra bởi sự chéo chéo của các đường trung bình di chuyển nhanh và chậm tạo thành chỉ số MacD.
Trong khi cung cấp đầy đủ lợi thế cho chỉ số MacD trong việc xác định xu hướng, chiến lược này cũng kết hợp dự đoán về xu hướng tương lai của chỉ số. Dựa trên việc nắm bắt xu hướng, nó cũng nắm bắt các bước ngoặt quan trọng. So với việc chỉ đơn giản theo đuổi xu hướng, chiến lược này có tiềm năng tiên đoán và lợi nhuận lớn hơn. Tất nhiên, cũng có một số rủi ro cần tối ưu hóa và cải thiện hơn nữa. Nhìn chung, chiến lược xứng đáng với nghiên cứu và ứng dụng sâu sắc.
/*backtest start: 2023-12-05 00:00:00 end: 2023-12-12 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // @version=4 // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © x11joe strategy(title="MacD (Future Known or Unknown) Strategy", overlay=false, precision=2,commission_value=0.26, initial_capital=10000, currency=currency.USD, default_qty_type=strategy.percent_of_equity, default_qty_value=100) //OPTIONAL:: Allow only entries in the long or short position allowOnlyLong = input(title="Allow position ONLY in LONG",type=input.bool, defval=false) allowOnlyShort = input(title="Allow position ONLY in SHORT",type=input.bool, defval=false) strategy.risk.allow_entry_in(allowOnlyLong ? strategy.direction.long : allowOnlyShort ? strategy.direction.short : strategy.direction.all) // There will be no short entries, only exits from long. // Create MacD inputs fastLen = input(title="MacD Fast Length", type=input.integer, defval=12) slowLen = input(title="MacD Slow Length", type=input.integer, defval=26) sigLen = input(title="MacD Signal Length", type=input.integer, defval=9) // Get MACD values [macdLine, signalLine, _] = macd(close, fastLen, slowLen, sigLen) hist = macdLine - signalLine useFuture = input(title="Use The Future?",type=input.bool,defval=true) macDState(resolutionType) => hist_from_resolution = security(syminfo.tickerid, resolutionType, hist,barmerge.gaps_off, barmerge.lookahead_on) Green_IsUp = hist_from_resolution > hist_from_resolution[1] and hist_from_resolution > 0 Green_IsDown = hist_from_resolution < hist_from_resolution[1] and hist_from_resolution > 0 Red_IsDown = hist_from_resolution < hist_from_resolution[1] and hist_from_resolution <= 0 Red_IsUp = hist_from_resolution > hist_from_resolution[1] and hist_from_resolution <= 0 result=0 if(Green_IsUp) result := 1 if(Green_IsDown) result := 2 if(Red_IsDown) result := 3 if(Red_IsUp) result := 4 result macDStateNonFuture(resolutionType) => hist_from_resolution = security(syminfo.tickerid, resolutionType, hist,barmerge.gaps_off, barmerge.lookahead_off) Green_IsUp = hist_from_resolution > hist_from_resolution[1] and hist_from_resolution > 0 Green_IsDown = hist_from_resolution < hist_from_resolution[1] and hist_from_resolution > 0 Red_IsDown = hist_from_resolution < hist_from_resolution[1] and hist_from_resolution <= 0 Red_IsUp = hist_from_resolution > hist_from_resolution[1] and hist_from_resolution <= 0 result=0 if(Green_IsUp) result := 1 if(Green_IsDown) result := 2 if(Red_IsDown) result := 3 if(Red_IsUp) result := 4 result // === INPUT BACKTEST RANGE === FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2019, title = "From Year", minval = 2017) ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) ToYear = input(defval = 9999, title = "To Year", minval = 2017) start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window window() => time >= start and time <= finish ? true : false // create function "within window of time" // === INPUT BACKTEST RANGE END === //Get FUTURE or NON FUTURE data macDState240=useFuture ? macDState("240") : macDStateNonFuture("240") //1 is green up, 2 if green down, 3 is red, 4 is red up //Fill in the GAPS if(macDState240==0) macDState240:=macDState240[1] //Plot Positions plot(close,color= macDState240==1 ? color.green : macDState240==2 ? color.purple : macDState240==3 ? color.red : color.yellow,linewidth=4,style=plot.style_histogram,transp=50) if(useFuture) strategy.entry("buy_1",long=true,when=window() and (macDState240==4 or macDState240==1)) strategy.close("buy_1",when=window() and macDState240==3 and macDState240[1]==4) strategy.entry("sell_1",long=false,when=window() and macDState240==2) else strategy.entry("buy_1",long=true,when=window() and (macDState240==4 or macDState240==1))//If we are in a red macD trending downwards MacD or in a MacD getting out of Red going upward. strategy.close("buy_1",when=window() and macDState240==3 and macDState240[1]==4)//If the state is going upwards from red but we are predicting back to red... strategy.entry("sell_1",long=false,when=window() and macDState240==2)//If we are predicting the uptrend to end soon.