「FX581獨(dú)家」MT4開(kāi)發(fā)技巧 歷史記錄的“坑”
我們會(huì)經(jīng)常遇到這樣的需求:統(tǒng)計(jì)歷史交易記錄的手?jǐn)?shù),或者得到最后一筆歷史交易訂單的信息。這樣的功能對(duì)于我們來(lái)說(shuō)并不困難,下面是一個(gè)簡(jiǎn)單的代碼示例:
double lot = 0;
for(int i=0;i < OrdersHistoryTotal();i )
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) == false) continue;
lot = OrderLots();
}
Print("總手?jǐn)?shù):",lot);
這段代碼就是通過(guò)循環(huán)統(tǒng)計(jì)出所有歷史的手?jǐn)?shù),其實(shí)這段代碼就是把循環(huán)遍歷所有在場(chǎng)單的代碼改動(dòng)下即可。把OrdersTotal()函數(shù)改成OrdersHistoryTotal(),把OrderSelect函數(shù)里增加一個(gè)參數(shù):MODE_HISTORY。那么這么一個(gè)簡(jiǎn)單的程序也有問(wèn)題嗎?答案是肯定的。
我們來(lái)運(yùn)行下這個(gè)EA程序,在終端中顯示的結(jié)果是:
總手?jǐn)?shù)居然是0!太不可思議了,明明我有很多的交易記錄啊。
現(xiàn)在跟小編一起來(lái)做一些操作,再運(yùn)行下程序看看最后的結(jié)果是什么:
在賬戶歷史中點(diǎn)擊右鍵,選擇所有交易記錄,現(xiàn)在賬戶歷史中就出現(xiàn)了之前交易的所有歷史記錄
那么我們?cè)谶\(yùn)行下EA程序試下結(jié)果就會(huì)顯示正常:
這就是通過(guò)程序得到歷史記錄的一個(gè)“坑”了,在MT4中,軟件默認(rèn)會(huì)只顯示當(dāng)月的歷史記錄,而程序在得到歷史記錄時(shí)只根據(jù)軟件當(dāng)前的歷史記錄進(jìn)行查找,由于這個(gè)月我沒(méi)有做任何的交易,所以在統(tǒng)計(jì)總手?jǐn)?shù)的時(shí)候得到的是0,而如果在軟件里把所有的交易記錄都顯示出來(lái)后,程序終于可以正常工作了。
(本段落標(biāo)藍(lán)是為了推廣所用,請(qǐng)吧xxx替換為相應(yīng)要宣傳的平臺(tái),如果沒(méi)有可做的平臺(tái)可以刪除這段內(nèi)容)之所以我們很少發(fā)現(xiàn)這個(gè)問(wèn)題的原因在于一般的MT4平臺(tái)模擬賬戶時(shí)效性都很短,注冊(cè)了一個(gè)模擬戶后很快就過(guò)期了,導(dǎo)致很少有人能發(fā)現(xiàn)這個(gè)問(wèn)題。所以擁有一個(gè)能開(kāi)長(zhǎng)效模擬戶的平臺(tái)尤為重要了,我們推薦使用xxx平臺(tái)它可以提供長(zhǎng)達(dá)xx天的模擬賬戶。
長(zhǎng)效模擬戶本身對(duì)于我們開(kāi)發(fā)和測(cè)試EA程序是有很大幫助,眾所周知開(kāi)發(fā)完成一款新的EA程序后只是用歷史模擬是不夠的,還需要掛機(jī)測(cè)試,如果測(cè)試沒(méi)幾天就過(guò)期了這樣對(duì)于開(kāi)發(fā)EA來(lái)說(shuō)是非常煩惱的事情。
關(guān)于這個(gè)歷史記錄的第二個(gè)“坑”是,我們要想得到歷史記錄只能用EA程序來(lái)獲取,如果我們寫(xiě)一個(gè)腳本程序,同樣是得不到歷史記錄的,即使我們已經(jīng)在賬戶歷史中顯示了所有的記錄。
那么我們?nèi)绾尾拍鼙苊膺@個(gè)問(wèn)題呢?因?yàn)榭蛻粼谑褂梦覀兊腅A程序時(shí)是不知道這個(gè)問(wèn)題的,如果客戶不知道或根本不會(huì)去這樣操作,我們?cè)诔绦蛑腥绾伪苊膺@個(gè)問(wèn)題呢?一個(gè)比較簡(jiǎn)單的辦法是在您的EA程序運(yùn)行中,把所有下單的記錄都存在文件中,這樣即使客戶沒(méi)有任何操作也可以拿到這些歷史記錄信息,下面是一個(gè)簡(jiǎn)單的存文件的代碼示例:
//content為要存儲(chǔ)的內(nèi)容
void setfile(string content)
{
string Filename = "要存儲(chǔ)的文件名";
int filehandle = FileOpen(filename,FILE_WRITE|FILE_TXT);//也可以存成CSV文件把FILE_TXT替換成FILE_CSV,這樣可以存儲(chǔ)多條信息
if(filehandle == INVALID_HANDLE)//判斷讀取文件是否出現(xiàn)錯(cuò)誤
{
FileClose(filehandle);
Print("存儲(chǔ)文件發(fā)生錯(cuò)誤");
}
else//正常打開(kāi),可以寫(xiě)入內(nèi)容了
{
FileWriteString(filehandle, content);
FileClose(filehandle);
}
}
通過(guò)以上的方法,想必各位已經(jīng)有所了解,在以后的開(kāi)發(fā)中我們的程序?qū)⒏拥耐晟坪徒选?/span>