Math Utils - MetaTrader 5 库
整数比较(双倍的一个,双倍的乙、整数数字);布尔值情商(双倍的一个,双倍的乙、整数数字=8);布尔值东北(双倍的一个,双倍的乙、整数数字=8);布尔值GT(双倍的一个,双倍的乙、整数数字=8);布尔值LT(双倍的一个,双倍的乙、整数数字=8);布尔值GTE(双倍的一个,双倍的乙、整数数字=8);布尔值LTE(双倍的一个,双倍的乙、整数数字=8);布尔值几乎等于(双倍的一个,双倍的b);布尔值等于双打(双倍的一个,双倍的乙、整数重要数字 =15);布尔值关闭(双倍的一个,双倍的乙、整数最大不同有效数字 =2);整数 获取相等的数字(双倍的一个,双倍的b);整数 获取EqualSigDigits(双倍的一个,双倍的b);
方便的双精度舍入函数
双倍的天花板(常量 双倍的五);双倍的天花板(常量 双倍的 价值,常量 整数数字);双倍的天花板(常量 双倍的 价值,常量 双倍的步);双倍的地面(常量 双倍的五);双倍的地面(常量 双倍的 价值,常量 整数数字);双倍的地面(常量 双倍的 价值,常量 双倍的步);双倍的圆形的(常量 双倍的五);双倍的圆形的(常量 双倍的 价值,常量 整数数字);双倍的圆形的(常量 双倍的 价值,常量 双倍的步);双倍的截断(常量 双倍的五);双倍的截断(常量 双倍的 价值,常量 整数数字);双倍的截断(常量 双倍的 价值,常量 双倍的步);双倍的舍入到有效数字(常量 双倍的 价值,整数数字);双倍的回合价格(双倍的p价格,细绳pSymbol = NULL);双倍的回合体积(双倍的p体积,细绳pSymbol = NULL);双倍的剥离错误(常量 双倍的 价值);
双打的各种便利功能
// 判断传入的值是否为整数。 布尔值 是整数(双倍的 价值);// 检查一个数字是否具有指定数量的小数位。 布尔值 是圆的(双倍的 价值,整数数字);// 检查一个数字是否是某个增量的整数倍。 布尔值 是圆的(双倍的 价值,双倍的步);// 获取 x 的小数部分(始终与 x 具有相同的符号) 双倍的压裂(双倍的 价值);// 获取小数点后的小数位数。 整数 获取数字(双倍的 价值);// 获取小数点左边的整数位数。 整数 获取整数数字(双倍的 价值);// 获取有效位数,不包括前导零和尾随零。 整数 获取有效数字(双倍的 价值);// 将范围 [min, max] 中的值转换为另一个范围 [destMin, destMax] 中的 y。 双倍的重新映射(双倍的 价值,双倍的分钟,双倍的最大限度,双倍的目的地分钟,双倍的目标最大)// 将尺度 [min, max] 上的值重新映射到标准化尺度 [0, 1]。 双倍的标准化(双倍的 价值,双倍的分钟,双倍的最大限度);// 将标准化值 [0, 1] 重新映射到比例 [destMin, destMax]。 双倍的非规范化(双倍的 价值,双倍的目的地分钟,双倍的目标最大)// 将数字钳位(限制)到边界(范围)。T 夹具(T价值,T 最小值,T 最大值);// 将数字钳位(限制)为最大值。T ClampTop(T价值,T 最大);// 将数字钳位(限制)为最小值。T ClampBot(T价值,T 分钟);// 将一个值包装在 [min, max] 之间的范围内。T 包裹(T价值,T 最小值,T 最大值);// 避免强制 mql 程序停止的零除错误。 双倍的安全Div(双倍的一个,双倍的b);// 返回数字的科学计数法的指数。 整数 楼层日志10(双倍的 价值);// 返回 pow(10, (int)power),使用快速查找表查找幂。 双倍的获取电源10(整数力量);// 计算值的符号为 1, 0, -1 双倍的数学符号(双倍的 价值);
// 返回对应于双精度值的位表示形式。 长的 双倍到长位(双倍的 价值);// 返回对应于位表示的双精度值。 双倍的LongBitsToDouble(长的位);// 返回位表示中指数的原始编码。 整数 原始指数(双倍的 价值);// 返回位表示中有效数的原始编码。 长的 原始有效数字(双倍的 价值);// 返回双精度值的无偏(调整后)指数。 整数 获取指数(双倍的 价值);// 返回双精度值的有效数。 长的 获取有效数字(双倍的 价值);// 确定数字是否可以精确地用 double 表示。 布尔值 IsExactDouble(双倍的 价值);// 返回 x 后远离零的下一个可表示值。 双倍的下一个之后(双倍的 价值);// 将浮点数前进指定数量的 ULP。 双倍的双倍预付(双倍的 价值,长的距离);// 返回参数的 ulp 的大小。 双倍的乌尔普(双倍的 价值);// 返回以 ulp 单位表示的两个浮点数之间的差异。 长的 UlpDiff(双倍的值1,双倍的值2);
// 将数值转换为原始十六进制文本字符串。 细绳双精度到十六进制(双倍的 价值);// 将数值转换为十六进制浮点常量字符串。 细绳DoubleToHexFloatConstant(双倍的 价值);// 将数值转换为精确的十进制文本字符串。 细绳DoubleToStringExact(双倍的 价值);// 将数值转换为科学记数法的字符串。 细绳DoubleToExponential(常量 双倍的 价值,整数数字 = -1);// 将数值转换为最短的往返字符串表示形式。 细绳代表(双倍的 价值);细绳代表(漂浮 价值);// 使用千位分隔符和指定的小数格式化双精度。 细绳格式双精度(常量 双倍的数字,常量 整数数字,常量 细绳分隔符=“,”);
有时,当比较两个假定相等但通过不同计算得出的双精度数字时,比较会出错。实际上,由于二进制舍入误差,A 与 B 的差异非常小(小数点后第 16 位),因此精确比较(==, !=, >, >=, <, <= 操作员)失败。
比较通过不同计算得出的双精度数:
如果(0.1+0.2 == 0.3) // 假 具有追踪止损功能的专家:
如果(新_sl>订单止损())如果(新_sl<订单止损())
具有隐藏止盈功能的专家:
如果(出价>= 隐藏止盈)如果(问<= 隐藏止盈)
比较网格策略中的价格水平:
如果(问< 虚拟止损)如果(出价> 虚拟止损)
为了避免意外结果,最好替换精确比较(==, !=, >, >=, <, <=),通过松散比较来克服浮点不精确性。这个小库提供了所需的功能。
//--- 精确比较可能会失败 如果(要求< virtual_stopLoss)如果(出价 > 虚拟止损)如果(0.1+0.2==0.3) // 错误的 //--- 使用库函数,结果达到预期 如果(LT(询问, virtual_stopLoss))如果(GT(出价, virtual_stopLoss))如果(EQ(0.1+0.2,0.3)) // 真的
附件下载
📎 debug_demo.mq5 (4.63 KB)
📎 math_test.mq5 (29.21 KB)
📎 normalizedouble_errors.mq5 (2.51 KB)
📎 pitfalls.mq5 (3.91 KB)
📎 unnormalized_quotes.mq5 (6.17 KB)
📎 math_utils.mqh (72.99 KB)
Source: MQL5 #20822
💡 精彩内容推荐
✍️ 楼主最新发布
- •
- •
- •
- •
- •
- •
🔗 您可能感兴趣
- •
- •
- •
- •
- •
- •
🔐
请登录后参与评论
注册满12小时后评论,即可解锁附件下载
立即登录
