在第一讲中,我们通过一个简单的例子Lesson1,学习了如何通过MQL5编程在MT5图表上添加按钮、处理按钮点击事件以及弹出对话框等。在第二讲中,我们将会在Lesson1例子的基础上进行改进,开发一个可以在MT5图表上进行一键下单的EA。怎样,是否很感兴趣呢?那我们就马上开始吧!
首先启动MT5,从MT5中启动ME5(MetaEditor5,不知道如何启动的请参阅第一讲相关内容),然后新建一个EA,取名为Lesson2,其它选项保持默认。生成Lesson2的EA代码文件后,如Lesson1一样,在OnInit函数中输入在图表创建按钮(Button)的代码如下:
大家可以发现代码和Lesson1基本一样,唯一的区别是按钮的文本不同了,这里设置为"Buy",意即我们打算在按下这个按钮时,会在MT5中下一张多单(Buy、Long)。输入完毕后,与Lesson1同样,我们添加一个OnChartEvent函数,并输入如下代码:
输入完毕后,按下F5进行编译,如无错误,即会切换到MT5图表,我们按下图表上的按钮"Buy",怎样?一键下单的功能实现了吧?
OnInit函数里面的代码这里就不作解释了,如不清楚的请回头参阅Lesson1中的讲解,这里重点讲解OnChartEvent中的代码。
MqlTradeRequest request;
这两句代码分别定义了一个叫做request的MqlTradeRequest类型变量和一个叫做result的MqlTradeResult类型变量。这里给初学的朋友补充一下基础知识:什么是变量呢?我们可以这样想象一下:MT5交易软件是个会做菜的机器,而MQL5开发就是设计菜谱,菜谱中列明了原材料及对原材料的加工方法,把菜谱输入MT5中,MT5便会自动生成原材料及对原材料进行指定的加工,最后得出我们想要的东西。这个例子很简洁明,相信读者朋友很容易就能理解,对吗?好了,对应到MQL5开发中,数据就是原材料,比如开盘价、收盘价、均线数值等等这些整数、浮点数,就是数据,就是MQL5开发的原材料,而对原材料的加工方法,就是如何对这些数据进行运算处理,最后输出我们想要的结果。那么,我们在厨房做菜时,原材料应该放在哪里呢?总不可能随便放到台上、地下吧,一般我们都会把原材料放在盘子、碟子里面,OK!这个盘子、碟子,就是我们的变量了。所谓的变量,就是用来盛放数据的容器,只不过我们知道计算机是很严格定义所有东西的,1就是1,2就是2,所以,我们根据数据类型的不同,必须明确指定变量这个容器的规格,这个指定变量规格的过程就叫做定义变量。如上面的代码,MqlTradeRequest就是规格,request就是根据MqlTradeRequest规格制作出来的容器。关于变量的概念及变量定义就暂时到这里了,如果还是不明白的话,我也没办法了,或者可以参与笔者稍后开办的MT5 EA开发学习班吧!
这句在Lesson1中已经讲解过了,就是判断如果Button1按钮被按下,则执行后续的操作。后续的操作代码是重点,读者要留心看了。request.action = TRADE_ACTION_DEAL;request.symbol = Symbol();request.volume = 0.1;request.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
这段代码的功能很单一,就是往request这个容器里塞东西,比如青菜、猪肉之类的,塞满了往MT5这个微波炉一叮,就有吃的了…… 言归正传,我们来看看都往request里面塞了些什么好吃的。大家可以看到有request.x这种格式,这是什么意思呢?举个形象点的例子,我们可以把request这个容器想象成里面有很多不同大小的格子,每个格子都有自己的名称,只能装下固定规格的东西,回到我们的代码上来,request.action就表示request容器里一个叫做action的格子,那么"="符号就表示要把"="号右边的东西塞到左边的格子里面去,那么,request.action = TRADE_ACTION_DEAL这句就表示把TRADE_ACTION_DEAL这个东西塞到request容器里一个叫做action的格子里面。那么好了,新问题又来了,这个TRADE_ACTION_DEAL又是个什么东东呢?答曰:这是MT5中内置的一个变量名称,已经固定好的了,相当于一个暗号,只要你一喊这个暗号,MT5就知道你想干嘛了;那么如果我们喊出了TRADE_ACTION_DEAL这个暗号,MT5就会干些什么?答曰:MT5就会给我们下市价单(是不是有点晕了,这也没办法,先往下看吧……)。request.symbol = Symbol();这句意思很清楚了,Symbol()是一个函数,把Symbol()函数的返回值装入request中的symbol格子里面(关于函数及返回值的概念这里我没有精力插入解释了,不了解的朋友可以找一些基础的资料看看),Symbol()函数的作用就是把EA所在图表的货币对名称返回,比如"EURUSD"、"GBPUSD"等。request.volume = 0.1; 指定下单量为0.1手。
request.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK);这里指定下单时所使用的价格类型,SymbolInfoDouble()函数是个很重要的函数,在MT5编程中免不了要经常用到的,其作用是获取指定货币对的相关数值,这里就是获取Symbol()函数返回的货币对的Ask价格。值得注意的是,MT4中的Ask、Bid变量在MT5中已不复存在,取而代之的是以上的使用方式。SYMBOL_ASK意指货币对的ASK价格。
request.type = ORDER_TYPE_BUY;ORDER_TYPE_BUY指下单类型为buy单,即多单。
request.sl = SymbolInfoDouble(Symbol(), SYMBOL_ASK)-300*_Point;
request.tp = SymbolInfoDouble(Symbol(), SYMBOL_ASK)+600*_Point这两句分别设定下单附带的止损和止盈价格。
好了,东西全部分门别类地塞入request里面的格子了,那么接下来干些什么呢?接下来就轮到主角OrderSend函数出场了。这里插些题外话:MT4转入MT5的朋友要注意了,MT5中的OrderSend函数和MT4中的不大一样,MT4中的是直接把下单类型、价格、滑点、止损、注释等等都直接作为OrderSend的参数,而MT5中则是先把这些东西塞入到一个MqlTradeRequest类型的变量中(就是上面的request),然后再把这个变量作为OrderSend函数的参数。 我们把request和result作为OrderSend的函数,request里面包含了需要MT5干些什么的指令,而result则是负责接收MT5干活的返回结果,比如是否成功、下好的单编码是多少等等。ObjectSetInteger(0, "Button1", OBJPROP_STATE, 0);ChartRedraw();这两句就不用解释了,Lesson1中已经出现过了。
Lesson2里面涉及到的基本概念比较多,初学的朋友可能就要想办法搞清楚这些概念了。Lesson2的例子中,大家可自己实现下空单的按钮代码。好了,至此Lesson2的开发工作就全部结束了,敬请关注MT5编程实战开发系列第三讲!
暂无评论内容