發(fā)明者量化PINE語言入門教程-時間序列與腳本結構
時間序列
時間序列這個概念在Pine語言中非常重要,是我們學習Pine語言時必須要弄明白的一個概念。時間序列不是一種類型而是用于隨時間存儲變量的連續(xù)值的基本結構,我們知道Pine腳本是基于圖表的,圖表中展示的最基本的內容就是K線圖。時間序列其中每個值都與一個K線Bar的時間戳關聯。open
是一個Pine語言的內置變量(built-in),其結構為儲存每根K線Bar開盤價的時間序列??梢岳斫鉃?code>open這個時間序列結構代表了當前K線圖從開始的第一根Bar到當前腳本執(zhí)行的這根Bar時所有K線Bar的開盤價。如果當前K線圖是5分鐘周期,那么我們在Pine策略代碼中引用(或者使用)open
時就是在使用策略代碼當前執(zhí)行時的K線Bar的開盤價。如果要引用時間序列中的歷史值需要使用[]
操作符。當Pine策略在某根K線Bar上執(zhí)行時,使用open[1]
表示引用open
時間序列上當前腳本執(zhí)行的這根K線Bar的前一根K線Bar的開盤價(即上一個K線周期的開盤價)。
時間序列上的變量非常方便用于計算
我們以內置函數ta.cum
舉例子:
測試代碼:
有很多類似ta.cum
這樣的內置函數可以直接處理時間序列上的數據,例如ta.cum
就是把傳入的變量在每個K線Bar上對應的值累加起來,接下來我們使用一個圖表來方便理解。

可以看到,其實v1、v2甚至bar_index都是時間序列結構,在每根Bar上都有對應的數據。這個測試代碼不論用「實時價模型」還是「收盤價模型」區(qū)別僅僅為圖表上是否顯示實時Bar。為了回測速度我們使用「收盤價模型」回測測試。

因為v1這個變量在每一根Bar上都是1,ta.cum(v1)
函數在第一根K線Bar上執(zhí)行時由于只有第一根Bar,所以計算結果為1,賦值給變量v2。
當ta.cum(v1)
在第二根K線Bar上執(zhí)行時,已經有2根K線Bar了(第一根對應的內置變量bar_index是0,第二根對應的內置變量bar_index是1),所以計算結果為2,賦值給變量v2,以此類推。實際上可以觀察到v2就是圖表中K線Bar的數量,由于K線的索引bar_index
是從0開始遞增,那么bar_index + 1
實際上也就是K線Bar的數量。觀察圖表也可以看到線v2
和bar_index
確實是重合的。

同樣我也可以用ta.cum
內置函數計算當前圖表上所有Bar的收盤價之和,那么只用這樣寫就可以了:ta.cum(close)
,當策略運行到最右側的實時Bar時ta.cum(close)
計算出的結果就是圖表上所有Bar的收盤價之和了(沒有運行到最右側時,只是累加到了當前Bar而已)。
時間序列上的變量也可以使用運算符進行運算,例如代碼:ta.sma(high - low, 14)
,把內置變量high
(K線Bar最高價)減去low
(K線Bar最低價),最后使用ta.sma
函數求平均值。
函數調用結果也會在時間序列中留下值的痕跡
該測試代碼在回測時測試運行,可以觀察到v1
和v2
的值是相同的,圖表上畫出的線也是完全重合的。函數調用計算出的結果在時間序列中會留下值的痕跡,例如代碼ta.highest(high, 10)[1]
其中的ta.highest(high, 10)
函數調用計算出的結果也是可以用[1]來引用其歷史值的?;诋斍癇ar的上一根Bar對應的ta.highest(high, 10)
計算結果就是ta.highest(high[1], 10)
。所以ta.highest(high[1], 10)
和ta.highest(high, 10)[1]
完全等價。
使用另一種畫圖函數輸出信息驗證:
可以看到時間序列中變量a和變量b的值顯示在對應的Bar的上方和下方。在學習過程中可以保留這個畫圖代碼,因為在測試、試驗時可能經常需要在圖表上輸出信息用于觀察。

腳本結構
一般結構
在教程開始部分我們總結過一些FMZ上的Pine和Trading View上的Pine語言使用方面的不同點,FMZ上的Pine代碼編寫時可以省略版本號、indicator()
、strategy()
、并且暫時不支持library()
。當然為了兼容較早版本的Pine腳本,策略編寫時寫上諸如://@version=5
,indicator()
,strategy()
也是可以的。一些策略設置也可以在strategy()
函數中傳參設置。
<version>
版本控制信息可省略。
注釋
Pine語言使用//
作為單行注釋符,由于Pine語言沒有多行注釋符。FMZ擴展了注釋符/**/
用于多行注釋。
代碼
腳本中不是注釋或編譯器指令的行是語句,它實現了腳本的算法。一個語句可以是這些內容之一。
變量聲明
變量的重新賦值
函數聲明
內置函數調用,用戶定義的函數調用
if
,for
,while
或switch
等結構
語句可以以多種方式排列
有些語句可以用一行來表達,比如大多數變量聲明、只包含一個函數調用的行或單行函數聲明。其他的,像結構,總是需要多行,因為它們需要一個局部的塊。
腳本的全局范圍內的語句(即不屬于局部塊的部分)不能以
空格
或制表符
(tab鍵)開始。它們的第一個字符也必須是該行的第一個字符。在行的第一個位置開始的行,根據定義成為腳本的全局范圍的一部分。結構或多行函數聲明總是需要一個
local block
。一個本地塊必須縮進一個制表符或四個空格(否則,會被解析為上一行的串聯代碼,即被判定為上一行代碼的連續(xù)內容),每個局部塊定義了一個不同的局部范圍。多個單行語句可以通過使用逗號(,)作為分隔符在一行中串聯起來。
一行中可以包含注釋,也可以只是注釋。
行也可以被包起來(在多行上繼續(xù))。
例如,包括三個局部塊,一個在自定義函數聲明中,兩個在變量聲明中使用if結構,如下代碼:
換行代碼
長行可以被分割在多行上,或被 "包裹 "起來。被包裹的行必須縮進任何數量的空格,只要它不是4的倍數(這些邊界用于縮進局部塊)。
可以被包裝成(注意每行縮進的空格數量都不是4的倍數):
一個長的plot()調用可以被包裝成。
用戶定義的函數聲明中的語句也可以被包裝。但是,由于局部塊在語法上必須以縮進開始(4個空格或1個制表符),當把它分割到下一行時,語句的延續(xù)部分必須以一個以上的縮進開始(不等于4個空格的倍數)。比如說:
本章內容不難,基本都是Pine語言的概念,規(guī)則介紹。您學會了嗎?