该策略是一个基于均线(EMA)交叉信号的趋势跟踪系统。它采用34周期EMA作为主要趋势指标,结合分批获利和风险控制机制,实现全自动化交易。策略的核心是通过价格与EMA的交叉来捕捉趋势启动点,并通过设置多重获利目标来最大化盈利机会。
策略主要基于以下核心原理运作: 1. 使用34周期EMA作为趋势判断指标 2. 当价格向上穿越EMA时,在EMA价格位置开仓做多 3. 采用三重获利目标(5%, 10%, 15%)实现分批止盈 4. 设置7%止损以控制风险 5. 保留10%仓位作为长期持仓以把握大趋势 6. 通过8小时最小交易间隔来避免过度交易 7. 支持固定交易量和动态仓位规模两种方式
这是一个设计合理、逻辑清晰的趋势跟踪策略。通过均线交叉捕捉趋势,使用多重获利目标管理风险,并保留部分仓位把握大趋势。策略的可调整性强,适合不同风险偏好的交易者使用。虽然存在一些固有的风险,但通过合理的参数设置和风险管理可以实现稳定的收益。
/*backtest
start: 2024-02-08 00:00:00
end: 2025-02-06 08:00:00
period: 2d
basePeriod: 2d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("EMA25 Long Strategy", overlay=true)
// Inputs
initial_capital = input.float(50000, title="Initial Capital ($)")
leverage = input.int(1, title="Leverage")
mode = input.string("Fixed Volume", title="Position Sizing Mode", options=["Fixed Volume", "Current Balance"])
ema_length = input.int(34, title="EMA Length")
stop_loss_percent = input.float(7, title="Stop Loss (%)", step=0.1) / 100
take_profit_1_percent = input.float(5, title="Take Profit 1 (%)", step=0.1) / 100
take_profit_2_percent = input.float(10, title="Take Profit 2 (%)", step=0.1) / 100
take_profit_3_percent = input.float(15, title="Take Profit 3 (%)", step=0.1) / 100
position_size_percent = input.float(100, title="Position Size (%)", step=1) / 100
long_term_hold_percent = input.float(10, title="Long Term Hold (%)", step=1) / 100
trade_delay = input.int(8, title="Trade Delay (hours)", minval=1) * 60 // Convert hours to minutes
// Calculate EMA
ema = ta.ema(close, ema_length)
// Plot EMA
plot(ema, title="EMA25", color=color.blue)
// Determine if a new trade can be placed
var float last_trade_time = na
can_trade = na(last_trade_time) or (time - last_trade_time) > trade_delay * 60 * 1000
// Determine position size based on selected mode
var float position_size = na
if (mode == "Fixed Volume")
position_size := initial_capital * leverage * position_size_percent / close
else
position_size := strategy.equity * leverage * position_size_percent / close
// Entry Condition
var float entry_price = na
price_crossed_ema_up = ta.crossover(close, ema)
price_crossed_ema_down = ta.crossunder(close, ema)
if ((price_crossed_ema_up or price_crossed_ema_down) and can_trade)
entry_price := ema
strategy.entry("Long", strategy.long, qty=position_size, limit=entry_price)
last_trade_time := time
label.new(bar_index, entry_price, text="Entry", color=color.green, style=label.style_label_up, textcolor=color.white, size=size.small)
// Stop Loss
strategy.exit("Stop Loss", from_entry="Long", stop=entry_price * (1 - stop_loss_percent))
// Take Profits
take_profit_1_price = entry_price * (1 + take_profit_1_percent)
take_profit_2_price = entry_price * (1 + take_profit_2_percent)
take_profit_3_price = entry_price * (1 + take_profit_3_percent)
strategy.exit("Take Profit 1", from_entry="Long", limit=take_profit_1_price, qty=position_size / 3)
strategy.exit("Take Profit 2", from_entry="Long", limit=take_profit_2_price, qty=position_size / 3)
strategy.exit("Take Profit 3", from_entry="Long", limit=take_profit_3_price, qty=position_size / 3)
// Long Term Hold (10% of position)
hold_qty = position_size * long_term_hold_percent
if (strategy.position_size > hold_qty)
strategy.close("Long Term Hold")