请观看如何免费下载自动交易
请在Twitter上找到我们!
加入我们粉丝页
有趣的脚本?
因此发布一个链接 -
让其他人评价
喜欢这个脚本? 在MetaTrader 5客户端尝试它
程序库

CDouble & CDoubleVector - MetaTrader 5程序库

显示:
1195
等级:
(25)
已发布:
2018.08.14 14:01
\MQL5\Scripts\CDoubleDebug\
Double.mqh (28.61 KB) 预览
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务

用于 MQL 开发的常用舍入方法函数库,用于类型 (double) 的元初包装类和 CDouble 对象的向量。 MQL5 和 MQL4 兼容!

版本 1.02: (2018.02.18)

  • 修正了舍入结果偏离预期结果的错误。 鸣谢 AMRALI!

版本 1.01:

  • 修复了算术运算符未返回舍入值的错误。
  • 添加了品种 setter (赋值) 方法以在调用构造函数后设置品种。


CDouble

CDouble 类在对象中包装元初类型 double 的值。 此外,该类为 舍入双精度 和双精度类型的数组/集合提供了 若干种方法 和静态方法。


声明

class CDouble : public CObject


标题

#include <Double.mqh>


继承层次结构

虚拟方法从 CObject 类: TypeLoadSaveCompare 实现/覆盖的

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

string
m_symbol
分配给类实例的品种,用于检索手数增幅和逐笔大小进行舍入。
double
m_value
分配给实例的元初 double 值。
uchar
m_step
舍入的步幅表示为 char 以便减少内存占用。 例如 0.0025 变为 25。
uchar
m_digits
小数点后的位数。
ENUM_PRECISION
m_mode
用于将舍入方法锁定到特定 "步幅" 的操作模式。

在我们进一步深入研究文档之前,这里有一个包装类的快速实际示例:

MqlTick tick;
   SymbolInfoTick(_Symbol,tick);
   CDouble  price = tick.ask - 0.0087263487676283476,
            sl    = price - 500*_Point,
            tp    = price + 500*_Point,
            lots  = 5.25 / 3.78789;
   MqlTradeRequest r={0};
   r.symbol= _Symbol;
   r.price = price.AsRoundedTick();
   r.sl    = sl.AsRoundedTick();
   r.tp    = tp.AsRoundedTick();
   r.volume= lots.AsRoundedLots();

...

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

MqlTick tick;
   SymbolInfoTick(_Symbol,tick);
   MqlTradeRequest r={0};
   r.symbol= _Symbol;
   r.price = tick.ask - 0.0087263487676283476,
   r.sl    = price - 500*_Point,
   r.tp    = price + 500*_Point,
   r.volume= 5.25 / 3.78789;
   ...
   CDouble::RoundTradeRequest(r);
   //自动将价格字段舍入为逐笔尺寸
   //和交易量步幅


静态方法摘要

注意: 使用此函数库时没有必要了解 OOP 或使用一个包装类实例。 所有人要做的就是用 CD25 范解析调用静态函数。 语法如下:

type variable_name = CDouble::Method(args);
修饰符和类型 方法 描述
static bool
IsEqual
(double number1,
 double number2,
 double step);
通过从第一个数值中减去第二个数值来比较两个双精度数值,并来返回一个布尔值,将总和四舍五入到 "步幅",并与 0 比较。
static bool
IsEqual
(double number1,
 double number2,
 int digits);
通过从第一个数值中减去第二个数值来比较两个双精度数值,并来返回一个布尔值,将总和四舍五入到 "位数",并与 0 比较。
static int
Compare
(double number1,
 double number2,
 double step)
比较两个双精度数值并返回一个整数:
  • 0 如果相等
  • 1 如果 number11 > number12。
  • -1 如果 number1 < number2.
static double
RoundToStep
(const double number, 
 double step)
将舍入值返回到最接近的步幅精度 (例如 0.0025)。
static double
RoundToDigit
(const double number, 
 int digits)
将舍入值返回到最接近的数字 (如同 NormalizeDouble)。
static double
RoundToStepUp
(const double number, 
 double step)
返回高于步幅精度的舍入值。
static double
RoundToStepDown
(const double number, 
 double step)
返回低于步幅精度的舍入值。
static double
RoundToTick
(const double number, 
 string symbol=NULL)
