CDouble & CDoubleVector - MetaTrader 5程序库
- 显示:
- 1195
- 等级:
- 已发布:
- 2018.08.14 14:01
- 需要基于此代码的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
- CDouble
虚拟方法从 CObject 类: Type,Load,Save,Compare 实现/覆盖的。
类型为 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) |
比较两个双精度数值并返回一个整数:
|
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 |
如果 step==NULL,将整个数组舍入到指定的步幅或当前品种的逐笔报价大小。 |
static void |
RoundArrayToStep |
如果 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 |
返回舍入到小数位的浮点数字符串,并截断任何后置零 (例如,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:
|
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 +, -, *, / (double 或 CDouble&) | 可以接受 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 |
重载操作符 ==, !=, >, <, >=, <= (double 或 CDouble&) |
可以接受 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:
|
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 图表指标。 配置使用逐笔报价,点值或点数进行配置。
DEMA_Range_Channel由两条双重指数移动平均线形成的通道,基于时间序列的平均最高价和最低价
该指标使用 MAMA (MESA 自适应移动平均线) 和 FAMA (跟随自适应移动平均线) 的组合值来评估行情趋势。
MAMA + FAMA 振荡器MAMA (MESA 自适应移动平均) 和 FAMA (跟随自适应移动平均) 的组合作为振荡器。