MQL4/MQL5双精度数位选取及按TickSize价格取整问题求助
MQL4/MQL5 技术问题解答
1. 提取双精度数的指定数位
整数部分数位提取
通过数学运算提取整数部分从右数第k位(个位为第1位):
int GetIntegerDigit(double number, int k) { long integerPart = (long)MathAbs(number); for(int i = 1; i < k; i++) { integerPart /= 10; } return (int)(integerPart % 10); }
- 调用示例:
GetIntegerDigit(1256.57, 2)返回十位的5,GetIntegerDigit(1256.57, 1)返回个位的6。
小数部分数位提取
提取小数部分从左数第k位(小数点后第一位为第1位):
int GetDecimalDigit(double number, int k) { double decimalPart = MathAbs(number) - (long)MathAbs(number); for(int i = 1; i < k; i++) { decimalPart *= 10; decimalPart -= (long)decimalPart; } decimalPart *= 10; return (int)MathFloor(decimalPart); }
- 调用示例:
GetDecimalDigit(1256.57, 1)返回小数点后第一位的5,GetDecimalDigit(1256.57, 2)返回第二位的7。
字符串方法提取(灵活定位)
将数值转为字符串后按索引提取,需注意小数点占位:
int GetDigitByIndex(double number, int index) { string numStr = DoubleToString(number, Digits); int dotIndex = StringFind(numStr, "."); // 若索引包含小数点位置,自动跳过 if(dotIndex != -1 && index >= dotIndex) { index++; } if(index < 0 || index >= StringLen(numStr)) return -1; // 无效位置返回-1 return (int)(StringGetChar(numStr, index) - '0'); }
- 调用示例:
GetDigitByIndex(1256.57, 3)返回整数部分最后一位6(字符串索引从0开始)。
2. 按TickSize对资产价格取整的函数
根据需求实现向下取整、向上取整两种逻辑,同时通过NormalizeDouble修正浮点数精度误差:
向下取整(示例中输出1256.55)
double RoundPriceDown(double price, double tickSize) { double result = MathFloor(price / tickSize) * tickSize; return NormalizeDouble(result, Digits); }
向上取整(示例中输出1256.60)
double RoundPriceUp(double price, double tickSize) { double result = MathCeil(price / tickSize) * tickSize; return NormalizeDouble(result, Digits); }
调用示例
void OnStart() { double inputPrice = 1256.57; double tickSize = 0.05; Print("向下取整结果: ", RoundPriceDown(inputPrice, tickSize)); // 输出1256.55 Print("向上取整结果: ", RoundPriceUp(inputPrice, tickSize)); // 输出1256.60 }
内容的提问来源于stack exchange,提问作者Feduz
相关产品推荐
相关产品推荐

