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

CDouble 和 CDoubleVector - MetaTrader 5 库

author emer | 353 人阅读 | 0 人评论 |

一个库,用于 MQL 开发中使用的常见舍入方法、类型 (double) 的原始包装类以及 CDouble 对象的向量。 MQL5 和 MQL4 兼容!

版本1.02:(2018.02.18)

CDouble 类将基本类型 double 的值包装在对象中。此外,该类还提供几种方法和静态方法四舍五入双打以及 double 类型的数组/集合。

班级双倍:民众对象


#包括<双.mqh>


继承层次结构

虚拟方法实施/覆盖来自 CObject 类:类型,加载,节省,比较

CDouble 类型的对象包含五个数据字段:

细绳
m_符号
分配给类实例的符号,用于检索舍入的手数步长和刻度大小。
双倍的
m_值
分配给实例的原始双精度值。
乌查尔
m_step
舍入步骤表示为 char 以减少内存占用。例如0.0025 变为 25。
乌查尔
m_位
小数点后的位数。
ENUM_PRECISION
模式
将舍入方法锁定到特定“步长”的操作模式。

在我们进一步了解文档之前,这里有一个包装类的实际示例:

MQTick打钩;
  符号信息勾选_象征,打钩);
   CDouble 价格 = tick.ask -0.0087263487676283476,
            sl = 价格 -500*_观点,
            tp = 价格 +500*_观点,
            手数=5.25/3.78789;
  Mql交易请求r={0};
   r.符号=_象征;
   r.价格 = 价格.AsRoundedTick();
   r.sl    = sl.AsRoundedTick();
   r.tp    = tp.AsRoundedTick();
   r.volume=lots.AsRoundedLots();

...

使用静态库方法的另一个示例:

MQTick打钩;
  符号信息勾选_象征,打钩);
  Mql交易请求r={0};
   r.符号=_象征;
   r.价格=tick.ask -0.0087263487676283476,
   r.sl    = 价格 -500*_观点,
   r.tp = 价格 +500*_观点,
   r.体积=5.25/3.78789;
   ...
   CDouble::RoundTradeRequest(r);
  //自动将价格字段舍入为刻度大小  //以及交易量到手数的步骤


静态方法总结

注意:无需了解 OOP 或使用包装类实例即可使用此库。我们所要做的就是使用 CDouble 作用域解析来调用静态函数。语法如下:

类型变量名 = CDouble::Method(args);
修饰符和类型 方法 描述
静态布尔值
是否相等(双数1,
 双数2,
 双步);
比较两个双精度数,并通过从第一个数字减去第二个数字、将总和四舍五入到“步长”并与 0 进行比较来返回布尔值。
静态布尔值
是否相等(双数1,
 双数2,
 整数数字);
比较两个双精度数,并通过从第一个数字减去第二个数字、将总和四舍五入到“数字”并与 0 进行比较来返回 an。
静态整型
比较(双数1,
 双数2,
 双步)
比较两个双精度数并返回一个整数:
  • 如果相等则为 0。
  • 如果数字 1 > 数字 2,则为 1。
  • 如果数字 1 < 数字 2,则为 -1。
静态双
回合到步骤(常量双数, 
 双步)
返回最接近步精度的舍入值(例如 0.0025)。
静态双
舍入到数字(常量双数, 
 整数数字)
返回四舍五入到最接近数字的值(与规范化双精度)。
静态双
回合到升压(常量双数, 
 双步)
返回向上舍入到步精度的值。
静态双
舍入降级(常量双数, 
 双步)
返回向下舍入到步精度的值。
静态双
圆形刻度(常量双数, 
 字符串符号=NULL)
返回最接近的四舍五入值刻度大小当前符号 (symbol=NULL) 或指定符号象征范围。
静态双
回合制手数(常量双数,
 字符串符号=NULL,
 布尔always_return_valid = true)

返回向下舍入到最接近的值批次步骤当前符号 (symbol=NULL) 或指定符号象征范围。

always_return_valid == true:将始终返回有效手数(min_lots <= return_value <= max_lots)

静态无效 (MQL5)
回合交易请求(MqlTradeRequest 和请求)

通过请求中标识的代码修改价格、止损、止盈和成交量字段。

将价格、SL 和 TP 舍入为最接近的价格变动单位。

将交易量向下舍入到最近的手数步长。

静态无效
圆数组到步

(双 &arr[], 双步 = NULL)

