MQL5 入门知识汇总
(2016-05-30 09:06:10)| 分类: 工作修行 | 
点操作符 ( . )
对于直接访问结构和类的公共成员 时,使用点操作符。
语法:Variable_name_of_structure_type.Member_name
struct SessionTime
 
 
 
 
 
 
 
 
 
 
 
 
范围解析操作符 ( :: )
mql5中每个函数都有其执行范围。例如,Print()系统函数可以在全局范围使用。Imported函数导入时使用。classes函数用在类的范围。
语法:[Scope_name]::Function_name(parameters)
如果没有范围名,就属于全局范围函数。如果没有范围解析操作,可以在最近范围内找到函数。如果本地范围没有函数,需要全局搜寻函数。
范围解析操作也用在确定函数-类成员。
type Class_name::Function_name(parameters_description)
 
// 函数主体
 
 
1.类方法。如果在类中设置了无指定名称的函数,那么移到下一级别。
2.MQL5 函数。如果语言没有这种函数,那么移到下一级别。
3.用户定义全局函数。如果没有找到有指定名称的函数,那么移到下一级别。
4.导入函数。如果没有发现有指定名称的函数,那么编译器返回一个错误。
若要避免函数调用歧义,就要使用范围解析操作,始终明确指定函数范围。class CCheckContext
 
 
public:
 
protected:
 
 
class CCheckContext2 : public CCheckContext
 
 
public:
 
 
protected:
 
 
void CCheckContext2::Print()
 
 
 
 
 
 
//+------------------------------------------------------------------+
//|
脚本程序启动函数 
//+------------------------------------------------------------------+
void OnStart()
 
//---
 
 
 
对象创建操作符new
new 操作符自动创建一个相应大小的对象,称为对象构造函数并回转已经创建的对象描述符。失败的情况下,操作符返回一个与常量NULL相比较的null描述符。
new操作符仅能用于类对象。不能应用于结构。操作符不用于创建对象数组。若要做这个,使用 ArrayResize() 。
//+------------------------------------------------------------------+
//|
图形创建 
//+------------------------------------------------------------------+
void CTetrisField::NewShape()
 
 
//--- 随机创建7个可能形状中的一个
 
 
 
 
 
 
 
 
 
 
 
//--- 绘画
 
 
 
 
 
 
 
 
 
 
对象删除操作符 delete
delete操作符删除通过new操作符创建的对象,称为相关的类析构函数并释放由对象占据的内存。现存对象的真实析构函数用作操作对象。delete操作执行后,对象析构函数无效 。
//--- 删除图形
 
 
//--- 创建一个新图形
 
引用与修饰符&
简单类型参数能够通过值和引用传送,而复合类型参数经常通过引用传送。若使编译器了解参数是通过引用传送,需要在参数前加上&符号。
通过引用传送参数意味着传送变量地址,这就是通过引用传送的参数的所有改变能够马上在变量源中反映出来的原因。使用通过引用传送的参数,一个函数可以同时得出几种结果。为防止引用传送的参数改变,使用常量修饰符。
class CDemoClass
 
private:
 
public:
 
 
//+------------------------------------------------------------------+
//|
填充数组 
//+------------------------------------------------------------------+
void 
 
 
 
 
 
 
 
目标指针
在MQL5中,有可能动态地创造复杂形势的目标,被新操作执行,创造目标返回一个描述符号,描述符号占用8字节。
MyObject* hobject= new MyObject();
class Foo
 
public:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
int Foo::s_counter=0;
//+------------------------------------------------------------------+
//|
脚本程序开始函数  
//+------------------------------------------------------------------+
void OnStart()
 
//--- 声明一个自动创建的对象变量
 
//--- 引用传递对象变量
 
//--- 声明对象指针,使用'new'操作符创建它
 
//--- 引用传递对象指针的变量
 
//--- 声明Foo类型对象的数组
 
//--- 传递对象数组变量
 
//--- 声明Foo类型对象的指针数组
 
 
 
 
 
//--- 传递指针数组变量
 
//--- 终止前强制删除创建为指针的对象
 
//--- 删除指针数组
 
 
 
 
//+------------------------------------------------------------------+
//|
始终通过引用传递对象 
//+------------------------------------------------------------------+
void PrintObject(Foo &object)
 
 
 
