本策略采用快慢两个Arnaud Legoux移动平均(ALMA)进行交易信号判断。ALMA 是对传统移动平均线的改进,可减少滞后并平滑曲线。策略通过快速ALMA上穿慢速ALMA 生成买入信号,快速ALMA下穿慢速ALMA生成卖出信号,同时结合成交量过滤,形成较为稳定的交叉信号。
该策略的核心指标和交易规则如下:
快速ALMA:期数较短,用于捕捉突破。
慢速ALMA:期数较长,用于判断大趋势。
成交量过滤:短期均量上穿长期均量时有效。
做多信号:快速ALMA上穿慢速ALMA且成交量过滤有效。
平多信号:快速ALMA下穿慢速ALMA。
做空信号:快速ALMA下穿慢速ALMA且成交量过滤有效。
平空信号:快速ALMA上穿慢速ALMA。
该策略简单直观,同时融合了趋势判断、突破捕捉和成交量验证等多种技术指标,形成了一个相对稳健的交易体系。快慢均线的配合可以有效判断趋势方向;ALMA算法的运用减小了滞后对交易的影响;成交量的加入避免了许多不确定的假突破。
相比传统均线交叉策略,该策略主要有以下优势:
ALMA算法可减少滞后,提高信号质量。
成交量过滤可避免假突破造成损失。
快慢均线配合判断大趋势,避免反向交易。
规则简单直观,容易理解实施。
可灵活调整均线参数,适用于不同市场。
资金管理设置合理,可控制单笔损失。
可通过优化均线参数进一步提高策略效果。
总体来说,相比传统均交策略,本策略稳定性和信号质量有所提高。
尽管该策略有许多优点,但以下风险仍须注意:
均线策略本质上易受震荡市错乱,产生多次亏损。
ALMA算法的参数设置会影响策略效果。
成交量放大效应可能误导交易信号判断。
存在一定的滞后,无法完全避免亏损。
Parametrics优化存在过拟合风险。
成交量异常情况下信号会失效。
机器学习等算法可能获得更优结果。
需关注收益回撤比指标,避免曲线过于锯齿。
考虑到上述风险因素,该策略可从以下几个方面进行优化:
优化ALMA均线参数,提高反应敏感性。
尝试不同的成交量计算方式。
引入止损策略,严格控制单笔损失。
结合其它指标构建立体化交易信号系统。
增加机器学习模块,实现更智能的信号调整。
多品种部署,进行策略分散。
优化资金管理策略,按不同市场调整仓位。
研究策略健壮性,防止过拟合。
本策略整体来说,相比传统均线交叉策略,通过ALMA算法和成交量验证提高了信号质量和稳定性。但交易策略优化是一个持续的过程,仍需关注风险,从多维度进行策略增强,使其能够适应更复杂的市场环境。
/*backtest start: 2022-09-16 00:00:00 end: 2023-09-22 00:00:00 period: 1d basePeriod: 1h 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/ // © Sarahann999 // Calculations for TP/SL based off: https://kodify.net/tradingview/orders/percentage-profit/ //@version=5 strategy("ALMA Cross", overlay=true) //User Inputs src= (close) long_entry = input(true, title='Long Entry') short_entry = input(true, title='Short Entry') //Fast Settings ALMA1 = input(100, "ALMA Lenghth 1", group= "ALMA Fast Length Settings") alma_offset = input.float(defval=0.85, title='Arnaud Legoux (ALMA) - Offset Value', minval=0, step=0.01) alma_sigma = input.int(defval=6, title='Arnaud Legoux (ALMA) - Sigma Value', minval=0) Alma1 = ta.alma(src, ALMA1, alma_offset, alma_sigma) //Slow Settings ALMA2 = input(120, "ALMA Length 2", group = "ALMA Slow Length Settings") alma_offset2 = input.float(defval=0.85, title='Arnaud Legoux (ALMA) - Offset Value', minval=0, step=0.01) alma_sigma2 = input.int(defval=6, title='Arnaud Legoux (ALMA) - Sigma Value', minval=0) Alma2 = ta.alma(src, ALMA2, alma_offset2, alma_sigma2) //Volume var cumVol = 0. cumVol += nz(volume) if barstate.islast and cumVol == 0 runtime.error("No volume is provided by the data vendor.") shortlen = input.int(5, minval=1, title = "Short Length", group= "Volume Settings") longlen = input.int(10, minval=1, title = "Long Length") short = ta.ema(volume, shortlen) long = ta.ema(volume, longlen) osc = 100 * (short - long) / long //Define Cross Conditions buy = ta.crossover(Alma1, Alma2) sell = ta.crossunder(Alma1, Alma2) //Calculate Take Profit Percentage longProfitPerc = input.float(title="Long Take Profit", group='Take Profit Percentage', minval=0.0, step=0.1, defval=2) / 100 shortProfitPerc = input.float(title="Short Take Profit", minval=0.0, step=0.1, defval=2) / 100 // Figure out take profit price 1 longExitPrice = strategy.position_avg_price * (1 + longProfitPerc) shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc) // Make inputs that set the stop % 1 longStopPerc = input.float(title="Long Stop Loss", group='Stop Percentage', minval=0.0, step=0.1, defval=2.5) / 100 shortStopPerc = input.float(title="Short Stop Loss", minval=0.0, step=0.1, defval=2.5) / 100 // Figure Out Stop Price longStopPrice = strategy.position_avg_price * (1 - longStopPerc) shortStopPrice = strategy.position_avg_price * (1 + shortStopPerc) //Define Conditions buySignal = buy and osc > 0 and strategy.position_size == 0 //sellSignal sellSignal = sell and osc > 0 and strategy.position_size == 0 // Submit entry orders if buySignal and long_entry strategy.entry(id="Long", direction=strategy.long, alert_message="Enter Long") alert(message="BUY Trade Entry Alert", freq=alert.freq_once_per_bar) if sellSignal and short_entry strategy.entry(id="Short", direction=strategy.short, alert_message="Enter Short") alert(message="SELL Trade Entry Alert", freq=alert.freq_once_per_bar) // Submit exit orders based on take profit price if (strategy.position_size > 0) strategy.exit(id="Long TP/SL", limit=longExitPrice, stop=longStopPrice, alert_message="Long Exit 1 at {{close}}") if (strategy.position_size < 0) strategy.exit(id="Short TP/SL", limit=shortExitPrice, stop=shortStopPrice, alert_message="Short Exit 1 at {{close}}") //Draw plot(Alma1,"Alma Fast", color=color.purple, style=plot.style_circles) plot(Alma2,"Alma Slow", color=#acb5c2, style=plot.style_circles)