MQL4課程-交易函數下單及掛單

交易函數也算是MT4平台的獨特函數了,也是最關鍵的一類,我們寫程序最終還是要落到交易上的,那麼下單和掛單的函數就必不可少

第五節 交易函數下單及掛單

交易函數也算是MT4平台的獨特函數了,也是最關鍵的一類,我們寫程序最終還是要落到交易上的,那麼下單和掛單的函數就必不可少。

1下單



打開幫助文件,我們可以看到交易函數還是有蠻多的,這節課我們先不講這麼多,我們完成一個目標就可以了,那就是做好開單和掛單。

開單和掛單我們都採用OrderSend()函數來執行,首先我們試一下在當前品種開一個市價多單,代碼如下:


 void OnStart() { double lot=0.01; int huadian=10; int ticket= OrderSend (Symbol(),OP_BUY,lot, MarketInfo(Symbol(),MODE_ASK),huadian,0,0,"MQL4 Lesson",1000, 0, clrAliceBlue); }


可以看到OrderSend()函數是個比較複雜的參數,它有十一個參數,給大家講解一下這些參數都是什麼意思。

第一個參數,是品種的名稱;

第二個參數是開單的方式,如果是市價單,那麼用OP_BUY或者OP_SELL,如果是突破單則用OP_BUYSTOP或是OP_SELLSTOP,如果是限價單則用OP_BUYLIMIT或者OP_SELLLIMIT;

第三個參數是開倉的手數;

第四個參數是開倉的價位,如果開市價多單,那麼開倉價為買入價就可以了;第五個參數是滑點,如果滑點超過了這個數值,那麼訂單是不會成交的;

第六、第七個參數分別是止損、止盈價位,如果是0則表示不設置止損止盈;

第八個參數是訂單的註釋,可以備註開單的原因等等;

第九個參數是魔術號碼,這個號碼非常重要,一般來說EA是通過這個號碼來識別它開的訂單的,所以一定注意不同的EA一定要用不同的魔術號碼來管理,否則會造成管理的混亂而產生虧損;

第十個參數是持續的時間,一般不怎麼用,所以設置0就可以了;

最後一個參數是顏色,這個指的是開單後在圖標上顯示開單位置的那個箭頭的顏色。

我們運行一下腳本,如下圖,可以看到我們成功地開出了一個0.01手歐美的多單,備註是"MQL4 Lesson",沒什麼毛病。



2分批下單

在我們做下單的程序時,我們肯定也會想到一些問題,比如說單子手數很小,小於平台的最小手數限制,或者反之單子大於了平台最大單子的限制怎麼辦?

對於手數很小的單子我們沒有辦法,只能給一個輸出提示一下,畢竟如果強行用最小手數的話有可能會出問題,因為有些品種的最小手數是1手,盈虧會很大,所以不建議當手數小於最小手數時採用最小手數下單。

那麼當手數大於最大手數時,我們就得把這個單子拆成幾個單子來下了,其實也不難,採用for循環就可以輕鬆做到,下面是一個例子:


 void OnStart() { string sym= Symbol(); int huadian=10; double lot=0.001; double maxlot= MarketInfo(Symbol(),MODE_MAXLOT); double minlot= MarketInfo(Symbol(),MODE_MINLOT); double amount=0; double lot_last=0; int i; int ticket=0; if (lot<minlot) { Print("手数太小"); return; } else if (lot>maxlot) { amount= MathCeil(lot/maxlot); lot_last=lot-(amount-1)*maxlot; for(i=(int)amount;i>0;i--) { if (i!=1) { ticket= OrderSend (sym,OP_BUY, maxlot, MarketInfo(Symbol(),MODE_ASK),huadian, 0,0, "MQL4 Lesson",1000,0, clrAliceBlue); } else { ticket= OrderSend (sym,OP_BUY, lot_last, MarketInfo(Symbol(),MODE_ASK),huadian, 0,0, "MQL4 Lesson",1000,0, clrAliceBlue); } } } else { ticket= OrderSend (Symbol(),OP_BUY,lot, MarketInfo(Symbol(),MODE_ASK),huadian, 0, 0, "MQL4 Lesson",1000,0, clrAliceBlue); } }


上例中,我們把這個品種的最大手數賦給了maxlot,把最小手數賦給了minlot,如果開單的手數在maxlot和minlot之間,那麼我就直接開單。

如果開單的手數比minlot小,那麼我們就輸出“手數太小”,不開單。

如果開單的手數比maxlot還要大,那麼我們就求出這個大訂單需要拆解成多少個小訂單,並把訂單數量存放在amount這個變量中,上例中的MathCeil()函數是向上取整的意思。然後我們計算出如果按最大手數來開單,最後一單應該是多少手,比如說我要開70手而最大訂單數是50手,那麼我應該開50手+20手,最後一單的手數是20手。這些都做好後用for循環開單就行了。