静态无效
圆数组到步

(CArrayDouble &arr, 双步 = NULL)

静态整型
获取数字(双浮点数)
返回双精度型中直到尾随零为止的位数。 (例如 0.0002500...将返回 5 位数字)。
静态双
获取点(整数)
返回指定数字的双精度值。 (例如 3 将返回 0.001)。
静态字符串
转字符串

(双数, 整数数字)

MQTick打钩;
  符号信息勾选_象征,打钩);
  双倍的rnd_by_step = CDouble::RoundToStep(tick.bid*1.052565465,_观点);
  双倍的rnd_by_digits = CDouble::RoundToDigit(tick.bid*1.052565465,_数字);
  双倍的by_lot_step = CDouble::RoundToLots(0.123423,_象征);
  双倍的by_tick_size = CDouble::RoundToTick(tick.ask-100*_观点,_象征);
  双倍的总结       = CDouble::RoundToStepUp(3.999999999,_观点);
  双倍的rounddn       = CDouble::RoundToStepDown(3.999999999,_观点);
  整数    数字        = CDouble::GetDigits(0.0000025);
  双倍的点         = CDouble::GetPoint(10);
  布尔值   等于         = CDouble::IsEqual(tick.bid,tick.bid+0.00000009,_观点);
  细绳tostr         = CDouble::ToString(3.1399999999999999);
  整数    比较       = CDouble::Compare(tick.ask,tick.bid);
  #ifdef__MQL5__  Mql交易请求r={0};
   r.符号=_象征;
   r.价格=tick.ask+0.000089849847658759198199999;
   r.sl    = r.价格 -503*_观点;
   r.tp    = r.价格 +503*_观点;
   r.体积=1.127984984;
   
   CDouble::RoundTradeRequest(r);#endif


构造函数总结

双倍(const ENUM_PRECISION 模式 = PRECISION_DEFAULT,
 const 字符串符号 = NULL)

注意:没有必要显式调用构造函数,因为参数已在调用方中初始化。也没有必要指定精度方法,因为有一些方法可以根据方法调用返回舍入值。

枚举精度:

双倍(const Cdouble &other)
复制构造函数:将其他对象的所有私有字段复制到此对象。

示例:

C双数;
C双倍出价(PRECISION_TICK_SIZE,_象征);
C双重要价(买价)
CDouble Ask2 = 出价;
C双倍批次(PRECISION_LOT_STEP,_象征);


作业摘要 - 重载的作业运算符

空白
(常量双精度值)
将原始双精度值分配给 m_value。
空白
(const Cdouble &other)
将 CDouble 对象的原始双精度值分配给 m_value。
空白
重载运算符=,+=,-=,*=,/=双倍的或者C双&) 将原始双精度值分配或修改为 m_value。

笔记:= 赋值运算符可以在与声明相同的行中调用。

C双标;
bid.Set(tick.bid);
CDouble Ask = tick.ask;

C双倍圆周率 =3.14;
C双因子 =2;
pi*=因子;打印(pi.ToString());//6.28


重载算术运算符总结

双倍的
重载运算符+,-,*,/双倍的或者C双&) 可以接受 double 或 CDouble 类型的对象作为参数。在应用与重载运算符关联的算术之后返回双精度值。

笔记:仅有的每个语句都可以使用算术运算符。

重载运算符算术的语法:

type_double_result <-- CDouble_object <--操作员<--双倍的
//CDouble对象总是位于操作符的左侧type_double_result <-- CDouble_object1 <--操作员<-- CDouble_object2//使用两个 CDouble 对象时顺序并不重要。

示例:

C双foo    =3.14;
C双杠    =10;
CDouble foobar = 酒吧 + foo;          //13.14CDouble err = bar + foo + foobar;//错误-非法操作使用

双倍的 变量= 酒吧 / 富;


重载比较运算符总结

布尔值
重载运算符==,!=,>,<,>=,<=双倍的或者C双&

可以接受 double 或 CDouble 类型的对象作为参数。返回值比较的布尔值。

注意:这是使用 Compare 方法进行比较。

C双foo =3.14, 条 =3.139999999999999999999;
   
  打印(富==酒吧);//真的  打印(foo <= 酒吧);//真的  打印(foo >  酒吧);//错误的


实例方法总结

精度控制(默认):digits = 8;步骤 = 1e-08

空白
精确模式(const ENUM_PRECISION 模式)

