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

MetaTrader 5如何获取当前交易品种的价格小数位数

在MetaTrader 5中获取交易品种的"点"对应报价变动值

你需要的是传统交易中"1点"对应的报价变动数值(即DAX=1、黄金=0.1、外汇=0.0001这类数据),以下是正确的实现方式及对你之前问题的解释:

先纠正你之前的错误操作

  1. symbolInfo.Digits()返回0.0的原因:
    CSymbolInfo对象必须先初始化才能获取有效数据,你需要先调用symbolInfo.Name(_Symbol)指定品种,再调用symbolInfo.Refresh()刷新数据,否则方法会返回无效值。而且Digits()返回的是报价的小数位数(整数),比如DAX返回1,黄金返回1,它不是你要的"点"数值。

  2. SYMBOL_POINT返回值的含义:
    这个属性返回的是报价的最小变动步长(Tick Size),比如DAX的Tick Size是0.1,黄金的Tick Size也是0.1,但这和你要的"点"不是同一个概念——不同品种的"点"和Tick Size的对应关系由经纪商定义(比如DAX的1点=10个Tick,黄金的1点=1个Tick)。

正确获取"点"对应报价变动值的方法

你需要通过SYMBOL_POINT_DIGITS属性获取"点"的小数位数,再计算对应的数值:

方法1:使用CSymbolInfo类

#include <Trade/SymbolInfo.mqh>

void OnStart()
{
    CSymbolInfo symbolInfo;
    // 初始化并刷新品种信息
    if(!symbolInfo.Name(_Symbol) || !symbolInfo.Refresh())
    {
        Print("获取品种信息失败,错误代码:", GetLastError());
        return;
    }

    // 获取点的小数位数,计算对应的报价变动值
    int pointDigits = symbolInfo.PointDigits();
    double pointValue = MathPow(10, -pointDigits);

    Print(_Symbol, "的1点对应报价变动:", pointValue);
}

方法2:直接使用SymbolInfoInteger函数

如果不想用类,也可以直接调用API函数:

void OnStart()
{
    int pointDigits = SymbolInfoInteger(_Symbol, SYMBOL_POINT_DIGITS);
    if(pointDigits == -1)
    {
        Print("获取点位数失败,错误代码:", GetLastError());
        return;
    }

    double pointValue = MathPow(10, -pointDigits);
    Print(_Symbol, "的1点对应报价变动:", pointValue);
}

验证结果

运行代码后,你会得到符合需求的结果:

  • DAX:pointDigits=0 → pointValue=1
  • 黄金:pointDigits=1 → pointValue=0.1
  • 欧美(4位报价):pointDigits=4 → pointValue=0.0001

内容的提问来源于stack exchange,提问作者dns_nx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 15:05:53