MT5編程實(shí)例課程(阿郎)----第一講:Hello,MT5
作者:MT4 來源:cxh99.com 發(fā)布時(shí)間:2012年06月01日
- MT5的推出,實(shí)在是廣大匯友之福!新增的眾多強(qiáng)大功能,相信會(huì)讓大家在交易時(shí)如虎添翼。廢話不多說,沿襲MTx編程實(shí)戰(zhàn)開發(fā)系列的慣例,先來個(gè)小例子,讓大家感受一下MT5的強(qiáng)大。
選擇菜單上”Tools->MetaQuotes Language Editor”選項(xiàng),啟動(dòng)MQL5編輯器MetaEditor5(以下簡(jiǎn)稱ME5),或者在MT5中直接按快捷鍵F4,同樣可啟動(dòng)。進(jìn)入ME5后,點(diǎn)擊工具欄上的“New”按鈕
在彈出的對(duì)話框中選擇Expert Advisor選項(xiàng):
點(diǎn)擊“下一步”,輸入EA的名稱:
這里我們將第一個(gè)EA例子命名為L(zhǎng)esson1,輸入后點(diǎn)擊“完成”按鈕,即可生成Lensson1.mq5文件,一切與ME4基本一致。
讓我們來觀察一下Lesson1.mq5的代碼結(jié)構(gòu),與MT4時(shí)代自動(dòng)生成的EA代碼基本一樣,也是三個(gè)函數(shù),其功能也是一樣的,區(qū)別在于名字變了,MT4時(shí)代的是init、deinit和start,而MT5中生成的是OnInit、OnDeinit和OnTick。On我們可以理解為“當(dāng)。。?!钡囊馑?,那么這三個(gè)函數(shù)就很形象了,分別為:當(dāng)初始化、當(dāng)程序結(jié)束和當(dāng)價(jià)格跳動(dòng)。這里作個(gè)補(bǔ)充:MT5中雖然增加了Timer機(jī)制,但默認(rèn)仍然是基于Tick驅(qū)動(dòng)事件的,Timer機(jī)制需自行啟動(dòng)(最后這段話看不懂?沒關(guān)系,以后再用例子說明,這里不看也罷,呵呵)。
好了,框架有了,那么我們想讓第一個(gè)例子Lesson1實(shí)現(xiàn)些什么功能呢?我是這樣打算的:讓Lesson1在圖表上添加一個(gè)按鈕,當(dāng)點(diǎn)擊這個(gè)按鈕時(shí),會(huì)彈出一個(gè)對(duì)話框,對(duì)話框的內(nèi)容是“Hello, MT5!”。有了目標(biāo)就好辦,我們繼續(xù)前進(jìn)!
首先我們讓Lessson1具備在圖表上添加按鈕的功能。我們?cè)贠nInit函數(shù)中添加如下代碼:
輸入完畢后,按下編譯快捷鍵F5,如輸入無誤,會(huì)自動(dòng)切換到MT5圖表:
如圖1-3勾上兩個(gè)選項(xiàng),點(diǎn)“確定”,EA就加載到圖表上了。這時(shí)我們可以發(fā)現(xiàn),在圖表中多了個(gè)按鈕:
點(diǎn)擊這個(gè)按鈕,什么都沒發(fā)生,那是因?yàn)槲覀冞€沒有為這個(gè)按鈕添加處理代碼。下面,我們繼續(xù)為L(zhǎng)esson1添磚加瓦。
在OnTick函數(shù)下面添加一個(gè)函數(shù)OnChartEvent,并輸入如圖1-5所示代碼:
輸入完畢,再次按下編譯快捷鍵F5,然后點(diǎn)擊圖表上的按鈕,這時(shí)就會(huì)彈出個(gè)對(duì)話框,內(nèi)容為”Hello,MT5!”:
至此,我們的Lesson1就完成了!怎樣,MT5的功能不錯(cuò)吧?
下面,為大家講解一下上面的代碼含義。首先我們看看在OnInit函數(shù)里面添加的代碼
如果讀者有MT4編程基礎(chǔ)的話,ObjectCreate函數(shù)就非常熟悉了(如不熟悉請(qǐng)參閱筆者的《MT4編程實(shí)戰(zhàn)開發(fā)系列》,創(chuàng)建一個(gè)Object(物件),OBJ_BUTTON是MT5新增的參數(shù),意即創(chuàng)建一個(gè)Button1(按鈕)。
ObjectSetInteger(0, "Button1", OBJPROP_XDISTANCE, 250);
ObjectSetInteger(0, "Button1", OBJPROP_YDISTANCE, 100);
上面兩句分別設(shè)定了Button1的X坐標(biāo)和Y坐標(biāo)。注意:在MT4時(shí)代,Object的所有屬性都是用ObjectSet函數(shù)來設(shè)定的,在MT5中,將其細(xì)分為ObjectSetInteger、ObjectSetDouble和ObjectSetString三個(gè)函數(shù)了,三權(quán)分立,各司其職。
ObjectSetString(0, "Button1", OBJPROP_TEXT, "Say");
ObjectSetString函數(shù)功能為設(shè)定Object的string類型(字符串類型)屬性,這里設(shè)置Button1上面的文字。補(bǔ)充一下:MT5中對(duì)中文的支持仍然很差,這里如果設(shè)置為中文則無法顯示,希望后續(xù)版本有所改善
ObjectSetInteger(0, "Button1", OBJPROP_STATE, 0);
最后,設(shè)定OBJPROP_STATE屬性,這個(gè)屬性控制著Button1的顯示狀態(tài),設(shè)置為0,表示默認(rèn)顯示為彈起的,大家可將其設(shè)為1,看看效果。
綜述,上面的幾句代碼創(chuàng)建了一個(gè)叫做Button1的按鈕,并設(shè)置了x,y坐標(biāo)及按鈕文字、顯示狀態(tài)。
接著,我們來看看新增的函數(shù)OnChartEvent。如上所述,OnChartEvent顧名思義就是“當(dāng)圖表上發(fā)生了事情時(shí)。。?!?,OnChartEvent的參數(shù)比較多,也比較復(fù)雜,這里暫時(shí)不解釋,后面有機(jī)會(huì)再細(xì)談,這里我們需要知道的是:在MT5中,當(dāng)圖表上發(fā)生了任何事情,如點(diǎn)擊按鈕、輸入框中輸入文字、拖動(dòng)Object、按下鍵盤等等,就會(huì)調(diào)用OnChartEvent函數(shù)。那么,我們只需守株待兔,在OnChartEvent函數(shù)中檢測(cè)Button1是否被按下:
if (id==CHARTEVENT_OBJECT_CLICK && sparam=="Button1")
這句,意思就是當(dāng)圖表上發(fā)生了事情,如果是Object被按下,且Object的名字是Button1,則滿足條件,繼續(xù)下面的操作:
MessageBox("Hello, MT5!", "Button1", MB_OK);
MessageBox函數(shù)功能是彈出一個(gè)對(duì)話框,其中參數(shù)這里就不詳述了
看起來Lesson1似乎工作得不錯(cuò),但仔細(xì)看看,按鈕在按下之后不會(huì)自動(dòng)彈起來!為了解決這個(gè)問題,我們把OnChartEvent函數(shù)改進(jìn)一下:
還記得OBJPROP_STATE屬性吧,控制按鈕的顯示狀態(tài),那么這里的意思就是顯示完MessageBox后,再次把按鈕的顯示狀態(tài)恢復(fù)為彈起。至此,Lesson1開發(fā)全部結(jié)束,敬請(qǐng)關(guān)注MT5編程實(shí)戰(zhàn)開發(fā)系列第二講!
作者:阿郎(shawnyau)栽自火線論壇http://www.fx998.cn。
Lesson1.rar (1 K) 下载次数:257