论坛风格切换切换到宽版
  • 4691阅读
  • 24回复

MT5编程实战开发系列----第二讲:一键下单 [复制链接]

上一主题 下一主题
离线shawnyau
 

发帖
49
金钱
41
威望
1173
贡献
151
交易币
6
只看楼主 倒序阅读 使用道具 楼主  发表于: 2009-10-19
第二讲:一键下单
l[G&=/R@H  
在第一讲中,我们通过一个简单的例子Lesson1,学习了如何通过MQL5编程在MT5图表上添加按钮、处理按钮点击事件以及弹出对话框等。在第二讲中,我们将会在Lesson1例子的基础上进行改进,开发一个可以在MT5图表上进行一键下单的EA。怎样,是否很感兴趣呢?那我们就马上开始吧! -F+ )N$CW  
首先启动MT5,从MT5中启动ME5(MetaEditor5,不知道如何启动的请参阅第一讲相关内容),然后新建一个EA,取名为Lesson2,其它选项保持默认。生成Lesson2的EA代码文件后,如Lesson1一样,在OnInit函数中输入在图表创建按钮(Button)的代码如下:
bu j}pEI  
Xv~v=.HNhk  
大家可以发现代码和Lesson1基本一样,唯一的区别是按钮的文本不同了,这里设置为"Buy",意即我们打算在按下这个按钮时,会在MT5中下一张多单(Buy、Long)。输入完毕后,与Lesson1同样,我们添加一个OnChartEvent函数,并输入如下代码:
sX :)g>b   
Ep.Q&(D >  
gE_i#=bw  
输入完毕后,按下F5进行编译,如无错误,即会切换到MT5图表,我们按下图表上的按钮"Buy",怎样?一键下单的功能实现了吧? ~g6`Cp`  
\Y4>_Mk  
OnInit函数里面的代码这里就不作解释了,如不清楚的请回头参阅Lesson1中的讲解,这里重点讲解OnChartEvent中的代码。 `[&) X  
MqlTradeRequest request; -_p+4tV  
MqlTradeResult result; sv g`s,g  
这两句代码分别定义了一个叫做request的MqlTradeRequest类型变量和一个叫做result的MqlTradeResult类型变量。这里给初学的朋友补充一下基础知识:什么是变量呢?我们可以这样想象一下:MT5交易软件是个会做菜的机器,而MQL5开发就是设计菜谱,菜谱中列明了原材料及对原材料的加工方法,把菜谱输入MT5中,MT5便会自动生成原材料及对原材料进行指定的加工,最后得出我们想要的东西。这个例子很简洁明,相信读者朋友很容易就能理解,对吗?好了,对应到MQL5开发中,数据就是原材料,比如开盘价、收盘价、均线数值等等这些整数、浮点数,就是数据,就是MQL5开发的原材料,而对原材料的加工方法,就是如何对这些数据进行运算处理,最后输出我们想要的结果。那么,我们在厨房做菜时,原材料应该放在哪里呢?总不可能随便放到台上、地下吧,一般我们都会把原材料放在盘子、碟子里面,OK!这个盘子、碟子,就是我们的变量了。所谓的变量,就是用来盛放数据的容器,只不过我们知道计算机是很严格定义所有东西的,1就是1,2就是2,所以,我们根据数据类型的不同,必须明确指定变量这个容器的规格,这个指定变量规格的过程就叫做定义变量。如上面的代码,MqlTradeRequest就是规格,request就是根据MqlTradeRequest规格制作出来的容器。关于变量的概念及变量定义就暂时到这里了,如果还是不明白的话,我也没办法了,或者可以参与笔者稍后开办的MT5 EA开发学习班吧!
-$; h+9BO  
if (id==CHARTEVENT_OBJECT_CLICK && sparam=="Button1") &{x%"Aq/  
这句在Lesson1中已经讲解过了,就是判断如果Button1按钮被按下,则执行后续的操作。 g}vOp3 ^  
后续的操作代码是重点,读者要留心看了。 aT]G&bR?  
YV6@SXy  
request.action = TRADE_ACTION_DEAL; iPD5 KsAOA  
request.symbol = Symbol(); 'R{Xq HP  
request.volume = 0.1; {N \ri{|  
request.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK); pq3W.7z;b  
request.type = ORDER_TYPE_BUY; 9i&(VzY[=  
request.sl = SymbolInfoDouble(Symbol(), SYMBOL_ASK)-300*_Point; a-A>A_.  
request.tp = SymbolInfoDouble(Symbol(), SYMBOL_ASK)+600*_Point; O!,WH?r  
AM[#AZv  
这段代码的功能很单一,就是往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就会给我们下市价单(是不是有点晕了,这也没办法,先往下看吧……)。
H/rJ:3  
request.symbol = Symbol();
'aWrjfDy:  
这句意思很清楚了,Symbol()是一个函数,把Symbol()函数的返回值装入request中的symbol格子里面(关于函数及返回值的概念这里我没有精力插入解释了,不了解的朋友可以找一些基础的资料看看),Symbol()函数的作用就是把EA所在图表的货币对名称返回,比如"EURUSD"、"GBPUSD"等。
MRI`h.  
request.volume = 0.1; 指定下单量为0.1手。 JGJy_.C  
request.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK);这里指定下单时所使用的价格类型,SymbolInfoDouble()函数是个很重要的函数,在MT5编程中免不了要经常用到的,其作用是获取指定货币对的相关数值,这里就是获取Symbol()函数返回的货币对的Ask价格。值得注意的是,MT4中的Ask、Bid变量在MT5中已不复存在,取而代之的是以上的使用方式。SYMBOL_ASK意指货币对的ASK价格。 fP:n=A{  
request.type = ORDER_TYPE_BUY; y7x&/2  
ORDER_TYPE_BUY指下单类型为buy单,即多单。 ~]d3 f  
request.sl = SymbolInfoDouble(Symbol(), SYMBOL_ASK)-300*_Point; aX)k (*|  
request.tp = SymbolInfoDouble(Symbol(), SYMBOL_ASK)+600*_Point; R#n!1~ (  
这两句分别设定下单附带的止损和止盈价格。 T[?toqkD>z  
\\Z{[{OZ  
好了,东西全部分门别类地塞入request里面的格子了,那么接下来干些什么呢?接下来就轮到主角OrderSend函数出场了。这里插些题外话:MT4转入MT5的朋友要注意了,MT5中的OrderSend函数和MT4中的不大一样,MT4中的是直接把下单类型、价格、滑点、止损、注释等等都直接作为OrderSend的参数,而MT5中则是先把这些东西塞入到一个MqlTradeRequest类型的变量中(就是上面的request),然后再把这个变量作为OrderSend函数的参数。 kn^? .^dVX  
我们把request和result作为OrderSend的函数,request里面包含了需要MT5干些什么的指令,而result则是负责接收MT5干活的返回结果,比如是否成功、下好的单编码是多少等等。 $*KM%M6  
0m,3''Q5lO  
ObjectSetInteger(0, "Button1", OBJPROP_STATE, 0); ik;S!S\v  
ChartRedraw(); 'Avp16zg  
这两句就不用解释了,Lesson1中已经出现过了。 A~!v+W%vO1  
>U.f`24  
Lesson2里面涉及到的基本概念比较多,初学的朋友可能就要想办法搞清楚这些概念了。Lesson2的例子中,大家可自己实现下空单的按钮代码。好了,至此Lesson2的开发工作就全部结束了,敬请关注MT5编程实战开发系列第三讲!
1条评分
老山羊 ͭǮ +6 - 2009-10-19
 
离线melamine

发帖
14
金钱
17
威望
639
贡献
84
交易币
135
只看该作者 沙发  发表于: 2009-10-19
我最踊跃
 
离线melamine

发帖
14
金钱
17
威望
639
贡献
84
交易币
135
只看该作者 板凳  发表于: 2009-10-19
能不能把字体编辑大点啊,看着眼睛好累
离线badguy
发帖
92
金钱
79
威望
28
贡献
79
交易币
16
只看该作者 地板  发表于: 2009-10-19
不错..呵呵 .
离线waihui9988
发帖
8
金钱
15
威望
82
贡献
58
交易币
2
只看该作者 地下室  发表于: 2009-10-19
能不能把字体编辑大点啊,看着眼睛好累
离线song_song
发帖
15
金钱
6
威望
69
贡献
70
交易币
0
只看该作者 下水道  发表于: 2009-10-19
感谢阿狼大厨做了一大餐
离线lonelywing
发帖
11
金钱
58
威望
2508
贡献
86
交易币
6
只看该作者 6楼 发表于: 2009-10-19
好文啊 !!!!!
离线tpy
发帖
4
金钱
2
威望
100
贡献
31
交易币
0
只看该作者 7楼 发表于: 2009-10-19
非常好!谢谢,不过,这一课应该包含市价一键关仓
离线tpy
发帖
4
金钱
2
威望
100
贡献
31
交易币
0
只看该作者 8楼 发表于: 2009-10-19
系主任先生,试验过了,为什么不执行?代码没错,Autotrading也设置好了,为什么点击没有反应呢?
离线tpy
发帖
4
金钱
2
威望
100
贡献
31
交易币
0
只看该作者 9楼 发表于: 2009-10-19
报告:成功了,但是,欧元是5位小数,其他的如英镑和澳元等是4位小数,可能是止损和盈利设置太小了,不能成交。比如欧元5位小数,如止损设置30点,太小了。请敎系主任是否对?
离线tpy
发帖
4
金钱
2
威望
100
贡献
31
交易币
0
只看该作者 10楼 发表于: 2009-10-19
发一张图 +fN2%aC  
离线小怪
发帖
5
金钱
21
威望
267
贡献
55
交易币
0
只看该作者 11楼 发表于: 2009-10-20
谢谢.
离线35a

发帖
43
金钱
16
威望
62
贡献
85
交易币
10
只看该作者 12楼 发表于: 2009-10-20
耐心等待中文版………………
离线trader888

发帖
117
金钱
33
威望
220
贡献
125
交易币
3939
只看该作者 13楼 发表于: 2009-10-20
很难啊, 慢慢学习
离线小行者
发帖
1
金钱
10
威望
50
贡献
8
交易币
0
只看该作者 14楼 发表于: 2009-10-20
没反应,问题出在哪呢?
离线sterling

发帖
3
金钱
44
威望
315
贡献
61
交易币
18
只看该作者 15楼 发表于: 2009-10-21
辛苦了~回头慢慢研究~
离线gkg

发帖
27
金钱
1016
威望
134
贡献
460
交易币
0
只看该作者 16楼 发表于: 2009-10-21
感谢阿狼大厨做了一大餐
离线pp665531
发帖
125
金钱
65
威望
4
贡献
68
交易币
10
只看该作者 17楼 发表于: 2009-10-21
回复 1# shawnyau 0F1u W>D1  
_@~PL>g"p  
\p3v#0R{  
谢谢
离线fanfan888

发帖
63
金钱
598
威望
220
贡献
110
交易币
93
只看该作者 18楼 发表于: 2009-10-22
讲得很好,从MT4转MT5,有些概念还是要转过来呼.
离线pkko

发帖
37
金钱
1
威望
70
贡献
68
交易币
0
只看该作者 19楼 发表于: 2009-10-27
来向你学习学习!辛苦了!狼主!
离线b8866
发帖
8
金钱
1
威望
33
贡献
44
交易币
0
只看该作者 20楼 发表于: 2009-10-28
ChartRedraw();在第一课我为何看不到代码?ChartRedraw();是什么函数什么意思?谢谢老师
离线shawnyau

发帖
49
金钱
41
威望
1173
贡献
151
交易币
6
只看该作者 21楼 发表于: 2009-10-28
ChartRedraw();在第一课我为何看不到代码?ChartRedraw();是什么函数什么意思?谢谢老师 ... LdUpVO8)l  
b8866 发表于 2009-10-28 14:52
nP31jm+A  
!YHu  
ChartReDraw()函数的作用是强制刷新图表。一般是用在设置、更新了图表上某个或多个Object的属性后,这样就能强制性刷新Object的显示状态。
离线simple76
发帖
19
金钱
2
威望
57
贡献
50
交易币
0
只看该作者 22楼 发表于: 2009-12-28
离线tianer33
发帖
9
金钱
10
威望
0
贡献
51
交易币
0
只看该作者 23楼 发表于: 2010-04-28
看着眼睛好累
离线lu2603348

发帖
20
金钱
26
威望
1
贡献
46
交易币
0
只看该作者 24楼 发表于: 2011-09-12
怎么被屏蔽了

  • 在线咨询
  • 400-881-0680