返回的舍入值与当前品种 (Symbol=NULL) 或在 symbol 参数中的指定品种的最近 逐笔报价大小 最接近。
static double
RoundToLots
(const double number,
 string symbol=NULL,
 bool always_return_valid=true)

返回的舍入值与当前品种 (Symbol=NULL) 或在 symbol 参数中的指定品种的最近 手数步幅 最接近。

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

static void (MQL5)
RoundTradeRequest
(MqlTradeRequest &request)

按请求中品种标识符修改 price,sl,tp 和 volume 字段。

将 price,sl 和 tp 舍入到最接近的逐笔报价大小。

将交易量减小到最接近手数步骤。

static void
RoundArrayToStep

(double &arr[], double step = NULL)

如果 step==NULL,将整个数组舍入到指定的步幅或当前品种的逐笔报价大小。
static void
RoundArrayToStep

(CArrayDouble &arr, double step = NULL)

如果 step==NULL,将整个 CArrayDouble 集合舍入到指定的步幅骤或当前品种的逐笔报价大小。
static int
GetDigits
(double floating_point)
返回的 double 中用后置零补足位数。 (即返回 5 位小数 0.0002500... )。
static double 
GetPoint
(int digits)
返回指定小位数的 double 值。 (即 3 返回 0.001)。
static string
ToString

(double number, int digits)

返回舍入到小数位的浮点数字符串,并截断任何后置零 (例如,CDouble::ToString(1.23400001,6) 将返回 "1.234")。

示例:

MqlTick tick;
   SymbolInfoTick(_Symbol,tick);
   double rnd_by_step   = CDouble::RoundToStep(tick.bid*1.052565465,_Point);
   double rnd_by_digits = CDouble::RoundToDigit(tick.bid*1.052565465,_Digits);
   double by_lot_step   = CDouble::RoundToLots(0.123423,_Symbol);
   double by_tick_size  = CDouble::RoundToTick(tick.ask-100*_Point,_Symbol);
   double roundup       = CDouble::RoundToStepUp(3.999999999,_Point);
   double rounddn       = CDouble::RoundToStepDown(3.999999999,_Point);
   int    digits        = CDouble::GetDigits(0.0000025);
   double point         = CDouble::GetPoint(10);
   bool   equal         = CDouble::IsEqual(tick.bid,tick.bid+0.00000009,_Point);
   string tostr         = CDouble::ToString(3.1399999999999999);
   int    compare       = CDouble::Compare(tick.ask,tick.bid);
   
#ifdef __MQL5__
   MqlTradeRequest r={0};
   r.symbol= _Symbol;
   r.price = tick.ask+0.000089849847658759198199999;
   r.sl    = r.price - 503 * _Point;
   r.tp    = r.price + 503 * _Point;
   r.volume= 1.127984984;
   
   CDouble::RoundTradeRequest(r);
#endif 


构造函数摘要

构造函数 描述
CDouble
(const ENUM_PRECISION mode = PRECISION_DEFAULT,
 const string symbol = NULL)

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

ENUM_PRECISION:

  • PRECISION_DEFAULT - 将默认精度设置为 1 和 8 小数位的步幅,可以通过调用 Step() 或 Digits() 来覆盖
  • PRECISION_TICK_SIZE - 将所有舍入方法锁定为指定品种的逐笔报价大小。
  • PRECISION_LOT_STEP - 将所有舍入方法锁定到指定品种的手数步幅。
CDouble
(const CDouble &other)
复制构造函数: 将其它对象的所有私有字段复制到此对象。

示例:

CDouble num;
CDouble bid(PRECISION_TICK_SIZE, _Symbol);
CDouble ask(bid)
CDouble ask2 = bid;
CDouble lots(PRECISION_LOT_STEP, _Symbol);


赋值摘要 - 重载的赋值运算符

修饰符和类型 方法 描述
void
Set(const double value)
将原始 double 值赋给 m_value。
void
Set(const CDouble &other)
将 CDouble 对象的原始 double 值赋给 m_value。
void
Overloaded operators =, +=, -=, *=, /= (double OR CDouble&) 将原始 double 值分配或修改为 m_value。

注意: 赋值符 = 可以在声明的同一行调用。

示例:

CDouble bid;
bid.Set(tick.bid);
CDouble ask = tick.ask;

