欢迎访问 外汇EA下载与MT4/MT5自动交易资源 - 聚合外汇EA、黄金EA、量化交易工具与自动化交易实战内容。
登录 注册

Math Utils - MetaTrader 5 库

author emer | 367 人阅读 | 0 人评论 |
整数比较(双倍的一个,双倍的乙、整数数字);布尔值情商(双倍的一个,双倍的乙、整数数字=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小时后评论,即可解锁附件下载
    立即登录