零基礎入門商品期貨程序化交易(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循環是否能執行的條件。這裏可以看到這個小括號()中寫着一個truetrue是一個布爾值並且爲真值,意思就是“這個循環是否能執行的條件”是一直爲真,這個循環在沒有其它跳出循環的語句影響下,會一直執行(如果該循環體中,沒有其它跳出循環的語句,那麼這個循環就叫死循環,因爲會一直不停的執行循環體)。在while語句的()循環條件之後緊跟着就是循環體了,循環體代碼是由{}花括號包裹住的。

關於“表達式”這個名詞,簡單說就是一個由變量、運算符等組合起來的式子,這個式子是有值的。可以是各種條件、計算的組合,在用作循環的條件時,這個表達式的值的真假決定了循環的是否執行,在以後的量化交易策略編程學習中,還會遇到,這裏暫且瞭解即可。{}花括號之內的一行一行的代碼,就是每次循環時要逐行執行的代碼了。

if (條件表達式) {觸發時執行的代碼} else {觸發時執行的代碼}語句

學習完了while循環,我們看循環體中另一個關鍵字if...elseif語句可以單獨使用,也可以和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  ̄;) 吸溜 ( ̄ \"  ̄;) ")
    }
}

先講到這裏,下篇繼續。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章