这是本书上半部分“MQL4入门”的最后一章,内容实用、重要。
英文原称 predefined variables,所谓“预定义函数”,不如译成“内建变量”,与“内建函数”呼应。
函数RefreshRates()用于更新内建变量的值。
Ask - 当前交易品种的最新卖价;
Bid - 当前交易品种的最新买价;
Bars - 当前主图中价格柱的总数;
Point - 报价小数部分的值;
Digits - 报价小数部分的位数。
Time - 当前主图中每个价格柱的开盘时间;
Open - 当前主图中每个价格柱的开盘价;
Close - 当前主图中每个价格柱的收盘价;
High - 当前主图中每个价格柱的最高价;
Low - 当前主图中每个价格柱的最低价;
Volume - 当前主图中每个价格柱对应的成交量。
内建变量的名字,不能再用做普通变量。不能给内建变量赋值。
内建变量的值,是由MT4系统自动更新的。更新发生在特别函数开始执行时。
MT4分别为每个启动的程序创建一组内建变量的副本,由该程序使用。
内建变量在特别函数运行期间被保存,并由函数RefreshRates()更新。
bool RefreshRates()
内建函数RefreshRates()强制更新市场信息(成交量,最新报价的服务器时刻Time[0],Bid, Ask, 等)。
若有新报价到来,RefreshRates()返回TRUE,内建变量被更新。
若无新报价到来,RefreshRates()返回FALSE,内建变量不更新。
RefreshRates()仅影响正在运行的程序,而非系统中的全部程序。
MQL4程序可以包含数十至数百个变量。重要的是变量的作用域。
局部变量是在函数内说明的,作用域是该函数体。
全局变量是在全部函数体外说明的,作用域是整个程序。全局变量的初始化,只能用常量,不能用表达式,并且,只能在程序头部,在特别函数运行之前。静态变量在函数内说明,可以用常量初始化,并且是一次性的。静态变量的初始值,默认为零。静态变量的作用域,是说明它的函数体。离开函数后,静态变量的值保持不变。
数组都是静态类型的,不必显式说明。
外部变量的值,可从程序属性窗口读取。外部变量是全局变量,在程序头部、各函数体外说明,作用域是整个程序:
extern int Number; // External variable of integer type
终端变量与全局变量不同。全局变量的作用域是其所在的程序,终端变量的作用域则是终端中所有启动的程序。
与其他变量不同,终端变量可在任一程序中创建或删除。终端变量在终端关闭后,保存在硬盘。终端变量被调用后,可在终端生存4个星期。在此期间若不被调用,终端便将其删除。终端变量只能为双精度double类型。
datetime GlobalVariableSet( string name, double value)
若变量不存在,创建一个新的。成功后,返回创建时间;否则,返回0。若要了解出错信息,调用函数GetLastError() 。
参数:
name - 变量名称。
value - 新数值。
double GlobalVariableGet( string name)
返回终端变量的值;若出错,返回0。若要了解出错信息,调用函数 GetLastError() 。
参数:
name - 变量名称。
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()
}
//--------------------------------------------------------------------
文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib
文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang
文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些
文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器
文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距
文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器
文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn
文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios
文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql
文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...
文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120
文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数