You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TradingView Pine Script:如何动态设置commission_value适配CFD手续费?

解决方案:自定义模拟CFD动态手续费规则

在Pine Script中,无法直接在strategy.entry或strategy.exit调用中单独设置commission_value——佣金参数是策略全局生效的,只能通过strategy()初始化或strategy.commission.set_value()修改全局规则,没法针对单笔交易的止损、仓位或盈亏状态动态调整。不过可以通过关闭默认佣金+手动计算并扣除手续费的方式,完全匹配你描述的CFD规则。

核心思路

  1. 关闭策略默认佣金设置
  2. 开仓时记录单笔交易的关键参数:仓位金额、止损点数
  3. 平仓时判断交易是否盈利,仅对盈利交易计算并扣除对应手续费

代码实现示例

//@version=5
strategy("CFD Custom Commission", overlay=true, 
         commission_type=strategy.commission.none,  // 关闭默认佣金
         initial_capital=2000, default_qty_type=strategy.cash, default_qty_value=20)

// 全局变量存储单笔交易参数
var float tradePositionSize = na
var float tradeStopLossPoints = na

// 示例开仓逻辑(可替换为你的策略条件)
longSignal = ta.crossover(ta.sma(close, 20), ta.sma(close, 50))
if (longSignal)
    // 计算仓位:账户余额1%
    tradePositionSize = strategy.equity * 0.01
    // 设置止损点数(这里示例为10,可根据策略动态调整)
    tradeStopLossPoints = 10
    stopLossPrice = close - tradeStopLossPoints * syminfo.mintick
    
    // 开仓+挂止损单
    strategy.entry("Long", strategy.long, qty=tradePositionSize/close)
    strategy.exit("Exit Long", "Long", stop=stopLossPrice)

// 监听平仓事件,计算并扣除手续费
if (strategy.closedtrades != strategy.closedtrades[1])
    lastTradeIdx = strategy.closedtrades - 1
    lastTradeProfit = strategy.closedtrades.profit(lastTradeIdx)
    
    // 仅对盈利交易收取手续费
    if (lastTradeProfit > 0)
        // 按规则计算手续费:(仓位金额 / 止损点数) * 1.5点差
        commission = (tradePositionSize / tradeStopLossPoints) * 1.5
        // 从账户权益中扣除手续费
        strategy.equity := strategy.equity - commission

关键细节说明

  • 止损点数与价格单位:代码中用syminfo.mintick处理不同品种的最小价格变动,确保止损点数计算准确(比如EURUSD的1点差对应0.0001,10点差就是0.0010)
  • 手续费触发条件:仅当交易盈利时才扣除,止损触发的亏损交易只扣除仓位本金,符合你的规则
  • 多信号兼容:如果是多品种或多信号策略,建议用数组存储每笔交易的参数,避免信号覆盖冲突

内容的提问来源于stack exchange,提问作者S. F.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 11:20:29