HSQL程式教學(六)陣列相關函數

HSOL將「陣列」觀念運用於策略程式上,此一創舉可以使得程式的編寫不再被侷限於「點」上,進而擴展至「面」;簡單來說,
以往編寫程通常只能依照最近幾根K線的狀況來做判斷,但是引進陣列觀念之後,你將可以直接針對最近250根K線的資料進行分析
比對,如此大大的增加程式編寫的張力,以往部份很難篩選之條件,如今即可迎刃而解。

※何謂陣列?

簡單來說,陣列就是一連串的儲存空間,可用於存放數字。
在HSQL程式中,每一個陣列皆設定為250個儲存空間,使用者可將諸如:成交量、收盤價、KD值、RSI值...等資料放入陣列中,則
最後一根K線的資料就是放在第250個儲存位置,而第249個儲存位置則是倒數第二根K線的資料,如此依此類推。

在HSQL程式中預設了10個陣列代號供使用者自由運用,分別為A1{}、A2{}、A3{}...A10{},輸入方式可直接按A鍵,即會出現選單
供選擇。



※陣列函數介紹

紅色框起之部份即為此次新增之函數。

其中淺黃色之函數輸出值為一數值,而暗黃色之函數輸出值為陣列

例:
10 載入陣列[ 10分_成交量 , 成交量 -> 陣列1 ] 
20 A2{} = 陣列排序( 陣列1 , 1 ~ 250 , 遞減 ) 
30 Va = 陣列2值( 1 ) 

行號10 將最近250根10分鐘線之成交量放入A1陣列中
行號20 針對陣列A1進行遞減排序,並將結果放入陣列A2當中。
行號30 將陣列A2的第1個儲存值放入變數Va中。

本例題最終Va即為250根10分鐘線之最大成交量。

以下逐一介紹相關之函數:
(注意,為舉例方便,以下範例有部份運用股票相關之函數,如:融資券、當沖等,期貨使用者不需在意)

1.載入陣列

本函數用於將資料放入陣列中。

語法:

載入陣列[ 5分_成交量 , 成交量 -> 陣列1 ]

本函數可指定資料種類及K線種類(5、10、15、20、30、60、90、120、180分鐘線),並且指定輸出至陣列A1{}~A10{}中。



2 .陣列值

本函數可輸出陣列中某一位置的數值。

語法:

陣列1值 ( 250 )



3 .陣列排序

本函數可針對某一陣列進行遞增或遞減排序。

語法:

陣列排序( 陣列1 , 1 ~ 250 , 遞減 , 相對位置 -> 陣列2 )

若勾選「輸出相對位置至」,可將原本之陣列位置一起排序,並且輸出至指定陣列中。

例:
10 載入陣列[ 5分_最高價 , 最高價 -> 陣列1 ] 
20 A2{} = 陣列排序( 陣列1 , 1 ~ 250 , 遞減 , 相對位置 -> 陣列3 ) 
30 Va = 陣列2值( 1 ) 
40 Vb = 陣列3值( 1 ) 
50 Vc = 前Vb_5分_成交量 

本例題最終Va即為250根5分鐘線之最高價,而Vc為當時之成交量。



4 .陣列運算

本函數可針對某一陣列進行加減乘除運算。

語法:

陣列運算( 陣列1 , 1 ~ 250 , + , 1 )
陣列運算( 陣列1 , 1 ~ 250 , + , 陣列2 )

亦可進行兩陣列之運算處理。


10 載入陣列[ 日_均價( 10 ) , 均價 -> 陣列1 ] 
20 載入陣列[ 日_均價( 20 ) , 均價 -> 陣列2 ] 
30 A3{} = 陣列運算( 陣列1 , 1 ~ 250 , - , 陣列2 ) 

本例題是將「10日均價」陣列1減「20日均價」陣列2,結果輸出至陣列3。



5 .陣列區間加總

本函數可將陣列之某一區間進行加總。

語法:

陣列區間加總( 陣列1 , 1 ~ 250 )


