追踪趋势获利策略旨在检测资产的长期趋势和短期回调,在长期看涨的同时抓住短期调整的机会建仓,并设置合理的止盈止损线,以便顺势而为,及时止盈止损。
该策略主要基于EMA均线和RSI指标判断长短期趋势。具体来说,它使用50日线EMA和200日线EMA判断长期趋势,使用RSI指标判断长期趋势强弱。当长期处于上涨趋势(200日线上涨)且强势(RSI大于50)的同时,短期出现回调(最近2根K线收盘价下跌)时,做多入场。
在入场后,策略设置了止盈止损条件。当价格较入场价上涨超过2倍BHD单位时,做多盈利了结;当价格较入场价下跌超过3倍BHD单位时,止损平仓。其中,BHD单位是根据最近200根K线的振幅计算得到。
这样,该策略充分考虑了长短期趋势特征,在增强盈利的同时控制风险,既可顺势而为,又可及时止盈止损。
该策略具有以下优势:
考虑长短期趋势特征,同时结合强弱指标,避免在震荡市场盲目建仓。
追踪趋势而建仓,顺应市场方向,胜率较高。
设置止盈止损点,有利于及时获利了结和控制风险。
止盈止损点根据市场波动性计算,可动态调整,较为合理。
回测数据表明,在多种币对和周期上,该策略收益较高,稳定性良好。
策略思路简单清晰,易于理解和实现,适合不同水平的交易者。
该策略也存在一定风险:
长短期判断可能存在错误,建仓方向误判的可能。
市场可能出现断崖式下跌,止损点无法完全避免巨额亏损的风险。
参数设置(如均线周期等)不当可能影响策略效果。
止盈点设置过小,可能过早离场影响收益。
回测数据不代表实盘表现,实盘期间需持续优化。
对应风险的解决方法:
优化参数,调整均线周期,或加入其他指标判断强弱。
可设置止损幅度较大,或加入降低仓位等风控机制。
多做回测,评估不同参数对策略的影响。
动态优化止盈参数,根据市场情况调整止盈幅度。
持续回测与优化,结合实盘进行调整,使策略更稳定。
该策略可以从以下几个方面进行进一步优化:
优化参数设置,如调整均线周期、BHD单位周期等,找出最优参数组合。
增加其他指标判断,如MACD、KD等,使短期判断更准确。
优化止盈止损策略,如根据波动率动态调整止盈幅度等。
添加仓位管理策略,如趋势强度影响仓位大小等。
测试更多品种和周期的数据,评估策略健壮性。
添加过滤条件,例如收盘价高于开盘价等,可避免陷阱。
增加机器学习等先进技术,使策略更自动化、智能化。
通过以上优化,可以提高策略的胜率、收益率、稳定性、适应性等方面表现。
追踪趋势获利策略整体来看,具有考虑长短期特征、顺势而为、止盈止损明确等优点,是一种较为稳定高效的趋势跟踪策略。但也存在一定风险,需要对参数及规则进行持续优化测试,结合实盘情况调整。整体来说,该策略思路清晰易操作,值得交易者学习借鉴。如果进一步优化,可以成为稳定可靠的量化交易策略之一。
/*backtest
start: 2023-08-26 00:00:00
end: 2023-09-25 00:00:00
period: 1h
basePeriod: 15m
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/
// © BHD_Trade_Bot
// @version=5
strategy(
shorttitle = 'Take Profit On Trend',
title = 'Take Profit On Trend (by BHD_Trade_Bot)',
overlay = true,
calc_on_every_tick = true,
calc_on_order_fills = true,
use_bar_magnifier = true,
initial_capital = 1000,
default_qty_type = strategy.percent_of_equity,
default_qty_value = 100,
commission_type = strategy.commission.percent,
commission_value = 0.1)
// Backtest Time Period
start_year = input(title='Start year' ,defval=2021)
start_month = input(title='Start month' ,defval=1)
start_day = input(title='Start day' ,defval=1)
start_time = timestamp(start_year, start_month, start_day, 00, 00)
end_year = input(title='end year' ,defval=2050)
end_month = input(title='end month' ,defval=1)
end_day = input(title='end day' ,defval=1)
end_time = timestamp(end_year, end_month, end_day, 23, 59)
is_back_test_time() => true
// EMA
ema50 = ta.ema(close, 50)
ema200 = ta.ema(close, 200)
// RSI
rsi200 = ta.rsi(close, 200)
// EMA_CD
emacd = ema50 - ema200
emacd_signal = ta.ema(emacd, 50)
hist = emacd - emacd_signal
// BHD Unit
bhd_unit = ta.rma(high - low, 200) * 2
bhd_upper = ema200 + bhd_unit
bhd_lower = ema200 - bhd_unit
// All n candles is going down
all_body_decrease(n) =>
isValid = true
for i = 0 to (n - 1)
if (close[i] > close[i + 1])
isValid := false
break
isValid
// ENTRY CONDITIONS
// Long-term uptrend
entry_condition1 = rsi200 > 51 and hist > 0
// Short-term downtrend
entry_condition2 = all_body_decrease(2)
ENTRY_CONDITIONS = entry_condition1 and entry_condition2
if ENTRY_CONDITIONS and is_back_test_time()
strategy.entry('entry', strategy.long)
// CLOSE CONDITIONS
// Price increase 2 BHD unit
take_profit = close > strategy.position_avg_price + bhd_unit * 2
// Price decrease 3 BHD unit
stop_loss = close < strategy.position_avg_price - bhd_unit * 3
CLOSE_CONDITIONS = take_profit or stop_loss
if CLOSE_CONDITIONS
strategy.close('entry')
// Draw
plot(ema50, color=color.orange, linewidth=2)
plot(ema200, color=color.purple, linewidth=2)
bhd_upper_line = plot(bhd_upper, color=color.teal)
bhd_lower_line = plot(bhd_lower, color=color.teal)
fill(bhd_upper_line, bhd_lower_line, color=color.new(color.teal, 90))