MQL4 开始动手写自己的外汇…

来源:互联网 发布:零基础学算法 光盘 编辑:程序博客网 时间:2024/05/20 23:36
原文地址:开始动手写自己的外汇智能交易系统">MQL4 开始动手写自己的外汇智能交易系统作者:秋实夏花
这几天又重温了一下外汇市场的紧张时光,对于汇市的人来说,时时刻刻的紧张盯盘带来的压力不是股票那种隔天才能交易的模式能够“媲美”的。此刻,我真正能体会到人们能于科技对智能化对自动化的渴望。人们总说汽车使人懒惰之类的话,却仍旧对智能化趋之若鹜。这不是高科技的错,人类的大脑早已无法快速计算自己的生活,因此需要电脑,需要智能。 面对各种外汇技术指标,各种外汇EA智能交易系统,我一直不喜欢把自己的口袋向他们敞开,或许在你不注意的时候,他会偷偷的将你的口袋掏空。这是没有一个用过EA的人能够一夜暴富的原因,不相信别人的,同样也不相信自己的眼光。对,确实不应该相信。我是一个写程序的"投机者",在搞不清楚别人的EA用的是何种策略,用的是何种方式去产生交易的情况下决不会贸然用之。同样我也是一个对金融一窍不通的"拜金者”,我梦想有一天能够借助电脑能够借助程序,在程序开启后的几天甚至几年都不需要再看一眼电脑,然后看着银行卡的数字一翻再翻。呵呵。或许,我有些痴心妄想了。但妄想的绝不止我一个,那么今天我把自己对MQL4编程语言的知识讲给大家,或许在以后的将来,有人能够用他做出这样一种完美的系统,实现我们这些妄想的人的幻想。

   下面开始讲:

          第一条: MQL 4 语言 跟C/C++的语法,格式基本相同,所以怎样声明变量,怎样做循环,怎么写函数,等等都可以直接略过。(前提是要懂C哈。。。)

          第二条:  MQL 4语言 的程序结构 和Java applet完全一样, 如果不懂java ,那我简单的说两句。 java applet  主程序中有三个函数:startup();cleanup();processEvent(); 他们分别在不同的时期完成不同的任务。

   再来看MQL4 : init();start(); deinit(); 显然,init()只是在开始运行的时候运行一次,完成一些初始化变量,窗口之类的工作,一旦return,便不再运行(直到下一次启动指标时)。deinit()是退出指标时做清洁的,同样只运行一次,它可以不用写任何代码,甚至主程序中不出现此函数。(直接结果是电脑里边很多垃圾,内存泄漏等,)。start()函数是程序的灵魂,每当服务器送来一个新的数据时,比如最高价变化了0.0001,那么他将被调用运行一次(实际上相当于一个循环啦,跟java一样,当有事件发生时就会调用processEvent()一样)。

    第三条:有人奇怪,那些指标上奇形怪状的线是如何画上去的。我告诉你,它里边可没有能人为画线的函数哦,怎么弄的呢。像这样,定义一个数组作为每一个数据计算后的结果缓存区,比如定义MacdBuffer[];其中,在start()函数中计算并赋值,如MacdBuffer[0]=1,MacdBuffer[1]=3,那么当指标被运行时就会在每一根k线与第二根k线对应的位置画一根连线,连接(0,1),(1,3)两个点。所以呢你要做的就是定义一个数组,并且跟据自己的方法计算每个元素的值。

              第四条:有人还会奇怪,怎么有的指标是一条平滑曲线(如RSI指标),面有的是一此分立的柱线(如AC指标),那么我告诉你,这也不是自己画出来的。在init()函数中,将做这些设定工作,下面我们来看看这里面都有什么。

                第1小步,首先要给让你的指标有个名字显示在图上吧,名字随便自己起啦。看看怎么实现。

                   int init(){   stringshort_name;   short_name="UDR("+K_number+")"; 

          IndicatorShortName(short_name);////确定指标名字,
            SetIndexLabel(0,short_name);// 在图上显示出来。就是这样。} 

     第2小步,给缓冲区编个序号.。为什么呢/?有很多指标都不只一条简单的线,像鳄鱼指标有三条,那么定义的数组到底代表哪一条线呢,就需要按顺序编号。程序如下(省略指标命名的一段 ):

                 init() { .......//指标命名的程序。 ;

        IndicatorBuffers(3);                //声明有三个数组要在图上表示。语言规定了能同时定义的数组不得超过8个,也即内部参数不能大于8.  

          SetIndexBuffer(0,RSIBuffer);//其中RSIBuffer,PosBuffer,NegBuffer.都是没有定义元素数量的数组。
          SetIndexBuffer(1,PosBuffer);
          SetIndexBuffer(2,NegBuffer); // 语言规定了能同时定义的数组不得超过8个        

     } 

     第3小步,下面就是设置要画线的样子还有从哪里开始画起了,完了这一步就没有了。(同样省略上两步的程序)    init()

        {    SetIndexStyle(0,DRAW_NONE);//......不画线。
           SetIndexStyle(1,DRAW_HISTOGRAM);//.....画的是竖起的分立的线。
           SetIndexStyle(2,DRAW_LINE);// 。。。画的是连续的平滑曲线。还有几种样式可以自己替换

                SetIndexDrawBegin(0,38);//
               SetIndexDrawBegin(1,38);// 这里前面的0,1,2,等就代表上一步编过号的数组了
               SetIndexDrawBegin(2,38); //38则是规定每根线从第几个k线处开始画起。

    //为什么不从0线开始画起呢,一种原因是因为只有从前面的几个数据基础上才能得到第一个指标数据。典型的是Ma指标,要平均前边几根K线的值才能得出一个结果,那么前边这几根k线对应的位置因为没有数据能够计算所以不能画线了}

    第4小步: 上面确实已经结束了,不过还要补充的是,有人会问:你定义的数组呢,咋没见在哪儿定义过呢。

    这个问题可以想一下C语言中的全局变量了。因为三个函数都要用到这些数组,所以一定要在函数之外的最上面定义了。 那么现在来说说函数之外.......会有什么东东呢。

          

  第五条:函数之外。最顶端,当然是定义一些要用到的全局变量,外部接口,还有整个程序的表现形式了。

                   #property  copyright   "Copyright ?2005, MetaQuotes SoftwareCorp."   //这里当然是定义版权的事情了。     

 #property link    "http://user.qzone.qq.com/1185574260 "  // 这两句可有可无的东东。
       #property indicator_separate_window           //这里定义指标打开后的显示方式,有两种哈,一种就是另起窗口。即indicator_separate_window.另一种则是在主窗口里显示了,即附加到k线图上去的。即indicator_chart_window
      #property  indicator_buffers3   //声明程序要用到几个数组缓冲区。
      #property indicator_color1  Black //对应每个缓冲区显示时所用的颜色。即每根线的颜色。
      #property indicator_color2  Green // 这里的indicator_colorN 是关键字一样的。总共有8个啦,每一个将对应你在下面为缓冲区编的号码。 即编号为0的缓冲区画出来的线是黑色的。等等等等。

//以上是预处理的内容。即还可能有一些#include<>.或者一些#define之类的。都会在预处理阶段先处理好。

               double    ExtBuffer0[];
    double    ExtBuffer1[];//这里就是在定义缓冲区啦,要用几个就定义几个,但是能在图上显示用的最多能有8个。

  

    extern int FastEMA=12;// 这里也算是全局变量了,但是前面加了一个关键字。又代表一种接口形式。即指标的属性窗口里会显示这几个变量,然后人为的输入一个新值去替代,默认的就是这里的赋值了。
    extern intSlowEMA=26;//当然属性窗口也不是人为画出来的哈,运行指标后,每个指标都会自带属性窗口,里面显示的就是这些变量,修改并保存后,在start()函数中就会用新的值去计算了。而不是这里的26.

    第六步:自定义的函数。你也许会定义一些函数。那么你可以将他们放到主程序的任何地方。这里跟C++一样,不管你放在开端,还是在最后。程序都能调用。(绝不能在三个主函数里定义函数哈,因为那样没人能够调用到。)

 

总结: 说了上面这些。或许还是无法下手去写一个指标。在这里,上面只是你能够读懂MQL4程序的基础,真正的核心就是那些定义在库里边的库函数啦,就像没人会抛弃STDIO.h库而写出一个C程序一样。 这里的库中定义了一些常量。一些基本指标计算函数,一些对象方法,一些下单交易操作的方法。写好你的逻辑,完全可以不用人点鼠标即可自动的完成一系列的交易。下一次的日记就介绍这些函数及常量。   
 

 

0 0