作为交易员,我们最常犯的一个错误,就是在回测时过度美化策略的表现。一个策略在图表上看起来天衣无缝,净值曲线一路向北,可一旦投入实盘,结果却往往不尽人意。这中间的差距,很多时候就出在被我们忽略的交易成本上,也就是手续费和佣金。
一个不考虑交易成本的回测,几乎没有任何实战参考价值。幸运的是,Pine Script 提供了内置的功能,让我们可以轻松地在策略中模拟真实的交易成本。今天我们就来聊聊 strategy()
函数中至关重要的两个参数:commission_value
和 commission_type
。
简单来说,commission_value
用来设定手续费的数额,而 commission_type
则决定了这个数额的计算方式。
在 Pine Script 中,你可以通过三种不同的方式来定义手续费,这基本涵盖了市面上主流券商的收费模式。
1. 按成交额百分比
这是最常见的方式,尤其是在股票和加密货币交易中。比如设置每笔订单的手续费为成交额的0.5%。这也是TradingView策略的默认手续费类型。
//@version=6
strategy(title="我的策略", commission_value = 0.5)
// 此处 commission_type 默认值为 strategy.commission.percent
这里有个新手非常容易踩的坑,commission_value = 0.5
代表的是 0.5%,而不是0.005
,千万不要在这里做多余的换算,否则你的手续费就设置错了。
2. 按每笔订单固定金额
这种方式在某些外汇平台比较常见,无论你下单多少,每笔交易都收取固定的费用。要实现这一点,我们需要将 commission_type
设置为 strategy.commission.cash_per_order
。
例如设置每笔订单的手续费为2.25(比如$2.25):
//@version=6
strategy(title="我的策略", commission_value = 2.25,
commission_type = strategy.commission.cash_per_order)
3. 按每手/每股固定金额
这种模式在期货和期权交易中最为普遍,即每交易一个合约(或一股)收取固定费用。你需要将 commission_type
设置为 strategy.commission.cash_per_contract
。
例如设置每交易一手合约的手续费为0.35:
//@version=6
strategy(title="我的策略", commission_value = 0.35,
commission_type = strategy.commission.cash_per_contract)
总结
在使用手续费设置时,有几个关键点你需要牢记:commission_value
只能接受一个固定的数字,不能是动态变化的变量。这意味着你无法在回测中模拟阶梯式佣金(即交易量越大,费率越低),整个回测期间,费率是恒定的。如果你不进行任何设置,commission_value
的默认值是0,
这意味着你的策略回测将是“零成本”的理想化模型,这在实战中是不存在的。还有设置的佣金适用于所有类型的订单(市价、限价、止损)和所有方向(多头、空头)。关于货币单位,当你使用固定金额类型时 (cash_per_order
或 cash_per_contract
),费用的单位与你策略设置的账户货币一致。如果你的策略货币是美元,那么commission_value = 2
就代表2美元。