比特币动量跟踪止损策略是一种基于动量的长仓策略,旨在捕捉比特币的上涨趋势,同时通过动态调整止损来规避下跌风险。该策略使用了简单而巧妙的动量跟踪止损技术,在高度看跌的波动期内收紧止损以保护敞口利润,而在持续看涨的动量期间放宽止损以让利润奔跑。只要比特币价格高于20周均线(EMA),该策略就会一直持仓,当价格跌破20周均线时就会平仓止损。该策略只交易一个头寸,不做空,但如果你知道自己在做什么,可以很容易地调整它来做任何你喜欢的事情。
该策略使用周线图表和20周EMA作为趋势过滤器,只在价格高于20周EMA时入场。5周期ATR用于动态调整跟踪止损的距离,在警戒状态下会收紧止损。警戒状态通过两个条件定义:近期波峰到当前最低价的距离大于1.5倍ATR,或者当日收盘价低于当日20EMA。这种动态止损调整方法可以在趋势强劲时给予更大的回撤空间,在趋势减弱时快速锁定利润。
简单有效:该策略逻辑简单清晰,容易理解和实施,同时能够有效捕捉比特币的主要上涨趋势。
动态止损:根据市场波动状况动态调整止损位置,既能控制回撤,又能让利润奔跑,是一种较为平衡和稳健的止损方法。
趋势过滤:通过高级别均线(20周EMA)过滤,只在明确的上涨趋势中入场,大大提高了策略胜率和盈亏比。
仓位管理:默认全仓交易,能够最大程度地利用资金,提高资金利用效率。同时也可灵活调整仓位大小。
适用性广:该策略逻辑可以方便地移植到其他标的和市场中,具有较好的通用性。
参数适用性:该策略参数是基于比特币市场的特点设置的,对其他市场的适用性有待验证,可能需要针对不同标的进行参数优化。
趋势识别:该策略主要依赖高级别EMA和ATR等技术指标判断趋势,对行情的把握不如基本面分析全面,在市场转折点容易出现失误。
止损风险:虽然动态止损可以一定程度上控制风险,但在极端行情下(如暴跌或快速深幅震荡),仍可能出现较大的回撤。而且止损位比较靠近,在震荡行情中可能会频繁止损。
盈利空间:策略在单边上涨趋势中表现出色,但在震荡市更容易陷入频繁止损的困境,整体盈利空间可能有限。
实盘表现:该策略在回测中表现良好,但实盘受到滑点、手续费等因素影响,可能与理论收益存在一定差距,需谨慎评估。
趋势判断:可以尝试引入更多高级别均线、波动率指标甚至基本面数据,提高趋势识别的准确性和可靠性。
动态参数:止损位和ATR参数可以进一步优化,引入与价格或波动率相关的动态调整机制,以适应不同的市场状态。
仓位管理:可以根据趋势强度、波动率等指标,动态调整仓位大小,在趋势强劲时加大仓位,在高波动率时减小仓位,提高收益风险比。
多空机制:在熊市中引入做空机制,扩大策略的适用范围和潜在盈利空间。但需要重新设计入场、止损等规则。
组合策略:将该策略与其他策略(如反转、均值回归等)进行组合,互补优势,提高策略稳定性和盈利能力。
比特币动量跟踪止损策略是一个简单有效的动量策略,它利用高级别均线和ATR指标,捕捉比特币强劲的上涨趋势,并通过动态调整止损的方式控制下行风险。该策略逻辑清晰,易于实施和优化,适用于追求稳健收益的中长线投资者。但在震荡市中表现一般,整体盈利空间有限。 该策略可以作为一个基础模板,投资者可以根据自己的需求和经验,在趋势判断、参数优化、仓位管理、多空机制等方面进一步完善,或与其他策略进行组合,以期获得更高的收益风险比。但需要注意,该策略在实盘中的表现可能与回测结果存在差异,需要谨慎评估和控制风险。任何策略在使用前都需要进行充分的历史数据回测和模拟交易,并根据市场变化进行动态调整。
/*backtest start: 2023-03-08 00:00:00 end: 2024-03-07 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/ // © ZenAndTheArtOfTrading // ------------------------------------------------------------------------------------------------------ // System Concept: Capture as much Bitcoin upside volatility as possible while side-stepping downside volatility. // Entry Rule #1: Bitcoin must be trading above higher-timeframe EMA (Weekly 20 EMA) // Entry Rule #2: Bitcoin must not be in 'caution' condition // -> Caution: True if BTC's recent swing high minus its current low is > 1.5x ATR OR close < Daily EMA // Trailing Stop: Stop is trailed 1 ATR from recent swing high, OR 20% of ATR if in caution condition // ------------------------------------------------------------------------------------------------------ // @version=5 strategy("Bitcoin Momentum Strategy", overlay=true) // Get user input var const string G_STRATEGY = "Strategy Entry Settings" var const string G_EXIT = "Strategy Exit Settings" var const string G_FILTER = "Strategy Filters" i_HigherTimeframe = input.timeframe("W", "Higher Timeframe", group=G_STRATEGY, tooltip="Higher timeframe MA reference") i_EmaLength = input.int(20, "EMA Length", group=G_STRATEGY, tooltip="Moving average period length") i_AtrLength = input.int(5, "ATR Length", group=G_STRATEGY, tooltip="ATR period length") i_TrailStopSource = input.source(low, "Trail Stop Source", group=G_EXIT, tooltip="Lowest price source for trailing stop") i_TrailStopLookback = input.int(7, "Trail Stop Lookback", group=G_EXIT, tooltip="How many bars to look back for trailing price source") i_TrailStopMulti = input.float(0.2, "Trailing Stop Ratchet Multiplier", group=G_EXIT, tooltip="When momentum is yellow (caution), shrink ATR distance for TS by this much") i_StartTime = input(timestamp("01 Jan 2000 13:30 +0000"), "Start Filter", group=G_FILTER, tooltip="Start date & time to begin searching for setups") i_EndTime = input(timestamp("1 Jan 2099 19:30 +0000"), "End Filter", group=G_FILTER, tooltip="End date & time to stop searching for setups") // Define custom security function which does not repaint RequestSecurity_NonRP(_market, _res, _exp) => request.security(_market, _res, _exp[barstate.isrealtime ? 1 : 0])[barstate.isrealtime ? 0 : 1] // Define date filter check DateFilter(int start, int end) => time >= start and time <= end // Get indicator values float atrValue = ta.atr(i_AtrLength) float emaValue = ta.ema(close, i_EmaLength) float htfEmaValue = RequestSecurity_NonRP(syminfo.tickerid, i_HigherTimeframe, emaValue) float marketPrice = close // Check for bullishness / bearish volatility caution bool isBullish = marketPrice > htfEmaValue bool isCaution = isBullish and (ta.highest(high, 7) - low > (atrValue * 1.5) or marketPrice < emaValue) // Set momentum color color bgCol = color.red if isBullish[1] bgCol := color.green if isCaution[1] bgCol := color.orange // Handle strategy entry, and reset trailing stop var float trailStop = na if isBullish and strategy.position_size == 0 and not isCaution strategy.entry(id="Buy", direction=strategy.long) trailStop := na // Update trailing stop float temp_trailStop = ta.highest(i_TrailStopSource, i_TrailStopLookback) - (isCaution[1] ? atrValue * i_TrailStopMulti : atrValue) if strategy.position_size > 0 if temp_trailStop > trailStop or na(trailStop) trailStop := temp_trailStop // Handle strategy exit if (close < trailStop or close < htfEmaValue) and barstate.isconfirmed strategy.close("Buy", comment="Sell") // Draw trailing stop, HTF EMA and color-coded momentum indicator plotshape(true, color=bgCol, style=shape.square, location=location.bottom, size=size.auto, title="Momentum Strength") plot(htfEmaValue, color=close > htfEmaValue ? color.green : color.red, linewidth=2, title="HTF EMA") plot(emaValue, color=close > emaValue ? color.green : color.red, linewidth=1, title="CTF EMA") plot(strategy.position_size[1] > 0 ? trailStop : na, style=plot.style_linebr, color=color.red, title="Stop Loss")