NTL+語言基礎 | IFCM
IFC Markets - 外匯交易

NTL+語言基礎

引言

這篇文章是為那些首次在NTL+語言上編寫程式的程式師. 在該語言中包括交易助手創造的一些特性以及知識. 有助於避免很多錯誤, 並節省編寫和調試的時間(NTL+語言腳本的概念有不同的程式樣式: 交易助手,指標和應用軟體)。


創建交易助手.

創建新的交易助手, 右鍵點擊檔 請轉入窗口Navigator, 右鍵點擊資料夾Advisors並在下拉式功能表中選擇Create. 此時您需要輸入新交易助手的名稱. 命名的規則與作業系統一樣, 不能含有下列符號*|\:"<>?/ .


創建新的交易助手文檔之後, 您會看到帶有3個函數的初始模版Initialize(), Run(), DeInitialize(). 其中每個函數都是在特定時間啟動. 程式師不需要單獨調用, 其為自動啟動.


運行交易助手之後, 直接執行函數Initialize(), 提供初始參數. 注意, 函數Initialize()不會執行交易操作, 因為其運行時, 交易參數可能是不固定的(例如BidAsk價格, 頭寸和訂單的資訊).


每一次價格變動都會運行函數Run(). 在該代碼中可以分析當前的市場狀況, 採取必要的交易措施或完成數學計算. 每次價格變動的資料加工不會超過10秒鐘, 否則程式將自動停止使用交易助手.


當停止交易助手時調用函數DeInitialize(), 在停止腳本之前結束最後的操作. 在很多腳本中當初始化或取消初始化時一些操作完全沒有必要- 這是函數Initialize() 和DeInitialize()將留空或將其從腳本中刪除(如果平臺不會調用).


編制演算法和編寫交易助手代碼.

第一步是制定演算法. 該演算法必須具有清晰的結構和詳細的解釋, 以便簡化後續的調試, 修改和優化.


必須確定交易的準則, 比如開立多空頭寸, 何時平倉, 如何監控並限制未結頭寸的數量. 如果您的交易助手已經放置掛單(包括條件訂單和啟動訂單), 那麼需要考慮要刪除和修改訂單的可能.


交易助手的成功取決於選擇正確的交易準則來開立/結清頭寸, 放置掛單, 因此創建成功交易助手的第一步是交易規則的制定. 其可以基於技術指標, 價格水準的分析等.


不要忘記, 交易助手工作時間人工干預的可能性: 如果交易助手開立頭寸, 而您關閉頭寸? 在非計畫狀態是否造成故障.


要正常工作, 您需要分析每個價格變動開倉和放置掛單的狀態. Deals.TotalOrders.Total可以幫助到您, 他們可以提高未接頭寸和放置掛單的數量, Deals.Select() 和 Orders.Select()方法也可以選擇頭寸或訂單.


值得關注的還有交易助手在終端重啟後的恢復工作: 能否進入到重啟前的狀態? 考慮到可能的情況, 在重啟期間, 頭寸可能因為止損或止贏結清, 甚至執行訂單開立新的頭寸.


需要預見到存在誤差的行為, 例如缺乏足夠的資金進行建倉, 或放置距離當前價格過近的掛單.


帳戶狀態的訪問可以通過Account及其熟悉來查看. 例如, 屬性Account.Balance可以獲得當前帳戶的帳戶餘額, 屬性Account.MarginFree - 獲得自由保證金的值.