CDouble pi = 3.14;
CDouble factor = 2;
pi*=factor;
Print(pi.ToString());
//6.28


重载的算术运算符摘要

修饰符和类型 方法 描述
double
Overloaded operators +, -, *, / (doubleCDouble&) 可以接受 double 类型或 CDouble 对象作为参数。 算术应用与重载运算符关联后返回 double 值。

注意: 一个 算术运算符可以用于每条语句。

运算符算术重载的语法:

type_double_result <-- CDouble_object <-- operator <-- double
//CDouble 对象始终位于操作符的左侧

type_double_result <-- CDouble_object1 <-- operator <-- CDouble_object2
//使用两个 CDouble 对象时顺序无关紧要。

示例:

CDouble foo    = 3.14;
CDouble bar    = 10;
CDouble foobar = bar + foo;          //13.14
CDouble err    = bar + foo + foobar; //错误 - 非法使用操作符

double var = bar / foo;


重载比较运算符摘要

修饰符和类型 方法 描述
bool
重载操作符 ==, !=, >, <, >=, <= (doubleCDouble&)

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

注意: 这是使用<static int>Compare 方法进行比较。

示例:

CDouble foo = 3.14, bar = 3.139999999999999999999;
   
   Print(foo == bar); //true
   Print(foo <= bar); //true
   Print(foo >  bar); //false


实例方法摘要

精度控制 (默认): 小数位 = 8; 步幅 = 1e-08

  • 控制精度有三种方法: Step, Digits, 或 PrecisionMode(ENUM_PRECISION)。 对这两种 setter 方法的任何调用都将覆盖以前的设置。
  • Step 即可为 _Point 亦或 LOT_STEP 或 TickSize; 表示为浮点数 (即 0.00001, 0.025, 等等)。
  • 由于 RoundToTick 和 RoundToLot 自动使用相应的步幅值进行舍入返回,因此无需设置步幅。
修饰符和类型 方法 描述
void
PrecisionMode
(const ENUM_PRECISION mode)

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

ENUM_PRECISION:

  • PRECISION_DEFAULT - 将默认精度设置为 1 和 8 小数位的步幅,可以通过调用 Step() 或 Digits() 来覆盖它。
  • PRECISION_TICK_SIZE - 将所有舍入方法锁定为指定品种的逐笔报价大小。
  • PRECISION_LOT_STEP - 将所有舍入方法锁定到指定品种的手数步幅。
ENUM_PRECISION
PrecisionMode()
返回当前工作精度模式。
void
Step
(const double step_or_point)
将步幅设置为指定的精度。 覆盖精度模式。
double
Step()
返回 Step 的当前值。
void
Digits
(const int digits)
将精度设置为指定小数位的数字。 覆盖精度模式并将步幅设置为 1e-(小数位)。
int
Digits()
返回当前工作小数位精度。
double
AsRawDouble()
返回存储的 double 的原始值。
double
AsRounded()

将舍入值返回到指定步幅最近的数值。 default = 1e-08.

当 PRECISION_TICK_SIZE 时步幅锁定到逐笔报价大小。

当 PRECISION_LOT_STEP 时步幅锁定到手数步幅.

double
AsRoundedUp()
返回高于指定步幅的舍入值。
double
AsRoundedDown()
返回低于指定步幅的舍入值。
double
AsRoundedTick()
返回最接近逐笔报价的舍入值 - 由品种的主笔大小指定。
double
AsRoundedLots
(bool always_return_valid = true)
将舍入值返回到最近的手数 - 由品种的手数步幅指定。
int
ToInt()
返回 int 值。
long
ToLong()
返回 long 值。
string
ToStringPrecision()
返回含后置零的字符串。
string
ToString()
返回截断后置零的字符串。
string
Symbol()
返回当前工作品种。
string
Symbol(const string symbol)
在调用构造函数后,将工作品种设置为图表品种以外的品种。 使用多品种时使用。

示例:

