在开发一个EA之前如何对EA的策略进行规划
在开发一个EA之前,需要对EA的策略进行规划,做到有的放矢。
EA的策略包括一下几点:
1、开仓:当行情满足什么条件时,EA进行开仓,何时做多,何时做空。
2、平仓:当行情满足什么条件时,EA要进行平仓。
3、止损和止赢:EA是否需要设置止损和止赢,如何设置。一般来说,止损是最好要设置的,以防止行情突变所带来的无法预料的损失。
不同于股票交易,外汇交易在下单的时候,可以设置止损价位和止赢价位,当价格达到止损或止赢价位时,交易单自动平仓。
以做多为例,假设买价为1.5000,止损价为1.4800,止赢价为1.5100,那么这里止损就是200点,止赢就是100点。
4、加码:是否要加码,何时加码。
接下来,以Larry Williams在《短线交易秘诀》中讲到的一个交易方法来作为本例的交易策略。
if
语句:当括号()内的条件成立时,执行 { } 内的代码
if语句:当括号()内的条件成立时,执行 { } 内的代码
==运算符:相等判断
&&运算符:并且判断
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 语言中预先占用,用户不可用于变量命名,这些保留字如下,它们会在后续章节中逐渐提到。
bool、 break 、 case 、 color 、 continue 、 datetime 、 default 、 double 、
else 、 extern 、 false 、 for 、 if 、 int 、 return 、 /static 、 string 、 switch 、 true 、 void 、 while 。
其中 return 可以把它当做一个保留字,也可以当做一个特殊的函数。