您的位置:首页 > 编程语言

《用MQL4编程》读书笔记(6)- 变量

2014-03-22 12:45 183 查看

变量

这是本书上半部分“MQL4入门”的最后一章,内容实用、重要。

内建变量与RefreshRates函数

英文原称 predefined variables,所谓“预定义函数”,不如译成“内建变量”,与“内建函数”呼应。

函数RefreshRates()用于更新内建变量的值。

内建简单变量

Ask - 当前交易品种的最新卖价;

Bid - 当前交易品种的最新买价;

Bars - 当前主图中价格柱的总数;

Point - 报价小数部分的值;

Digits - 报价小数部分的位数。

内建时序数组变量

Time - 当前主图中每个价格柱的开盘时间;

Open - 当前主图中每个价格柱的开盘价;

Close - 当前主图中每个价格柱的收盘价;

High - 当前主图中每个价格柱的最高价;

Low - 当前主图中每个价格柱的最低价;

Volume - 当前主图中每个价格柱对应的成交量。

内建变量的特点

内建变量的名字,不能再用做普通变量。不能给内建变量赋值。

内建变量的值,是由MT4系统自动更新的。更新发生在特别函数开始执行时。

MT4分别为每个启动的程序创建一组内建变量的副本,由该程序使用。

内建变量在特别函数运行期间被保存,并由函数RefreshRates()更新。

函数RefreshRates()

bool RefreshRates()

内建函数RefreshRates()强制更新市场信息(成交量,最新报价的服务器时刻Time[0],Bid, Ask, 等)。

若有新报价到来,RefreshRates()返回TRUE,内建变量被更新。

若无新报价到来,RefreshRates()返回FALSE,内建变量不更新。

RefreshRates()仅影响正在运行的程序,而非系统中的全部程序。

变量类型

MQL4程序可以包含数十至数百个变量。重要的是变量的作用域。

局部变量和全局变量

局部变量是在函数内说明的,作用域是该函数体。

全局变量是在全部函数体外说明的,作用域是整个程序。全局变量的初始化,只能用常量,不能用表达式,并且,只能在程序头部,在特别函数运行之前。

静态变量

静态变量在函数内说明,可以用常量初始化,并且是一次性的。静态变量的初始值,默认为零。静态变量的作用域,是说明它的函数体。离开函数后,静态变量的值保持不变。

数组都是静态类型的,不必显式说明。

外部变量

外部变量的值,可从程序属性窗口读取。外部变量是全局变量,在程序头部、各函数体外说明,作用域是整个程序:

extern int Number;                          // External variable of integer type


终端变量

终端变量与全局变量不同。全局变量的作用域是其所在的程序,终端变量的作用域则是终端中所有启动的程序。

终端变量的特点

与其他变量不同,终端变量可在任一程序中创建或删除。终端变量在终端关闭后,保存在硬盘。终端变量被调用后,可在终端生存4个星期。在此期间若不被调用,终端便将其删除。终端变量只能为双精度double类型。

处理终端变量的函数

函数 GlobalVariableSet()

datetime GlobalVariableSet( string name, double value)

若变量不存在,创建一个新的。成功后,返回创建时间;否则,返回0。若要了解出错信息,调用函数GetLastError() 。

参数:

name - 变量名称。

value - 新数值。

函数 GlobalVariableGet()

double GlobalVariableGet( string name)

返回终端变量的值;若出错,返回0。若要了解出错信息,调用函数 GetLastError() 。

参数:

name - 变量名称。

函数 GlobalVariableDel()

bool GlobalVariableDel( string name)

删除变量。成功后,返回TRUE;否则,返回FALSE。若要了解出错信息,调用函数 GetLastError() 。

参数:

name - 变量名称。

举例使用终端变量的好处

假设:有几个“操盘手”程序同时在终端运行,保证金10000美元,开仓总额不得超过保证金的30%,各“操盘手”程序均分配等额保证金。创建一“操盘手”程序,处理这个问题。

分给“操盘手”的资金,不难计算。可是,需要掌握当前运行的“操盘手”总数。而MQL4没有函数可回应这个问题。唯一的办法,是每个“操盘手”自行报告,并修改相关的终端变量。所有的“操盘手”都需要这些信息,以确定当前情况。