//+------------------------------------------------------------------+
//|
传递对象数组 
//+------------------------------------------------------------------+
void PrintObjectsArray(Foo &objects[])
 
 
 
 
 
 
 
 
//+------------------------------------------------------------------+
//|
传递对象指针数组 
//+------------------------------------------------------------------+
void PrintPointersArray(Foo* &objects[])
 
 
 
 
 
 
 
关键字 this
 
class CDemoClass
 
private:
 
public:
 
 
 
//+------------------------------------------------------------------+
//|
填充数组 
//+------------------------------------------------------------------+
void 
 
 
 
 
 
 
 
//+------------------------------------------------------------------+
//|
返回它自己的指针  
//+------------------------------------------------------------------+
CDemoClass *CDemoClass::getDemoClass(void)
 
 
 
架构(类与其类似)
创建框架:struct + 架构名称。
创建架构变量:架构名称 + 变量名称。
访问变量中的架构成员:变量名称 + . + 成员名称。
架构中不能有虚拟函数。
new不能用于架构。
//---创建架构
struct trade_settings
 
 
 
 
 
//--- 创建和初始化交易设置类型的变量
trade_settings
my_set={0.0,0.0,5};//创建架构变量 
if (input_TP>0) my_set.take=input_TP;//访问并初始化架构变量中的架构成员
类和架构都有明确的构造函数和解构方法,如果构造函数定义明确,架构或类别变量的初始化进行初始化序列是不可能的。
struct trade_settings
 
 
 
 
 
 
 
 
 
//--- 编译器生成一个无法初始化的错误信息
trade_settings
my_set={0.0,0.0,5}; 
构造函数与析构函数
构造函数不需要返回类型。
构造函数与类的名称匹配。
构造函数分为参数构造函数和缺省构造函数。
每个类可以有多个构造函数。
构造函数可以在类描述中声明然后定义主体。
//+------------------------------------------------------------------+
//|
处理日期的类 
//+------------------------------------------------------------------+
class MyDateClass
 
private:
 
 
 
 
 
 
public:
 
 
 
 
 
//+------------------------------------------------------------------+
//|
默认构造函数 
//+------------------------------------------------------------------+
MyDateClass::MyDateClass(void)
 
 
 
 
 
 
 
 
 
 
 
//+------------------------------------------------------------------+
//|
参数构造函数 
//+------------------------------------------------------------------+
MyDateClass::MyDateClass(int h,int m,int s)
 
 
 
 
 
 
 
 
 
 
 
在默认构造函数,类的所有成员都使用TimeCurrent() 函数,在参数构造函数,只有时分秒值在使用。其他的类成员将自动初始化当前日期。
当初始化类的对象数组时,默认构造函数有一个特殊用途。所有参数都有默认值的构造函数,并不是默认构造函数。
//+------------------------------------------------------------------+
//|
默认构造函数的类
 
//+------------------------------------------------------------------+
class CFoo
 
 
public:
 
 
 
 
 
//+------------------------------------------------------------------+
//|
脚本程序开始函数 
//+------------------------------------------------------------------+
void OnStart()
 
// CFoo foo;// 该变量不能使用 - 没有设置默认构造函数
//--- 创建 CFoo 对象的可能选项
 
 
 
 
 
 
//--- 接收 CFoo 指针的可能选项
 
 
 
 
// CFoo foo_array[3];// 该选项不能使用 - 没有指定默认构造函数
//--- 显示m_call_time值
 
 
 
 
 
 
 
 
 
//--- 删除动态创建数组
 
 
//删除 pfoo8;// 您不需要一定删除pfoo8,因为它指向自动创建的对象foo1
//删除 pfoo9;// 您不需要一定删除pfoo9,因为它指向pfoo7相同的对象
 
如果您取消这些字符串
//CFoo foo_array[3];// 该变量不能使用 - 没有设置默认构造函数
//CFoo foo_dyn_array[];//该变量不能使用 - 没有设置默认构造函数
然后编译器将会返回一个错误“默认构造函数未定义”。
类型的密封和扩展
密封就是当向用户定义类型提供端口时,隐藏执行细节的能力。
Private成员,只能通过类成员函数接入。
Protected成员,可以通过类成员函数接入或者通过继承类成员函数接入。
public成员,可以通过类声明范围内任意一个函数接入。
struct Name
 
 
 
 
class CPerson
 
protected:
 
public:
 
 
private:
 
 
 
void CPerson::SetName(string n)
 
 
 
 
string CPerson::GetFirstName(string full_name)
 
 
 
 
 
string CPerson::GetLastName(string full_name)
 
 
 
 
 
 
 
