我们前面学习到,用currency
参数可以模拟跨币种回测,非常方便。但一个敏感的问题随之而来:TradingView用的是昨天的汇率来换算,而我的券商用的是实时汇率,这会导致我的回测报告失真吗?这个差异到底有多大?值得我们担心吗?
今天学长就带你用一个实验,把这个问题彻底看清楚。
我们的实验设计很简单:
- 我们写一个策略,设定账户为欧元(
currency=currency.EUR
),然后去交易一个以美元计价的品种。 - 这个策略很特别,它会在每根K线上都稳定地赚或亏10美元。这样我们就能排除交易逻辑的干扰,专门观察这10美元在换算成欧元时发生的变化。
- 我们用三条不同颜色的线,来追踪这10美元换算成欧元后的样子:
- 蓝线:TradingView官方的换算结果。
- 红点:我们自己模拟的昨日汇率换算结果。
- 紫线:我们模拟的实时汇率换算结果(用1分钟数据代替)。
通过对比这三条线,我们就能直观地看到汇率延迟到底造成了多大的差异。
下面是完整代码:
//@version=6
strategy(title="示例 - TradingView中的货币换算",currency=currency.EUR)
// 设定每根固定有 10 USD 需要换成 EUR
tenUsd = 10.0
// 蓝线:TV官方汇率
tvUsdToEur = request.currency_rate(currency.USD, currency.EUR)
blue_tv_eur = tenUsd * tvUsdToEur
plot(blue_tv_eur, color=color.blue, linewidth=2, title="TV官方换算(10USD→EUR)")
// 红点:昨日日线汇率
dailyEURUSD_prev = request.security("EURUSD", "D", close[1], lookahead=barmerge.lookahead_off)
red_prev_eur = tenUsd / dailyEURUSD_prev
plot(red_prev_eur, color=color.new(color.red, 30), style=plot.style_circles, linewidth=3, title="昨日汇率(10USD→EUR)")
// 紫线:取当日最后1分钟
eurusd_minute = request.security("EURUSD", "1", close, lookahead=barmerge.lookahead_off)
purple_min_eur = tenUsd / eurusd_minute
plot(purple_min_eur, color=color.purple, linewidth=3, title="分钟汇率(10USD→EUR)")
当我们将脚本加载到图表上,结果一目了然:
从图上我们可以清晰地看到:蓝线和红点几乎完全重合,这证明了TV确实是使用了前一天的收盘价作为当天的换算汇率。紫线和蓝/红线非常接近,虽然紫线因为日内波动而上下起伏,但它和代表昨日汇率的蓝/红线之间的差异非常小。在汇率波动更剧烈的时候,差异可能会稍微变大,但整体上依然处于很小的范围内。
经过这个实验,我们可以得出一个清晰且让人放心的结论,对于绝大多数中长线策略,TradingView的汇率延迟所造成的差异小到可以忽略不计。因为从长期来看,今天汇率比昨天高,你可能占了便宜;明天汇率比昨天低,你可能吃了亏,这些微小的差异在成百上千笔交易中,会相互抵消。更重要的与其去纠结这百分之一都不到的汇率换算差异,你更应该把精力放在那些能让回测结果产生10%甚至50%偏差的巨坑上,比如:你是否合理设置了手续费和滑点?你的策略是否存在未来函数?抓大放小,这才是专业策略开发者应有的精力分配和关注点。
总结
TradingView在进行跨币种回测时,使用的是相关外汇对前一交易日的收盘价作为换算汇率,这与经纪商使用的实时汇率存在微小差异,但实验证明,这个差异对于大多数策略来说影响极小。相比于手续费、滑点等核心成本,汇率换算的微小差异不应成为你评估策略时的主要担忧。