本策略综合利用了RSI指标识别超买超卖信号,布林带判断价格突破进行操作,以及均线的金叉死叉形态,从而在趋势的不同阶段对市场进行判断,实现盈利。
该策略主要由以下几部分指标组成:
RSI指标:当RSI指标线上穿过设定的超买线或者下穿超卖线时,进行相应的做多或者做空操作。
布林带:当价格突破布林带上轨时,进行做空操作;当价格跌破布林带下轨时,进行做多操作。
均线:计算一定周期(如5周期)内的最高价和最低价,当价格高于最近5周期的最高点时,做多;当价格低于最近5周期的最低点时,做空。
MACD:计算快线,慢线和MACD线的金叉死叉,作为辅助判断指标。
这几个指标相互结合,在趋势行情中,利用布林带判断价格突破和回归中轴的时间点;在盘整行情中,利用均线判断突破来抓取趋势转换点;在超买超卖行情中,利用RSI指标的极值区域判断来实现逆向操作。
该策略具有以下几个优势:
多指标组合,判断精确。RSI,布林带,均线等指标相互验证,使得交易信号更加可靠。
适合不同行情。趋势行情利用布林带,盘整行情利用均线,超买超卖行情利用RSI,多种行情都能应对。
操作频率适中。指标参数设置较为谨慎,避免过于频繁交易。
程序结构清晰。代码编写规范,容易读懂和二次开发。
该策略也存在一些风险:
参数设置风险。指标参数设置不当可能导致交易信号错误。需要反复测试优化参数。
多头空头切换风险。在行情转折点多头空头切换可能比较频繁,交易成本会加大。可以适当调整持仓时间。
编程实现风险。代码中可能存在一些难以发现的逻辑错误,导致异常交易。需要完善异常处理和日志记录。
该策略还可以从以下几个方向进行优化:
增加止损策略,以锁定利润,减少亏损。
结合交易量指标,避免虚假信号。例如突破布林带时检查交易量。
增加机器学习算法,利用历史数据训练,自动优化参数。
增加图形化展示,能直观显示策略表现。
进行回测优化,选择最佳参数组合。
本策略综合运用了均线、布林带、RSI等多个指标,通过指标组合判断,形成交易信号。策略优势是适应性强,判断精确;风险主要在参数设定和程序实现,需要不断优化测试。接下来将持续完善该策略,增加止损机制,利用机器学习训练最佳参数,并开发图形化界面,完善监控和异常处理功能。
/*backtest start: 2024-01-19 00:00:00 end: 2024-02-15 00:00:00 period: 4h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("MD strategy", overlay=true) lengthrsi = input( 14 ) overSold = input( 30 ) overBought = input( 70 ) price = close source = close lengthbb = input(20, minval=1) mult = input(2.0, minval=0.001, maxval=50) direction = input(0, title = "Strategy Direction",minval=-1, maxval=1) fastLength = input(12) slowlength = input(26) MACDLength = input(9) consecutiveBarsUp = input(3) consecutiveBarsDown = input(3) lengthch = input( minval=1, maxval=1000, defval=5) upBound = highest(high, lengthch) downBound = lowest(low, lengthch) ups = price > price[1] ? nz(ups[1]) + 1 : 0 dns = price < price[1] ? nz(dns[1]) + 1 : 0 MACD = ema(close, fastLength) - ema(close, slowlength) aMACD = ema(MACD, MACDLength) delta = MACD - aMACD strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long)) basis = sma(source, lengthbb) dev = mult * stdev(source, lengthbb) upper = basis + dev lower = basis - dev vrsi = rsi(price, lengthrsi) if (not na(vrsi)) if (crossover(vrsi, overSold)) strategy.entry("RsiLE", strategy.long, comment="RsiLE") if (crossunder(vrsi, overBought)) strategy.entry("RsiSE", strategy.short, comment="RsiSE") if (crossover(source, lower)) strategy.entry("BBandLE", strategy.long, stop=lower, oca_name="BollingerBands", comment="BBandLE") else strategy.cancel(id="BBandLE") if (crossunder(source, upper)) strategy.entry("BBandSE", strategy.short, stop=upper, oca_name="BollingerBands", comment="BBandSE") else strategy.cancel(id="BBandSE") if (not na(close[lengthch])) strategy.entry("ChBrkLE", strategy.long, stop=upBound + syminfo.mintick, comment="ChBrkLE") strategy.entry("ChBrkSE", strategy.short, stop=downBound - syminfo.mintick, comment="ChBrkSE") //plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)