继承算法
1.对象创建时首先调用基本类构造函数,然后调用衍生类的构造函数。
2.对象毁坏时首先调用衍生类的析构函数,然后调用基本类析构函数。
3.基本类的构造函数和析构函数不能继承。
4.衍生类是基本类的变体,它继承了基本类的protected 和 public构件。
5.protected继承中,基本类public和protected构件成为衍生类protected构件。
6.private 继承中,基本类public 和protected构件成为衍生类private构件。
让我们创建一个基本类 CShape,它包括描述图形最常用的构件。这些构件描述任何图形所特有的属性-图像类型和定位点主坐标。
//--- 基本类的形状
class CShape
 
protected:
 
 
 
public:
 
 
 
 
下一步,创建基本类衍生出的新类,这里我们可以添加说明类的必要的字段。对于圆形添加包括半径值构件是必须的。正方形以边值为特点。因此,由继承基本类CShape而衍生的类如下声明:
//--- 派生类 圆形
class CCircle : public CShape // 冒号后定义基本类
 
private:
 
public:
 
 
//--- 派生类 方形
class CSquare : public CShape // 冒号后定义基本类
 
private:
 
public:
 
 
 
任何继承类型中,只有public 和 protected访问说明符声明的基类成员可用衍生类。
//+------------------------------------------------------------------+
//|一些访问类型的示例类
 
//+------------------------------------------------------------------+
class CBaseClass
 
private: //---
从衍生类,private成员不可用 
 
protected: //---
从基类及其衍生类,protected方法不可用 
 
public: //---
类构造函数可用于类的所有成员 
 
private: //---
将值分配给m_member的private方法 
 
 
//+------------------------------------------------------------------+
//| 有错误的衍生类
 
//+------------------------------------------------------------------+
class CDerived: public CBaseClass // 由于默认的原因,public继承规范可以忽略。
 
public:
 
 
 
 
 
 
 
 
 
 
如果是protected继承类型的情况下,所有public和protected访问权限的基类成员都会成为protected。这就意味着如果public基类的数据成员和方法从外部访问,那么protected继承类型的情况下,他们只能从衍生类及其衍生品的类中使用。
//+------------------------------------------------------------------+
//| 一些访问类型的示例类
 
//+------------------------------------------------------------------+
class CBaseMathClass
 
private: //--- private成员不可从衍生类使用
 
public: //--- 获取和设置mPi值
 
 
public: // 类构造函数可用于所有成员
 
 
//+------------------------------------------------------------------+
//|
一个衍生类,在此m_Pi不能修改  
//+------------------------------------------------------------------+
class CProtectedChildClass: protected CBaseMathClass // Protected继承类型
 
private:
 
public: //--- 衍生类中的Public方法
 
 
 
//+------------------------------------------------------------------+
//| 脚本启动函数
 
//+------------------------------------------------------------------+
void OnStart()
 
//--- 创建衍生类时,基类的构造函数将自动调用
 
//--- 指定半径
 
 
//--- 如果评论下面的字符串,我们在编译阶段将得到一个错误,因为SetPi()现在是protected的类型
//
pt.SetPI(3); 
//--- 现在声明基类变量,尝试将Pi常量设置等于10
 
 
//--- 下面是结果
 
 
如果是private继承类型,所有public和protected访问权限的基类成员都会成为private,并且在进一步继承中无法进行调用。
多态性
有关每个数组元素将包括的对象类型决策将在程序执行期间直接采用。这包括动态创建合适的类的对象,因此需要使用对象指针来替代对象。
new操作符用于动态创建对象。每个这样的对象都必须独立且明确地使用delete操作符删除。
//+------------------------------------------------------------------+
//| 脚本程序开始函数  
//+------------------------------------------------------------------+
void OnStart()
 
//--- 声明基本类型对象指针的数组
 
//--- 这里以衍生对象填充数组
//--- 声明指针到CCircle类型的对象
 
//--- 在圆形指针设置对象属性
 
//--- 将指针值置于shapes[0]
 
//--- 创建另一个CCircle对象并写下其指针在shapes[1]
 
 
 
//--- 这里我们故意“忘记”设置shapes[2]值
//circle=new CCircle();
//circle.SetRadius(10);
//shapes[2]=circle;
 
//--- 不使用的元素设置为NULL
 
//--- 创建CSquare对象并写下其指针在shapes[3]
 
 
 
