零基礎入門商品期貨程式化交易(2)
上篇文章我們一起學習了商品期貨交易方面的一些基礎概念、常識。本篇我們繼續從實際出發,學習商品期貨程式化交易策略的基礎設計。
內容講解以CTP協議為例(不清楚CTP這個名詞的可以看一下上篇文章)。
所有操作的前提--和期貨公司前置機連線
我們已經學習了一個重要的概念就是我們的交易程式不是直接連通商品期貨交易所的。而是我們的交易程式連線的是期貨公司的前置機伺服器,我們的策略程式觸發交易時一系列的操作例如下單、撤單、查詢賬戶資產、獲取行情等請求都是和期貨公司前置機互動的。那有的同學可能會問:“我們的交易程式下的單隻提交到了期貨公司前置機伺服器,那麼最終是怎麼到交易所的?畢竟交易所才是最終撮合交易的地方。”
我們的交易策略程式和期貨公司前置機互動,至於下單、撤單請求最終怎麼到交易所,那就是期貨公司前置機和交易所的業務範圍了,可以不予考慮。當然,以上只是簡單描述。實際情況例如CTP協議,當策略程式和期貨公司前置機建立連線之後期貨公司前置機會主動推送行情和一些訊息。我們不過多研究CTP協議,這裡只瞭解即可。
在FMZ上設計商品期貨交易策略的第一個需要牢記的概念就是:“確保和期貨公司前置機連線成功”。策略程式中所有的操作都必須基於和期貨公司前置機連線成功的前提之下。所以就有了FMZ API
文件中描述的商品期貨策略基礎框架(以JavaScript語言編寫策略為例):
function main(){ while(true){ // 需要在判斷exchange.IO("status")函式返回true,即為真值時才可呼叫行情、交易等函式 if(exchange.IO("status")){ exchange.SetContractType("MA000") var ticker = exchange.GetTicker() Log("MA000 ticker:", ticker) LogStatus(_D(), "已經連線CTP !") } else { LogStatus(_D(), "未連線CTP !") } } }
可能有的同學看到程式碼就直接感到頭大了。不用怕,本篇文章帶你徹底征服這段程式碼。
function
首先我們來說說function
這個單詞,這個單詞是JavaScript語言的關鍵字,所謂關鍵字就是這門程式語言中定義好的一個名稱,這個名稱只用於一個用途。function
的用途就是建立一個函式。那麼有萌新同學又會問了:“什麼是函式?”。簡單說,函式就是你輸入給它一些引數,它給你反饋一些資料,或者做一些處理,或者執行一些邏輯。
那麼function
這個單詞的作用在JavaScript語言中就是建立一個函式。接著往function
後面看,是另一個單詞:main
。這個main
並不是關鍵字,只是一個名稱,意思為“主要的”。function
main
就是說這裡建立了一個函式,這個函式名稱叫main
。再往後看是一對小括號()
,如果你建立的函式需要傳引數,在這個小括號內就可以寫上形式引數,這裡不做深究,暫且知道就行。我們建立的這個名為main
的函式是沒有引數的,所以這裡()
裡面就是空空的。繼續往後看,如下圖中的紅色標記:
又是一對兒符號,但是這裡是一對兒{}
花括號。我們把花括號連帶其中的程式碼內容稱為函式體,就是你要讓函式做的操作統統寫在這裡,OK我們也不做深究。至此我們學會了如何建立一個函數了,那麼動手實踐實踐,我們利用FMZ的回測系統,很方便的可以學習JavaScript語言。
使用回測系統測試、學習
我們登陸FMZ平臺之後,點選控制中心
,然後點選策略庫
,然後點選新建策略
按鈕。然後設定語言為JavaScript語言,如圖:
建立策略時,預設給出的程式碼是:
function main() {
return exchange.GetName();
}
這個預設的程式碼是一個main
函式,這個main
函式只執行一句程式碼:return exchange.GetName();
先不做深究。(這裡順便回顧一下,還記得我們開始講的麼?商品期貨必須要先判斷連線上前置機伺服器)我們清空程式碼編輯區。
我們就可以練習建立一個函數了,我們在程式碼編輯區鍵入:
function main() {
}
這樣我們就在策略中建立了一個函式,名為main
,我們可以執行一下。
點選模擬回測
切換到回測頁面,使用回測系統測試。
- 1、設定回測的交易所物件為
商品期貨
。 - 2、新增這個設定好的交易所物件。
- 3、顯示新增上了。
- 4、點選回測按鈕測試策略程式碼。
發現沒任何動靜!! 因為我們函式體裡什麼都沒寫嘛!如果我們在main
函式的函式體中寫上一句輸出語句Log("你好 FMZ!")
,例如:
function main() {
Log("你好 FMZ!")
}
那麼再次點選模擬回測
按鈕執行一下,就可以看到有日誌輸出了。
至於Log
這個是什麼?這個語句就是列印日誌資訊用的,詳細用法後續再講,暫且瞭解即可。
主函式main
我們經過實踐,建立了一個策略。在策略中建立了一個函式名為main
。可能有的同學會問如果我建立的函式名字不叫main
呢?回測測試時策略還會執行起來麼?
答案肯定是:不行。FMZ上策略是必須從main
函式作為入口執行的,如果你的策略中沒有建立main
函式將會報錯,有興趣的可以動手試下,比如上例子中main
改為main1
,雖然名字只加上了一個字元1
。所以我們又學到了,策略必須有main
函式。
函式體中的while
語句
while
又是一個要學習的程式語言關鍵字,這個關鍵字的意思是執行一個迴圈。while
關鍵字後面跟著是一個小括號()
,這個小括號裡面的表示式是while
迴圈是否能執行的條件。這裡可以看到這個小括號()
中寫著一個true
,true
是一個布林值並且為真值,意思就是“這個迴圈是否能執行的條件”是一直為真,這個迴圈在沒有其它跳出迴圈的語句影響下,會一直執行(如果該迴圈體中,沒有其它跳出迴圈的語句,那麼這個迴圈就叫死迴圈,因為會一直不停的執行迴圈體)。在while
語句的()
迴圈條件之後緊跟著就是迴圈體了,迴圈體程式碼是由{}
花括號包裹住的。
關於“表示式”這個名詞,簡單說就是一個由變數、運算子等組合起來的式子,這個式子是有值的。可以是各種條件、計算的組合,在用作迴圈的條件時,這個表示式的值的真假決定了迴圈的是否執行,在以後的量化交易策略程式設計學習中,還會遇到,這裡暫且瞭解即可。{}
花括號之內的一行一行的程式碼,就是每次迴圈時要逐行執行的程式碼了。
if (條件表示式) {觸發時執行的程式碼} else {觸發時執行的程式碼}
語句
學習完了while
迴圈,我們看迴圈體中另一個關鍵字if...else
。if
語句可以單獨使用,也可以和if else
或者else
一起配合使用。
我們先看if
的用法,if語句的意思就如同這個單詞的字面意思“如果”。if之後跟著一個小括號()
我們都已經很熟悉了,這裡小括號裡面也是需要寫入一個表示式,作為條件判斷,這裡可能你聽得一臉懵!沒關係,我們動手來實踐下。運用我們上面學習到的知識,我們很容易寫出一個main
函式,用來在回測系統中測試學習這個if語句。
function main() {
if (1) {
Log("1為真值,所以條件觸發")
}
if (0) {
Log("0為假值,能觸發就見鬼了 >_< ")
}
}
可以看到1
這個數值也可以作為一個表示式,它的值為真。所以上圖中觸發了if
條件語句的執行程式碼Log("1為真值,所以條件觸發")
。可以看到這句程式碼也是被{}
包裹,在Javascript語言中{}
包裹的程式碼為程式碼塊,裡面可以是一行程式碼,也可以是N行程式碼。
測試中,第一個if判斷,由於條件為真(1這個值恆為真),所以執行了這個if語句攜帶的程式碼塊中的程式碼。第二個if判斷,由於條件為假(0這個值恆為假),所以沒有執行這個if語句攜帶的程式碼塊中的程式碼,{}
中的Log("0為假值,能觸發就見鬼了 >_< ")
這句程式碼。
說完了if
語句,那else
語句呢?做什麼用的?else
是要和if
配合一起用的,作用簡單說就是在組合使用中,if的條件如果沒觸發就執行else後面的程式碼塊。來看這個例子:
function main() {
if (0) {
Log("0為假值,能觸發就見鬼了 >_< ")
} else {
Log("當你看到這句話輸出時,程式碼裡上面那個if條件一定是假的!不信去看看程式碼 ( ̄ ii  ̄;) 吸溜 ( ̄ \"  ̄;) ")
}
}
先講到這裡,下篇繼續。