10 載入陣列[ 日_成交量 , 成交量 -> 陣列1 ] 
20 A2{} = 陣列排序( 陣列1 , 201 ~ 250 , 遞減 ) 
30 Va = 陣列區間加總( 陣列2 , 1 ~ 5 ) 
40 Vb = Va / 5 

本例題是將最近50個交易日中「前5大成交量之平均」,結果輸出至Vb。



6 .陣列平移

本函數可將陣列向左或向右移動若干位置。

語法:

陣列平移( 陣列1 , 向右位移 1 , 空位補 0 )


10 載入陣列[ 日_融資餘額 , 融資餘額 -> 陣列1 ] 
20 載入陣列[ 日_融資餘額 , 融資餘額 -> 陣列2 ] 
30 A3{} = 陣列平移( 陣列2 , 向右位移 1 , 空位補 0 ) 
40 A4{} = 陣列運算( 陣列1 , 1 ~ 250 , - , 陣列3 ) 

本例題是用於計算每日融資差異量,結果輸出至A4。



7 .陣列位階

本函數可將陣列值轉換成為0~100之位階值。
位階之定義:將區間內之最大值定義為100,最小值定義為0,而其他數值則依比例計算
公式:       數值-最小值
    位階 = -------  X 100
         最大值-最小值

語法:

陣列位階( 陣列1 , 1 ~ 250 )


10 載入陣列[ 日_收盤價 , 收盤價 -> 陣列1 ] 
20 A2{} = 陣列位階( 陣列1 , 201 ~ 250 ) 
30 If 陣列2值( 250 ) >= 90 Then 
40 Print( 50天相對高檔 , 股票代號 ) 
50 End If  

本例題是用於計算目前股價相對於近50天,是否處於高檔(百分之九十以上)。



8 .陣列填值

本函數可將數值填入陣列之任一區段。

語法:

陣列填值( 陣列1 , 1 ~ 250 , 填入 0 )



9 .陣列交叉

本函數可偵測兩陣列是否發生交叉。

語法:

陣列交叉( 陣列1 , 陣列2 , 黃金=1 , 死亡=-1 , A>B=2 , A<B=-2 )


10 載入陣列[ 日_KD( 9 ) , K值 -> 陣列1 , D值 -> 陣列2 ] 
20 A3{} = 陣列交叉( 陣列1 , 陣列2 , 黃金=1 , 死亡=-1 , A>B=2 , A<B=-2 ) 
30 If 陣列3值( 250 ) = 1 Then 
40 Print( 發生黃金交叉 , 股票代號 ) 
50 End If 

本例題是用於偵測目前是否發生KD(9)黃金交叉。



10 .陣列背離

本函數可偵測兩陣列是否發生背離。

語法:

陣列背離( 陣列1 , 陣列2 , 限制間距=3 ~ 22 , 高檔=-1 , 低檔=1 , 未背離=0 )

限制間距用於指定偵測背離之區間,以上圖為例,代表只偵測背離發生在前3天至前22天內之背離。


10 載入陣列[ 日_最高價 , 最高價 -> 陣列1 ] 
20 載入陣列[ 日_MACD( 10 , 10 , 20 ) , DIF -> 陣列2 , Macd -> 不輸出 ] 
30 A3{} = 陣列背離( 陣列1 , 陣列2 , 限制間距=3 ~ 22 , 高檔=-1 , 低檔=1 , 未背離=0 ) 
40 If 陣列3值( 250 ) = -1 Then 
50 Print( 高檔背離 , 股票代號 ) 
60 End If 

本例題是用於偵測目前是否發生Macd(10,10,20)高檔背離。



11 .陣列高低點

本函數可用於偵測陣列波浪之高低點。

語法:

陣列高低點( 陣列1 , 1 ~ 250 , 級數=4 , 相對位置 -> 陣列2 )

高低點級數4,代表高點之決定方式是以該點之前後4個數值是否皆低於該點,則該點視為高點;
而低點之決定方式是以該點之前後4個數值是否皆高於該點,則該點視為低點。

而偵測結果資料輸出格式如下:

陣列位置1:前1波低點數值
陣列位置2:前2波低點數值
陣列位置3:前3波低點數值
........

