MT5編程實(shí)例課程(阿郎)---第二講(一鍵下單)
作者:MT4 來(lái)源:cxh99.com 發(fā)布時(shí)間:2012年05月30日
- 在第一講中,我們通過(guò)一個(gè)簡(jiǎn)單的例子Lesson1,學(xué)習(xí)了如何通過(guò)MQL5編程在MT5圖表上添加按鈕、處理按鈕點(diǎn)擊事件以及彈出對(duì)話框等。在第二講中,我們將會(huì)在Lesson1例子的基礎(chǔ)上進(jìn)行改進(jìn),開(kāi)發(fā)一個(gè)可以在MT5圖表上進(jìn)行一鍵下單的EA。怎樣,是否很感興趣呢?那我們就馬上開(kāi)始吧!
首先啟動(dòng)MT5,從MT5中啟動(dòng)ME5(MetaEditor5,不知道如何啟動(dòng)的請(qǐng)參閱第一講相關(guān)內(nèi)容),然后新建一個(gè)EA,取名為L(zhǎng)esson2,其它選項(xiàng)保持默認(rèn)。生成Lesson2的EA代碼文件后,如Lesson1一樣,在OnInit函數(shù)中輸入在圖表創(chuàng)建按鈕(Button)的代碼如下:
大家可以發(fā)現(xiàn)代碼和Lesson1基本一樣,唯一的區(qū)別是按鈕的文本不同了,這里設(shè)置為"Buy",意即我們打算在按下這個(gè)按鈕時(shí),會(huì)在MT5中下一張多單(Buy、Long)。輸入完畢后,與Lesson1同樣,我們添加一個(gè)OnChartEvent函數(shù),并輸入如下代碼:

