外_匯_邦 WaiHuiBang.com
在MetaTrader 4交易系統中創建並測試智能交易存在以下列舉特性。www.emoneybtc.com
在開倉之前必須驗證賬戶內是否存在自由保證金。如果賬戶內的自由保證金不足,開倉交易將失敗。您可以測試檢驗"FreeMargin"值不能夠少於1000,因為測試期間一個標准手的的價格為 1000。
- if(AccountFreeMargin() < 1000) return(0); // 沒有保證金 - 退出
復制代碼您可以通過使用預設定數組Time, Open, Low, High, Close, Volume 獲取歷史數據。因為歷史數據的原因,指數的增長是逐漸遞減-指數的最後值為0。指數 1 表示倒數一個時間周期,指數2表示倒數兩個時間周期,指數3 倒數三個時間周期以此類推。
- // 如果前一個蠟燭柱的Close少於前者的Close
- if(Close[1] < Close[2]) return(0);
復制代碼使用其他的時間間隔甚至是其他貨幣對可以獲得當前歷史的數據。得到這些數據首先需要確定一維數組,並且在函數"ArrayCopySeries"的幫助下完成復制工作。對於函數的調用您可以發送較少數量的參量,並且不指明默認參量。
- double eur_close_m1[];
- int number_copied = ArrayCopySeries(eur_close_m1, MODE_CLOSE, "EURUSD", PERIOD_M1);
復制代碼智能交易的編寫與其他程序創建一樣需要一些附加的調試信息。 MQL4 語言提供了幾種獲取信息的方法。
函數 "Alert" 會出現一個對話窗口顯示用戶指定數據。
- Alert("FreeMargin grows to ", AccountFreeMargin(), "!");
復制代碼函數 "Comment"將會在圖表窗口的左上角顯示用戶指定的數據。符號"n" 使用於字行的轉接。
- Comment("FreeMargin is ", AccountFreeMargin(), ".");
復制代碼函數"Print"在系統日志中打印用戶指定的數據。
- Print("FreeMargin is ", AccountFreeMargin(), ".");
復制代碼程序中錯誤的獲取,函數"GetLastError"的功能非常有用。例如,交易訂單經常返回替克數。如果這個替克數字等於 0 (在執行業務過程中出現了錯誤),獲取這個錯誤的詳細信息必須調用函數"GetLastError":
- int iTickNum = 0;
- int iLastError = 0;
- ...
- iTickNum = OrderSend(Symbol(), OP_BUY, g_Lots, Ask, 3, 0,
- Ask + g_TakeProfit * g_Points);
- if(iTickNum <= 0)
- {
- iLastError = GetLastError();
- if(iLastError != ERR_NO_ERROR)
- Alert("Some Message"); }
復制代碼調用"GetLastError"函數可以顯示錯誤代碼,並且重新設置改值。 因此連續調用這個函數返回的值將是0。
怎樣確定開始柱? (必須找到先前柱結束的位置)存在以下幾種方法。
第一種方法以檢測柱的數量為基礎:
- static int prevbars = 0;
- ...
- if(prevbars == Bars) return(0);
- prevbars = Bars;
- ...
復制代碼這種方法在歷史加載的情況下不能運行。在“先前”柱沒有完成之間,柱的數量發生改變。這種情況下您可以檢查這些值之間的差距等於1。
接下來這種方法是以 "Volume" 值為基礎取決先前每個柱生成的替克的數量。第一個替克意味著形成柱的"Volume"值等於 1:
- if( Volume[0] > 1) return(0);
- ...
復制代碼這種方法在大量價格替克輸入時可能會運行失敗。問題在於價格替克的輸入時實行單獨的作業。如果當下一個替克進入時這個作業處於繁忙狀態,那麼進入的這個替克則不能進入以避免超載的出現!這種情況下可以使用先前保存的 "Volume"執行檢測。
第三種方法是以柱的打開時間為基礎:
- static datetime prevtime=0;
- ...
- if(prevtime == Time[0]) return(0);
- prevtime = Time[0];
- ...
復制代碼這種方法是最保險的方法。它能夠在任意條件下運行。
"CSV"類型文件運行的范例:
- int h1;
- h1 = FileOpen("my_data.csv", MODE_CSV | MODE_WRITE, ";");
- if(h1 < 0)
- {
- Print("Unable to open file my_data.csv");
- return(false);
- }
- FileWrite(h1, High[1], Low[1], Close[1], Volume[1]);
- FileClose(h1);
復制代碼對於代碼的一些描述。首先打開"CSV"格式文件。在打開文件時生成錯誤將會對出程序。在文件成功打開後,清除文件內容並復制數據到文件內,隨後關閉文件。如果您需要保存文件原有的內容,可以使用 MODE_READ模式打開:
- int h1;
- h1 = FileOpen("my_data.csv", MODE_CSV | MODE_WRITE | MODE_READ, ";");
- if(h1 < 0)
- {
- Print("Unable to open file my_data.csv");
- return(false);
- }
- FileSeek(h1, 0, SEEK_END);
- FileWrite(h1, High[1], Low[1], Close[1], Volume[1]);
- FileClose(h1);
復制代碼這個范例中數據被添加到文件的尾頁。在文件打開後,我們可以使用函數 "FileSeek"。
外_匯_邦 WaiHuiBang.com