如何编写适配所有外汇货币对的Pip Value(点值)计算代码?
外汇全货币对点值计算适配方案
原代码局限
你当前的计算逻辑仅适配基础货币为USD的直盘货币对(如USDCAD、USDJPY),未覆盖计价货币为USD的直盘、以及交叉盘场景。
适配逻辑说明
默认以标准手(10万基础货币单位)、账户计价货币为USD为例,分三类场景处理:
- 计价货币为USD(如EURUSD、GBPUSD):1点波动直接对应USD金额,无需额外汇率转换
- 基础货币为USD(如USDCAD、USDJPY):按原有逻辑,除以当前货币对汇率转换为USD计价
- 交叉盘(基础/计价货币均非USD,如EURJPY、GBPCAD):先计算1点波动对应的计价货币金额,再通过计价货币兑USD的汇率转换为账户计价单位
适配后完整代码(Pine Script)
// 计算点大小 f_pipSize() => syminfo.mintick * (syminfo.type == "forex" ? 10 : 1) // 自动判断货币对类型,计算对应点值(默认账户计价货币为USD) f_getPipValue() => pipSize = f_pipSize() baseCurrency = syminfo.basecurrency quoteCurrency = syminfo.currency standardLot = 100000 if quoteCurrency == "USD" // 计价货币为USD的直盘 pipSize * standardLot else if baseCurrency == "USD" // 基础货币为USD的直盘,即原有适配场景 (pipSize * standardLot) / close else // 交叉盘,获取计价货币兑USD的汇率 usdQuoteTicker = syminfo.prefix + ":" + quoteCurrency + "USD" usdQuoteRate = request.security(usdQuoteTicker, timeframe.period, close) (pipSize * standardLot) / usdQuoteRate float _pipValue = f_getPipValue()
自定义调整说明
- 若你的账户计价货币不是USD,只需将代码中所有
USD替换为你的账户计价货币代码即可 - 若需要计算迷你手(1万单位)、微型手(1千单位)的点值,调整
standardLot变量的数值即可
内容的提问来源于stack exchange,提问作者nop
相关产品推荐
相关产品推荐

