牛人外汇论坛

 找回密码
 立即加入

QQ登录

只需一步,快速开始

查看: 126|回复: 0

MQL4课程十三 (11)

[复制链接]
  • TA的每日心情
    奋斗
    2019-12-8 00:15
  • 签到天数: 2 天

    [LV.1]初来乍到

    86

    主题

    87

    帖子

    5192

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    5192

    荣誉管理

    发表于 2019-12-8 00:43:10 | 显示全部楼层 |阅读模式
    我的第一个指标二
    今天我们将在上一课创建的代码中添加新的代码行,然后对所有代码进行逐一讲解。
    新添加的代码行用红色字体标出:

    #property copyright
    #property link   
    #property indicator_separate_window
    #property indicator_buffers 1
    #property indicator_color1 Red
    //---- buffers
    double ExtMapBuffer1[];
    //+------------------------------------------------------------------+
    //| Custom indicator initialization function                         |
    //+------------------------------------------------------------------+
    int init()
      {
    //---- indicators
       SetIndexStyle(0,DRAW_LINE);
       SetIndexBuffer(0,ExtMapBuffer1);
       string short_name = "我的第一个指标正在运行!";
    IndicatorShortName(short_name);
    //----
       return(0);
      }
    //+------------------------------------------------------------------+
    //| Custom indicator deinitialization function                       |
    //+------------------------------------------------------------------+
    int deinit()
      {
    //----
       
    //----
       return(0);
      }
    //+------------------------------------------------------------------+
    //| Custom indicator iteration function                              |
    //+------------------------------------------------------------------+
    int start()
      {
       int    counted_bars=IndicatorCounted();
    //---- check for possible errors
    if (counted_bars<0) return(-1);
    //---- last counted bar will be recounted
    if (counted_bars>0) counted_bars--;
    int pos=Bars-counted_bars;
    double dHigh , dLow , dResult;
    Comment("Hi! I'm here on the main chart windows!");
    //---- main calculation loop
    while(pos>=0)
    {
    dHigh = High[pos];
    dLow = Low[pos];
    dResult = dHigh - dLow;
    ExtMapBuffer1[pos]= dResult ;
    pos--;
    //----
       
    //----
       return(0);
      }
    //+------------------------------------------------------------------+
    现在,让我们来逐行解释这些代码:

    注释:
    开始的5行灰色的代码是注释。
    我们用注释方式书写的代码将会被编译器忽略。
    你可以用两种方式书写注释:
    单行注释:开始于//,结束于一个新行。
    多行注释:开始于/*,结束于*/
    在我们的程序里,MQL4向导收集我们输入的程序名,作者和网站链接,并把它们作为注释,写在程序的顶部。
    #property copyright "Codersguru"
    #property link "http://www.forex-tsd.com"
    #property indicator_separate_window
    #property indicator_buffers 1
    #property indicator_color1 Red
    编译控制:
    我们注意到上面的几行都一#property开始,这是因为它们是MQL4预处理程序的一部分,被叫做编译控制。
    它们的工作是设置你程序的属性。例如:你的指标将被显示在主窗口还是指定的窗口?程序的作者是谁?等等。
    注意:预处理程序行结束于回车而不是分号。
    我们来讨论下这些变量:
    link:用来设置你在向导的第二步设置的网站链接。它的数据类型是字符串。
    copyright:程序的作者名。也是你在向导的第二步输入。它的数据类型也是字符串。
    stacksize:堆栈大小。用来设置每一个线程的内存大小。它的数据类型是整型。默认值为16384.
    indicator_chart_window:设置了这个属性,你的指标将被显示在图表窗口。它的数据类型是void,意思是没有返回值。
    indicator_separate_window:设置了这个属性,你的指标将被显示在单独的窗口。
    而且你可以用下面两个属性来设置指标窗口的刻度:
    indicator_minimum用来设置指标窗口的最小刻度,indicator_maxisum用来设置指标窗口的最大刻度。
    你还可以用下面的属性在你的指标窗口画水平线:
    indicator_levelNN=18):你最多可以在你的指标窗口上画8条线水平线。
    例如:
    #property indicator_minimum 0 //指标窗口的最小刻度
    #property indicator_minimum 100 //指标窗口的最大刻度
    #property indicator_level1 10 //第一条水平线
    #property indicator_level2 65.5 //第二条水平线
    注意:indicator_levelN必须大于indicator_minisum,并且小于indicator_maxisum
    indicator_minisumindicator_maxisum的数据类型是整型。indicator_levelN的数据类型是双精度。
    indicator_chart_windowindicator_separate_window这两个属性都是void数据类型。你仅仅需要书写它们,但是它们没有返回值。
    file:///C:\Users\army3\AppData\Local\Temp\ksohtml38076\wps26.png
    在我们的程序里我们将把我们指标绘制在独立的窗口:indicator_separate_window
    indicator_buffers
    通过这个属性我们可以设置计算指标的缓冲区个数(18),在我们的程序里我们只使用一个缓冲区,因为我们只画一条线。
    #property indicator_buffers 1
    indicator_colorN:
    我们可以在我们的指标窗口画8条线,并且可以用这个属性为每条线设置属性。N是在属性indicator_buffers中设置的数值。
    你可以在你指标的属性对话框改变这个颜色,在本例中,我们把我们的指标线设置为红色。
    #property indicator_color1 Rea
    这个属性的数据类型是color
    file:///C:\Users\army3\AppData\Local\Temp\ksohtml38076\wps27.png
    double ExtMapBuffer1[];
    数组:
    在日常生活中,我们可以把具有相同属性的物品进行分类归总。在程序里我们也可以把就有相同类型的数据进行归总。这就是数组。
    数组很像是表格,我们可以把相同的数据放进表格里。然后通过行和列来定位和访问数据。
    在数组里,我们通过索引来访问数据。
    我们使用下面的代码声明数组:
    int my_array[50];
    在这里,我们定义了一个有50个元素的整型数组。
    我们可以通过索引访问数组中的每一个元素:
    my_array[10]=500;
    我们也可以在声明数组的同时对其进行初始化:
    int my_array[5]={1,23,5,3,6};
    在我们的例子中我们定义了一个双精度类型的数组:
    double ExtMapBuffer1[];
    我们使用这数组来计算我们将要画线的那些柱图的值。
    //+------------------------------------------------------------------+
    //| Custom indicator initialization function                         |
    //+------------------------------------------------------------------+
    int init()
      {
    //---- indicators
       SetIndexStyle(0,DRAW_LINE);
       SetIndexBuffer(0,ExtMapBuffer1);
       string short_name = "Your first indicator is running!";
    IndicatorShortName(short_name);
    //----
       return(0);
      }
    特殊函数:
    int init()
    {
    }
    每一个程序在运行其他函数之前都将运行这个函数。我们可以把我们变量的初始值放在这里。以下是它的内容:
    SetIndexStyle:
    void SetIndexStyle( int index, int type, int style=EMPTY, int width=EMPTY, color
    clr=CLR_NONE)
    这个函数设置画线的样式。
    index参数的值为07,因为数组的索引开始于0,而我们最多只能画8条线。它的值表示将要被设置样式的那条线。
    type参数设置指标类型:
    DRAW_LINE=0 画线)
    DRAW_SECTION=1 (draw section)
    DRAW_HISTOGRAM =2 (画柱状图)
    DRAW_ARROW=3 画箭头符号,需要设置符号代码)
    DRAW_ZIGZAG    = 4 画锯齿图
    DRAW_NONE=12 不画线)
    style参数设置线的类型:
    STYLE_SOLID=0 (实线)
    STYLE_DASH =1(虚线)
    STYLE_DOT=2 (点化线)
    STYLE_DASHDOT (虚线和点)
    STYLE_DASHDOTDOT=3 (虚线和两点)
    它的默认属性为empty,意思是线的类型不被改变。
    实例如下图:从上到下分别为:01234
    file:///C:\Users\army3\AppData\Local\Temp\ksohtml38076\wps28.png
    width参数设置线的宽度(像素)15,它的默认属性为empty,意思是不改变线的宽度。
    color参数设置线的颜色。它可以是任何有效的颜色类型变量。它的默认属性是CLR_NONE,意思是不改变线的颜色。
    在我们的程序中:
    SetIndexStyle(0,DRAW_LINE);
    我们把索引设置为0,说明我们的设置是针对第一条(在我们的程序中也只有这一条)指标线的。我们把指标类型设置为画线。其他的属性我们都设置为默认值。
    SetIndexBuffer:
    bool SetIndexBuffer( int index, double array[])
    绑定全局数组到自定义指标预定义的缓冲区。需要计算的指标缓冲区的个数由函数indicatorbuffers()函数设置并且不能超过8个。如果获取数组名成功,返回true;否则,返回false
    index—指标线
    arry[]—存储计算指标的数组
    setindexbuffer()函数把索引0绑定到第一条线的缓冲区,把索引1绑定到第二条线的缓冲区。以此类推。
    因为我们计划把我们要计算的值放在数组ExtMapBuffer1,并且我们只有一个指标缓冲区。所以我们的程序需要写成下面这样:
    setindexbuffer(0,ExtMapBuffer1);
    IndicatorShortName:
    void IndicatorShortName( string name)
    这个函数将把我们输入的字符串显示在图表窗口的左上角。
    file:///C:\Users\army3\AppData\Local\Temp\ksohtml38076\wps29.png
    在我们的例子中,我们声明一个名为short_name的字符串变量并把它赋值为:“我的第一个指标正在运行!”。然后我们把它传递给indicatorshortname()函数。
    string short_name=我的第一个指标正在运行!;
    indicatorshortname(short_name);
    return(0);
    这是init()函数的返回值,它将终止init()函数的执行,并继续执行下一个函数start()
    int deinit()
    {
    //----
    //----
    return(0);
    }
    对于deinit()函数并没有什么新的内容,你可以参考下上一课的内容。
    最后感谢大家,欢迎回帖批评指正。

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即加入

    本版积分规则

    QQ|Archiver|手机版|小黑屋|牛人外汇论坛 ( 粤ICP备13040892号-1 )|网站地图

    GMT+8, 2020-4-7 12:12 , Processed in 1.130918 second(s), 30 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表