XQ量化交易平台上的型態學相關函數

By | 2020-03-31

型態分析應該算是股市投資者最耳熟能詳的分析方式,M頭,W底,趨勢線等名稱,大家總能朗朗上口,如何把這些大家都很熟悉的概念,用程式語法表現出來,是本章學習的重點。

所有的型態概念,通常有三個基本元素

  1. 上昇切線
  2. 下降切線
  3. 上昇或下降的角度

透過這三個元素,可以組成各種線段,而型態就是由這些線段所組成。

例如把過去一段時間的走勢分成三個線段,就可以組成如下圖所列出來的不同行情走勢

在語法上,要描敘這些線段,使用的是一個叫作Angle的函數,透過這個函數,只要輸入計算的起始日期及結束日期,就可以算出這段區間的線段上漲或下跌的角度。

它的語法如下:

計算任意二個日期的走勢角度。

回傳數值=Angle(日期1,日期2)

傳入二個參數:
– 第一個參數是日期1。
– 第二個參數是日期2,需大於日期1。

例如要計算最近四期的走勢角度,就可以像下面這麼寫

以下是Angle這個函數的腳本

從腳本中我們可以發現,angle這個值的計算有兩個步驟

第一是先算出斜率_slope

斜率的算法是以最近一期收盤價除以計算起始期的開盤價減一當分子(也就是漲跌幅),以兩個日期的差當分母,然後乘以100。

第二是把斜率用arcTangent函數,把數值轉成角度。

由於arcTangent是利用已知直角三角形的對邊和鄰邊這兩條直角邊的比值求出其夾角大小的函數,用來算對邊與鄰邊值的角度,所以算出來的角度就是這兩個區間的線段的上漲或下跌角度值。

當回傳數值大於0時,代表趨勢向上;當回傳數值小於0時,代表趨勢向下。

回傳值的數值絕對值愈大,代表這個線段的斜率愈陡。

所以運用這樣的概念,可以用語法描述各種型態的轉折,例如要用語法描敘V型反轉,就可以這麼寫

上面這個腳本裡有用到一個函數叫lowestbar,這個函數是用來計算一個區間內的最低點落在第幾根Bar,在描述那些更複雜的型態時,往往需要標示出整個區間的

  1. 最高點
  2. 最高點所在的位置
  3. 最低點
  4. 最低點所在的位置
  5. 第N個高低點
  6. 第N個高低所在的位置
  7. 波段第N個高低點
  8. 波段第N個高低點所在的位置

為了標示出這些位置及價位,系統內建了以下的幾個函數,透過這些函數的應用,可以讓電腦回傳上述八種位置及價位,以利於後續的運算。例如下面這張圖

就需要標出上述的六個點,為了協助使用者能夠在腳本中描繪各種型態,系統支援了描述上述八種位置及數值的相關函數,這些函數分類如下:

函數的寫法,以nthhighest為例:

計算序列資料的第N個極大值
回傳數值=NthHighest(第幾個極大值,數列,期數)
傳入三個參數:
– 第一個參數是要計算極大值的序號。
– 第二個參數是數列,通常是開高低收的價格數列。
– 第三個參數是期數。

以最新一筆資料為基準點,輸入要計算的期數,然後計算過去期數的第N個極大值。

例如,要計算近五期的次高價,就可以這麼寫:

Value1=nthhighest(2,high,5);

這一系列的函數可以協助找出區間的各個高點及低點,以及它們在K棒上的相對位置,可以協助描繪使用者想要尋找的型態。

舉個例子,上面列出來的多頭繼績型態,有個上昇旗型

這個型態的特色是在整理期間還是一峰高過一峰,最後以更陡的漲勢來突破整理,要描述這樣的型態,可以運用上面所提到的nthhighest 及nthhighestbar這兩個函數,參考的腳本如下:

input:period(20,"計算區間");

value2=nthhighest(1,high[1],period);//最高價

value3=nthhighest(2,high[1],period);//第二高價

value4=nthhighest(3,high[1],period);//第三高價

value5=nthhighestbar(1,high[1],period);//最高價距今幾根bar

value6=nthhighestbar(2,high[1],period);//第二高價距今幾根bar

value7=nthhighestbar(3,high[1],period);//第三高價距今幾根bar

if value6-value5>3 and value7-value6>3

  //三個高點沒有連在一起,且是愈來愈高

and maxlist(value2,value3,value4)

<minlist(value2,value3,value4)*1.05

  //三個高點相差不到5%

and close crosses over value2

  //創新高

then ret=1;

這個腳本就可以選出像下面這張圖裡,符合腳本描述型態的股票。

其次,系統也支援幾個可以找出轉折的高點及相對位置,可以使用的函數有以下幾個:

舉Swinghigh為例,其語法如下:

回傳數值=SwingHigh(數列,期數,左肩期數,右肩期數,第幾個高點)

計算數列最近N個的轉折高點數值

傳入五個參數:
– 第一個參數是數列,通常是開高低收的價格數列。
– 第二個參數是要尋找轉折點的樣本期數。
– 第三個參數是高點左側要有幾筆較低的數值。
– 第四個參數是高點右側要有幾筆較低的數值。
– 第五個參數是第幾個高點,依圖表由右往左(時間新到舊),1為最近一次的高點、2為第二近的高點。

若某一筆資料的左右二側數值在指定的期數內都比該筆資料低的話,則定義為轉折高點。

當無法找到對應的轉折高點時,回傳值為-1。

例如想要找出過去20天,第二個左右兩邊都各至少有三天的高點價位,就可以寫成:

value1=swinghigh(high,20,3,3,2);

透過以上這些型態的函數,可以具體的描繪各種型態,找出符合特定型態的股票。

以下是一個多次到頂而破的例子,用到的是 highest及highestbar這兩個函數

 input:HitTimes(4,"設定觸頂次數");
input:RangeRatio(1,"設定頭部區範圍寬度%");
input:Length(40,"計算期數");

if GetSymbolField("tse.tw","收盤價")
>average(GetSymbolField("tse.tw","收盤價"),10)
then begin
variable: theHigh(0); 

//找到過去其間的最高點
theHigh = Highest(High[1],Length); 
value1=highestbar(high[1],length);

variable: HighLowerBound(0); 

// 設為瓶頸區間上界
HighLowerBound = theHigh *(100-RangeRatio)/100; 

variable: TouchRangeTimes(0); 

//回算在此區間中 進去瓶頸區的次數 
TouchRangeTimes = CountIF(High[1] > HighLowerBound, Length-value1);

Condition1 = TouchRangeTimes >= HitTimes;
Condition2 = close > theHigh;
condition3=close[length]*1.1<thehigh;


Ret = Condition1 and Condition2 and condition3 ;
end;

透過這些型態函數,可以試著描繪出各種不同的型態,程式交易語法的好處就在於,當您把您相信的型態,透過語法完整而清楚的描述之後,就不用每天辛苦地從1500多檔股票的線圖中尋找想要尋找的型態,電腦可以很快的在幾秒到幾分鐘之內挑出這些股票。