我們開一個0.001手試一下,運行結果如下:



可以看到程序輸出了“手數太小”。接下來我們調整手數,將lot調整為0.01,可以看到我們開出了0.01手的訂單。



最後我們試一下開1200手訂單:



可以看到程序自動將1200手訂單拆成了2個500手的單子和1個200手的單子,運行結果沒有問題。

在以後的模塊編寫中,這一部分內容將非常重要。

3掛單

掛單其實和下單區別不是太大,不同之處在於單子成交的價格和掛單的類別。比如說我現在想在歐元美元1h級別的上一根K線最高價以上10個點掛一個0.1手的多單,代碼如下:


 void OnStart() { double lot=0.1; int huadian=10; double Price= iHigh("EURUSD",60, 1)+ 10 *(MarketInfo("EURUSD", MODE_POINT)* 10); int ticket= OrderSend ("EURUSD",OP_BUYSTOP,lot, Price,huadian, 0, 0,"MQL4 Lesson",1000,0, clrAliceBlue); }


可以看到和開單的例子相比,掛單僅僅多了一個掛單的價格Price,然後把OP_BUY改成了OP_BUYSTOP,其他都沒變,所以學會了開單那麼掛單也是一樣的。



運行以上代碼,我們順利完成了掛單的任務。

4新聞交易雙向掛單腳本

有了以上的掛單的基礎,我們就可以搞一點點黑科技出來了,比如說寫一個在重大消息公佈之前一鍵雙向掛單的腳本,這個腳本要能夠實現快速地掛單,並設置好止損止盈。

如果這個任務交給一個人去完成,那是非常困難的事情,考驗手速,沒玩過幾年星際爭霸都搞不出來,而且在數據公佈前有的時候會比較緊張,一緊張就容易掛錯。這項黑科技便可以替我們完成這一系列複雜的操作。

我們在市價以上5個點掛一個0.1手突破多單,止盈為20個點,止損為5個點,然後在市價以下5個點掛一個0.1手突破空單,同樣止盈20個點,止損5個點。代碼如下:


 void OnStart() { double lot=0.1; int huadian=10; int tp=20; int sl=5; double Price_BUY= MarketInfo(Symbol(), MODE_ASK)+ 5 *(MarketInfo(Symbol(), MODE_POINT)* 10); double tp_BUY= Price_BUY+tp*(MarketInfo(Symbol(), MODE_POINT)* 10); double sl_BUY= Price_BUY-sl*(MarketInfo(Symbol(), MODE_POINT)* 10); int ticket= OrderSend (Symbol(),OP_BUYSTOP,lot, Price_BUY,huadian, sl_BUY, tp_BUY,"MQL4 Lesson",1000,0, clrAliceBlue); double Price_SELL= MarketInfo(Symbol(), MODE_BID)- 5 *(MarketInfo(Symbol(), MODE_POINT)* 10); double tp_SELL= Price_SELL-tp*(MarketInfo(Symbol(), MODE_POINT)* 10); double sl_SELL= Price_SELL+sl*(MarketInfo(Symbol(), MODE_POINT)* 10); ticket= OrderSend (Symbol(),OP_SELLSTOP,lot, Price_SELL,huadian, sl_SELL, tp_SELL,"MQL4 Lesson",1000,0, clrAliceBlue); }


以上程序我們將多單和空單掛單的價格分別賦給了Price_BUY和Price_SELL,將多單的止盈止損分別賦給tp_BUY和sl_BUY,然後掛出多單,將空單的止盈止損分別賦給tp_SELL和sl_SELL並掛出空單,從而實現了雙向掛單的功能。



我們雙擊一下腳本,程序自動掛了兩個單,執行正常。

當然,要做一款用於新聞交易的EA肯定不止是這麼簡單的,比如說後面我們還要實現移動止損的功能,還有刪除掛單的功能以及根據時間自動開倉的功能等,需要學習的東西還非常多,但是到這一步也算是比手工做單來的方便點了。


更多內容請關注公眾號【Alpha自營交易室】~

分享至:

作者:火象趣交易

本文為PANews入駐專欄作者的觀點,不代表PANews立場,不承擔法律責任。

文章及觀點也不構成投資意見

圖片來源:火象趣交易如有侵權,請聯絡作者刪除。

關注PANews官方賬號,一起穿越牛熊
推薦閱讀
2021-11-01 06:53
2021-11-01 06:31
2021-11-01 06:27
2021-11-01 06:21
2021-11-01 05:30
2021-11-01 04:41

熱門文章

行業要聞
市場熱點
精選讀物

精選專題

App内阅读