CDouble pi2 = 3.14159265359;
   
   // 获得数值...... 
   double raw_double             = pi2.AsRawDouble();
   double round_double_to_step   = pi2.AsRounded();
   double tick_size_double       = pi2.AsRoundedTick();
   double lot_step_double        = pi2.AsRoundedLots();
   double rounded_up             = pi2.AsRoundedUp();
   double rounded_down           = pi2.AsRoundedDown();
   int    double_to_int          = pi2.ToInt();
   long   double_to_long         = pi2.ToLong();
   string precision_str          = pi2.ToStringPrecision();
   pi2 = 3.140000000009;
   pi2.Digits(8);
   string truncated_str          = pi2.ToString();


虚方法摘要

从 CObject 覆盖的方法:

修饰符和类型 方法 描述
virtual int
Compare
(const CObject *node,
 const int mode=0)
Compare 方法用于排序和搜索,将此对象的 AsRounded 值与传入节点的 AsRounded 值进行比较。
virtual int
Type()
返回 TYPE_DOUBLE 的 int。
virtual bool
Save(const int file_handle)
序列化并将成员变量保存到所传入句柄的文件中。
virtual bool
Load(const int file_handle)
将成员变量设置为所传入句柄文件中保存的值。

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


CDoubleVector

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


声明

class CDoubleVector : public CArrayObj


标题

#include <Double.mqh>


继承层次结构

来自类 CArrayObj 中 实现/覆盖 的虚拟方法: CreateElement.


实例方法摘要

**参阅 CArrayObj 对于继承的公有方法

修饰符和类型 方法 描述
CDouble*
operator[]
(const int index)
重载索引运算符。 返回向量中索引 n 处对象的指针。
bool
Add(const double value)
将元初 double 作为参数并将其转换为 CDouble 对象并将其添加到向量的末尾。
bool
AssignDoubleArray
(const double &array[])
获取一个双精度数组并将它们转换为 CDouble 对象,并将它们分配给矢量。
bool
CopyOut(double &arr[])
将向量中的 CDouble 值复制到元初双精度数组。
bool
CopyOut(CArrayDouble &arr)
将向量中的 CDouble 值复制到 CDoubleArray 集合。
virtual bool
Save(const int file_handle)
将向量保存到所传入文件句柄指定的文件中。
virtual bool
Load(const int file_handle)
从所传入文件句柄指定的文件里加载保存的矢量状态。

示例:

CDoubleVector *vect = new CDoubleVector;
   
   double dubs[]={3.14,1.21,55.555};
   vect.AssignDoubleArray(dubs);
   vect.Add(tick.bid);
   
   //按照索引调用 CDouble 对象
   Print(vect[vect.Total()-1].ToString());
   
   //添加一个新的 CDouble 对象
   CDouble *lot = new CDouble(PRECISION_LOT_STEP);
   lot = 1.22;
   vect.Add(lot);
   
   //矢量升序排序
   vect.Sort();
   
   int total = vect.Total();
   
   //将向量保存到文件,包括 CDouble 对象状态和值
   string f = "testdub.bin";
   int    h = FileOpen(f,FILE_WRITE|FILE_BIN);
   if(vect.Save(h))
      Print("save successful");
   FileClose(h);
   delete vect;
   
   //从文件加载矢量
   CDoubleVector vect_reborn;
   h=FileOpen(f,FILE_READ|FILE_BIN);
   if(vect_reborn.Load(h))
      Print("load successful");
   FileClose(h);
   total = vect_reborn.Total();
   Print("Total vector size = ",sizeof(vect_reborn)," bytes");
   for(int i=0;i<vect_reborn.Total();i++)
      Print(vect_reborn[i].ToString());
      
   //复制到双精度数组
   double arr2[];
   vect_reborn.CopyOut(arr2);
   Print(ArraySize(arr2));

由MetaQuotes Ltd译自英文
原代码: https://www.mql5.com/en/code/19727

Renko 2.0 Renko 2.0

完整的灯芯形式的 Renko 图表指标。 配置使用逐笔报价,点值或点数进行配置。

DEMA_Range_Channel DEMA_Range_Channel

由两条双重指数移动平均线形成的通道,基于时间序列的平均最高价和最低价

MAMA + FAMA MAMA + FAMA

该指标使用 MAMA (MESA 自适应移动平均线) 和 FAMA (跟随自适应移动平均线) 的组合值来评估行情趋势。

MAMA + FAMA 振荡器 MAMA + FAMA 振荡器

MAMA (MESA 自适应移动平均) 和 FAMA (跟随自适应移动平均) 的组合作为振荡器。