【FX581原創】MT4開發技巧歷史記錄的“坑”

MT4指標、EA討論群
fx58

我們會經常遇到這樣的需求:統計歷史交易記錄的手數,或者得到最後一筆歷史交易訂單的信息。這樣的功能對於我們來說並不困難,下面是一個簡單的代碼示例:

double lot = 0;

for(int i=0;i < OrdersHistoryTotal();i++)

{

 if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) == false) continue;

   lot += OrderLots();

}

Print("總手數:",lot);

這段代碼就是通過循環統計出所有歷史的手數,其實這段代碼就是把循環遍歷所有在場單的代碼改動下即可。把OrdersTotal()函數改成OrdersHistoryTotal(),把OrderSelect函數里增加一個參數:MODE_HISTORY。那麼這麼一個簡單的程序也有問題嗎?答案是肯定的。

我們來運行下這個EA程序,在終端中顯示的結果是:

總手數居然是0!太不可思議了,明明我有很多的交易記錄啊。

現在跟小編一起來做一些操作,再運行下程序看看最後的結果是什麼

在賬戶歷史中點擊右鍵,選擇所有交易記錄,現在賬戶歷史中就出現了之前交易的所有歷史記錄

那麼我們在運行下EA程序試下結果就會顯示正常:

這就是通過程序得到歷史記錄的一個“坑”了,在MT4中,軟件默認會只顯示當月的歷史記錄,而程序在得到歷史記錄時只根據軟件當前的歷史記錄進行查找,由於這個月我沒有做任何的交易,所以在統計總手數的時候得到的是0,而如果在軟件裡把所有的交易記錄都顯示出來後,程序終於可以正常工作了。

之所以我們很少發現這個問題的原因在於一般的MT4平台模擬賬戶時效性都很短,註冊了一個模擬戶後很快就過期了,導致很少有人能發現這個問題。所以擁有一個能開長效模擬戶的平台尤為重要了,我們推薦使用xxx平台它可以提供長達xx天的模擬賬戶。

長效模擬戶本身對於我們開發和測試EA程序是有很大幫助,眾所周知開發完成一款新的EA程序後只是用歷史模擬是不夠的,還需要挂機測試,如果測試沒幾天就過期了這樣對於開發EA來說是非常煩惱的事情。

關於這個歷史記錄的第二個“坑”是,我們要想得到歷史記錄只能用EA程序來獲取,如果我們寫一個腳本程序,同樣是得不到歷史記錄的,即使我們已經在賬戶歷史中顯示了所有的記錄。

那麼我們如何才能避免這個問題呢?因為客戶在使用我們的EA程序時是不知道這個問題的,如果客戶不知道或根本不會去這樣操作,我們在程序中如何避免這個問題呢?一個比較簡單的辦法是在您的EA程序運行中,把所有下單的記錄都存在文件中,這樣即使客戶沒有任何操作也可以拿到這些歷史記錄信息,下面是一個簡單的存文件的代碼示例:

//content為要存儲的內容

void setfile(string content)

{

   string filename = "要存儲的文件名";

   int filehandle = FileOpen(filename,FILE_WRITE|FILE_TXT);//也可以存成CSV文件把FILE_TXT替換成FILE_CSV,這樣可以存儲多條信息

   if(filehandle == INVALID_HANDLE)//判斷讀取文件是否出現錯誤

   {

      FileClose(filehandle);

      Print("存儲文件發生錯誤");

   }

   else//正常打開,可以寫入內容了

   {

      FileWriteString(filehandle, content);

      FileClose(filehandle);

   }

}

通過以上的方法,想必各位已經有所了解,在以後的開發中我們的程序將更加的完善和健壯。

著作權歸作者所有

最後編輯於2023/08/24 08:10

18 贊同
33 評論
收藏
查看原文
相關推薦
關於我們 用戶協議隱私權政策風險披露認證協議社群規範 幫助中心 意見回饋
App Store Android

風險披露

金融工具交易屬於高風險投資活動,有導致部分或全部投資本金損失的風險,可能不適合所有投資者。本網站所包含的任何觀點、聊天訊息、通知、新聞資訊、研究調查、分析、價格或其他訊息都是作為一般市場訊息提供的,僅供教育和娛樂之用,並不構成投資建議。所有的觀點、市場行情、推薦或任何其他內容可能隨時會改變,恕不另行通知。Trading.live對因使用或根據這些訊息而直接或間接造成的任何損失概不負責。

© 2024 Tradinglive Limited. All Rights Reserved.