下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、MT4 的 MACD 编程 EA 详解在 MT4 安装后,默认会给用户提供几个例子程序,这些程序对于新学习 EA 开发过程中有很大的帮助,下面我们就来对 MACDSample 这个例子 EA 来做个解读,来看看别人是如何开发一个 EA 的。首先是注释,在 MQL 语言中所有的这一行就是注释行,系统本身不会去执行它,它只是用来解释当前代码的含义的,我们在代码中加入这些注释为了是让我们能够清楚的阅读代码的含义,在程序中加入详细的注释是一个很好的编程习惯,我们鼓励大家多加入注释。很多人觉得注释这东西因为没用在写代码中觉得很麻烦而忽略它,但是即使是自己编写的程序如果不加注释过几天就会忘记意思,还要再一
2、行一行地看这些代码,所以注释是非常重要的。下面这些就是定义变量,我们发现前面加上了 extern 关键字,如果在定义变量的前面有这个词说明这个变量将会被彳为 EA 运行的参数,举个例子,比如我要编写一个 EA,在使用过程中我想改变它的止盈和止损值,如果我程序都是事先编好的止盈止损,那么以后要改动它必须要改代码,这样不仅麻烦也不灵活,如果我把这些信息作为 EA运行参数,那么在 EA 运行中就可以随时调整它了。externdoubleTakeProfit=50;externdoubleLots=0.1;externdoubleTrailingStop=30;externdoubleMACDOpen
3、Level=3;externdoubleMACDCloseLevel=2;externdoubleMATrendPeriod=26;上面定义了 6 个变量并且都是当作参数,这里设定变量名称的时候尽量使用用户可以理解的词汇,在 EA 的参数设置里这些变量名就是参数的名字。值得注意的是 EA 里变量名称是可以用中文的。intstart()start()函数是 EA 运行的核心,MQL 语言规定了几个默认函数,其中 EA 第一次运行时会调用 init()函数,在这个函数里我们可以放入一些需要初始化的信息,start()函数中放我们 EA 的核心代码,每次一个 TICK(换句话说就是新报价)来到后,系
4、统会自动调用 start()函数。deinit()函数是当 EA 关闭的时候调用的,这里放一些我们程序停止后需要善后”的代码。start()函数是必须要有的,其它两个函数如果不需要可以不用写。if(Bars100)Print(barslessthan100);return(0);)上面代码的意思是如果当前图表中的 k 线少于 100 根将会在日志信息里输出提示信息并且结束 start()函数的执行。return 的意思是返回,如果在程序中判断出有错误,下面的代码无法继续执行了,我们调用 return()函数让他退出 start()函数的执行。if(TakeProfit10)Print(Take
5、Profitlessthan10);return(0);/checkTakeProfit)上面的代码意思是如果参数里的 TakeProfit 变量小于 10 也提示一条信息并结束执行,TakeProfit 从字面的意思中我们可以知道是止盈的意思,有些平台会限制下单时的止盈点数不得小于某个点,如果小于某值会在下单时报错,为了避免这种错误我们会限制参数中止盈的设定。其实这里可以调用 MarketInfo()函数得到我们当前平台中允许的止盈止损最小值从而根据平台的不同自动计算出最小的止盈点数,详细情况请参阅文档 MarketInfo()函数的描述。MacdCurrent=iMACD(NULL,0,1
6、2,26,9,PRICE_CLOSE,MODE_MAIN,0);MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);MaPrevious=iMA(NULL,0,M
7、ATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);以上语句是调用了 MQL 的一些内置指标函数,在 MQL 语言中,对于常用的指标如均线,MACD,KD 等 MQL 已经提供给我们现成的函数,我们只要调用他即可得到指标的值(相见文档技术指标部分:http:/ 的值是参数为 12,26,9 的 MACD 主线当前 K 线的值,MacdPrevious 贝 U 是 MacdCurrent 前一根 K 线的值,SignalCurrent 和 SignalPrevious 则是相同参数信号线的当前值和前一根值。后两个是调用均线指标函数,这里的均线周期参数则是使用了 EA 的
8、参数变量 MATrendPeriod,这样写是个好习惯,把调用指标的参数放到 EA 参数里,这样可以随时在运行中调整这些参数方便我们改变策略。MaCurrent 和MaPrevious 是得到 26 均线的当前 K 线值和前一根的值。total=OrdersTotal();if(total1)上面的代码就是判断我们当前是否有单子在做,他调用了 OrdersTotal()函数,它可以计算当前账户中一共还没有平仓的单子和挂单的个数,如果它小于 1 说明当前没有任何单子,这种判断方法只是一种简单的判断法,如果这个 EA 在运行过程中人为也去下单则 EA 永远不会下单了,如果要更加精确的计算这个 EA
9、 所下的单子数量还需要利用其他方法,这些技巧我们会在以后的文章中介绍。if(AccountFreeMargin()(1000*Lots)Print(Wehavenomoney.FreeMargin=,AccountFreeMargin();return(0);上面的代码是计算当前的剩余保证金是否小于 1000,如果太少钱会不够用,所以会输出下当前的保证金还剩多少并退出。if(MacdCurrentSignalCurrent&MacdPrevious(MACDOpenLevel*Point)&MaCurrentMaPrevious)ticket=OrderSend(Symbol(
10、),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,macdsample,16384,0,Green);if(ticket0)if(OrderSelec0&MacdCurrentSignalPrevious&MacdCurrent(MACDOpenLevel*Point)&MaCurrent0)if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)Print(SELLorderopened:,OrderOpenPrice();)elsePrint(ErroropeningSELLorder
11、:,GetLastError();return(0);这段代码就是空单的进场条件,和上面的正相反。值得说明是这两个下单代码中会遇到下单失败的情况,因为当用OrderSend()0 数下单后会返回一个大于 0 的整数订单号数值,利用这一点就可以很容易的知道下单是否成功了。下面的代码是平仓和移动止损部分,这段代码比较难懂,但是却是非常重要的部分,因为在编写 EA 中这些操作会经常遇到,让我们来一点一点的拆解开来理解下它们的含义。for(cnt=0;cnttotal;cnt+)当前存在的订单中我们要判断是否到达平仓的条件,所以第一步我们首先要对所有在下的单子进行一次遍历,一个一个的去判断它们是否达到
12、平仓条件。此代码中利用了一个循环语句从第一单开始一单一单的循环,这里值得注意的是所有单子都是按照下单的先后顺序存放的,第一弓单子的编号是 0 而不是 1,这是编程语言中一般都采取的方法,我们在编写程序的时候一定要注意它的值要从 0 开始。OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);上面是选择订单操作,当循环一次订单后,必须调用 OrderSelect()函数来锁定这一订单,这样下面的操作才可以正常运行。这里最容易出错的地方是函数的第二个参数如果查一下文档我们会发现它有两个选项:SELECT_BY_POS 和 SELECT_BY_TICKET。第一种方式
13、是根据订单的位置进行选定操作,这个例子中就是使用了这种方式,第二种方式是根据订单号来进行选定操作,因为我们并不知道所有单子的订单号是多少所以我们只能使用第一种方式来选择订单,刚才说过订单是按照下单的先后顺序来存放的,因此如果是第一个单子那么就是 0,如果是第二个单子就是 1,最后一个单子是总单子数减一。if(OrderType()0&MacdCurrentSignalPrevious&MacdCurrent(MACDCloseLevel*Point)OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);/closeposition
14、return(0);/exit多单的平仓部分代码,这里其实就是去掉均线条件的空单下单信号,平仓操作中一定要注意在平仓完成后必须终止这个遍历订单的循环,因为平仓后会打乱所有单子的顺序,造成误操作其他订单。我们在这里举个例子就能明白为什么要这么做:比如当前有三个单子没有平仓,按照顺序排列序号是 0、1、2,如果第二个单子平仓后第三个单子序号就会提前,这样当下一轮循环执行到 OrderSelect()函数后会因为没有这个编号而出现错误。if(TrailingStop0)if(Bid-OrderOpenPrice()Point*TrailingStop)if(OrderStopLoss()Bid-Po
15、int*TrailingStop)OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);return(0);这段代码就是多单的移动止损部分,当参数 TrailingStop 大于 0 的时候 EA 就开启了移动止损功能(默认设定是 30,也就是说默认情况下是开启移动止损的),我们就用我们这个例子 EA 的默认参数 30 点来说明,当单子的盈利大于30 点并且单子的止损点和当前价位相差 30 点以上时,修改订单的止损到当前价格以下 30 点位置。我们在上面的程序里屡
16、次发现作者使用 Point 变量来计算点位,这个变量是 MT4 运行环境中自动设定的值,它在 MQL 语言中叫做预定义变量(关于预定义变量可以参考这里:http:/ 告诉我们当前货币对的价格最小点值是多少,举个例子:欧元对美元的价格总是 X.XXXX 这种形式,它的 Point 值就是 0.0001,当我们想设定当价格大于 30 点这种情况时,我们只要用 30 乘以 Point 就可以计算这个货币对的实际30 点值。不过 Point 常量在很多平台中不能正确的来实现它本身的功能了,原因是很多平台已经改为小数点后 5 位,这本 Point 值变成了 0.00001,我们直接用他来乘以点位得到是却
17、是实际点位的十分之一,这样会在 EA 的运行中出现致命的逻辑错误。因此如果是 5 位的平台,需要在那些点位的值上乘以 10 来修正这个问题。关于 Point 的完美解决方法我们将在后续的文章中继续讨论。以上就是 MT4 例子 EA 的解读, 这个程序虽然比较复杂但是它却是一个很好的例子, 里面涉及到了我们在写 EA 程序过程中常用到的一些功能,对于初学 EA 程序的人来说帮助很大,我们也可以修改这个程序的开仓、平仓部分直接变成我们自己的逻辑。好指标如何应用到 EA 上第一部分:指标为了能赚钱而不是亏损,无论是专业的交易商还是个体,都在研究各和总结各种种的规律,并做成指标,我们经常会发现二际标图
18、线看起来很完美,F 都会想到要根据指标的变化国及易。但这样做会赚钱吗?能否赚钱,我们就要看这些指标有没有作弊。即确定指标是否有未来函数的计算,也就是说指标会不会根据现在的K鱼,计算后将指标在历史K线上标示做更改。比如原来是卖的 n 玄,改为买。(恐怖吧)。(当然还有一些 EA 特有的环节也会影响盈利问题,在这里不讲)确定是否有未来函数的方法有两种:1 .白盒校验(即查看源码)直接看源码中的循环部分,如果有修改历史曲线数组的行为,则可以立刻断定有未来函数。2 .黑盒观察当没有源码的时候,可以将指标加载到 1 分钟的图线上,连续不断观察其标示的变化,尤其注意与当前 K 线状态最接近的历史 K 线标
19、示的变化。如果随着当前 K 线的变化出现过历史变化更改,则也可以确定有未来函数指标 EA 化之前必须要确认的事情:如果一个指标含有未来函数,那么这个指标是没有多大意义的。也就是说,我们要将指标改为 EA 前,必须确认这个指标是不含未来函数的,这样指标 EA 化才有意义。第二部分指标 EA 化接下来将指标 EA 化大致的做法是:在 EA 中通过函数 iCustom 读取这个指标的当前 K 线输出值,得出当前的状态,来决定是否入场或者平仓并反向入场。iCustom 的具体用法:指标一般都是曲线或者箭头两种。在这里我们要把曲线和箭头都看成是数组就容易理解了。对于指标来说每一条曲线或者箭头都是写在与每
20、个 K 线对应的数组中的,也就是说一条曲线对应一个数组,一个方向的箭头也是对应一个数组(有箭头的数组值是当时的色道,没箭头地方的数组值是空”)iCustomMT4 的帮助里说的是:计算指定的客户指标并且退回它的值”,即这个函数可以让你获取指定指标的第几个数组对应第几根 K 线上的计算数值。具体如下:doubleiCustom(stringsymbol,inttimeframe,stringname,.,intmode,intshift)计算指定的客户指标并且退回它的值。必须在 terminal_directoryexpertsindicators 目录内编写客户指标(*.EX4 文件)。参量:
21、symbol-计算指标数据上的货币对名称.NULL 表示当前货币对.timeframe-时间周期。可以时间周期列举任意值.0 表示当前图表的时间周期.name-客户指标完整的程序名称.-参量设置(如果需要)。通过的参量和他们的顺序必须与 desclaration 命令和客户指标的外部可变物的种类对应。mode-索引行。从 0 到 7 并且必须对应以其中一个使用的索引的 SetIndexBuffer 函数.shift-从显示缓冲采取的值的索引(转移相对当前柱特定相当数量期间前).示例:doubleval=iCustom(NULL,0,示例 Ind”,13,1,0);doubleva2=iCust
22、om(NULL,0,示例 Ind”,13,0,1);例如:一个指标,画了两条曲线,则可以用 iCustom 取得这个指标在第 4 根 K 线上对应的第一条曲线的数值。我们现在已经可以根据自己的想法去获得一个指定指标的任何 K 线上的状态数值了。那麽下一步我们就要开始EA 的概念。因为 EA 只针对当前价格状态下的动作进行控制。所以一般而言我们就取指定指标在当前 K 线下的计算数值用于 EA 的条件判断。如果你认为当前 K 线没有结束,其数值始终在变化,有可能一会有讯号一会没讯号,那麽你可以采用取前一 K线的指标数值的方式作为基础。F 口果用当前 K 线指标数值作为条件会有不确定的结果,但如果用前一 K 线数值做条件则有错过最佳入场点”的问题。这是需要程序设计者权衡的问
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 青岛期末语文真题及答案
- 2025~2026学年云南省红河哈尼族彝族自治州第一中学高二上学期期中考试数学试卷
- 棉花栽培工岗前基础晋升考核试卷含答案
- 教师招聘考试模拟试卷
- 复工复产微党课
- 11月消防安全月
- 电子玻璃制品加工工班组建设水平考核试卷含答案
- 道路交通事故处理协议书3篇
- 非线性回归模型构建的标准流程
- 啤酒花栽培工安全管理考核试卷含答案
- 工业视觉教学课件
- 2025heidenhain海德汉旋转编码器手册
- 冬季油库安全知识培训
- 22.1直角三角形(直角三角形的性质与判定)课件沪教版(五四制)八年级数学上册
- 中药饮片知识培训课件
- 2025年江苏省港口集团物流有限公司社会招聘3人笔试参考题库附带答案详解(10套)
- 松原市乾安县200MW飞轮、电化学混合储能调频电站项目工程环评报告书
- 关联交易定价管理办法
- xx教育培训机构xx年中考全托提分计划
- 股骨近端骨肿瘤诊疗要点解析
- 2025年天津市中考数学试卷(含标准答案及解析)
评论
0/150
提交评论