该策略通过设定价格突破的高点和低点,实现对加密货币价格趋势的追踪。当价格突破最高点时做多,当价格突破最低点时做空,实现对趋势的捕捉。
该策略主要通过平滑移动平均线加权法判断价格是否出现明显的上涨或下跌趋势。具体来说,它会统计一定周期内最高价和最低价,当实际交易价格超过统计的最高价时,判断为上涨趋势出现,则做多;当实际交易价格低于统计的最低价时,判断为下跌趋势出现,则做空。
做多做空的开仓价格通过输入参数“ENTRY”设置,平仓价格通过“EXIT”参数设置。回测时段也可以通过参数设定。这样可以通过调整参数,寻找最佳的 combo 组合。
具体来说,策略的主要逻辑是:
通过该逻辑循环,可以捕捉价格的上涨和下跌趋势,实现趋势跟踪。
该策略最大的优势在于通过参数调整,可以自动捕捉价格趋势,无需人工判断趋势方向。只要参数设定得当,就可以自动跟踪加密货币的价格波动。
另外,该策略非常适合作用于量化交易,可以轻松实现自动化下单。无需人工操作,降低了情绪化交易的风险,可以大幅提高交易效率。
最后,该策略还可以通过参数调整最大化收益。通过测试不同的 ENTRY 和 EXIT 参数,可以找到最优参数,实现收益最大化。
该策略最大的风险在于参数设置不当可能导致过于频繁交易,增加交易费用和滑点损失。如果 ENTRY 设置过低、EXIT 设置过高,很容易产生虚议交易信号。
另外,如果参数调整不当,也可能导致无法及时捕捉价格趋势,错过交易机会。这就需要通过大量回测来找到最优参数。
最后,该策略对短期市场噪音过于敏感,可能产生错误交易信号。这需要通过适当设置交易时间周期参数来避免。
该策略可以通过以下几个方向继续优化:
增加止损逻辑。这样可以在亏损扩大至一定比例时止损退出,避免更大的损失。
增加移动平均线等技术指标过滤。利用 MA、KDJ 等指标判断大趋势,避免短期噪音带来过多交易。
优化参数设置逻辑。可以设定 ENTRY、EXIT 参数的自适应变化机制,而非静态设置,使其可以根据市场环境调整参数。
利用机器学习训练最优参数。通过大量历史数据训练,获得对当前市场环境最优的 ENTRY 和 EXIT 设置。
该策略通过捕捉价格趋势实现自动化交易,最大优势是可以减少人为情绪对交易的影响,降低风险,提高效率。同时可以通过参数调整寻找最优收益点。
策略的主要风险在于参数设置不当,以及对市场噪音过于敏感。这需要通过止损、指标过滤、参数自适应优化等手段进行改进。
总体来说,该策略为简单有效的趋势跟踪策略,适合量化和自动交易。通过持续优化,可以进一步提高策略稳定性。
/*backtest
start: 2022-12-01 00:00:00
end: 2023-12-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/
// © JstMtlQC
//@version=4
strategy("Trend Following Breakout",calc_on_order_fills=true,calc_on_every_tick =false, overlay=true, initial_capital=2000,commission_value=.1,default_qty_type = strategy.percent_of_equity, default_qty_value = 100)
/////////////// INPUT ENTRY EXIT
entry= input(100, "ENTRY H/L")
exit= input(50, "EXIT H/L")
/////////////// Backtest Input
FromYear = input(2015, "Backtest Start Year")
FromMonth = input(1, "Backtest Start Month")
FromDay = input(1, "Backtest Start Day")
ToYear = input(2999, "Backtest End Year")
ToMonth = input(1, "Backtest End Month")
ToDay = input(1, "Backtest End Day")
/////////////// Backtest Setting
start = timestamp(FromYear, FromMonth, FromDay, 00, 00)
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)
window() => time >= start and time <= finish ? true : false
/////////////// BUY OPEN PLOT
highestpricelong = highest(high,entry)[1]
plot(highestpricelong, color=color.green, linewidth=2)
/////////////// BUY CLOSE PLOT
lowestpricelong = lowest(high,exit)[1]
plot(lowestpricelong, color=color.green, linewidth=2)
/////////////// SHORT OPEN PLOT
lowestpriceshort = lowest(low,entry)[1]
plot(lowestpriceshort, color=color.red, linewidth=2)
/////////////// SHORT CLOSE PLOT
highestpriceshort = highest(low,exit)[1]
plot(highestpriceshort, color=color.red, linewidth=2)
///////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////// CONDITION LONG SHORT //////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////
/////////////// SHORT
entryshort= crossunder(close, lowestpriceshort)
exitshort= crossover(close,highestpriceshort)
/////////////// LONG
exitlong= crossover(close, lowestpricelong)
entrylong= crossover(close,highestpricelong)
///////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////// LONG and SHORT ORDER //////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////
/////////////// LONG
if (entrylong)
strategy.entry("LongEntry", strategy.long, when = window())
if (exitlong or entryshort)
strategy.close("LongEntry", when=window())
/////////////// SHORT
if (entryshort)
strategy.entry("short", strategy.short, when = window())
if (exitshort or entrylong)
strategy.close("short", when=window())