下载MetaTrader 5

外汇开户---送MQL培训---公开我的MT4编程书稿 - 页 3

要添加评论,请登录注册
lhb
3
lhb  

没完呢?

楼主继续。

lihai
3
lihai  
wp00000008:

行 3~4 :两个预处理指令,表示本 ea 的版权信息

行 8 :如果当前时间是星期一,且在时间在 00 : 05 : 00 之前,则执行 9~25 行。

if语句:当括号()内的条件成立时,执行 { } 内的代码

DayOfWeek函数:判断当前是星期几。 1~6 :星期一 ~ 星期六, 0 :星期天

==运算符:相等判断

&&运算符:并且判断

Hour函数:当前时间的小时部分, 0~23

Minute函数:当前时间的分钟部分, 0~59

行 9 :如果当前单据总数等于 0 ,则执行 10~14 行,否则执行 16~24 行。行 9 和行 15 是一个 if/else 语句。

行 10 :本周开盘价大于上周收盘价,则执行 11 行,否则小于的话则执行 13 行。

Open[0]表示当前周期的开盘价, Close[1] 表示上一周期的收盘价, Open 和 Close 都是预定义数组,分别表示开盘价和收盘价, 0 和 1 是周期数,关于数组的详细描述,请参阅后续章节。本 ea 是运行于 H1 周期的, Open[0] 表示当前一小时的开盘价, Close[1] 表示上一小时的收盘价;当满足行 8 列出的条件时, Open[0] 等同于星期一的开盘价, Close[1] 等同于上周五的收盘价。

行 11 :下买单。

行 13 :下卖单

OrderSend函数用于下单,各参数含义如下:

参数 1 :货币对。 Symbol 函数返回 ea 附着的当前货币对。

参数 2 :单据类型。

OP_BUY:买单

OP_SELL:卖单

OP_BUYSTOP: BUYSTOP 单

OP_BUYLIMIT: BUYLIMIT 单

OP_SELLSTOP: SELLSTOP 单

OP_SELLLIMIT: SELLLIMIT 单

参数 3 :下单大小。本例为 0.1 手

参数 4 :交易价格。对于买单而言,最低交易价格是 Ask ;对于卖单,最高交易价格是 Bid

参数 5 :滑点。由于发生 OrderSend 指令到单据成交之间有个时间差,在这段时间之类,交易价格可能会发生变动,导致无法按照指定的价格进行成交。交易者可以在下单的时候指定最终交易价格和原定交易价格之间的最大浮动值,以确保交易尽快成交。这个值的单位为 Point 。

参数 6 :止损价位。为 0 表示不指定止损价。

参数 7 :止盈价位。为 0 表示不指定止盈价。

参数 8 :单据的备注。

参数 9 :单据的 magic 数字。 magic 数字用于区分不同 ea 所下的单,具体请参阅后续章节。

参数 10 :单据失效时间。仅限挂单,当单据打到后,挂单自动删除。为 0 表示不指定失效时间。

参数 11 :箭头颜色。下单成功后, ea 在行情图表上会用一个箭头图标标注下单位置。买单为蓝色 Blue ,卖单为红色 Red 。

返回值:单据编号。如果返回值为 -1 表示下单失败。此处没有检查下单结果。

行 16 :选定第一个单。在对单据进行后续操作之前,一般需要有个选定的动作。

OrderSelect函数:选定一个单据

参数 2 :选定标准。 SELECT_BY_POS 按照单据序号选定,所有的单据都是从 0 开始编序号的。 SELECT_BY_TICKET 按照单据编号选定。 SELECT_BY_POS 和 SELECT_BY_TICKET 都是整数常量,关于整数和常量的概念,请参阅后续章节。

参数 1 :要选定的单据的值,具体的值的含义由参数 2 解释。

行 17 :如果当前时间离选定单据的下单时间超过一天,则执行 18~23 行。

TimeCurrent函数:表示当前时间,单位为秒。返回值为从 1970 年 1 月 1 日零点到现在的秒数。

OrderOpenTime函数:返回选定单据的下单时间,单位为秒。

行 18 :如果为买单则按照 Bid 平仓(行 19 )

行 19 :如果为卖单则按照 Ask 平仓(行 22 )

OrderType函数:返回选定单据的单据类型。

参数 1 :单据编号。 OrderTicket 函数返回当前选定单据的编号

参数 2 :平仓数量。 OrderLots 函数返回当前选定单据的手数。

参数 3 :平仓价格。对于买单为 Bid ,对于卖单为 Ask 。 Ask 和 Bid 是两个浮点数类型的变量,关于浮点数和变量的概念,请参阅后续章节。

参数 4 :滑点。含义同 OrderSend 中的滑点。

本 ea 的代码量为 28 行。考虑到初学者的理解能力,进入的概念是比较少的。对本 ea 稍加改造,加上少量代码后,会完整而可靠的实现交易思路,整个代码量将不会超过 40 行。

一般来说,完整的实现一个交易思路所需的 ea 的代码量是不大的,即便是对于很复杂的交易策略,对于熟练开发者来说,所需的代码量也很少会超过 500 行。如果某个交易思想需要过多的代码量来表达,那么很可能是以下两种情况。

第一情况,逻辑混乱。 mt 平台的 ea 的运行逻辑和人处理交易的逻辑是有些不一样的。人在处理交易的时候,讲求一个步骤,先开仓,后平仓,这个过程里面有一个思维的先后延续性。而对于 mt 平台的 ea 而言,所有的逻辑只有一个 start 函数,而 start 函数的执行并非是有先后次序的(当然 start 函数内部的代码是先后执行的),“价格变动一次, start 函数执行一次”是 ea 逻辑的最高归纳。这种重复性、随机性和人工交易的步骤性思维是不一样的,为了将这种随机性逻辑转化为步骤性逻辑,这就要求开发者在程序内部维护并检查当前交易进度的状态,使得每次 start 被执行的时候,按照当前状态来决定下一步的动作:开仓或是平仓。在 ea_002 中,行 8 、行 9 、行 17 即是对当前交易状态的判断,特别是行 17 ,如果去掉了这行,将导致在周一开盘的 5 分钟内, ea 反复的开仓和平仓。

mt平台 ea 的这种特性和人工交易的差异性,也是导致一些初学者对 ea 开发感到迷惑、 ea 的运行结果不符合预期逻辑、且难以查找和修正 ea 运行错误的原因。

第二种情况,老外写的 ea 多半代码量很大。接触过一些老外写的代码,动辄 2000 行甚至更多,但程序逻辑并无问题,只是由于代码量比较大,执行速度比较慢,特别是复盘测试的时候(关于复盘测试请参阅后面的“ EA 测试”)。代码看懂了之后,重新编写 ea 实现相同的功能,可能只需要 30% 的代码量。

东方人凡事讲究“只可意会不可言传”,西方人更多的喜欢钻研具体的方法,对方法的细节定义得非常仔细和严格。举个例子,关于一种交易方法,东方人可能会画个示意图,然后大家去体会;而西方人可能会去搞清楚图上的每个元素、每根曲线的来历,元素之间的相对关系、周期数、上下大小比例、点位等,把这些东西用具体的数值定义下来。相比较而言,西方人的思维更接近电脑的那种机械式思维,这个是编写好的 ea 的一个基本条件:像电脑一样的思考。

123
要添加评论,请登录注册