本策略通过计算自定义净量指标,实现量化黄金交叉买入和死叉卖出的交易策略。该策略属于趋势跟随型策略。
策略的核心逻辑是计算自定义的净量(NV)指标。NV指标通过判断价格的变化方向,如果为正则取当日成交量,如果为负则取当日成交量的负值,如果无变化则取0。这样可以更清晰地反映价格变化和成交量的关系。
之后,策略计算NV指标的3日简单移动平均线,分别作为黄金交叉线和死叉线。当NV指标从下向上突破黄金交叉线时,做多;当NV从上向下突破死叉线时,做空。
此外,策略还设置了参数化的起止时间,对交易时间进行控制。
该策略最大的优势是策略简单清晰,容易理解,参数设置灵活,可自定义交易品种、交易时段等。此外,该策略属于趋势跟随型策略,能够有效捕捉价格趋势,降低交易频率,获得较高的盈利率。
该策略主要存在以下风险:
日跟随策略,不能及时反应价格变化趋势。可能错过部分交易机会或者无法及时止损。
量化黄金交叉本身具有一定的滞后性,可能导致入场偏晚,扩大亏损。
无法有效过滤市场噪音,容易被套。
可采用动态移动平均,结合其他指标过滤降低风险。
该策略可以从以下几个方面进行优化:
增加止损策略,利用移动止损、隔夜止损等方式控制单笔损失。
增加过滤指标,利用MACD、KDJ等其他指标过滤误报信号,提高策略稳定性。
参数优化,通过遗传算法、马尔可夫链等方法迭代寻找最优参数组合。
策略组合,与其他非相关策略进行组合,可以进一步分散风险,提高整体收益率。
本策略通过量化黄金交叉实现了简单有效的趋势跟随,虽然存在一定程度的滞后性,但参数设置灵活,容易理解,是一种适合初学者实践的策略。通过持续优化,可以逐步提升策略效果,降低风险。
/*backtest
start: 2023-11-14 00:00:00
end: 2023-11-15 03:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy(title="@DankCoins - Customized Net Volume")
src = input(defval = close, title = "VA Source")
nv = change(src) > 0 ? volume : change(src) < 0 ? -volume : 0*volume
// Inputs //
VHigh = input(defval = 50, title = "VHigh Amount")
VLow = input(defval = -50, title = "VLow Amount")
// === 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 = 2018, title = "From Year", minval = 2012)
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 = 2012)
MAV1 = sma(volume, 3)
MAV2 = -sma(volume, 3)
enterShort = crossunder(nv, MAV1)
exitShort = crossunder(nv, MAV2)
enterLong = crossover(nv, MAV2)
exitLong = crossover(nv, MAV1)
// Time Function
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"
strategy.entry(id="Long Entry", long=true, when=enterLong and window())
strategy.entry(id="Short Entry", long=false, when=enterShort and window())
strategy.exit("Exit Long", from_entry = "Long Entry", when=exitLong and window())
strategy.exit("Exit Short", from_entry = "Short Entry", when=exitShort and window())
// Plot
plot(nv, color=blue, title="NV")
plot(VHigh, color=red)
plot(VLow, color=red)
plot(MAV1, color=green)
plot(MAV2, color=green)