第三節 賬戶信息函數和檢測函數

在上一節課中我們建立了第一個EA,並完成了一些很簡單的功能。接下來,要開始介紹一些用於交易的函數了。第一個便是賬戶信息函數與檢測函數,用來查找賬戶的信息,如賬戶的淨值,賬戶的名稱等。

1.賬戶信息函數

一般來說,在EA運行前,我們需要對賬戶進行判斷,比如賬戶的信息是否正確,賬戶的淨值是多少等等,賬戶信息核對通過後才可以使用我們的策略對賬戶的資金進行管理,同時也便於我們對賬戶的風險進行控制。

查找賬戶的信息一般採用AccountInfoDouble()、AccountInfoInteger()以及AccountInfoString()函數,這三個函數分別用來查詢雙精度浮點型賬戶信息、整數型賬戶信息以及字符串型賬戶信息。

比如說,現在我想查詢賬戶的餘額,由於餘額是個小數,所以我們需要用查詢雙精度浮點型的賬戶信息函數AccountInfoDouble()來查詢;如果要查賬戶的槓桿倍數,則用AccountInfoInteger()查找,如果查找交易商的名稱,那麼就要用AccountInfoString()。

當然,每個函數都有相應的子目錄,以便查詢各種不一樣的信息,那首先介紹一下AccountInfoDouble()函數的用法。我們可以打開幫助文件查看這個函數的子目錄如下:



可以看到這個函數可以查詢非常多的賬戶信息,下面我們把它們一一輸入進去,看看輸出的結果。為了不重複輸出,我們用腳本來編寫。


 void OnStart() { Print("账户余额="+(string) AccountInfoDouble(ACCOUNT_BALANCE)); Print("账户亏损="+(string) AccountInfoDouble(ACCOUNT_CREDIT)); Print("账户利润="+(string) AccountInfoDouble(ACCOUNT_PROFIT)); Print("账户净值="+(string) AccountInfoDouble(ACCOUNT_EQUITY)); Print("账户已用保证金="+(string) AccountInfoDouble (ACCOUNT_MARGIN)); Print("账户可用保证金="+(string) AccountInfoDouble (ACCOUNT_MARGIN_FREE)); Print("账户可用保证金比例="+(string) AccountInfoDouble (ACCOUNT_MARGIN_LEVEL) +"%"); Print("账户追加保证金比例="+(string) AccountInfoDouble (ACCOUNT_MARGIN_SO_CALL) +"%"); Print("爆仓保证金比例="+(string) AccountInfoDouble (ACCOUNT_MARGIN_SO_SO) +"%"); Print("账户初始保证金="+(string) AccountInfoDouble (ACCOUNT_MARGIN_INITIAL)); Print("账户维持保证金="+(string) AccountInfoDouble (ACCOUNT_MARGIN_MAINTENANCE) ); /*用于期货市场*/ Print("账户活动资金="+(string) AccountInfoDouble (ACCOUNT_ASSETS)); /*用于期货市场*/ Print("账户锁定保证金="+(string) AccountInfoDouble (ACCOUNT_COMMISSION_BLOCKED)); /*用于期货市场*/ }


以上我們把所有的雙精度型賬戶信息都輸出了,得到的結果如下:



所謂賬戶的追加保證金比例,指的是當前保證金比例小於50%時,交易商會通知你追加保證金以免爆倉,而爆倉保證金比例指的是當保證金比例小於30%時,交易商會對賬戶強行平倉。

這麼多函數其實不用記,只要知道AccountInfoDouble()函數是用來查詢賬戶的小數一類的信息就行了,而這個也是非常簡單,直接看這個函數的名字你就知道這個函數可以用來幹什麼了。如果沒有記住這裡面的子目錄,可以打開幫助文件搜索AccountInfoDouble()來查這個函數的子目錄及其功能。以後的MQL4函數也大都不用去背,如果死記硬背估計沒個一年還用不了,我們只需要知道一些主要的函數,然後充分利用好幫助文件即可。

接下來是整數型的賬戶信息,如賬戶的ID號碼等,所有的整數型賬戶信息如下:


 void OnStart() { Print("账户ID="+(string) AccountInfoInteger (ACCOUNT_LOGIN)); Print("杠杆倍数="+(string) AccountInfoInteger (ACCOUNT_LEVERAGE)); Print("最大持仓单数="+(string) AccountInfoInteger (ACCOUNT_LIMIT_ORDERS)); //如果为0则没有限制,由交易商规定Print("是否允许账户交易="+(string) AccountInfoInteger (ACCOUNT_TRADE_ALLOWED)); //如果为0则不允许交易,为1则允许交易Print("是否允许EA交易="+(string) AccountInfoInteger (ACCOUNT_TRADE_EXPERT)); //如果为0则不允许,为1则允许Print("保证金的计算模式="+(string) AccountInfoInteger (ACCOUNT_MARGIN_SO_MODE)); //如果为0,则用百分比计算保证金,若低于某一比例则需追加保证金;若为1则采用保证金的数值来计算保证金,当保证金低于某一值时需追加保证金,取决于交易商,一般来说采用百分比计算}


如果是模擬賬戶是沒有持倉單數的限制的,如果是實盤賬戶的話會有限制,每個交易商都不一樣,所以在做策略時,特別是多策略多品種同時運行,單子特別多的時候,一定要注意交易商在持倉單數的限制,否則單子數量到了一定程度後交易是開不了單的。另外,是否允許賬戶交易,這個一般來說是允許的,如果是觀摩賬號就不會允許。

運行腳本可以得到以下輸出:



最後我們看一下字符串類型的賬戶信息,代碼如下:


 void OnStart() { Print("账户名称="+(string) AccountInfoInteger (ACCOUNT_NAME)); Print("交易商服务器的名称="+(string) AccountInfoInteger (ACCOUNT_SERVER)); Print("结算货币="+(string) AccountInfoInteger (ACCOUNT_CURRENCY)); Print("交易商公司名称="+(string) AccountInfoInteger (ACCOUNT_COMPANY)); }


相對來說字符串類型的賬戶信息較少,但是在一些時候也是非常有用的。運行代碼輸出如下:



再次重申,以上函數千萬不要死記硬背,這會浪費大量的實踐時間,我覺得依靠幫助文件來查詢來多用這些函數,到後面用多了也就自然熟悉了。總而言之,多編寫一些東西,多練習就行。

2.檢測函數

檢測類函數在幫助文件的目錄中對應的是Checkup這一類函數,如下圖:



打開這一類函數,我們可以看多這類函數有很多。下面挑幾個常用的說一下,其他的函數不經常用到,所以在此不講解。

首先最常用的檢測函數是GetLastError()函數,這個函數用來返回程序出錯的原因。這個函數在以後的模塊編寫時會經常用到,但是很多時候會涉及到開倉等交易函數,因此暫時不說,只要記得這個函數有什麼用即可。

IsStopped()這個函數檢測的是程序是否被停止操作,一般來說用來檢查程序是否允許運行。

Symbol()函數用來獲取掛的圖表的品種,Period()用來獲取當前圖表的時間框架,Digits()用來獲取當前品種的價格在小數點後有幾位小數,Point()則用來返回當前圖表貨幣對的最小報價單位,代碼如下:


 void OnStart() { string a=Symbol(); int b=Period(); int c=Digits(); double d=Point(); Print("当前货币对为"+a+",当前时间周期为"+(string)b+",小数点后有"+(string)c+"位小数"+",最小报价单位为"+(string)d); }


輸出如下:



注意Period()函數以分鐘為單位來區別時間週期,比如4h,那麼函數返回的便是240。

還有一些檢測函數如TerminalInfoInteger()、TerminalInfoDouble()、TerminalInfoString()等等,可以檢測的內容非常多,包括檢測賬戶是模擬賬戶還是真實賬戶,檢測是否是在回測,檢測網絡是否通暢等等,大家可以打開MQL4幫助文件查看,不用背下來,只在有需要時用一下即可。

以上是本節課的內容,下節課我們將學習一下市場信息函數,通過市場信息函數我們可以獲取各品種的報價、點差、交易量等等。


更多內容請關注公眾號【火象】~