本策略是一个基于LuxAlgo®信号和叠加指标的量化交易系统。它主要通过捕捉自定义警报条件来开启多头仓位,并结合多个退出信号来管理持仓。该系统采用模块化设计,支持多种退出条件的组合使用,包括智能追踪止损、趋势反转确认、以及传统的百分比止损等方式。同时,系统还支持在已有持仓的基础上进行加仓操作,这为资金管理提供了更大的灵活性。
策略的核心逻辑包含以下几个关键部分: 1. 入场信号系统:通过自定义的LuxAlgo®警报条件触发多头入场信号。 2. 加仓管理:可选择性地启用加仓功能,在现有持仓基础上增加头寸。 3. 多层次退出机制: - 智能追踪止损:监控价格与智能追踪线的关系 - 趋势确认退出:包括基础和增强版的空头确认信号 - 内置退出信号:利用指标自带的多种退出条件 - 传统止损:支持基于百分比的固定止损设置 4. 时间窗口管理:提供灵活的回测日期范围设置功能。
该策略通过结合LuxAlgo®的高质量信号和多层次的风险管理系统,为量化交易提供了一个完整的解决方案。其模块化设计和灵活的配置选项使其具有很好的适应性和可扩展性。虽然存在一些固有风险,但通过持续的优化和完善,策略的整体表现仍有很大的提升空间。建议使用者在实际应用中要注意市场环境的变化,适时调整参数设置,并保持对风险的持续监控。
/*backtest
start: 2024-11-12 00:00:00
end: 2024-12-11 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Chart0bserver
// This strategy is NOT from the LuxAlgo® developers. We created this to compliment their hard work. No association with LuxAlgo® is intended nor implied.
// Please visit https://chart.observer to test your Tradingview Strategies in our paper-trading sandbox environment. Webhook your alerts to our API.
// Past performance does not ensure future results. This strategy provided with absolutely no warranty and is for educational purposes only
// The goal of this strategy is to enter a long position using the Custom Alert condition feature of LuxAlgo® Signals & Overlays™ indicator
// To trigger an exit from the long position, use one or more of the common exit signals which the Signals & Overlays™ indicator provides.
// You will need to connect those signals to this strategy in the dialog box.
// We're calling this a "piggyback" strategy because the LuxAlgo® Signals & Overlays indicator must be present, and remain on the chart.
// The Signals and Overlays™ indicator is invite-only, and requires a paid subscription from LuxAlgo® - https://luxalgo.com/?rfsn=8404759.b37a73
//@version=6
strategy("Simple Backtester for LuxAlgo® Signals & Overlays™", "Simple Backtester for LuxAlgo® S&O ", true, pyramiding=3, default_qty_type = 'percent_of_equity', calc_on_every_tick = true, process_orders_on_close=false, calc_on_order_fills=true, default_qty_value = 33, initial_capital = 10000, currency = currency.USD, commission_type = format.percent, commission_value = 0.10 )
// Initialize a flag to track order placement
var bool order_placed = false
// Reset the flag at the start of each new bar
if (not na(bar_index) and bar_index != bar_index[1])
order_placed := false
// === Inputs which the user needs to change in the configuration dialog to point to the corresponding LuxAlgo alerts === //
// === The Signals & Overlays indicator must be present on the chart in order for this to work === //
la_EntryAlert = input.source(close, "LuxAlgo® Custom Alert signal", "Replace 'close' with your LuxAlgo® entry signal. For example, try using their Custom Alert.", display=display.none, group="Enter Long Position")
useAddOnTrades = input.bool(false, "Add to your long position on LuxAlgo® signals", display=display.none, group="Add-On Trade Signal for Longs")
la_AddOnAlert = input.source(close, "Add to open longs with this signal", "Replace 'close' with your desired Add-On Trade Signal", display=display.none, group="Add-On Trade Signal for Longs")
la_SmartTrail = input.source(close, "LuxAlgo® Smart Trail", "Replace close with LuxAlgo® Smart Trail", display=display.none, group="LuxAlgo® Signals & Overlays™ Alerts")
la_BearishConfirm = input.source(close, "LuxAlgo® Any Bearish Confirmation", "Replace close with LuxAlgo® Any Bearish Confirmation", display=display.none, group="LuxAlgo® Signals & Overlays™ Alerts")
la_BearishConfirmPlus = input.source(close, "LuxAlgo® Bearish Confirmation+", "Replace close with LuxAlgo® Bearish Confirmation+", display=display.none, group="LuxAlgo® Signals & Overlays™ Alerts")
la_BuiltInExits = input.source(close, "LuxAlgo® Bullish Exit", "Replace close with LuxAlgo® Bullish Exit", display=display.none, group="LuxAlgo® Signals & Overlays™ Alerts")
la_TrendCatcherDn = input.source(close, "LuxAlgo® Trend Catcher Down", "Replace close with LuxAlgo® Trend Catcher Down", display=display.none, group="LuxAlgo® Signals & Overlays™ Alerts")
// === Check boxes alowing the user to select exit criteria from th long position === //
exitOnSmartTrail = input.bool(true, "Exit long trade on Smart Trail Switch Bearish", group="Exit Long Conditions")
exitOnBearishConf = input.bool(false, "Exit on Any Bearish Confirmation", group="Exit Long Conditions")
exitOnBearishConfPlus = input.bool(true, "Exit on Bearish Confirmation+", group="Exit Long Conditions")
exitOnBuiltInExits = input.bool(false, "Exit on Bullish Exits", group="Exit Long Conditions")
exitOnTrendCatcher = input.bool(false, "Exit on Trend Catcher Down", group="Exit Long Conditions")
// === Optional Stop Loss ===//
useStopLoss = input.bool(false, "Use a Stop Loss", group="Optional Stop Loss")
stopLossPercent = input.float(0.25, "Stop Loss %", minval=0.25, step=0.25, group="Optional Stop Loss")
// Use Lux Algo's signals as part of your strategy logic
buyCondition = la_EntryAlert > 0
if useAddOnTrades and la_AddOnAlert > 0 and strategy.opentrades > 0 and not buyCondition
buyCondition := true
sellCondition = false
sellComment = ""
if exitOnSmartTrail and ta.crossunder(close, la_SmartTrail)
sellCondition := true
sellComment := "Smart Trail"
if exitOnBearishConf and la_BearishConfirm == 1
sellCondition := true
sellComment := "Bearish"
if exitOnBearishConfPlus and la_BearishConfirmPlus == 1
sellCondition := true
sellComment := "Bearish+"
if exitOnBuiltInExits and la_BuiltInExits == 1
sellCondition := true
sellComment := "Bullish Exit"
if exitOnTrendCatcher and la_TrendCatcherDn == 1
sellCondition := true
sellComment := "Trnd Over"
// Stop Loss Calculation
stopLossMultiplyer = 1 - (stopLossPercent / 100)
float stopLossPrice = na
if strategy.position_size > 0
stopLossPrice := strategy.position_avg_price * stopLossMultiplyer
// -----------------------------------------------------------------------------------------------------------//
// Back-testing Date Range code ----------------------------------------------------------------------------//
// ---------------------------------------------------------------------------------------------------------//
fromMonth = input.int(defval=1, title='From Month', minval=1, maxval=12, group='Back-Testing Date Range')
fromDay = input.int(defval=1, title='From Day', minval=1, maxval=31, group='Back-Testing Date Range')
fromYear = input.int(defval=2024, title='From Year', minval=1970, group='Back-Testing Date Range')
thruMonth = 1
thruDay = 1
thruYear = 2112
// === START/FINISH FUNCTION ===
start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window
finish = timestamp(thruYear, thruMonth, thruDay, 23, 59) // backtest finish window
window() => // create function "within window of time
time >= start and time <= finish ? true : false
// End Date range code -----//
if buyCondition and window() and not order_placed
strategy.entry("Long", strategy.long)
order_placed := true
if sellCondition and window() and not order_placed
strategy.close("Long", comment=sellComment)
order_placed := true
if useStopLoss and window()
strategy.exit("Stop", "Long", stop=stopLossPrice)