
本策略通过计算快线EMA和慢线EMA,并比较两者的大小关系,实现双EMA的金叉和死叉交易信号,属于趋势跟踪策略。当快线上穿慢线时生成买入信号,当快线下穿慢线时生成卖出信号,实现了一个简单的趋势追踪策略。
该策略的核心逻辑主要包含以下几个部分:
计算快线EMA和慢线EMA:通过ta.ema()函数计算长度为fastInput的快线EMA和长度为slowInput的慢线EMA。
设置回测时间范围:通过useDateFilter参数设置是否过滤回测时间,backtestStartDate和backtestEndDate设置回测开始和结束时间。
生成交易信号:通过ta.crossover()和ta.crossunder()函数比较快线EMA和慢线EMA的大小关系,当快线上穿慢线时生成买入信号,当快线下穿慢线时生成卖出信号。
处理时间范围外的订单:在回测时间范围外会取消未成交的订单,并平掉所有头寸。
绘制移动平均线:在图表上绘制出快线EMA和慢线EMA的移动平均线。
这是一个非常简单的趋势跟踪策略,具有以下几点优势:
策略逻辑简单,易于理解和实现。
EMA平滑了价格数据,可以减少噪音交易。
可自定义EMA周期参数,适应不同市场环境。
可灵活设置回测时间范围,针对特定时间范围进行测试。
可优化入场和出场条件,结合其他指标等使用。
该策略也存在一些风险需要注意:
双EMA策略较为粗放,无法灵活应对市场变化。
存在频繁交易和重复交易的风险。
EMA参数设置不当可能导致交易信号错误。
回测时间范围不合理可能导致过拟合。
存在避免不了回撤和亏损的风险。
可通过参数优化、适当过滤波动、设置止损等方式来控制风险。
该策略可从以下几个方面进行优化:
优化EMA周期参数,选择最佳参数组合。
增加其他指标过滤,避免不必要的交易。
增加止损策略,控制单笔亏损。
结合趋势、波动率等过滤器,减少交易频率。
测试不同的品种合约,寻找最佳策略适用对象。
使用滑点、手续费等成本控制,使回测更真实。
本策略整体来说是一个非常简单的双EMA金叉死叉策略,逻辑清晰易懂,通过快慢线EMA比较产生交易信号。该策略优点是实现简单,但也存在一些问题如频繁交易、容易造成过优化等。下一步可从参数优化、风险控制等方面进行改进,使策略更稳健实用。
/*backtest
start: 2022-11-06 00:00:00
end: 2023-11-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("MollyETF_EMA_Crossover", overlay = true, initial_capital = 100000, default_qty_value=100, default_qty_type=strategy.percent_of_equity)
fastInput = input( 10, "Fast EMA")
slowInput = input( 21, "Slow EMA")
// Calculate two moving averages with different lengths.
float fastMA = ta.ema(close, fastInput)
float slowMA = ta.ema(close, slowInput)
// STEP 1. Create inputs that configure the backtest's date range
useDateFilter = input.bool(true, title="Filter Date Range of Backtest",
group="Backtest Time Period")
backtestStartDate = input(timestamp("1 Jan 2018"),
title="Start Date", group="Backtest Time Period",
tooltip="This start date is in the time zone of the exchange " +
"where the chart's instrument trades. It doesn't use the time " +
"zone of the chart or of your computer.")
backtestEndDate = input(timestamp("7 Sep 2023"),
title="End Date", group="Backtest Time Period",
tooltip="This end date is in the time zone of the exchange " +
"where the chart's instrument trades. It doesn't use the time " +
"zone of the chart or of your computer.")
// STEP 2. See if current bar falls inside the date range
inTradeWindow = true
// STEP 3. Include the date filter with the entry order conditions
// Enter a long position when `fastMA` crosses over `slowMA`.
if inTradeWindow and ta.crossover(fastMA, slowMA)
strategy.entry("buy", strategy.long)
// Enter a short position when `fastMA` crosses under `slowMA`.
if inTradeWindow and ta.crossunder(fastMA, slowMA)
strategy.close_all(comment="sell")
// STEP 4. With the backtest date range over, exit all open
// trades and cancel all unfilled pending orders
if not inTradeWindow and inTradeWindow[1]
strategy.cancel_all()
strategy.close_all(comment="Date Range Exit")
// Plot the moving averages.
plot(fastMA, "Fast MA", color.aqua)
plot(slowMA, "Slow MA", color.orange)