乖离矩阵趋势跟随策略是一个结合趋势、乖离和均线的量化交易策略。该策略运用双RSI指标判断市场趋势方向,结合矩阵均线设置进场信号。矩阵均线会根据价格的乖离程度来调整仓位规模。整体而言,该策略的优点是运用多个指标确认交易信号,可以有效避免假突破,同时矩阵均线机制可以锁定更高收益。
乖离矩阵趋势跟随策略主要由以下几部分组成:
使用快速RSI和慢速RSI判断市场趋势方向。当快速RSI出现超买或超卖时,结合慢速RSI判断趋势方向。
根据进场价格设置一组矩阵均线,当价格触及某均线时,相应调整仓位。这样可以在趋势中获利较多。
默认为双向交易。可选择只做多不做空。
具体交易逻辑是:
使用快速RSI判断市场临时的超买超卖情况。
使用慢速RSI判断市场中长期的趋势方向。
当快速RSI出现超买超卖,同时慢速RSI显示趋势转折时,根据慢速RSI的多空判断做相应方向的仓位。
建仓后,设定一组矩阵均线。这组矩阵均线围绕进场价设置,间距大小由”矩阵区间百分比”参数设定。
当价格触及矩阵均线时,相应调整持仓量。如向上突破均线,则增加多单;向下跌破,则减少空单。
当价格出现较大的调整时,仓位会被重置到初始水平。
以上是该策略的主要交易逻辑。通过矩阵均线,可以在趋势中锁定更多利润。
乖离矩阵趋势跟随策略具有以下几个优势:
双RSI判断信号更可靠。快速RSI避免假突破,慢速RSI确保大趋势正确。
矩阵均线追踪趋势获利。根据价格乖离程度调整仓位,可以持续获利。
支持双向交易。默认双向交易,也可仅做多。可适应更多市场环境。
仓位重置机制控制风险。当价格出现明显调整时重置仓位,可以及时止损。
参数设置灵活。用户可以根据历史数据、交易品种等选择最佳参数组合。
代码结构清晰。各部分职责明确划分,易于理解、优化和扩展。
总的来说,该策略最大的优势在于利用多种机制提高信号质量,在控制风险的同时追求更高收益。这是一种风险收益兼顾的交易策略。
乖离矩阵趋势跟随策略也存在一些风险,主要集中在以下几点:
双RSI判断失效风险。当市场处于震荡调整时,RSI经常发出假信号。这时需要审时度势,适当调整参数或暂停交易。
矩阵均线方式不当风险。如果矩阵参数设置不当,仓位调整可能过于激进,从而加大亏损。需谨慎测试参数。
仓位过度放大风险。调整仓位幅度过大也会导致亏损扩大。最大仓位参数需要审慎设置。
趋势反转风险。当趋势发生反转时,如果不及时平仓,会面临较大亏损。这需要关注较长周期的趋势指标。
代码优化空间有限风险。该策略已经比较成熟,继续优化空间有限。如果市场环境发生较大变化,整体交易逻辑需要重新评估。
对策略进行评估和优化,是降低这些风险的关键。比如调整参数组合、监控较长周期指标等手段,都可以在一定程度上规避风险。
乖离矩阵趋势跟随策略还有进一步优化的空间:
优化双RSI参数。可以测试更多参数组合,选择判断最准确的RSI周期数值。
自定义矩阵均线设置。允许用户根据不同品种参数化设置矩阵均线参数,使之更符合该品种的特点。
增加止损机制。如设定离场均线,当价格跌破该均线时止损。
增加仓位比例规则。更科学合理的调整仓位规模和速度,防止仓位过度放大。
结合其他指标。可再引入MACD、KD等其他指标进行辅助判断,提升信号准确性。
优化代码结构。继续提高代码的可扩展性、可维护性和执行效率。
乖离矩阵趋势跟随策略是一个多机制综合的量化交易策略。它主要运用双RSI判断趋势方向,矩阵均线追踪趋势获利的思路。相比单一指标策略,该策略可以提供更加稳定和高效的交易信号。通过参数调整和优化扩展,该策略可以适应更多不同的市场环境,具有很强的适用性。总体而言,该策略风险收益平衡良好,值得投资者积极应用和持续优化。
/*backtest
start: 2023-01-01 00:00:00
end: 2023-10-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy("The Matrix 7.0 Strategy", overlay=false)
//Matrix Settings
entry_size = input(title="Entry Size", defval = 1)
max_size = input(title="Max Size", defval = 10000)
matrix = input(title="Matrix Interval %", defval = 2)
matrix_price_overwrite = input(title="Matrix Overwrite $", defval = 0.0)
adjustment = input(title="Adjustment Size", defval = 1000)
trade_short = input(title="Trade Short", type=bool, defval = true)
//RSI Settings
periods = input(title="RSI Periods", defval = 14)
overbought_short = input(title="RSI Overbought", defval = 65)
oversold_short = input(title="RSI Oversold", defval = 30)
//RSI Trend Settings
resolution_long = input(title="Resolution Trend", defval = "D")
periods_long = input(title="RSI Trend Periods", defval = 14)
overbought_long = input(title="RSI Trend Overbought", defval = 64)
oversold_long = input(title="RSI Trend Oversold", defval = 30)
//Round Off to 2 decimals
round2(x) =>
a = x * 10 * 10
a := floor(a + 0.5)
a := a / 10 / 10
a
//RSI Function
RSI = rsi(close, periods)
//RSI Market Function
rsi_oversold = RSI < oversold_short
rsi_overbought = RSI > overbought_short
market_rsi = 0.0
market_rsi := if (rsi_oversold)
RSI - oversold_short
else
if (rsi_overbought)
RSI - overbought_short
else
0
//RSI Trend Function
rsi_long = request.security(syminfo.tickerid,resolution_long,rsi(close,periods_long))
trend_rsi_long = rsi_long < oversold_long
trend_rsi_short = rsi_long > overbought_long
trend_rsi = 0
trend_rsi := if (trend_rsi_short)
-1
else
if (trend_rsi_long)
1
else
trend_rsi[1]
// // Shorter time resolution to make "close" crosses give faster positives.
// short_resolution = security(tickerid, "1", close)
// quick = round2(short_resolution) //ROUND OFF TO 2 DECIMAL PLACES.
//Declare Other Variables
entry_price = 0.0
entry_price := nz(entry_price[1])
position_size = 0.0
position_size := nz(position_size[1])
last_traded_price = 0.0
last_traded_price := nz(last_traded_price[1])
matrix_price = 0.0
if matrix_price_overwrite > 0.0
matrix_price := matrix_price_overwrite
else
matrix_price := round2((matrix/100) * entry_price)
level = 0
level := nz(level[1])
level_price = entry_price
if not na(level_price[1])
level_price := level_price[1]
// Calculate Level
if close > level_price
level_change = floor((high - level_price)/matrix_price)
level := level + level_change
else
if close < level_price
level_change = ceil((low - level_price)/matrix_price)
level := level + level_change
// Calculate Level Price
level_price := (level * matrix_price) + entry_price
// Calculate Matrix Position
matrix_position = 0.0
if position_size > 0
matrix_position := ((-1 * level) * adjustment) + entry_size
else
if position_size < 0
matrix_position := ((-1 * level) * adjustment) - entry_size
//Trend Entry or Reversal Conditions
trend_reversal_up = trend_rsi == 1 and (trend_rsi[1] == -1 or trend_rsi == 0) and position_size <= 0
trend_reversal_down = trend_rsi == -1 and (trend_rsi[1] == 1 or trend_rsi == 0) and position_size >= 0 and trade_short == true
flatten_position = trend_rsi == -1 and (trend_rsi[1] == 1 or trend_rsi == 0) and position_size >= 0 and trade_short == false
//Reset Conditions
reset_long = (position_size > 0) and (close - entry_price > matrix_price) and (market_rsi < 0) and (position_size != entry_size)
reset_short = (position_size < 0) and (entry_price - close > matrix_price) and (market_rsi > 0) and (position_size != (-1 * entry_size))
//Adjustment Conditions
increase_long = (position_size > 0) and (matrix_position > position_size) and (market_rsi < 0) and (matrix_position <= max_size)
decrease_long = (position_size > 0) and (matrix_position < position_size) and (market_rsi > 0)
increase_short = (position_size < 0) and (matrix_position < position_size) and (market_rsi > 0) and (matrix_position >= (-1 * max_size))
decrease_short = (position_size < 0) and (matrix_position > position_size) and (market_rsi < 0)
//Transactions
//Trend Reversals
if trend_reversal_up
strategy.entry("OL", strategy.long, qty=entry_size)
position_size := entry_size
matrix_position := entry_size
level := 0
else
if trend_reversal_down
strategy.entry("OS", strategy.short, qty=entry_size)
position_size := -1 * entry_size
matrix_position := -1 * entry_size
level := 0
//Reset Positions
else
if reset_long
order = entry_size - position_size[1]
strategy.order("RL", strategy.long, qty=order)
position_size := entry_size
matrix_position := entry_size
level := 0
else
if reset_short
order = position_size[1] - (-1* entry_size)
strategy.order("RS", strategy.short, qty=order)
position_size := -1 * entry_size
matrix_position := -1 * entry_size
level := 0
//Position Adjustments
else
if increase_long
order = matrix_position - position_size[1]
strategy.order("IL", strategy.long, qty=order)
position_size := position_size[1] + order
else
if decrease_long
order = position_size[1] - matrix_position
strategy.order("DL", strategy.short, qty=order)
position_size := position_size[1] - order
else
if increase_short
order = position_size[1] - matrix_position
strategy.order("IS", strategy.short, qty=order)
position_size := position_size[1] - order
else
if decrease_short
order = matrix_position - position_size[1]
strategy.order("DS", strategy.long, qty=order)
position_size := position_size[1] + order
else
if flatten_position
strategy.close_all()
position_size := 0.0
matrix_position := 0.0
level := 0
//Grouped Actions
if trend_reversal_up or trend_reversal_down or reset_short or reset_long
entry_price := round2(close)
last_traded_price := round2(close)
if increase_long or decrease_long or increase_short or decrease_short
last_traded_price := round2(close)
// //RSI Trend & Adjustment Moments. (strategy)
p1 = plot(market_rsi, color = trend_rsi > 0 ? green : red, linewidth = 4, title='Market', transp =0)
p2 = plot(trend_rsi, color = trend_rsi > 0 ? green : red, linewidth = 4, title='Trend', transp = 0)
fill(p1,p2, color=trend_rsi > 0 ? green : red, transp=0)
p3 = plot((rsi_long - 50) *2, color = white, title="Trend Index")
fill(p2,p3, color=white)
hline((overbought_long -50) * 2)
hline((oversold_long -50) * 2)
//Position Plots (strategy)
plot(matrix_position / 100, title='Matrix', color=white, linewidth = 4)
plot(position_size / 100, title='Position', color=blue, linewidth = 4)
plot(strategy.position_size / 100, title='Strategy', color=orange, linewidth = 4)
// //Price Plots (study)
// plot(level_price, title="Matrix Level Price", linewidth=4)
// plot(last_traded_price, title="Last Traded Price", linewidth=2, color=orange)
// plot(entry_price + (4 * matrix_price), title='Adjustment 4', color=white, linewidth = 1)
// plot(entry_price + (3 * matrix_price), title='Adjustment 3', color=white, linewidth = 1)
// plot(entry_price + (2 * matrix_price), title='Adjustment 2', color=white, linewidth = 1)
// plot(entry_price + matrix_price, title='Adjustment 1', color=white, linewidth = 1)
// plot(entry_price, title='Entry Price', color=white, linewidth = 3)
// plot(entry_price - matrix_price, title='Adjustment -1', color=white, linewidth = 1)
// plot(entry_price - (2 * matrix_price), title='Adjustment -2', color=white, linewidth = 1)
// plot(entry_price - (3 * matrix_price), title='Adjustment -3', color=white, linewidth = 1)
// plot(entry_price - (4 * matrix_price), title='Adjustment -4', color=white, linewidth = 1)
// //Alerts (study only)
// alertcondition(trend_reversal_up, title='Trend Reversal Up', message='Market Oversold, Lets Buy')
// alertcondition(trend_reversal_down, title='Trend Reversal Down', message='Market Overbought, Lets Sell')
// alertcondition(reset_long, title='Reset Long', message='Higher Bottom, Lets Buy')
// alertcondition(reset_short, title='Reset Short', message='Lower Top, Lets Sell')
// alertcondition(increase_long, title='Increase Long', message='Price Dropped, Lets Buy')
// alertcondition(decrease_long, title='Decrease Long', message='Price Spiked, Lets Sell')
// alertcondition(increase_short, title='Increase Short', message='Price Spiked, Lets Sell')
// alertcondition(decrease_short, title='Decrease Short', message='Price Dropped, Lets Buy')
// //Grouped Conditions
// condition_buy = trend_reversal_up or increase_long or decrease_short or reset_long
// condition_sell = trend_reversal_down or decrease_long or increase_short or reset_short
// adjustment_matrix = trend_reversal_up or increase_long or decrease_short or trend_reversal_down or decrease_long or increase_short or reset_long or reset_short
// //Grouped Alerts
// alertcondition(condition_buy, title='Condition Buy', message='You Need to Buy')
// alertcondition(condition_sell, title='Condition Sell', message='You Need to Sell!')
// alertcondition(adjustment_matrix, title='Adjustment Matrix', message='You Need to Adjust')