本策略名为”OBVious MA Strategy 基于OBV与MA交叉信号的趋势跟踪策略”,核心是使用OBV(On Balance Volume)指标与移动平均线的交叉来产生交易信号。OBV可以提供领先的趋势信号,本策略利用OBV突破移动平均线作为进场和出场条件,以捕捉趋势。同时使用独立的进场MA和出场MA,可以更灵活地控制持仓时间。该策略虽然是一个简单的演示,但展现了如何有效利用OBV进行量价分析。
本策略展示了一种基于OBV与MA交叉的简单趋势跟踪方法。优点是逻辑清晰,能够及时捕捉趋势,通过分离进出场MA可以灵活控制持仓。但缺点是缺乏风险控制措施以及信号确认手段。后续可以从趋势过滤、参数优化、仓位管理、联合信号等方面进行改进,以期获得更稳健的策略表现。本策略更适合作为一个向导信号,配合其他策略来使用。
/*backtest start: 2023-04-23 00:00:00 end: 2024-04-28 00:00:00 period: 1d 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/ // © ThousandX_Trader //@version=5 strategy(title="OBVious MA Strategy [1000X]", overlay=false, initial_capital=10000, margin_long=0.1, margin_short=0.1, default_qty_type=strategy.percent_of_equity, default_qty_value=100, slippage=1, commission_type=strategy.commission.percent, commission_value=0.1) // Direction Input /// tradeDirection = input.string("long", title="Direction", options=["long", "short"], group = "Direction Filter") /////////////////////////////////////// // 1000X OBV MA INDICATOR // /////////////////////////////////////// // OBV Trend Length Inputs // long_entry_length = input(190, title="Long Entry MA Length", group = "Moving Average Settings") long_exit_length = input(202, title="Long Exit MA Length", group = "Moving Average Settings") short_entry_length = input(395, title="Short MA Entry Length", group = "Moving Average Settings") short_exit_length = input(300, title="Short Exit MA Length", group = "Moving Average Settings") // OBV Calculation obv = ta.cum(ta.change(close) >= 0 ? volume : -volume) // Calculate OBV Moving Averages obv_ma_long_entry = ta.sma(obv, long_entry_length) obv_ma_long_exit = ta.sma(obv, long_exit_length) obv_ma_short_entry = ta.sma(obv, short_entry_length) obv_ma_short_exit = ta.sma(obv, short_exit_length) /////////////////////////////////////// // STRATEGY RULES // /////////////////////////////////////// longCondition = ta.crossover(obv, obv_ma_long_entry) and tradeDirection != "short" and strategy.position_size <= 0 longExitCondition = ta.crossunder(obv, obv_ma_long_exit) shortCondition = ta.crossunder(obv, obv_ma_short_entry) and tradeDirection != "long" and strategy.position_size >= 0 shortExitCondition = ta.crossover(obv, obv_ma_short_exit) /////////////////////////////////////// // ORDER EXECUTION // /////////////////////////////////////// // Close opposite trades before entering new ones if (longCondition and strategy.position_size < 0) strategy.close("Short Entry") if (shortCondition and strategy.position_size > 0) strategy.close("Long Entry") // Enter new trades if (longCondition) strategy.entry("Long Entry", strategy.long) if (shortCondition) strategy.entry("Short Entry", strategy.short) // Exit conditions if (longExitCondition) strategy.close("Long Entry") if (shortExitCondition) strategy.close("Short Entry") /////////////////////////////////////// // PLOTTING // /////////////////////////////////////// // Plot OBV line with specified color plot(obv, title="OBV", color=color.new(#2962FF, 0), linewidth=1) // Conditionally plot Long MAs with specified colors based on Direction Filter plot(tradeDirection == "long" ? obv_ma_long_entry : na, title="Long Entry MA", color=color.new(color.rgb(2, 130, 228), 0), linewidth=1) plot(tradeDirection == "long" ? obv_ma_long_exit : na, title="Long Exit MA", color=color.new(color.rgb(106, 168, 209), 0), linewidth=1) // Conditionally plot Short MAs with specified colors based on Direction Filter plot(tradeDirection == "short" ? obv_ma_short_entry : na, title="Short Entry MA", color=color.new(color.rgb(163, 2, 227), 0), linewidth=1) plot(tradeDirection == "short" ? obv_ma_short_exit : na, title="Short Exit MA", color=color.new(color.rgb(192, 119, 205), 0), linewidth=1)