该策略结合了多个指数移动平均线(EMA)、相对强弱指数(RSI)以及基于标准差的出场条件来识别潜在的买卖机会。使用了短期(6、8、12天)、中期(55天)和长期(150、200、250天)的 EMA 来分析市场趋势的方向和强度。RSI 采用可配置的买入(30)和卖出(70)阈值来评估动量并识别超买或超卖状况。该策略还采用了一个独特的出场机制,当收盘价触及 12 日 EMA 的可配置标准差范围(默认为0.5)时触发出场,从而提供了一种潜在的保护利润或降低损失的方法。
本文提出了一个基于多重移动平均线、RSI 和标准差出场的蜡烛线高度突破交易策略。该策略从趋势和动量两个维度对市场进行分析,同时采用了独特的标准差出场机制,在捕捉趋势机会的同时兼顾风险控制。策略思路清晰,逻辑严谨,代码实现简洁高效。经过合理优化,该策略有望成为一个稳健的日内中高频交易策略。但需注意,任何策略都有其局限性,盲目使用可能带来风险。量化交易不应是机械的”信号-下单”过程,而应建立在对整体市场态势的把握和审慎的风险管理之上。交易者还需不断评估策略表现,适时调整,并与自己的交易风格和承受能力相结合,才能长期立于不败之地。
/*backtest start: 2023-03-22 00:00:00 end: 2024-03-27 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Candle Height Breakout with Configurable Exit and Signal Control", shorttitle="CHB Single Signal", overlay=true) // Input parameters for EMA filter and its length useEmaFilter = input.bool(true, "Use EMA Filter", group="Entry Conditions") emaFilterLength = input.int(55, "EMA Filter Length", minval=1, group="Entry Conditions") candleCount = input.int(4, "SamG Configurable Candle Count for Entry", minval=3, maxval=4, step=1, group="Entry Conditions") exitEmaLength = input.int(12, "Exit EMA Length", minval=1, group="Exit Conditions", defval=12) exitStdDevMultiplier = input.float(0.5, "Exit Std Dev Multiplier", minval=0.1, maxval=2.0, step=0.1, group="Exit Conditions") // State variables to track if we are in a long or short position var bool inLong = false var bool inShort = false // Calculating EMAs with fixed periods for visual reference ema6 = ta.ema(close, 6) ema8 = ta.ema(close, 8) ema12 = ta.ema(close, 12) ema55 = ta.ema(close, 55) ema100 = ta.ema(close, 100) ema150 = ta.ema(close, 150) ema200 = ta.ema(close, 200) emaFilter = ta.ema(close, emaFilterLength) exitEma = ta.ema(close, exitEmaLength) // Plotting EMAs plot(ema6, "EMA 6", color=color.red) plot(ema8, "EMA 8", color=color.orange) plot(ema12, "EMA 12", color=color.yellow) plot(ema55, "EMA 55", color=color.green) plot(ema100, "EMA 100", color=color.blue) plot(ema150, "EMA 150", color=color.purple) plot(ema200, "EMA 200", color=color.fuchsia) plot(emaFilter, "EMA Filter", color=color.black) plot(exitEma, "Exit EMA", color=color.gray) // Calculating the highest and lowest of the last N candles based on user input highestOfN = ta.highest(high[1], candleCount) lowestOfN = ta.lowest(low[1], candleCount) // Entry Conditions with EMA Filter longEntryCondition = not inLong and not inShort and (close > highestOfN) and (not useEmaFilter or (useEmaFilter and close > emaFilter)) shortEntryCondition = not inLong and not inShort and (close < lowestOfN) and (not useEmaFilter or (useEmaFilter and close < emaFilter)) // Update position state on entry if (longEntryCondition) strategy.entry("Buy", strategy.long, comment="B") inLong := true inShort := false if (shortEntryCondition) strategy.entry("Sell", strategy.short, comment="S") inLong := false inShort := true // Exit Conditions based on configurable EMA and Std Dev Multiplier smaForExit = ta.sma(close, exitEmaLength) upperExitBand = smaForExit + exitStdDevMultiplier * ta.stdev(close, exitEmaLength) lowerExitBand = smaForExit - exitStdDevMultiplier * ta.stdev(close, exitEmaLength) exitConditionLong = inLong and (close < upperExitBand or close < exitEma) exitConditionShort = inShort and (close > lowerExitBand or close > exitEma) // Strategy exits if (exitConditionLong) strategy.close("Buy", comment="Exit") inLong := false if (exitConditionShort) strategy.close("Sell", comment="Exit") inShort := false // Visualizing entry and exit points plotshape(series=longEntryCondition, style=shape.labelup, location=location.belowbar, color=color.green, size=size.tiny, title="Buy Signal", text="B") plotshape(series=shortEntryCondition, style=shape.labeldown, location=location.abovebar, color=color.red, size=size.tiny, title="Sell Signal", text="S")