如何将技术指标转化为智能交易系统(EA)
时间:2011-02-22 11:17:12 来源:作者:
第一部分:指标
为了能赚钱而不是亏损,无论是专业的交易商还是个体,都在研究各和总结各种种的规律,并做成指标,我们经常会发现一些指标图线看起来很完美,于是都会想到要根据指标的变化进行交易。
但这样做会赚钱吗?
能否赚钱,我们就要看这些指标有没有作弊。即确定指标是否有未来函数的计算,也就是说指标会不会根据现在的K线,计算后将指标在历史K线上标示做更改。比如原来是卖的提示,改为买(恐怖吧)。(当然还有一些EA特有的环节也会影响盈利问题,在这里不讲)确定是否有未来函数的方法有两种:
1.白盒校验(即查看源码)
直接看源码中的循环部分,如果有修改历史曲线数组的行为,则可以立刻断定有未来函数。
2.黑盒观察
当没有源码的时候,可以将指标加载到1分钟的图线上,连续不断观察其标示的变化,尤其注意与当前K线状态最接近的历史K线标示的变化。如果随着当前K线的变化出现过历史变化更改,则也可以确定有未来函数。
指标EA化之前必须要确认的事情:
如果一个指标含有未来函数,那么这个指标是没有多大意义的。也就是说,我们要将指标改为EA前,必须确认这个指标是不含未来函数的,这样指标EA化才有意义。
第二部分指标EA化
接下来将指标EA化大致的做法是:
在EA中通过函数iCustom读取这个指标的当前K线输出值,得出当前的状态,来决定是否入场或者平仓并反向入场。
iCustom的具体用法:
指标一般都是曲线或者箭头两种。在这里我们要把曲线和箭头都看成是数组就容易理解了。
对于指标来说每一条曲线或者箭头都是写在与每个K线对应的数组中的,也就是说一条曲线对应一个数组,一个方向的箭头也是对应一个数组(有箭头的数组值是当时的价格,没箭头地方的数组值是“空”)
iCustom MT4的帮助里说的是:“计算指定的客户指标并且退回它的值”,即这个函数可以让你获取指定指标的第几个数组对应第几根K线上的计算数值。
具体如下:
double iCustom(string symbol, int timeframe, string name, ..., int mode, int shift)
计算指定的客户指标并且退回它的值。必须在terminal_directory\experts\indicators目录
内编写客户指标(*.EX4文件)。
参量:
symbol - 计算指标数据上的货币对名称。NULL表示当前货币对。
timeframe - 时间周期。可以时间周期列举任意值。0表示当前图表的时间周期。
name - 客户指标完整的程序名称。
... - 参量设置(如果需要)。通过的参量和他们的顺序必须与desclaration命令和客户指标的外部可变物的种类对应。
mode - 索引行。从0到7并且必须对应以其中一个使用的索引的SetIndexBuffer 函数。
shift - 从显示缓冲采取的值的索引(转移相对当前柱特定相当数量期间前)。
示例:
double val=iCustom(NULL, 0, "示例Ind",13,1,0);
double va2=iCustom(NULL, 0, "示例Ind",13,0,1);
例如:一个指标,画了两条曲线,则可以用iCustom取得这个指标在第4根K线上对应的第一条曲线的数值。
我们现在已经可以根据自己的想法去获得一个指定指标的任何K线上的状态数值了。那么下一步我们就要开始EA的概念。
因为EA只针对当前价格状态下的动作进行控制。所以一般而言我们就取指定指标在当前K线下的计算数值用于EA的条件判断。
如果你认为当前K线没有结束,其数值始终在变化,有可能一会有讯号一会没讯号,那麽你可以采用取前一K线的指标数值的方式作为基础。(如果用当前K线指标数值作为条件会有不确定的结果,但如果用前一K线数值做条件则有“错过最佳入场点”的问题。这是需要程序设计者权衡的问题。)
另外的一个问题,就是怎末去判断指标输出的数值与我们肉眼看到的讯号一致起来的问题。
如果参考的指标是一种变线,则一定是一种颜一个数组的方式叠加起来显示的。我们在取其数值的时候只需要看看不同颜的数组的数值比较一下就知道其结果是哪种颜,并作为EA的条件进行动作就行了。
如果是箭头的方式,则一样是去取其数值,无箭头的K线上指标对应的数值是“空”,有箭头的地方数组对应的数值肯定不是空。用这个来判断是否发生了讯号就行了。
比如双线,就一定是两个数组分别显示不同颜,当指标认为应该显示其中一种颜的时候就将这个颜对应的数组在当前K线中的数值设成当前价。反之则设为“空”。这样循环一遍后,你肉眼看到的就是变线了。
现在我们可以轻松获得指标的当前讯号状态了!
下一步就是结合进EA中,就是把指标中的数组值拿过来。
第三部分EA 编程逻辑
EA就是一个循环往复的过程。每来一个价格就运行一次。
EA是电脑,并不知道你现在的仓位情况也不知道指标的情况,除了计算什么都不知道,一切都是编程者赋予的。因此,编程者脑子里一定要建立一种综合状态的概念。
EA的一开始一定要先进行仓位的情况检查。大致的逻辑如下:
1. 先查出持仓情况和持仓单的方向。
2. 然后获得指标的数值。
3. 判断并操作。
持仓状态下:根据持仓单的方向进行对应来判断反向讯号是否发生。如果发生则平仓并反向入场。如果没发生则直接返回,等待下一次价格的而到来。
空仓状态下:则两个方向的讯号都做判断,哪边发生了就按那边的方向入场。
4. 其他的的细节
不论入场还是出场都要在发出动作后马上判断是否正确执行的判断。如果没有执行成功则一定要立刻放弃后面的操作直接返回。等待下一个价格来的时候在此发出同样的动作。
另外说明的是数据是自动更新的。
MT4新编:简单三线交叉EA
时间:2011-03-09 11:29:56 来源:作者:
MT4编程入门教程目录
MT4编程入门1:MT4自定义指标的基本操作
MT4编程入门2:指标源码中的常用符号说明
MT4编程入门3:自定义变量
MT4编程入门4:自定义函数
MT4编程入门5:自定义数组
MT4编程入门6:市场数据取值
MT4编程入门7:判断语句
MT4编程入门8:循环
MT4编程入门9:MT4自定义指标的结构
MT4编程入门10:画一条指标线
MT4编程入门11:MT4的报警
MT4编程入门1:MT4自定义指标的基本操作
MT4自定义指标的保存目录、指标编缉器与指标调用
一、MT4自定义指标保存在C:\Program Files\MetaTrader 4\experts\indicators这个目录中,
该目录中主要有二种类型的文件,
一种是mq4文件,这是MT4自定义指标的源码文件,是一种高级语言文件,可以人工编写修改,机器不能直接执行,但能在MT4启动时自动编译为ex4可执行文件。
另一种就是ex4文件,这是MT4自定义指标的可执行文件,由mq4文件编译得到。
mq4文件必须编译为ex4文件才能被MT4执行。
但ex4文件是机器码文件,人工不可修改
另外还有一个文件是mqlcache.dat,它用来保存目录中的文件信息,如果MT4无法自动编译,只要删除此文件即可解决问题
mq4文件编译为ex4可执行文件有两种方法:
1、MT4启动时,会自动把此目录中的mq4文件编译为ex4文件。
2、用MQ语言编辑器打开mq4文件,点一下“编写”按钮,即可生成ex4文件
交易时间字符串是什么二、下载保存mq4文件、ex4文件
在论坛上我们经常看到有mq4文件、ex4文件可供下载,我们只要把它们保存到C:\rogram Files\MetaTrader 4\experts\indicators这个目录,也就是下面这个目录中,就可以了。如果下载的是ex4文件,那可以直接调用;如果是mq4文件,则需要重启动MT4,让系统自动生成
ex4可执行文件。如果下载的是rar、zip等类型的压缩文件,还必须下载后解压到此目录下才能使用。
三、将源码保存为源码文件
在论坛上,我们也经常能看到指标源码贴在网页上,但没有mq4、ex4等文件可以下载,只能复制源码。此时需要我们自己动手将源码保存为源码文件,那也没关系,非常地简单,多点几下鼠标就搞定。
1、打开MQ语言编辑器
2、在MQ语言编辑器中新建一个文件,文件名一定要输,别的随便操作都没关系。
3、删除新文件里面的所有内容,成为一个空文件,
4、接着我们就可以将网页上源码复制粘贴进来
试着点一下“编写”,如果左下角出现“0错误,0警告”,那说明源码没问题,编译通过了,成功生成了ex4可执行文件
5、还有很重要的一点,就是要把源码文件保存到正确的目录中
保存后,再点一下编写。
到此,源码保存完成。
当然,我们也还有另的办法:
可以打开一个原已存在的mq4文件,然后另存为你需要的文件名,再删除文件中的所有内容成为空文件,把网页上的源贴到文件中保存即可
也可以在记事本中新建一个文件,把网页上的源码贴进记事本,然后取个文件名保存到上面提到的目录,不过文件后缀必须输入mq4,保存类型选择“所以文件”
四、mt4程序调用自定义指标
这非常简单
MT4编程入门2:指标源码中的常用符号说明
一、注释符:单行注释“//”、多行注释“/* */”
程序不执行注释,注释内容仅供阅读或保留不用的语句
在MQ语言编辑器中,注释内容以灰显示
二、分号“;”
表示一个语句结束
三、逗号“,”
表示一个语句内部间隔,不结束语句。
四、等于号“=”
赋值语句,把等号后面的值赋给等号前的变量中
五、加号“+”
整数或小数,则表示值相加;字符串,则表示前后连接。
六、加加“++”
表示把符号前的变量值加1,例如:“i++;” 这实际上就是:“i=i+1;”的简写,表示i的值加1 七、加等于“+=”
表示把符号后的值加到符号前的变量中。例如“i+=2;”,实际上就是“i=i+2;”的简写,表示i 的值加2
八、双等号“==”
等于号。用于逻辑判断,双等号前后值相等,则返回逻辑值“真true”;双等号前后值不相等,则返回逻辑值“假false”
九、叹号等号“!=”
不等于号。用于逻辑判断,不等号前后值不相等,则返回逻辑值“真true”;不等号前后值相等,则返回逻辑值“假false”
十、“&&”
逻辑符“并且”
十一、“||”
逻辑符“或者”
十二、大括号“{}”
表示函数体。
{}内部为函数体语句。
MT4编程入门3:自定义变量
一、自定义变量在使用前,必须先创建(定义),设定变量的类型和名称。
创建时可同时赋值,也可以不赋值。名称可以使用中文字符。
例:
int mark;创建一个整型变量,变量名为“mark”。
bool 是否报警=true;创建一个逻辑型变量,变量名为“是否报警”,同时,赋初值“true”二、类型和类型定义词
自定义变量的基本类型有:
1、整形(int):就是整数,包括负整数
2、双精度小数(double):可以简单地理解为带小数位的数
3、字符串型(string)。
4、逻辑型(bool):其值分别为“true、false”,即“真、假”,也可以写成“1、0”(1真,0假)。类型定义词仅在创建变量时使用,后面使用变量时,就不能再加类型定义词了
三、附加变量
附加变量就是在程序投入使用后,变量值允许用户自由更改的变量,一般用作程序参数。一般指标,例如MACD(12,26,9)参数输入就是通过附加变量实现,(12,26,9)分别为三个附加变量的默认值。
定义附加变量只需在变量定义语句前加“extern”
例:
extern int 周期=9;创建一个整型附加变量,变量名为“周期”,默认值为9,允许用户在程序外部修改参数值
MT4编程入门4:自定义函数
自定义函数与数学函数在本质上是一致的
例如:数学函数ft(x,y)=3x+2y (x,y为正整数) 写成程序语句就是:
int ft(int x,int y)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论