该策略是一种拟似Grid Bot的策略,主要用于算法交易。它采用一个基于交易量计算的动态、非等间距的Grid网格,并且只在RSI满足特定条件时才更新网格。它也具有突破交易的特性,与普通Grid Bot不同(典型的Grid Bot在达到更高grid线时卖出,而本策略在特定条件下跌破更低grid线时卖出)。该策略也在收盘时平仓所有的金字塔式订单。
简而言之,该策略在每次RSI穿越过买入/卖出信号线时,将网格更新为你给定的数据源(设置中的”src”)的基于交易量计算的最高价/最低价。它会根据这个区间生成5条等间距的线,并用当前的数据源判断最接近的数据源的是哪条线。如果数据源突破当前线正上方的线,则发出买入信号;如果数据源跌破当前线正下方的线,则发出卖出信号。
你可以在设置中配置是否做空、数据源、RSI周期长度以及超买超卖线。
该策略的核心逻辑是:
使用RSI指标判断趋势反转点,以RSI线穿越设置的超买区或超卖区作为确认信号。
在RSI确认信号出现时,记录一定周期内的最高价和最低价,设置为网格上下限。
根据上下限均分为5条网格线,实时判断价格接近哪条网格线。
当价格突破网格线上方线时,做多入场;当价格跌破网格线下方线时,平仓做空入场。
使用突破网格的方式,而不是触碰网格的普通Grid Bot方式,可以更好抓取趋势突破。
在交易日收盘时,平仓全部金字塔订单,防止隔夜风险。
该策略主要由以下部分组成:
输入参数设置:包括数据源、RSI参数、做多做空选择等。
RSI指标计算:计算RSI指标并判断其是否出现穿越信号。
动态网格设置:在RSI信号发生时记录价格范围并计算网格线。
信号判断:检测价格是否突破网格上下线,判断做多做空信号。
订单管理:发出做多做空信号并在收盘前平仓金字塔订单。
绘图界面:显示网格线、做多做空区域等。
通过动态更新网格,结合RSI指标的趋势判断和突破信号,使该策略能够有效跟踪趋势,在反转时及时调整方向。收盘前平仓可有效控制隔夜风险。
该策略具有以下主要优势:
动态网格可以根据趋势自适应调整,而不是固定不变的网格,更具弹性。
只在RSI确认趋势反转时调整网格,可以过滤掉部分噪音信号。
使用突破信号而不是仅触碰信号,可以更准确抓取趋势转折点。
收盘前全部平仓,可以规避隔夜大幅波动的风险,保护利润。
RSI指标可以较好地判断超买超卖情况,与动态网格结合效果好。
采用突破模式而非回调模式,可以在趋势初期获得较好入场机会。
调整网格间距和交易量比例可以灵活调整策略的风险收益特征。
图形界面直观显示网格分布和做多做空区域。
可选择是否开启做空,满足不同交易者的需求。
规则简单清晰,易于理解实现,适合算法交易。
上述优势使该策略可以自动跟踪趋势,同时控制风险,适合量化交易实盘应用。
该策略也存在一些潜在风险需要注意:
大幅震荡趋势中,可能出现止损风险。可适当放宽止损范围,或在震荡期间暂停策略。
夜间可能出现隔夜大幅跳空,导致开盘头寸较大。可考虑降低头寸比例规避该风险。
参数设置不当可能导致交易频繁或信号产生误差。应谨慎测试优化参数。
交易费用较高时,网格交易利润可能被反复吃掉。应适当调整交易数量或选择费率更低的交易所。
突破信号可能略晚于趋势反转点出现,需要合理设置突破幅度。
在股市平稳上涨阶段,该策略可能表现不佳。可考虑与其他指标组合使用。
需要足够的资金支持较大的头寸和金字塔仓位,否则效果不佳。应根据资金量调整仓位。
对策:
优化参数,降低交易频率,防止过度交易。
结合趋势指标,避开震荡期交易。
调整仓位,降低单笔交易比例,控制风险。
测试不同的突破幅度参数,平衡及时性和稳定性。
可以考虑与其他指标组合,利用更多市场信息。
增加资金量,扩大仓位规模,提高盈利空间。
通过参数优化、风险管理、与其他策略组合等方法,可以在一定程度上减少该策略的风险,使其可以稳定运作。
该策略可以在以下方面进一步优化:
优化RSI参数,测试不同的RSI周期长度,寻找最佳参数组合。
测试不同的网格间距设置,找到最佳收益风险比的网格。
尝试结合其他指标过滤信号,例如MACD、KD等,提高准确率。
开发自适应止损策略,根据市场波动程度来动态调整止损幅度。
增加开仓条件,仅在趋势足够明确时开仓,避免被套。
进行回测优化,测试更长时间段的数据,评估参数稳定性。
尝试基于机器学习的动态参数优化,让策略自适应各市场环境。
探索结合Options的策略,利用Options对冲仓位风险。
根据最近行情特点,调整参数优化策略,保持策略有效性。
开发图形化策略优化平台,辅助快速优化测试。
通过自动化的参数优化、策略组合以及引入更多市场信息等方式,该策略可以取得更好的稳定性和收益率,成为真正可靠的量化交易策略。
整体来看,该RSI矩形网格策略利用RSI指标判断趋势反转确认信号,设置价格范围动态网格,在突破网格线时交易,在日内完全平仓,形成一个灵活的趋势跟踪算法交易策略。相比固定网格策略,它可以更好地自适应市场变化。
该策略具有一定的优势,包括结合RSI指标判断趋势、动态网格自适应、突破模式交易及日内完全平仓等。这使其可以有效跟踪趋势同时控制风险。但该策略也存在一些潜在风险需要注意,比如震荡趋势下的止损风险、隔夜跳空风险等。可以通过参数优化、与其他信号组合以及风险管理手段来减少这些风险。
该策略还有许多优化的方向,通过引入更多指标、机器学习优化参数以及图形化回测平台等手段,可以将其优化成一个更稳定、收益更高的算法交易策略。总体来说,该策略为量化交易提供了一个可靠、易于操作的趋势跟踪算法框架。
/*backtest
start: 2023-09-29 00:00:00
end: 2023-10-29 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © wbburgin
//@version=5
// strategy("RSI Box Strategy (pseudo-Grid Bot)", overlay=true, initial_capital = 10000,
// default_qty_type = strategy.percent_of_equity, default_qty_value = 1, pyramiding = 33, commission_value=0.10)
src = input.source(close,"Source")
rsiLength = input.int(14,"RSI Length")
oblvl = input.int(70,"Overbought Level")
oslvl = input.int(30,"Oversold Level")
useShorts = input.bool(false,"Use Shorts",inline="B")
showGrid = input.bool(false,"Show Grid",inline="B")
rsi = ta.rsi(src,rsiLength)
rsi_crossdn = ta.crossunder(rsi,oblvl)
rsi_crossup = ta.crossover(rsi,oslvl)
highest = ta.vwma(ta.highest(src,rsiLength),rsiLength)
lowest = ta.vwma(ta.lowest(src,rsiLength), rsiLength)
gridTop = ta.valuewhen(rsi_crossdn,highest,0)
gridBottom = ta.valuewhen(rsi_crossup,lowest,0)
gridMiddle = math.avg(gridTop,gridBottom)
gridMidTop = math.avg(gridMiddle,gridTop)
gridMidBottom = math.avg(gridMiddle,gridBottom)
diff1 = math.abs(src - gridTop)
diff2 = math.abs(src - gridBottom)
diff3 = math.abs(src - gridMiddle)
diff4 = math.abs(src - gridMidTop)
diff5 = math.abs(src - gridMidBottom)
minDiff = math.min(diff1, diff2, diff3, diff4, diff5)
// Determine which line is the closest
float closestLine = na
if minDiff == diff1
closestLine := gridTop
else if minDiff == diff2
closestLine := gridBottom
else if minDiff == diff3
closestLine := gridMiddle
else if minDiff == diff4
closestLine := gridMidTop
else if minDiff == diff5
closestLine := gridMidBottom
buyCrosses = ta.crossover(src,gridTop) or ta.crossover(src,gridBottom) or ta.crossover(src,gridMiddle) or ta.crossover(src,gridMidTop) or ta.crossover(src,gridMidBottom)
sellCrosses= ta.crossunder(src,gridTop) or ta.crossunder(src,gridBottom) or ta.crossunder(src,gridMiddle) or ta.crossunder(src,gridMidTop) or ta.crossunder(src,gridMidBottom)
condition_bull = buyCrosses
condition_bear = sellCrosses
var float bull_status_line = na
var float bear_status_line = na
var float bull_buy_line = na
var float bear_sell_line = na
if condition_bull
bull_status_line := closestLine
if condition_bear
bear_status_line := closestLine
if bull_status_line == gridBottom
bull_buy_line := gridMidBottom
if bull_status_line == gridMidBottom
bull_buy_line := gridMiddle
if bull_status_line == gridMiddle
bull_buy_line := gridMidTop
if bull_status_line == gridMidTop
bull_buy_line := gridTop
if bear_status_line == gridTop
bear_sell_line := gridMidTop
if bear_status_line == gridMidTop
bear_sell_line := gridMiddle
if bear_status_line == gridMiddle
bear_sell_line := gridMidBottom
if bear_status_line == gridMidBottom
bear_sell_line := gridBottom
l = ta.crossover(src,bull_buy_line)
s = ta.crossunder(src,bear_sell_line)
if l
strategy.entry("Long",strategy.long)
if s
strategy.close("Long")
if useShorts
strategy.entry("Short",strategy.short)
// Plotting
in_buy = ta.barssince(l) < ta.barssince(s)
u=plot(bull_buy_line,color=na,title="Buy Plot")
d=plot(bear_sell_line,color=na,title="Sell Plot")
plot(not showGrid?na:gridBottom,color=color.new(color.white,75),title="Grid Line -2")
plot(not showGrid?na:gridMidBottom,color=color.new(color.white,75),title="Grid Line -1")
plot(not showGrid?na:gridMiddle,color=color.new(color.white,75),title="Grid Line 0")
plot(not showGrid?na:gridMidTop,color=color.new(color.white,75),title="Grid Line 1")
plot(not showGrid?na:gridTop,color=color.new(color.white,75),title="Grid Line 2")
fill(u,d,color=in_buy ? color.new(color.lime,75) : color.new(color.red,75))