在开发一个EA以前,需要对EA的策略执行规划,做到有的放矢。
EA的策略包含一下几点:
1、开仓:当行情满足什么条件时,EA执行开仓,什么时候做多,什么时候做空。
2、平仓:当行情满足什么条件时,EA要执行平仓。
3、止损和止赢:EA能否需要设置止损和止赢,如何设置。一般来看,止损是最好要设置的,以防止行情突变所导致的无法预料的损失。
不同于股票交易,外汇交易在下单的时机,可以设置止损价位和止赢价位,当价格高达止损或止赢价位时,交易单自动平仓。
以做多为例,如果买价为1.5000,止损价为1.4800,止赢价为1.5100,那么这里止损就是200点,止赢就是100点。
4、加码:能否要加码,什么时候加码。
接下去,以Larry Williams在《短线交易秘诀》中讲到的一个交易方法来作为本例的策略逻辑。
if
语句:当括号()内的条件成立时,实施 { } 内的代码
if语句:当括号()内的条件成立时,实施 { } 内的代码
==运算符:相等分析
amp;&运算符:而且分析
Hour函数: 目前时间的小时部分, 0~23
Minute函数:目前时间的分钟部分, 0~59
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 反复的开仓和平仓。
-------------------------------------------------------------------------------------------------------------------------
1.1. 基本语法
MT4的源代码由下方几部分构成,各部分之间一般用行执行分隔:
1、 注释
注释是源代码中的表明部分,一般是为了说源代码执行表明,以便更好的阅读。
注释不是可实施代码的一部分,在源代码编译生成可实施代码的时机,
注释会被忽视。
(1) 单行注释 以 // 开头的行,即是注释。
(2) 多行注释 以 终结。 之间的部分即是注释。
2、 预处理指令
以 # 开头的行,是预处理指令,用于一部分特殊的表明和用途。具体描述请参阅后面的“预处理指令”。
3、 全局变量定义
请参阅后面的“变量”部分。
4、 函数
除了以上三个部分, MT 代码的其余部分均为由若干个函数构成,函数之间可相互调用。
函数则由语句构成,语句之间采取分号执行分隔,这些语句会在后面渐渐提及。
除非特别表明,语句的各个部分是区分大小写的,即 start 和 START 是不一样的。
有关语句的一部分元素的约定如下: 1、 2、保留字
保留字是 MT 语言中预先占用,用户不可用于变量命名,这些保留字如下,它们会在后续章节中渐渐提及。
ool、 break 、 case 、 color 、 continue 、 datetime 、 default 、 double 、
else 、 extern 、 false 、 for 、 if 、 int 、 return 、 static 、 string 、 switch 、 true 、 void 、 while 。
其中 return 可以把它当做一个保留字,也可以当做一个特殊的函数。