MetaTrader 5如何获取当前交易品种的价格小数位数
在MetaTrader 5中获取交易品种的"点"对应报价变动值
你需要的是传统交易中"1点"对应的报价变动数值(即DAX=1、黄金=0.1、外汇=0.0001这类数据),以下是正确的实现方式及对你之前问题的解释:
先纠正你之前的错误操作
symbolInfo.Digits()返回0.0的原因:CSymbolInfo对象必须先初始化才能获取有效数据,你需要先调用symbolInfo.Name(_Symbol)指定品种,再调用symbolInfo.Refresh()刷新数据,否则方法会返回无效值。而且Digits()返回的是报价的小数位数(整数),比如DAX返回1,黄金返回1,它不是你要的"点"数值。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
相关产品推荐
相关产品推荐