陣列位置101:前1波高點數值
陣列位置102:前2波高點數值
陣列位置103:前3波高點數值
........


10 載入陣列[ 日_最低價 , 最低價 -> 陣列1 ] 
20 A2{} = 陣列高低點( 陣列1 , 1 ~ 250 , 級數=4 , 相對位置 -> 陣列3 ) 
30 If 陣列2值( 1 ) > 陣列2值( 2 ) Then 
40 Print( 一底比一底高 , 股票代號 ) 
50 End If 

本例題是用於偵測前1波低點是否高於前2波低點。



12.支撐壓力線

本函數可偵測K線之支撐壓力線價位。

語法:

支撐壓力線( 日線 , 短中長 )

而偵測結果資料輸出格式如下:

陣列位置1:最接近之支撐價位
陣列位置2:次接近之支撐價位
陣列位置3:第3接近之支撐價位
........

陣列位置101:最接近之壓力價位
陣列位置102:次接近之壓力價位
陣列位置103:第3接近之壓力價位
........


10 A1{} = 支撐壓力線( 日線 , 中長 ) 
20 If 陣列1值( 101 ) - 收盤價 < 1 Then 
30 Print( 距離上方壓力線少於1元 , 股票代號 ) 
40 End If
 

本例題是用於偵測目前股價距離上方中長期壓力線少於1元之股票。



13..盤整區塊

本函數可記錄K線產生之盤整區塊。

語法:

盤整區塊( 距離 <= 40 , 寬度 >= 12 )

上圖代表記錄最近40根K線所產生「寬度大於12根K線」之盤整區塊。

而偵測結果資料輸出格式如下:

陣列位置1:最接近之盤整區塊距離
陣列位置2:最接近之盤整區塊寬度
陣列位置3:最接近之盤整區塊上價位
陣列位置4:最接近之盤整區塊下價位
陣列位置5:次接近之盤整區塊距離
陣列位置6:次接近之盤整區塊寬度
陣列位置7:次接近之盤整區塊上價位
陣列位置8:次接近之盤整區塊下價位
陣列位置9:第3接近之盤整區塊距離
陣列位置10:第3接近之盤整區塊寬度
陣列位置11:第3接近之盤整區塊上價位
陣列位置12:第3接近之盤整區塊下價位
........


10 A1{} = 盤整區塊( 距離 <= 50 , 寬度 >= 20 ) 
20 If 陣列1值( 1 ) <= 3 And 陣列1值( 2 ) >= 20 Then 
30 Show 
40 End If 

本例題是用於找出距離3根K線以內,並產生寬度大於20根K線之個股。


13 .陣列均值

本函數用於計算陣列之均值,類似MA(移動平均線)的算法。

語法:

陣列均值( 陣列1 , 1 ~ 250 , 參數 10 )


10 載入陣列[ 5分_MACD( 10 , 10 , 20 ) , DIF -> 陣列1 , Macd -> 不輸出 ] 
20 A2{} = 陣列均值( 陣列1 , 1 ~ 250 , 參數 10 ) 
30 Va = 陣列2值( 250 ) 
40 Vb = 陣列2值( 249 ) 

本例題變數Va為目前K線起算,往前10根K線之DIF值之均值;變數Va為前一根K線起算,往前10根K線之DIF值之均值。


14..陣列單格填值

本函數可針對陣列之某一個儲存位置填入數值。

語法:

陣列單格填值( 陣列1 , #250 , 填入 1)


10 載入陣列[ 5分_成交量 , 成交量 -> 陣列1 ] 
20 陣列單格填值( 陣列1 , #250 , 填入 0 ) 
30 陣列單格填值( 陣列1 , #249 , 填入 0 ) 
40 陣列單格填值( 陣列1 , #248 , 填入 0 ) 
50 A2{} = 陣列排序( 陣列1 , 241 ~ 250 , 遞增 ) 
60 Va = 陣列2值( 250 ) 

本例題是用於找出最近10根5分鐘線並且排除最後3根K線之最大成交量,並且存於變數Va中。