本策略结合趋势跟踪止损和止盈退出逻辑,实现对趋势的持续跟踪获利。策略利用均线判断趋势方向,当价格突破均线时产生交易信号。进入做多头仓位后,策略会根据ATR值设定止损距离,同时利用趋势跟踪止损逻辑调整止损距离,在保护利润的同时跟踪趋势。当价格上涨到一定比例时,策略会部分止盈,锁定部分利润。
根据用户输入的回测时间范围,设置回测的起止时间戳。
设置长仓和短仓的止损价格,以及止损跟踪百分比。
当价格突破均线产生做多信号时,进行做多入场。
根据ATR值计算止损距离,并设置止损价格。
当价格继续上涨时,跟踪调整止损距离,使其逐步上移,锁定更多利润。
当价格上涨到设置的止盈阈值时,部分平仓止盈。
跌破均线产生做空信号时,进行做空入场。
根据ATR值计算止损距离,并设置止损价格。
当价格继续下跌时,跟踪调整止损距离,使其逐步下移,锁定更多利润。
当价格下跌到设置的止盈阈值时,部分平仓止盈。
利用趋势跟踪止损机制,可以在保护利润的同时持续跟踪趋势进行获利,比传统的固定止损距离更具优势。
结合ATR指标计算动态止损距离,可以有效应对市场波动,降低止损被触发的概率。
部分止盈逻辑可以锁定部分利润,降低回撤风险。
策略逻辑简单清晰,容易理解和实现,适合 traders 参考借鉴。
趋势突然反转时,止损距离可能太大,无法及时止损,可能带来较大亏损。
ATR指标计算的止损距离可能过于灵活,容易被市场噪音频繁触发止损。
部分止盈比例设置不当,可能错失趋势机会或增加亏损。
需要优化的参数较多,如ATR周期、止损跟踪比例、部分止盈比例等,优化难度较大。
策略仅基于均线和ATR指标,当这些指标发出错误信号时,会产生交易失误。
可以结合其他指标过滤交易信号,避免均线产生错误信号。例如MACD,KD等。
可以考虑将固定的部分止盈,改为动态比例止盈,根据趋势强度调整。
可以测试不同的ATR周期参数,采用最稳定的参数。也可以结合其他指标来决定止损距离。
可以引入机器学习算法,通过算法自动优化参数,并根据市场实时调整参数。
可以结合深度学习等高级算法,通过模型训练自动识别趋势,生成交易信号。
本策略整合了趋势跟踪止损、ATR动态止损和部分止盈逻辑,可以持续跟随趋势进行止盈,在回撤控制方面也有一定优势。但策略也存在一定局限,如趋势判断指标简单、参数优化难度大等。这给了我们很好的优化方向,通过引入更多指标和技术手段,有望进一步增强策略稳定性和收益率。总体来说,该策略为我们在实盘交易中设计止损和止盈机制提供了很好的参考。
/*backtest start: 2023-09-29 00:00:00 end: 2023-10-29 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/ // © felipefs //@version=4 strategy("Meu Script", overlay=true) plot(ohlc4) //Funçao de Datas testStartYear = input(2018, "Backtest Start Year") testStartMonth = input(6, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(30, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0) testPeriod() => time >= testPeriodStart and time <= testPeriodStop ? true : false //Funções de Trailing Stop long_stop_price = 0.0 short_stop_price = 0.0 long_trail_perc = 0 short_trail_perc = 0 long_stop_price := if (strategy.position_size > 0) stopValue = close * (1 - long_trail_perc) max(stopValue, long_stop_price[1]) else 0 short_stop_price := if (strategy.position_size < 0) stopValue = close * (1 + short_trail_perc) min(stopValue, short_stop_price[1]) else 999999 //Função de Debug debug(value) => x = bar_index y = close label.new(x, y, tostring(value)) //Take Profit profit = close * (1 + 0.12) strategy.entry("Long", true) strategy.exit("Take Profit 1 Long", from_entry="Long", limit=profit, qty_percent=50.0) //ATR Stop // xATRTrailingStopLong = 0.0 // xATR = atr(nATRPeriod) // nLossLong = nATRMultipLong * xATR // if (strategy.position_size > 0) // xATRTrailingStopLong := max(nz(xATRTrailingStopLong[1]), close - nLossLong)