乖离矩阵趋势跟随策略


创建日期: 2023-12-12 17:05:27 最后修改: 2023-12-12 17:05:27
复制: 0 点击次数: 513
avatar of ChaoZhang ChaoZhang
1
关注
1364
关注者

乖离矩阵趋势跟随策略

概述

乖离矩阵趋势跟随策略是一个结合趋势、乖离和均线的量化交易策略。该策略运用双RSI指标判断市场趋势方向,结合矩阵均线设置进场信号。矩阵均线会根据价格的乖离程度来调整仓位规模。整体而言,该策略的优点是运用多个指标确认交易信号,可以有效避免假突破,同时矩阵均线机制可以锁定更高收益。

策略原理

乖离矩阵趋势跟随策略主要由以下几部分组成:

  1. 双RSI判断趋势

使用快速RSI和慢速RSI判断市场趋势方向。当快速RSI出现超买或超卖时,结合慢速RSI判断趋势方向。

  1. 矩阵均线生成交易信号

根据进场价格设置一组矩阵均线,当价格触及某均线时,相应调整仓位。这样可以在趋势中获利较多。

  1. 双向交易

默认为双向交易。可选择只做多不做空。

具体交易逻辑是:

  1. 使用快速RSI判断市场临时的超买超卖情况。

  2. 使用慢速RSI判断市场中长期的趋势方向。

  3. 当快速RSI出现超买超卖,同时慢速RSI显示趋势转折时,根据慢速RSI的多空判断做相应方向的仓位。

  4. 建仓后,设定一组矩阵均线。这组矩阵均线围绕进场价设置,间距大小由”矩阵区间百分比”参数设定。

  5. 当价格触及矩阵均线时,相应调整持仓量。如向上突破均线,则增加多单;向下跌破,则减少空单。

  6. 当价格出现较大的调整时,仓位会被重置到初始水平。

以上是该策略的主要交易逻辑。通过矩阵均线,可以在趋势中锁定更多利润。

策略优势

乖离矩阵趋势跟随策略具有以下几个优势:

  1. 双RSI判断信号更可靠。快速RSI避免假突破,慢速RSI确保大趋势正确。

  2. 矩阵均线追踪趋势获利。根据价格乖离程度调整仓位,可以持续获利。

  3. 支持双向交易。默认双向交易,也可仅做多。可适应更多市场环境。

  4. 仓位重置机制控制风险。当价格出现明显调整时重置仓位,可以及时止损。

  5. 参数设置灵活。用户可以根据历史数据、交易品种等选择最佳参数组合。

  6. 代码结构清晰。各部分职责明确划分,易于理解、优化和扩展。

总的来说,该策略最大的优势在于利用多种机制提高信号质量,在控制风险的同时追求更高收益。这是一种风险收益兼顾的交易策略。

策略风险

乖离矩阵趋势跟随策略也存在一些风险,主要集中在以下几点:

  1. 双RSI判断失效风险。当市场处于震荡调整时,RSI经常发出假信号。这时需要审时度势,适当调整参数或暂停交易。

  2. 矩阵均线方式不当风险。如果矩阵参数设置不当,仓位调整可能过于激进,从而加大亏损。需谨慎测试参数。

  3. 仓位过度放大风险。调整仓位幅度过大也会导致亏损扩大。最大仓位参数需要审慎设置。

  4. 趋势反转风险。当趋势发生反转时,如果不及时平仓,会面临较大亏损。这需要关注较长周期的趋势指标。

  5. 代码优化空间有限风险。该策略已经比较成熟,继续优化空间有限。如果市场环境发生较大变化,整体交易逻辑需要重新评估。

对策略进行评估和优化,是降低这些风险的关键。比如调整参数组合、监控较长周期指标等手段,都可以在一定程度上规避风险。

策略优化方向

乖离矩阵趋势跟随策略还有进一步优化的空间:

  1. 优化双RSI参数。可以测试更多参数组合,选择判断最准确的RSI周期数值。

  2. 自定义矩阵均线设置。允许用户根据不同品种参数化设置矩阵均线参数,使之更符合该品种的特点。

  3. 增加止损机制。如设定离场均线,当价格跌破该均线时止损。

  4. 增加仓位比例规则。更科学合理的调整仓位规模和速度,防止仓位过度放大。

  5. 结合其他指标。可再引入MACD、KD等其他指标进行辅助判断,提升信号准确性。

  6. 优化代码结构。继续提高代码的可扩展性、可维护性和执行效率。

总结

乖离矩阵趋势跟随策略是一个多机制综合的量化交易策略。它主要运用双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')