这个Pine脚本策略在TradingView平台上实现了一种每日均成本策略,同时结合了EMA指标的触碰信号来确定入场点。策略遵循均成本投资法则,每天以固定金额进行买入,以分散风险。同时,通过EMA的触碰信号来指导具体的入场时机。
该策略主要具有以下几个特点:
每日均成本投资法则
EMA指标确定入场点
动态止损机制
最大仓位限制
具体来说,策略每天投入固定金额,按当日收盘价计算可以购买的股票数量。在这个基础上,如果当天的收盘价上穿5日、10日、20日等EMA中的任意一条时,就会触发买入信号。一旦累积的仓位达到最大限制的300笔时,就不会有新的买入操作。另外,如果收盘价跌破20日SMA,或者到达提前设定的退出日期,就会清仓止损。该策略还在价格图上绘制不同周期的EMA线,方便直观分析。
该策略具有以下几个优势:
分散投资,降低单笔投资风险
EMA结合,避开短期调整
动态止损,控制亏损
最大仓位限制,控制风险
直观的EMA显示,易于判定
高度可定制化
该策略也存在一些风险需要注意:
系统性风险难以规避
固定投资金额带来的风险
EMA无法对极端行情作出反应
仓位限制也限制了盈利空间
停损点设置需要经验和技巧
该策略还具有进一步优化的空间:
增加动态调整每日投入金额
结合更多指标判断入场
采用指数移动平均
动态调整最大仓位
采用渐进式止损
总的来说,该每日均成本策略结合EMA触碰信号,实现了长期分批投资的思路。相比单次大手开仓,可以分散风险,避免在高点狂欢。EMA的加入也在一定程度上避让了短期调整带来的风险,采取止损措施控制最大亏损。同时,仍需要注意黑天鹅风险,以及固定投入金额无法充分抓住机会带来的遗憾等问题。这些都为策略进一步的优化提供了方向。通过参数调整与指标组合,可以逐步优化并实现既高效又稳定的量化交易策略。
/*backtest
start: 2024-01-08 00:00:00
end: 2024-01-15 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Daily DCA Strategy with Touching EMAs", overlay=true, pyramiding=10000)
// Customizable Parameters
daily_investment = input(50000, title="Daily Investment")
start_year = input(2022, title="Start Year")
start_month = input(1, title="Start Month")
start_day = input(1, title="Start Day")
end_year = input(2023, title="End Year")
end_month = input(12, title="End Month")
end_day = input(1, title="End Day")
trade_count_limit = input(10000, title="Pyramiding Limit")
enable_sell = input(true, title="Enable Sell")
start_date = timestamp(start_year, start_month, start_day)
var int trade_count = 0
// Calculate the number of shares to buy based on the current closing price
shares_to_buy = daily_investment / close
// Check if a new day has started and after the start date
isNewDay = dayofmonth != dayofmonth[1] and time >= start_date
// Buy conditions based on EMA crossovers
ema5_cross_above = crossover(close, ema(close, 5))
ema10_cross_above = crossover(close, ema(close, 10))
ema20_cross_above = crossover(close, ema(close, 20))
ema50_cross_above = crossover(close, ema(close, 50))
ema100_cross_above = crossover(close, ema(close, 100))
ema200_cross_above = crossover(close, ema(close, 200))
if isNewDay and (ema5_cross_above or ema10_cross_above or ema20_cross_above or ema50_cross_above or ema100_cross_above or ema200_cross_above) and trade_count < trade_count_limit
strategy.entry("Buy", strategy.long, qty=shares_to_buy)
trade_count := trade_count + 1
// Dynamic sell conditions (optional)
sell_condition = true
if enable_sell and sell_condition
strategy.close_all()
// EMA Ribbon for visualization
plot(ema(close, 5), color=color.red, title="EMA 5")
plot(ema(close, 10), color=color.orange, title="EMA 10")
plot(ema(close, 20), color=color.yellow, title="EMA 20")
plot(ema(close, 50), color=color.green, title="EMA 50")
plot(ema(close, 100), color=color.blue, title="EMA 100")
plot(ema(close, 200), color=color.purple, title="EMA 200")