int Run() { // 初始化變數volume –交易量(單位基礎貨幣) int volume = 10000; if(Account.MarginFree < volume/Account.Leverage) return -1; }

注意«return -1» - 當完成該操作, 強制停止.


歷史牌價.

利用時間序列使您可以獲取當前工具的歷史價格並分析過去的市場形勢. 時間序列是一組陣列: Open[] – 開盤價, Close[] – 收盤價, High[] – 最高價, Low[] – 最低價, Time[] – 開盤時間和Volume[] – 價格跳動數量. 時間序列有反向索引: 最後一個(即時間最晚的)將為指數0, 第一個 – 等於Bars.Total(Chart.Symbol,Chart.Interval)-1.


如果你想獲得任意工具的資料, 您需要使用物件Bars. 其Open(), High(), Low(), Close(), Volume(), Time()對應的時間序列, 唯一的區別是需要指定工具, 柱體的數量(區間, 時間週期)和柱體號碼, 以獲得需要的值. 運行腳本之前,您需要訂閱腳本有關聯的工具. 因此需要打開視窗MarketWatch,右鍵點擊空白區域, 在下拉式功能表中選擇Subscribe,勾選所有需要的工具並點擊"OK".


在交易助手中您可能需要確定何時開立新的柱體或結束前一柱體. 對此, 可以使用全域陣列Volume.每個價格跳動, Volume[0]會增大1, 在第一個跳動後, 新的柱體為1. 因此, 確定柱體的開立時間適用下列結構:


int Run() { if(Volume[0]==1) { //開立新的柱體時執行的某個代碼. } }

甚至可以是在return的幫助下, 對於除了1以外所有的Volume[0]值執行Run()


int Run() { if(Volume[0]>1) return (0); //開立新的柱體時執行的某個代碼. }

另一種方法是分析打開柱體的時間 – 如果這一時間另個相鄰的價格跳動重合, 那麼在return(0)的幫助下退出. 在形成新的柱體時, 我們獲得了當前和前一跳動時不同的Time[0]值- 也就是開立新柱體.


datetime lasttime=0; int Run() { if(lasttime == Time[0]) return(0); //開立新的柱體時執行的某個代碼. lasttime = Time[0]; }

測試交易助手

交易助手測試的目的是評估交易助手有效性並檢查其運作. 要開始測試, 請在主功能表中選擇View -> Advisor Tester. 在窗口的上部有下列標籤:


  • Parameters –測試參數
  • Results – 頭寸的信息
  • Equity Graph – 餘額和資產淨值
  • Journal – 文件

Parameters

在標籤Parameters中可以確定下列影響測試允許的參數:


  • Advisor下拉清單 –選擇測試的交易顧問.
  • Properties – 打開交易助手參數進行編輯. 如果沒有extern, 則按鈕不會啟動.
  • Symbol – 測試的國內國際*.
  • Interval – 測試的時間段.
  • Spread – 選擇點差值. Current spread的值對應當前的點差. 在Spread 中可以引入任意的非負值.
  • Method – 測試方法. 可以選擇其中的一個值: Control PointsOpen Price Only. 如果選擇Control points , 則自動生成每個柱體4個價格跳動. 如果開盤價低於收盤價, 那麼對應Open, Low, High, Close; 如果相反, 則對應有- Open, High, Low, Close.
    img
    Open Prices Only方法, 所有交易操作僅按照開盤價執行. 並且時間序列中零值將對應Open[0] = High[0] = Low[0] = Close[0], 而非零值與Control Points的值重合.
  • 標籤Limit Dates 用於打開時間週期的限制.
  • FromTo區域為設置測試的時間段. 該值默認為工具載入的歷史時間.
  • Initial Deposit – 開始測試的初始存款.
  • Enable visual輸出圖表, 在圖表中顯示有開立結清頭寸的時刻, 以及放置掛單的時間.
  • Enable expert logs 輸出列印標籤Journal中的函數System.Print.
  • Start/Stop 開始或結束測試.

打開標籤Enable visual modeEnable expert logs 會影響測試的速度,因此建議只在必要的時刻開.


* 當前不提供測試多交易助手. 如果您想測試顧問, 幾種工具的頭寸和載入的歷史牌價區間不吻合, 那麼價格bid和ask, 時間序列和值將通過對象Bars返回, 可能為零值.


Results

在標籤Results輸出所有頭寸的資訊, 包括測試的開立和結清的頭寸. 在上面有未結頭寸. 其顯示下列資訊:


  • 號碼# - 結清頭寸的號碼. 第一個結清頭寸為#1, 第二個#2 等等
  • Deal ID – 結清頭寸的ID.
  • Symbol – 已開立頭寸的工具.
  • Volume1 – 頭寸數(單位基礎貨幣)
  • Volume2 -頭寸數(單位報價貨幣)
  • Open rate – 開盤價
  • Open time – 開盤時間
  • Stop loss – 止損水準 (如果不設置, 則不顯示)
  • Take profit – 止贏水準 (如果不設置, 則不顯示)
  • Last swap – 隔夜利息
  • Rate close – 收盤價
  • Time close – 收盤時間
  • Profit – 盈利
  • Balance – 帳戶餘額*.
  • Equity – 資產淨值*.

* 該表格輸出為Show extended columns模式. 該模式可以通過表格的下拉式功能表打開.


表格下部顯示的是結束測試時未結清的頭寸. 表格列的名稱與對應Closed Positions的名稱相同, 除了沒有列的結清頭寸.


在資訊視窗輸出結束測試時的資訊, 包括帳戶餘額, 資產淨值, 自由保證金.


Equity graph

根據每個結清頭寸顯示帳戶餘額和資產淨值的變化. 按兩下圖表顯示對應的頭寸Closed positions.


Journal

通過函數System.Print顯示測試輸出. 如果標籤Parameters的Enable expert logs關閉, 那麼只有啟動命令和停止命令顯示報告中.


腳本調試

調試腳本很少不使用列印函數System.Print, 輸出資訊到視窗Toolbox的標籤Journal中(測試中, 在標籤Journal). 運行交易助手, 顯示的資訊將複製到資料夾«用戶名\Documents\ NeTTradeX Advisors\logs»中. 檔可以在txt格式下編輯. 並記錄事件 發生的時間, 退出代碼(0-成功完成, 1- 錯誤)和正文.


添加屬性System.LastError值, 使得在交易助手出錯時進行分析. 其屬性保存最後一個錯誤的號碼. 並具有重要的特點: 每個隨後的交易操作將屬性值改為結果值. 因此如果您的腳本發送錯誤的參數, 之後放置訂單的參數是正確的, 那麼System.LastError會記錄為零值. 獲得System.LastError的值需要等待下一個交易操作(在我們的例子中是放置訂單), 那時將保存錯誤的代碼. System.ErrorDescription()方法描述錯誤, 通過System.LastError.返回一個錯誤代碼的字串.


調試時, 物件SystemIsStopped屬性是很有用的功能. 如果程式執行超過7秒, 其將有true值. 根據這一特性, 可以告知程式師腳本不久(3秒)後被強制停止. 因此, 腳本獲取時間來採取措施正確完成腳本.


概要

最後,應該指出的是,建立交易助手可以分為兩個階段:演算法開發和寫代碼. 第一步的準確性將決定第二步的易用性和快速性. 本文列出擬定的演算法, 以及切實可行的解決方案, 從而可以使您更容易的掌握NTL+和它的功能.


Close support
Call to Skype Call to QQ Call Back