本策略的核心思想是通过分析麦克D指标的未来走势,实现对价格趋势的预测。该策略充分利用了麦克D指标的快速均线和慢速均线构成的交叉产生的交易信号。
本策略充分发挥麦克D指标判断趋势优势的同时,又增加了对指标未来走势的预测分析,在捕捉趋势的基础上把握关键的转折点。相比简单追踪趋势,本策略的运用前瞻性更强,获利空间更大。当然也存在一定的风险,需要进一步优化和完善。总体来说,该策略值得深入研究和应用。
/*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.