您現在的位置:程序化交易>> 外匯現貨>> MT5>> MT5知識>>正文內容

MT5編程實例課程(阿郎)---第二講(一鍵下單) [MT4]

  • 在第一講中,我們通過一個簡單的例子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編程實戰開發系列第三講!

【字體: 】【打印文章】【查看評論

相關文章

    沒有相關內容
双色球机选新浪彩票