《用MQL4编程》读书笔记(6)- 变量_在mql4语言中bars()函数索引是0开始还是1开始-程序员宅基地

变量

这是本书上半部分“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()
      }
    //--------------------------------------------------------------------
    
        
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lawme/article/details/21789411

智能推荐

IDEA安装教程_idea2018安装教程-程序员宅基地

文章浏览阅读3.2k次,点赞6次,收藏15次。IDEA社区版安装教程直接上链接 我的是2018版本 需要的朋友自取链接: https://pan.baidu.com/s/101l0AUm_e8fSgtFksEOI3g.提取码:yyds下面介绍安装步骤1、选中“IDEA2018”压缩包,鼠标右击选择“解压到IDEA2018”。鼠标右击选择“以管理员身份运行”。2. 点击“Next”。3.然后点击“Next”。4. 选择“Creat Desktop Shortcut”下适合自己电脑的位数,在“CreateAssociatons”下全_idea2018安装教程

springcloud 笔记9 cloud stream_spring.cloud.stream 配置项-程序员宅基地

文章浏览阅读36次。cloud stream_spring.cloud.stream 配置项

AHB分频器输出的时钟和HCLK关系,是不是HCLK。CLOCK 4bit clock enable和睡眠模式有关_lpc1788睡眠模式-程序员宅基地

文章浏览阅读1.8k次。AHB分频器输出的时钟送给5大模块使用:  1.送给AHB总线、内核、内存、DMA使用的HCLK时钟。  2.通过8分频送给系统定时器的定时时钟(嘀嗒定时器)。  3.直接送给Cortex的空闲时钟PCLK。  4.送给APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36M)另一路送给定时器(timer)2、3、4倍频器使用。该倍频器可选择1或着2倍频,时钟输出供定时器2、3、4使用。  5.送给APB2分频器可选择1、2、4、8、16分频,其输出一_lpc1788睡眠模式

在kibana的devtools 下的查询_kibana devtools 查询-程序员宅基地

文章浏览阅读2k次。GET es_test_final8/_mappingGET _search{ "query": { "match_all": {} }}PUT /testGET /testPOST _analyze{ "analyzer": "standard" , "text": "你好呀"}POST test_index/_analyze{ "analyze..._kibana devtools 查询

Java 生成带文字二维码_java生成二维码带文字-程序员宅基地

文章浏览阅读417次。运行生成带文字二维码示例。_java生成二维码带文字

odoo14配置阿里云免费SSL证书_odoo不支持ssl-程序员宅基地

文章浏览阅读1k次。登入阿里云SSL证书管理,点击购买免费版证书配置好域名后下载nginx证书有了证书之后,第一步上传证书到服务器,配置nginx,我这配置了两个域名对应odoo两个新建的网站域名vi /etc/nginx/conf.d/域名.conf#odoo serverupstream odoo { server 127.0.0.1:8069;}upstream odoochat { server 127.0.0.1:8072;}# http -> httpsserver { l._odoo不支持ssl

随便推点

LangChain入门指南-程序员宅基地

文章浏览阅读3.3w次,点赞47次,收藏384次。LangChain是一个强大的框架,旨在帮助开发人员使用语言模型构建端到端的应用程序。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互,将多个组件链接在一起,并集成额外的资源,例如 API 和数据库。官方文档:https://python.langchain.com/en/latest/_langchain

【智能车入门:面包板】(蓝牙遥控、超声波避障、红外循迹)-程序员宅基地

文章浏览阅读1.6k次,点赞43次,收藏16次。这里将传感器得DO引脚接到PB6(设置成浮空输入),通过判断PB6引脚的高低电平,来控制led亮灭,led一脚接gnd,另一脚接PB7。这里将四个红外循迹传感器都要做一遍测试,就是看它能否正常工作,当能接收到反射回来的红外线时,这个模块的DO引脚就输出低电平,如果距离过远,或者是射到了黑色的物质上,红外线没法反射回来,此时DO引脚输出高电平,靠这个逻辑就能实现简单的循迹。有了①②③④的测试就可以组装一下车子然后测试超声波避障了,此时可以用充电宝给stm32供电,看看能不能正常工作,可以的话就可以上电池了。

网络安全与应用程序安全-程序员宅基地

文章浏览阅读1.2k次,点赞25次,收藏8次。在当今的数字环境中确保数据安全变得比以往任何时候都更具挑战性。

HTML+CSS+JS网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计_标题为提升《html5+css3 web前端设计》课程作业质量,结合课程知识技术特点,同-程序员宅基地

文章浏览阅读51次。1 网页简介:此作品为学生个人主页网页设计题材,HTML+CSS 布局制作,web前端期末大作业,大学生网页设计作业源码,这是一个不错的网页制作,画面精明,代码为简单学生水平, 非常适合初学者学习使用。2.网页编辑:网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad++ 等任意html编辑软件进行运行及修改编辑等操作)。3.知识应用:技术方面主要应用了网页知识中的: Div+CSS、鼠标滑_标题为提升《html5+css3 web前端设计》课程作业质量,结合课程知识技术特点,同

c语言如何使四种运算符同级,二 如何学习C语言的运算符和运算顺序-程序员宅基地

文章浏览阅读141次。该楼层疑似违规已被系统折叠隐藏此楼查看此楼C语言的运算功能十分丰富,运算种类远多于其它程序设计语言。因此,当多种不同运算组成一个运算表达式,即一个运算式中出现多种运算符时,运算的优先顺序和结合规则显得十分重要。初学者往往对此感到非常困难,觉得C语言学习太繁杂,其实只要我们对此合理进行分类,找出它们与我们在数学中所学到运算之间的不同点之后,记住这些运算也就不困难了,有些运算符在理解后更会牢记心中,..._c语言怎么让四种符号优先级相同

矩阵分析学习(补充)_k阶行列式因子-程序员宅基地

文章浏览阅读3.2k次,点赞3次,收藏9次。一、k级行列式因子在A(λ)特征矩阵中所有非0的k级子式首项系数为1的最大公因式Dk(λ)称为A(λ)的一个k级行列式因子;举个例子:在这里我们设A(λ)为对于1问:1级非0子式为(λ+1,λ-1,λ-2),这三个多项式的最大公因式为1,所以D1(λ)=1;2级非0子式为((λ+1)(λ-1),(λ+1)(λ-2),(λ-1)(λ-2)),这三个多项式的最大公因式为1,所以D2..._k阶行列式因子

推荐文章

热门文章

相关标签