该策略运用简单移动平均线的黄金交叉和死叉原理,实现股票的长短仓。当快线从下方向上突破慢线时,做多;当快线从上方向下跌破慢线时,做空。
该策略首先定义了回测的起止时间,然后设置两个平均线的计算参数,包括平均线类型和周期长度。
通过getMAType()函数计算两个平均线的值。其中fastMA为短周期平均线,slowMA为长周期平均线。
策略的核心逻辑在于:
当fastMA上穿slowMA时,发出做多信号long;
当fastMA下穿slowMA时,发出做空信号short。
最后,在回测期内,遇到做多信号就采取长仓策略;遇到做空信号就采取空仓策略。
针对风险,可以从以下方面进一步优化:
增加其他技术指标过滤,以识别趋势。
增加止损策略,控制单次损失。
引入量能指标等,避免震荡市场的套利。
建立参数优化机制,自动寻找最佳参数组合。
该策略可以从以下几个方面进行进一步优化:
增加止损策略,如设定固定止损点或追踪止损,控制损失。
增加仓位管理策略,如固定仓位、动态仓位,控制交易风险。
增加过滤器,结合其他技术指标识别趋势,提高胜率。
优化参数设置,通过网格搜索、线性回归等方法寻找最优参数。
扩展做多做空策略,如破位反转、分批建仓等,丰富交易策略。
增加量能指标,避免在震荡行情中被套。
丰富交易品种,扩展至股指期货、外汇、数字货币等更多品种。
本策略基于移动平均线的交叉原理实现股票的长短仓选择。策略思路简单明了,使用广泛,适应性强,具有一定的实用价值。但该策略也存在一定的滞后性、无法有效过滤震荡等缺点。未来可从完善止损、优化参数、增加过滤器等方面进行优化,使策略更具优势。
/*backtest start: 2023-09-10 00:00:00 end: 2023-10-10 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 //strategy("Golden X BF Strategy", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0) /////////////// Time Frame /////////////// testStartYear = input(2010, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0) testPeriod() => true ///////////// MA Params ///////////// source1 = input(title="MA Source 1", defval=close) maType1 = input(title="MA Type 1", defval="sma", options=["sma", "ema", "swma", "wma"]) length1 = input(title="MA Length 1", defval=50) source2 = input(title="MA Source 2", defval=close) maType2 = input(title="MA Type 2", defval="sma", options=["sma", "ema", "swma", "wma"]) length2 = input(title="MA Length 2", defval=200) ///////////// Get MA Function ///////////// getMAType(maType, sourceType, maLen) => res = sma(close, 1) if maType == "ema" res := ema(sourceType, maLen) if maType == "sma" res := sma(sourceType, maLen) if maType == "swma" res := swma(sourceType) if maType == "wma" res := wma(sourceType, maLen) res ///////////// MA ///////////// fastMA = getMAType(maType1, source1, length1) slowMA = getMAType(maType2, source2, length2) long = crossover(fastMA, slowMA) short = crossunder(fastMA, slowMA) /////////////// Plotting /////////////// checkColor() => fastMA > slowMA colCheck = checkColor() ? color.lime : color.red p1 = plot(fastMA, color = colCheck, linewidth=1) p2 = plot(slowMA, color = colCheck, linewidth=1) fill(p1, p2, color = checkColor() ? color.lime : color.red) bgcolor(long ? color.lime : short ? color.red : na, transp=20) /////////////// Execution /////////////// if testPeriod() strategy.entry("Long", strategy.long, when=long) strategy.entry("Short", strategy.short, when=short)