


認識交易函數、常量
從第三章開始将正式學習EA編程中最重要的一環,交易函數的正式運用。在MQL4中,交易函數是用于執行各種交易操作的必備。它們提供了一系列函數來實現下單、平倉、修改和删除訂單等基本交易行爲。通過調用這些函數,交易者可以根據自己的交易策略和市場分析,自動化地進行各種交易操作。
獲取訂單信息前準備
在獲取訂單信息之前,如果你要獲得全部訂信息,我們首先要回顧一下最基本的for循環,因爲在訂單信息獲取的過程中,要借助循環遍曆的方式遍曆到賬戶中存在的訂單數量才能開始。下圖爲一個簡單的訂單遍曆和獲取訂單信息的流程。
for循環複習:
for 循環是常用的叠代結構,用于重複執行一段代碼,直到滿足特定的條件才停止。它們的詳細結構如下:
- 初始值:在循環開始之前執行的語句,用于初始化循環控制變量
- 條件:每次循環叠代前進行判斷的表達式,如果條件爲真,繼續執行循環體;如果條件爲假,跳出循環。
- 更新操作:每次循環叠代後執行的語句,用于更新循環控制變量的值。
- 循環體:在條件爲真時重複執行的代碼塊。
以下是一個示例,展示了如何使用 for 循環打印從 1 到 5 的數字:
在上述示例中,i 的初始值爲 1,每次叠代後通過 i++ 更新 i 的值,循環條件爲 i <= 5。在每次叠代中,打印當前 i 的值,然後繼續下一次叠代,直到 i 大于 5 時循環結束。在懂得for循環後我們開始今天的正題。
認識訂單信息函數
1、OrdersTotal()、OrdersHistoryTotal():訂單總數函數,這兩個函數是遍曆訂單時重要函數之一,OrdersTotal()用于獲得在你的倉位中的市場單和挂單的總數量,既未平倉的所有訂單;相反OrdersHistoryTotal()則是獲取的賬戶中所有已經平倉的訂單數量,在做曆史訂單統計時需要用到。
2、OrderSelect():訂單選擇函數,這個也是最重要的函數之一,隻有在成功選擇訂單後才能使用其他訂單信息函數獲取對應的訂單信息。該函數爲布爾形态,接受三個重要參數,在成功選擇訂單後返回真;
- n, 第幾個訂單:
- SELECT_BY_POS/SELECT_BY_TICKET:從訂單順序或者訂單号來選擇訂單
- MODE_TRADES / MODE_HISTORY:選擇持倉訂單還是曆史訂單
3、剩餘的就是其餘16個重要的訂單信息函數,了解其功能即可。在這些函數中。你可以拿來判斷過濾條件,也可以直接用來獲取信息。
- OrderClosePrice() 返回當前選定訂單的收盤價
OrderCloseTime() 返回當前選定訂單的關閉時間
OrderComment() 返回當前所選訂單的評論
OrderCommission() 返回當前所選訂單的計算傭金
OrderExpiration() 返回所選挂單的到期日期
OrderLots() 返回所選訂單的手數
OrderMagicNumber() 返回當前所選訂單的标識号(魔術)
OrderOpenPrice() 返回當前選定訂單的開盤價
OrderOpenTime() 返回當前選定訂單的開盤時間
OrderProfit() 返回當前選定訂單的利潤
OrderStopLoss() 返回當前選定訂單的止損值
OrderSwap() 返回當前選定訂單的掉期價值
OrderSymbol() 返回當前所選訂單的商品名稱
OrderTakeProfit() 退貨獲利當前選定訂單的價值
OrderTicket() 返回當前選定訂單的票證編号
OrderType() 返回當前所選訂單的訂單操作類型
4、另外,對于OrderType() 函數,既訂單類型,這裏還需要明白我們常見的訂單是怎麽區分多空或者挂單的。在MT4中OrderType()函數接受的訂單操作類型共分爲7種,前6種如下圖所示,代表值分别代表了每一種不同訂單類型,爲了容易記住,MQL4中也爲每種值分配了固定的常量名稱,不管你是直接使用值還是常量都是一樣的。
兩種等效的表達方式。
學習與實踐
1、獲取當前貨币魔号爲123456的多單手數總數和總利潤。
邏輯解析:
-
for(int i = 0; i < OrdersTotal(); i++)
這是一個 for 循環語句,用于遍曆當前賬戶下的所有訂單。OrdersTotal()函數返回賬戶中的持倉訂單總數。循環變量 i 從 0 開始(也就是離當前最近開的一個單子),直到小于訂單總數(最早的開的單子)爲止;
要是把for的循序反過來,順序也就從最早的開始。那麽怎麽理解OrdersTotal() - 1呢?上面我們提到0代表當前最近的一個訂單,而OrdersTotal代表了訂單總數,假如總數有10個訂單,最早的一個就是9,由此10-1=9,OrdersTotal() - 1自然代表了最後一個訂單。既i=最後一個訂單,隻要i大于等于0,就繼續循環,也可以理解爲循環到0的時候停止,也就遍曆到了所有持倉訂單,兩種方法幾乎是等效的;但在一些特殊場景下我們需要反過來,比如處理平倉單,這個我們後面到訂單修改函數部分再解讀。 -
if(OrderSelect(t, SELECT_BY_POS, MODE_TRADES))
OrderSelect()函數用于選擇指定的訂單。 i 則是遍曆到的訂單順序定位,這裏使用SELECT_BY_POS模式,表示按照位置索引選擇訂單。MODE_TRADES表示選擇交易訂單,而不是挂單。
如果選擇訂單成功,則進入下一個代碼塊。 -
if(OrderType() == 0 && OrderSymbol()Symbol() && OrderMagicNumber()"123456")
OrderType()函數返回訂單類型,這裏判斷是否爲買入訂單(0)。
OrderSymbol()函數獲取訂單的交易對,symbol代表當前加載EA的圖表貨币。
OrderMagicNumber()函數獲取訂單的Magic,這裏判斷是否爲"123456"。 -
如果滿足這些條件,則進入下一個代碼塊。
int buyOds++;
這行代碼将 buyOds 變量的值加1,用于統計滿足條件的買入訂單數量,有多少個訂單循環多少次就加多少次。
double Lots += OrderLots();//可以理解爲Lots = Lots+OrderLots();
這行代碼将當前訂單的交易量累加到 Lots 變量中,用于統計所有滿足條件訂單的總交易量。其表達方式和
double Profit += OrderProfit();
這行代碼将當前訂單的盈虧累加到 Profit 變量中,用于統計所有滿足條件訂單的總盈虧。
歡迎觀看本期教程,祝大家學習愉快!
删除后无法恢复
删除后无法恢复