//--- 创建CSquare对象并写下其指针到shapes[4]
 
 
 
//--- 我们有一组指针,获得其大小
 
//--- 通过数组的所有指针循环通过
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
//--- 我们必须删除所有已创建的动态对象
 
 
 
 
 
 
 
 
 
 
 
 
请注意,当使用delete操作符删除对象时,必须检查指针类型。只有POINTER_DYNAMIC 指针对象可以使用delete删除。对于其他类型的指针,将返回错误。
重载函数与重载
通常函数名反映它的作用。一般说来,可读程序包括各种挑选出来的标识符 。有时不同的函数用于同样的作用。重载就是一个函数定义多值。根据函数接收的自变量类型选择特定的值。基于调用函数时对应的自变量列表选择特定的函数,到函数说明参数列表。
1.匹配严格(尽可能)。
2.尝试标准类型提高。
3.尝试标准类型转换。
在一个类中定义两个或者以上同名类函数是可能的,但是会有不同数量的参量。当这个发生时,类函数就称为重载而这样的过程被称为类函数重载。如果调用的函数无准确匹配,编译器就会在三个连续阶段搜索适合的函数:
 
 
 
类/结构的静态成员
类成员可以使用存储类修饰符static进行声明。这些数据成员通过该类的所有实例共享并存储在一个地方。为每个类对象变量创建非静态数据成员。
由于静态类成员不依赖于具体实例,则对它的引用如下:
class_name::variable
类的静态成员必须以所需的值进行显式初始化。为此,它必须在全局范围声明和初始化。静态成员初始化的顺序对应其在全局范围声明的顺序。
//+----------------------------------------------------------------+
//| 类
"文本解析"  
//+----------------------------------------------------------------+
class CParser
{
public:
static
int 
static
int 
//--- 构造函数和析构函数
 
 
};
//--- 全局层面解析类静态成员的初始化
int CParser::s_words=0;
int CParser::s_symbols=0;
静态类成员可以通过const关键字来声明。这种静态常量必须在全局层面以const 关键字进行初始化:
//+-----------------------------------------------------------------+
//| 类
"Stack" 存储处理数据  
//+-----------------------------------------------------------------+
class CStack
{
public:
 
 
private:
 
 
//--- 初始化CStack类的静态常量
const int CStack::s_max_length=1000;
类/结构的静态方法
在MQL5可以使用静态类型成员函数。在类内部的声明,静态修饰符必须在函数返回类型之前。
class CStack
 
public:
 
 
 
 
 
private:
 
 
 
//+-----------------------------------------------------------------+
//| 返回堆栈中存储的元素的最大数量
 
//+-----------------------------------------------------------------+
int CStack::Capacity(void)
 
 
 
//--- 初始化CStack 类的静态常量
const int CStack::s_max_length=1000;
//+-----------------------------------------------------------------+
//|
脚本程序起始函数 
//+-----------------------------------------------------------------+
void OnStart()
 
//--- 声明
CStack
类型变量 
 
//---
调用对象的静态方法 
 
//---
它也可以按以下方式调用,因为方法是静态的,无需对象的存在 
 
 
const 修饰符方法被称为常量并且不能修改类的隐式成员。声明类的常量函数和常量参数被称为const-correctness控制。通过这个控制,可以保证,编译器将确保对象值的一致性并且如果有什么问题,在编译过程中将会返回一个错误。
参数列表进入类声明以后才会放置const修饰符。类以外的定义也应该包括 const 修饰符:
//+-----------------------------------------------------------------+
//|
“矩形”类 
//+-----------------------------------------------------------------+
class CRectangle
 
private:
 
 
public:
 
 
 
 
 
 
 
{ return(w*h); }
 
//+-----------------------------------------------------------------+
//|
返回“矩形”对象区域 
//+-----------------------------------------------------------------+
double CRectangle::Square(void) const
 
 
 
//+-----------------------------------------------------------------+
//|
返回两变量的产品 
//+-----------------------------------------------------------------+
static double CRectangle::Square(const double w,const double h)
 
 
 
//+-----------------------------------------------------------------+
//|
脚本程序起始函数 
//+-----------------------------------------------------------------+
void OnStart()
 
//--- 创建等于5和6的矩形
 
//--- 用常量方法找出矩形区域
 
//--- 通过类CRectangle的静态方法找出产品数量
PrintFormat("CRectangle::Square(2.0,1.5)=%f",CRectangle::Square(2.0,1.5));
 

 加载中…
加载中…