輸入完畢后,按下F5進(jìn)行編譯,如無(wú)錯(cuò)誤,即會(huì)切換到MT5圖表,我們按下圖表上的按鈕"Buy",怎樣?一鍵下單的功能實(shí)現(xiàn)了吧?
OnInit函數(shù)里面的代碼這里就不作解釋了,如不清楚的請(qǐng)回頭參閱Lesson1中的講解,這里重點(diǎn)講解OnChartEvent中的代碼。
MqlTradeRequest request;
這兩句代碼分別定義了一個(gè)叫做request的MqlTradeRequest類型變量和一個(gè)叫做result的MqlTradeResult類型變量。這里給初學(xué)的朋友補(bǔ)充一下基礎(chǔ)知識(shí):什么是變量呢?我們可以這樣想象一下:MT5交易軟件是個(gè)會(huì)做菜的機(jī)器,而MQL5開(kāi)發(fā)就是設(shè)計(jì)菜譜,菜譜中列明了原材料及對(duì)原材料的加工方法,把菜譜輸入MT5中,MT5便會(huì)自動(dòng)生成原材料及對(duì)原材料進(jìn)行指定的加工,最后得出我們想要的東西。這個(gè)例子很簡(jiǎn)潔明,相信讀者朋友很容易就能理解,對(duì)嗎?好了,對(duì)應(yīng)到MQL5開(kāi)發(fā)中,數(shù)據(jù)就是原材料,比如開(kāi)盤價(jià)、收盤價(jià)、均線數(shù)值等等這些整數(shù)、浮點(diǎn)數(shù),就是數(shù)據(jù),就是MQL5開(kāi)發(fā)的原材料,而對(duì)原材料的加工方法,就是如何對(duì)這些數(shù)據(jù)進(jìn)行運(yùn)算處理,最后輸出我們想要的結(jié)果。那么,我們?cè)趶N房做菜時(shí),原材料應(yīng)該放在哪里呢?總不可能隨便放到臺(tái)上、地下吧,一般我們都會(huì)把原材料放在盤子、碟子里面,OK!這個(gè)盤子、碟子,就是我們的變量了。所謂的變量,就是用來(lái)盛放數(shù)據(jù)的容器,只不過(guò)我們知道計(jì)算機(jī)是很嚴(yán)格定義所有東西的,1就是1,2就是2,所以,我們根據(jù)數(shù)據(jù)類型的不同,必須明確指定變量這個(gè)容器的規(guī)格,這個(gè)指定變量規(guī)格的過(guò)程就叫做定義變量。如上面的代碼,MqlTradeRequest就是規(guī)格,request就是根據(jù)MqlTradeRequest規(guī)格制作出來(lái)的容器。關(guān)于變量的概念及變量定義就暫時(shí)到這里了,如果還是不明白的話,我也沒(méi)辦法了,或者可以參與筆者稍后開(kāi)辦的MT5 EA開(kāi)發(fā)學(xué)習(xí)班吧!
這句在Lesson1中已經(jīng)講解過(guò)了,就是判斷如果Button1按鈕被按下,則執(zhí)行后續(xù)的操作。后續(xù)的操作代碼是重點(diǎn),讀者要留心看了。request.action = TRADE_ACTION_DEAL;request.symbol = Symbol();request.volume = 0.1;request.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
這段代碼的功能很單一,就是往request這個(gè)容器里塞東西,比如青菜、豬肉之類的,塞滿了往MT5這個(gè)微波爐一叮,就有吃的了…… 言歸正傳,我們來(lái)看看都往request里面塞了些什么好吃的。大家可以看到有request.x這種格式,這是什么意思呢?舉個(gè)形象點(diǎn)的例子,我們可以把request這個(gè)容器想象成里面有很多不同大小的格子,每個(gè)格子都有自己的名稱,只能裝下固定規(guī)格的東西,回到我們的代碼上來(lái),request.action就表示request容器里一個(gè)叫做action的格子,那么"="符號(hào)就表示要把"="號(hào)右邊的東西塞到左邊的格子里面去,那么,request.action = TRADE_ACTION_DEAL這句就表示把TRADE_ACTION_DEAL這個(gè)東西塞到request容器里一個(gè)叫做action的格子里面。那么好了,新問(wèn)題又來(lái)了,這個(gè)TRADE_ACTION_DEAL又是個(gè)什么東東呢?答曰:這是MT5中內(nèi)置的一個(gè)變量名稱,已經(jīng)固定好的了,相當(dāng)于一個(gè)暗號(hào),只要你一喊這個(gè)暗號(hào),MT5就知道你想干嘛了;那么如果我們喊出了TRADE_ACTION_DEAL這個(gè)暗號(hào),MT5就會(huì)干些什么?答曰:MT5就會(huì)給我們下市價(jià)單(是不是有點(diǎn)暈了,這也沒(méi)辦法,先往下看吧……)。request.symbol = Symbol();這句意思很清楚了,Symbol()是一個(gè)函數(shù),把Symbol()函數(shù)的返回值裝入request中的symbol格子里面(關(guān)于函數(shù)及返回值的概念這里我沒(méi)有精力插入解釋了,不了解的朋友可以找一些基礎(chǔ)的資料看看),Symbol()函數(shù)的作用就是把EA所在圖表的貨幣對(duì)名稱返回,比如"EURUSD"、"GBPUSD"等。request.volume = 0.1; 指定下單量為0.1手。
request.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK);這里指定下單時(shí)所使用的價(jià)格類型,SymbolInfoDouble()函數(shù)是個(gè)很重要的函數(shù),在MT5編程中免不了要經(jīng)常用到的,其作用是獲取指定貨幣對(duì)的相關(guān)數(shù)值,這里就是獲取Symbol()函數(shù)返回的貨幣對(duì)的Ask價(jià)格。值得注意的是,MT4中的Ask、Bid變量在MT5中已不復(fù)存在,取而代之的是以上的使用方式。SYMBOL_ASK意指貨幣對(duì)的ASK價(jià)格。
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這兩句分別設(shè)定下單附帶的止損和止盈價(jià)格。
好了,東西全部分門別類地塞入request里面的格子了,那么接下來(lái)干些什么呢?接下來(lái)就輪到主角OrderSend函數(shù)出場(chǎng)了。這里插些題外話:MT4轉(zhuǎn)入MT5的朋友要注意了,MT5中的OrderSend函數(shù)和MT4中的不大一樣,MT4中的是直接把下單類型、價(jià)格、滑點(diǎn)、止損、注釋等等都直接作為OrderSend的參數(shù),而MT5中則是先把這些東西塞入到一個(gè)MqlTradeRequest類型的變量中(就是上面的request),然后再把這個(gè)變量作為OrderSend函數(shù)的參數(shù)。 我們把request和result作為OrderSend的函數(shù),request里面包含了需要MT5干些什么的指令,而result則是負(fù)責(zé)接收MT5干活的返回結(jié)果,比如是否成功、下好的單編碼是多少等等。ObjectSetInteger(0, "Button1", OBJPROP_STATE, 0);ChartRedraw();這兩句就不用解釋了,Lesson1中已經(jīng)出現(xiàn)過(guò)了。
Lesson2里面涉及到的基本概念比較多,初學(xué)的朋友可能就要想辦法搞清楚這些概念了。Lesson2的例子中,大家可自己實(shí)現(xiàn)下空單的按鈕代碼。好了,至此Lesson2的開(kāi)發(fā)工作就全部結(jié)束了,敬請(qǐng)關(guān)注MT5編程實(shí)戰(zhàn)開(kāi)發(fā)系列第三講!