设置舍入计算和 ToString 的默认模式。覆盖现有的步长和数字设置。注:也可以在构造函数中设置。

枚举精度:

ENUM_PRECISION
精确模式()
返回当前工作精度模式。
空白
(常量双步或点)
将步长设置为指定的精度。覆盖精度模式。
双倍的
()
返回 Step 的当前值。
空白
数字(常量整型数字)
将精度设置为指定的位数。覆盖精度模式并将步长设置为 1e-(数字)。
整数
数字()
返回当前工作数字精度。
双倍的
AsRawDouble()
返回存储的双精度的原始值。
双倍的
圆形()

返回最接近的指定步长的舍入值。默认 = 1e-08。

当 PRECISION_TICK_SIZE 时,步长被锁定为刻度大小。

当 PRECISION_LOT_STEP 时,步骤被锁定到批次步骤。

双倍的
围捕()
返回指定步长的向上舍入值。
双倍的
向下取整()
返回指定步长的向下舍入值。
双倍的
圆角刻度()
返回最接近刻度的舍入值 - 由交易品种的刻度大小指定。
双倍的
圆形地块(布尔always_return_valid = true)
返回最接近手数的舍入值 - 由交易品种的手数步长指定。
整数
至整数()
返回 int 值。
长的
土龙()
返回长整型值。
细绳
字符串精度()
返回带有尾随零的字符串。
细绳
转字符串()
返回带有截断尾随零的字符串。
细绳
象征()
返回当前工作符号。
细绳
象征(常量字符串符号)
调用构造函数后,将工作交易品种设置为图表交易品种以外的交易品种。使用多个符号时使用。

示例:

C双 pi2 =3.14159265359;
   
  // 获取值...  双倍的raw_double             = pi2.AsRawDouble();
  双倍的round_double_to_step = pi2.AsRounded();
  双倍的tick_size_double       = pi2.AsRoundedTick();
  双倍的lot_step_double        = pi2.AsRoundedLots();
  双倍的rounded_up             = pi2.AsRoundedUp();
  双倍的rounded_down           = pi2.AsRoundedDown();
  整数    double_to_int          = pi2.ToInt();
  长的   double_to_long         = pi2.ToLong();
  细绳precision_str          = pi2.ToStringPrecision();
   π2 =3.140000000009;
   pi2。数字8);
  细绳truncated_str          = pi2.ToString();


虚拟方法总结

从 CObject 重写的方法:

虚拟整数
比较(常量 CObject *节点,
 常量整型模式=0)
Compare 方法用于排序和搜索,将此对象的 AsRounded 值与传入节点的 AsRounded 值进行比较。
虚拟整数
类型()
返回 TYPE_DOUBLE 的 int。
虚拟布尔
节省(常量 int 文件句柄)
序列化并保存成员变量到传入句柄的文件中。
虚拟布尔
加载(常量 int 文件句柄)
将成员变量设置为保存在传入句柄的文件中的值。

有关示例,请参阅下面的 CDoubleVector。

CDoubleVector 类是专门用于 CDouble 动态实例的对象指针集合。

班级CD双向量:民众CArray对象


#包括<双.mqh>


继承层次结构

虚拟方法实施/覆盖来自 CArrayObj 类:创建元素

实例方法总结

**看CArray对象对于继承的公共方法

C双*
操作员[]
(常量整型索引)
重载索引运算符。返回指向向量中第 n 个索引处的对象的指针。
布尔值
添加(常量双精度值)
采用原始双精度作为参数并将其转换为 CDouble 对象并将其添加到向量的末尾。
布尔值
分配双数组(常量双精度数组[])
获取双精度数组并将它们转换为 CDouble 对象并将它们分配给向量。
布尔值
复制输出(双&arr[])
将向量中的 CDouble 值复制到原始双精度数组。
布尔值
复制输出(CArrayDouble &arr)
将向量中的 CDouble 值复制到 CDoubleArray 集合。
虚拟布尔
节省(常量 int 文件句柄)
将向量保存到传入文件句柄指定的文件中。
虚拟布尔
加载(常量 int 文件句柄)
从传入文件句柄指定的文件加载保存的矢量状态。

示例:


附件下载

📎 doubletests.mq5 (5.47 KB)

📎 double.mqh (28.61 KB)

Source: MQL5 #19727

🔐
请登录后参与评论
注册满12小时后评论,即可解锁附件下载
立即登录