应该指出,实际交易中,不是每个“操盘手”都需处理这一问题。

下面,是处理问题的程序:

//--------------------------------------------------------------------
// globalvar.mq4
// 本程序仅用于教学目的。
//--------------------------------------------------------------------
int    Experts;                                 // “操盘手”程序数目
double Depo=10000.0,                            // 设定保证金数额
Persent=30,                              // 设定动用比例
Money;                                   // 需要的资金
string Quantity="GV_Quantity";                  // 终端变量名
//--------------------------------------------------------------------
int init()                                      // 特别函数 init()
{
Experts=GlobalVariableGet(Quantity);         // 读取当前值
Experts=Experts+1;                           // “操盘手”数目
GlobalVariableSet(Quantity, Experts);        // 新值
Money=Depo*Persent/100/Experts;                // “操盘手”分得的资金
Alert("For EA in window ", Symbol()," allocated ",Money);
return;                                      // 退出 init()
}
//--------------------------------------------------------------------
int start()                                     // 特别函数 start()
{
int New_Experts= GlobalVariableGet(Quantity);// “操盘手”现有数目
if (Experts!=New_Experts)                    // 如有变化
{
Experts=New_Experts;                      // 以现有数目为准
Money=Depo*Persent/100/Experts;             // 重新分配资金
Alert("New value for EA ",Symbol(),": ",Money);
}
/*
...
这里是“操盘手”的主要代码部分。
变量Money的值用在这里。
...
*/
return;                                      // 退出 start()
}
//--------------------------------------------------------------------
int deinit()                                    // 特别函数 deinit()
{
if (Experts ==1)                             // 若只有一个“操盘手”……
GlobalVariableDel(Quantity);              //……删除终端变量
else                                         // 否则……
GlobalVariableSet(Quantity, Experts-1);   //……数目减 1
Alert("EA detached from window ",Symbol());  // 提示一个“操盘手”退出
return;                                      // 退出 deinit()
}
//--------------------------------------------------------------------


数组

MQL4的数组,语法用法与C语言的相同,如:首个成员的位置为0,末尾成员的位置为“数组长度 - 1 ”。这部分内容,不做翻译。

重点关注时序数组

时序数组有预设的名称:Open, Close, High, Low,Volume,Time 等。它们的值,表示K线图中价格柱的数据信息。

时序数组承载的信息,在MQL4编程中广泛应用,十分重要。时序数组都是一维结构,包含价格柱特征的历史数据。每个价格柱的特征包括:开盘价Open[],收盘价Close[],最高价High[],最低价Low[],成交量Volume[],和开盘时间Time[]。

零柱是K线图中最右边的柱。

对于价格柱及相应的时序数组索引进行运算,起点是零柱,索引为[0]。

时序数组最重要的特点是:

零柱的值Close[0], High[0], Low[0], Volume[0]等随时间进程而改变,其他价格柱的值不变。

为了正确理解时序数组索引的重要,看个简单程序:

从最新的n个价格柱中,找出最低价和最高价。

注意,这种问题的解决,离不开时序数组值的引用:

//--------------------------------------------------------------------
// extremumprice.mq4
// 本程序仅用于教学目的。
//--------------------------------------------------------------------
extern int Quant_Bars=30;                       // 价格柱数目
//--------------------------------------------------------------------
int start()                                     // 特别函数 start()
{
int i;                                       // 价格柱序号
double Minimum=Bid,                          // 最低价格
Maximum=Bid;                          // 最高价格

for(i=0;i<=Quant_Bars-1;i++)                 // From zero (!) to..
{                                          // ..Quant_Bars-1 (!)
if (Low[i]< Minimum)                      // If < than known
Minimum=Low[i];                        // it will be min
if (High[i]> Maximum)                     // If > than known
Maximum=High[i];                       // it will be max
}
Alert("For the last ",Quant_Bars,            // 显示信息
" bars Min= ",Minimum," Max= ",Maximum);
return;                                      // 退出 start()
}
//--------------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: