第四節 市場信息函數
1價格信息查詢
這節課比較重要,也是MQL4比較獨特的地方,它可以直接獲取當前的市場各貨幣對信息以及歷史的信息,這對於量化交易來說是極為方便的。
打開MQ4幫助文件的目錄,我們可以看到這一類的函數。
一般來說我們使用MarketInfo()函數來獲取品種的相關信息,代碼如下:
void OnStart() { double bid= MarketInfo("EURUSD",MODE_BID); double ask= MarketInfo("EURUSD",MODE_ASK); double point= MarketInfo("EURUSD",MODE_POINT); double digits= MarketInfo("EURUSD",MODE_DIGITS); double spread= MarketInfo("EURUSD", MODE_SPREAD); double bid_current= MarketInfo(Symbol() MODE_BID); Print("欧元兑美元卖出价="+(string)bid); Print("欧元兑美元买入价="+(string)ask); Print("欧元兑美元最小报价单位="+(string)point); Print("欧元兑美元小数点后的位数="+(string)digits); Print("欧元兑美元的点差="+(string)spread); Print("当前品种的卖出价="+(string)bid_current); }
輸出結果如下:
可以看到程序是加載在原油的圖表上的,但是通過MarketInfo()我可以查詢EURUSD的信息,這個函數是非常關鍵的函數,比如說要做美國油和英國油的基差套利,那麼我們就可以把EA加載在美國油上,然後用MarketInfo()函數查詢英國油的價格,從而算出兩個的價差以及兩個品種的點差成本。因此這一函數對於對沖和套利的交易者來說是非常重要的。
MarketInfo()函數只能查詢當前的信息,如果我要查詢以往的信息要怎麼做?如果只查詢當前品種的信息,其實有一些方便一點的函數可以做到,比如說Ask、Bid、Close、Open等,用法如下:
void OnStart() { double close= Close[0]; double open= Open[0]; double high= High[0]; double low= Low[0]; datetime time= Time[0]; double volume= Volume[0]; double ask= Ask; double bid= Bid; Print("当前品种当前时间框架下当前K线的收盘价="+(string) close); Print("当前品种当前时间框架下当前K线的开盘价="+(string) open); Print("当前品种当前时间框架下当前K线的最高价="+(string) high); Print("当前品种当前时间框架下当前K线的最低价="+(string) low); Print("当前品种当前时间框架下当前K线的开盘时间="+(string) time); Print("当前品种当前时间框架下当前K线的成交量="+(string) volume); Print("当前品种当前时间框架下当前的买入价="+(string) ask); Print("当前品种当前时间框架下当前的卖出价="+(string) bid); }
輸出結果如下:
在這裡有必要說一下這幾個函數的用法,以Close為例,其實這個函數是MT4中內置的一個數組,可以方便查詢當前品種的信息,而輸入的參數就是K線的編號,比如說上例中,輸入的是0,那麼系統就會查詢編號為0的K線的收盤價,至於K線的編號方法,可以參照下圖:
當前K線的編號為0,往前的K線順延。
如果需要查詢其他品種之前K線的價格信息,我們可以用Close的升級版,那就是i系列函數來查詢,注意,這裡不再是數組了,而是函數,代碼如下:
void OnStart() { double close= iClose (Symbol(),60,1); double open= iopen (Symbol(),60,1); double high= iHigh (Symbol(),60,1); double low= iLow (Symbol(),60,1); datetime time= iTime (Symbol(),60,1); double volume= iVolume (Symbol(),60,1); Print("当前品种1h级别上一K线的收盘价="+(string) close); Print("当前品种1h级别上一K线的开盘价="+(string) open); Print("当前品种1h级别上一K线的最高价="+(string) high); Print("当前品种1h级别上一K线的最低价="+(string) low); Print("当前品种1h级别上一K线的开盘时间="+(string) time); Print("当前品种1h级别上一K线的成交量="+(string) volume); }
輸出結果如下:
使用這幾個函數需要輸入三個參數,第一個參數,很好理解,是品種的名稱,如果查詢其他品種,那麼可以把symbol()替換成其他品種的名稱,比如”GBPUSD”等等;第二個參數是時間框架,如果是1h那麼就是60min,也就是說這個參數輸入60;第三個參數,指的是K線的編號。
有了這幾個函數用於價格查詢其實基本上就夠了,所有的品種以及所有的K線的價格信息靠這幾個函數都能查到,因此一般來說要查詢價格都採用i系列的函數。除了一個數據用MT4是查不到的,那就是之前的點差數據,這對於剝頭皮交易者來說還是有一些困擾的,因為剝頭皮類型的策略需要非常精準的數據測試才能證明有用,所以很多時候,剝頭皮交易者會採用ECN賬戶來做交易,一是點差成本低,二是減小了浮動點差的影響,其實盤的交易結果與測試的結果與標準賬戶比稍微可靠一點。
2品種信息查詢
有的時候我們需要計算一個品種的盈虧,比如說我要計算1手XAUUSD這個品種波動1美元帶來的盈虧,或者說我們要計算EURUSD波動一個最小單位(0.1個點)造成的盈利和虧損,但是我們會經常發現,有些平台每手合約的大小不一樣(如黃金、白銀、原油等商品類品種很多時候會出現這種情況),這個時候就很尷尬了,不能很方便地從價格直接計算出盈虧,這個時候怎麼辦?
這裡最核心的,便是要查到品種合約的大小,這時可以使用SymolInfo這一系列函數來查詢。比如說我要計算XAUUSD波動1個最小報價單位以及波動一美元時造成的盈虧,代碼如下:
void OnStart() { double vlu= SymbolInfoDouble (Symbol(), SYMBOL_TRADE_CONTRACT_SIZE); double point= SymbolInfoDouble (Symbol(),SYMBOL_POINT); double profit= vlu* point; Print("当前品种的合约大小="+(string) vlu); Print("当前品种的最小波动价格="+(string) point); Print("当前品种波动最小单位造成的盈亏="+(string) profit); profit= 1* vlu; Print("当前品种波动1美元造成的盈亏="+(string) profit); }
輸出結果如下:
當然,對於交叉盤,盈虧的計算會比較複雜,需要配合之前課程中的品種識別以及現在的盈虧計算,這一塊會放到以後的模塊編寫中來詳細介紹,屆時我們會實現盈虧計算模塊的編寫和封裝。
其他的函數一般不怎麼用到,在此不細講,大家可以通過幫助文件來學習函數的用法。
那麼本節課就到這,這是一節非常重要的課,以後會大量用到這些函數,望大家好好掌握,下一節我們將介紹開單、平倉、掛單函數,此後我們便可以開始寫一些簡單的EA了。
更多內容請關注公眾號【Alpha自營交易室】~