Author Archives: 發財橘子

成就億萬身家的操作之鑰:開盤價

最近十年有一批新的股市大戶在興起 ,這些人所仰仗的方法 ,現在市場上也幾近眾所皆知了 :追鎖漲停 ,隔天開高賣出 !! 就這麼一招, 拱出了這群人的百億身價 !

追買漲停已經就是當日最高價了 ,那獲利的關鍵點在哪 ? 就是隔天的開盤價 !!這才是真實的獲利來源 !!

簡而言之 :掌握開盤價 ,是可換得億萬身家。

我們透過 XS大量測試並抽絲撥繭 ,發現了一件和隔日開盤價息息相關的因素 :當日收盤價和最高價。

如下圖 : 當日收盤價和當日最高價是同一個價位的時候 ,隔日開盤價呈現了一個明顯的偏離 :開高所佔比幾乎是開低的三倍之多 ,分別是 37% 與13% 。但開平盤仍佔了半數 ! 這樣還是不具備交易誘因的 ! 需要利用XS 進一步分析來取得獲利 !

篩選過許多可能條件 ,XS 系統顯示, 當天長紅棒的漲升幅度 ,大大影響了隔日開高盤的幅度 !!
定義長紅棒幅度 : 收盤價除以開盤價的漲幅百分比。
我們把這個幅度分成五份 ,分別為 : A1: 紅棒長1-2% 、 A2:紅棒長 2-3% 、A3: 紅棒長3-4% 、 A4:紅棒長 4-5% 、A5: 紅棒長>5% 。

由 “今日長紅棒幅度分析圖 ” 中, 我們明顯可以和得出來 ,當長紅棒的幅度越大 ,即從 A1到 A5, 開平盤次數大幅下降 ,開高次數持續上升。到了 A5時 ,開高 1%以上的筆數更是大幅激增 ! 而開低的筆數幾乎是全部躺平不見其影 !
我們得知了一件事 :長紅棒幅度大於 5%且收在最高價者 ,是開高真強者 !!

接下來 ,把 A1到 A5的事件依獲利機會作區分並統計 ,開高者有獲利機會 ,而開平低盤者則無。
如圖顯示 ,當紅棒長度越長 ,可獲利機會由三成快速激升至七成 !!

這時只要善用 XS即時計算跳出交易時機 ,下一個大戶 ,很快又會誕生 !!

o3

o2

o1

開盤價在策略中的應用

程式交易始祖:賴利威廉斯,相當倚重開盤價在策略中的應用,我們今天利用大師的方法來驗證一下台股的開盤現象!

根據大師的說法,開盤價分成四個區域,分別是:
1.開高過昨高,今天開盤的價格,超過昨日的最高價,是最強勢的開盤!
2.開漲不過昨高,今天開盤價大於昨天的收盤價,但是不大於昨天最高價!
3.該跌不過昨低,今天開盤價小於等於昨天收盤價,且大於等於昨天最低價,屬於偏弱格局
4.開低跌過昨低,今天的開盤價小於昨天的最低價,是相當弱勢的開盤!

我們先統計看看,最近一年來,全部上市櫃普通股的開盤價,在各區的分佈比例,如下圖:
open

open1
明顯可見的是,雖然過去一年來台股呈現了多頭走勢,但開低比例卻是偏高的54%(第3,4區總和)!!這部分我們之後再做進一步討論!

我們利用XS把這四個區域的資料統計起來,用收紅能力來評估開盤價這四個區域和收盤價的關係。

定義收紅能力:將收盤價除以開盤價後減去1,取百分比。若此值大於0,則會呈現實體紅K棒,若此值小於0,則會呈現實體黑K棒。

將這四個區域裡的所有資料都用收紅能力計算過一輪,標準化後放在一起比較看看,是不是有什麼不一樣的地方?

如圖可以看到四條標準分佈線。對於第2,第3區而言,多數的收盤價看起來都落在開盤價附近,並沒有特別大的變動差,但比起第3區,第2區有些偏左邊傾了!

接下來才是我們的重點:開在第1區和第4區的比較。

這兩個區域很有趣,開高的那邊,明顯往左邊黑K區域偏離,而開低那邊,也是明顯往右邊紅K棒偏離,而且紅棒平均拉昇幅度,比黑K棒跌幅還高出4成多!! 這樣來看,開偏低買進搶短的贏面,是比開高放空還來得高上一些!

我們透過這樣的資料分析,明確定義出開高收黑K與開低收紅K的操作方式,是等同把每一種具有相當把握的型態,轉換成XQ自動判讀並跳出的訊號,從而大大提升進出場效率!!

交易活躍度指標

我們在操作的時候,最常出現的問題是:當個股轉強時,我們分不清楚這是波段還是小反彈,分不清楚是大行情還是只有小漣漪。

我師父當年為了解決這個問題,叫我用excel跑一些數據,他說,反常必有妖,要看一檔股票股價有沒有大行情,不光看他有沒有持續上漲,還要看他有沒有出現結構性的轉變,這種結構性的轉變,可以從五個地方來看,
1.總成交筆數
2.相對大盤強度
3.外盤均量
4.主動買力
5.開盤委買張數

師父認為,要分辨一檔股票是準備發動攻勢,還是僅僅只是隨著大盤稍為表現一下,主要就是看這幾個方面有沒有出現大變化

師父的這個理論,在有了XS之後,我一直想要把它寫成程式,這次XS改版,同事們幫我把這幾個欄位都變成可以用Getfield語法拿來計算的數字,所以我就寫了一個"交易活躍度指標"

這個指標的邏輯是這樣,上述五項如果超過季平均三成,就算一分,所以總分是五分,腳本如下,附圖是我用這指標來看一些個股時的對應圖,我覺得還不錯用,可以幫我濾一些假訊號

input:days(66);
input:ratio(10);
setinputname(1,"移動平均天數");
setinputname(2,"超出均值比率");
var:count(0);
value1=GetField("當日總成交筆數");
value2=average(value1,days);
value3=GetField("強弱指標");
value4=average(value3,days);
value5=GetField("外盤均量");
value6=average(value5,days);
value7=GetField("主動買力");
value8=average(value7,days);
value9=GetField("開盤委買");
value10=average(value9,days);
count=0;
if value1>=value2*(1+ratio/100)
then count=count+1;
if value3>=value4*(1+ratio/100)
then count=count+1;
if value5>=value6*(1+ratio/100)
then count=count+1;
if value7>=value8*(1+ratio/100)
then count=count+1;
if value9=value10*(1+ratio/100)
then count=count+1;

plot1(count,"交易活躍度指標");


各位可以利用這些欄位來做出更有價值的訊號
各位可以利用這些欄位寫出更有價值的指標或選股雷達

當沖策略之反常必有妖

在系統內建警示腳本裡,當沖交易型這個目錄中,有一個”突破波動範圍”的腳本,今天來介紹這個簡單的腳本,它的程式碼如下:

input:Length(20); setinputname(1,"高低計算期數");
variable:HighLow(0);
HighLow=high-low;
if HighLow>highest(HighLow[1],Length) then ret=1;

意思是如果最近一根bar盤中最高減最低,超過過去二十根bar的最大值,就請電腦通知你。

這個腳本很簡單,我個人是用在日線,搭配著成交量來用,我的邏輯是,每檔股票都有其股性,冷灶要熱燒前,一定會先加溫,而那種在加溫的股票,量會增加,高點減低點的差值也會變大,這就是我常說的反常必有妖。
各位可以參考附圖

時間格式介紹

日期時間的運算,一向是程式語言裡面的比較麻煩的一塊。

一來是格式怎麼表示,許多習慣是不同的,二來是加減的運算跟數字不太一樣。因為不是十進位的算法。

我們先來看看XQ的日期時間格式是怎樣:

目前XQ的用法是 2012/12/22,很明顯的年月日各用”/”符號分開

但這在程式運算必須使用字串,使用者可能不熟悉字串的運作。所以我們直接使用最簡單易懂的格式

就是yyyyMMdd八個數字的格式如: 20121222。

這樣一來至少我們在西元9999年12月31日前都可以固定日期肯定8位數的整數格式。

至於時間 我們也希望用類似的格式數處理所以我們用HHmmss

六碼的24小時制時間格式 134500 代表下午一點45分整。

從今天開盤起算的語法

我們在寫腳本時 常常會有開盤怎麼樣  或是開盤以來怎麼樣的想法  這時候要怎麼落實到腳本呢?

請看以下的語法

if date[1] <> date then
begin

這樣的寫法適用在日線以下的頻率

自訂函數之資料格式宣告

在編寫函數時,使用者需要傳入參數的變數類型,

目前支援三種,
Numeric數值,String字串,邏輯值TrueFalse。

細分是否傳值或傳址,是否為陣列、序列、或是

簡單型態預先宣告好的型態,Value類的可以
儲存數值,Condition可以儲存邏輯值。

共有二十種

資料格式宣告

詞 解釋
numeric Input:Name(Numeric);
Name:參數的名稱
名稱可以包含英文半形字元,底線,數字,英文的句點”.”。
名稱大小寫視為相同。
名稱第一個字不能為數字或句點”.”。
Numeric表示數值型態。
=================
在函數裡面宣告變數時使用,定義被宣告的參數為數值,傳入參數數值。

numericarray Input:Name1[PA1,PA2,PA3,….](NumericArray);
Name1:宣告數值陣列的名稱。
PA1:有幾個參數就表示該陣列有多少維度,三個就表示三維的陣列。參數則表示陣列該維的長度。
名稱可以包含英文半形字元,底線,數字,英文的句點”.”。
名稱大小寫視為相同。
名稱第一個字不能為數字或句點”.”。
===============
在函數裡面宣告數值陣列時使用,定義被宣告數值陣列的陣列名稱與陣列長度。

numericarrayref Input:Name1[PA1,PA2,PA3,….](NumericArrayRef);
Name1:宣告數值陣列的名稱
PA1:有幾個參數就表示該陣列有多少維度,三個就表示三維的陣列。參數則表示陣列該維的長度。
名稱可以包含英文半形字元,底線,數字,英文的句點”.”。
名稱大小寫視為相同。
名稱第一個字不能為數字或句點”.”。
NumericArrayRef表示用傳址的方式傳回此陣列。
===============
在函數裡面宣告數值陣列時使用,定義被宣告數值陣列的陣列長度與數值。傳回陣列的位址。

numericref Input:Name(NumericRef)
Name:參數的名稱
名稱可以包含英文半形字元,底線,數字,英文的句點”.”。
名稱大小寫視為相同。
名稱第一個字不能為數字或句點”.”。
===============
在函數裡面宣告變數時使用,定義被宣告的參數為數值,傳入參數的位址。

numericseries Input:Name(NumericSeries)
Name:參數時序的名稱。
名稱可以包含英文半形字元,底線,數字,英文的句點”.”。
名稱大小寫視為相同。
名稱第一個字不能為數字或句點”.”。
================
在函數用來宣告數值時序(時間序列,有時間前後關係序列,例如開、高、低、收、成交量等)

numericsimple Input:Name(NumericSimple)
Name:參數的名稱。
名稱可以包含英文半形字元,底線,數字,英文的句點”.”。
名稱大小寫視為相同。
名稱第一個字不能為數字或句點”.”。
NumericSimple表示單一數值。
=================
在函數用來宣告數值,且不是時間序列只有單一數值。

string Input:Name(String)
Name:參數的名稱
名稱可以包含英文半形字元,底線,數字,英文的句點”.”。
名稱大小寫視為相同。
名稱第一個字不能為數字或句點”.”。
String表示字串型態。
=================
在函數裡面宣告變數時使用,定義被宣告的參數為字串,傳入參數字串。

stringarray Input:Name1[PA1,PA2,PA3,….](StringArray);
Name1:宣告字串陣列的名稱。
PA1:有幾個參數就表示該陣列有多少維度,三個就表示三維的陣列。參數則表示陣列該維的長度。
名稱可以包含英文半形字元,底線,數字,英文的句點”.”。
名稱大小寫視為相同。
名稱第一個字不能為數字或句點”.”。
===============
在函數裡面宣告字串陣列時使用,定義被宣告字串陣列的陣列名稱與陣列長度。

stringarrayref Input:Name1[PA1,PA2,PA3,….](StringArrayRef);
Name1:宣告字串陣列的名稱
PA1:有幾個參數就表示該陣列有多少維度,三個就表示三維的陣列。參數則表示陣列該維的長度。
名稱可以包含英文半形字元,底線,數字,英文的句點”.”。
名稱大小寫視為相同。
名稱第一個字不能為數字或句點”.”。
StringArrayRef表示用傳址的方式傳回此陣列。
===============
在函數裡面宣告字串陣列時使用,定義被宣告字串陣列的陣列長度與字串。傳回陣列的位址。

stringref Input:Name(StringRef)
Name:參數的名稱
名稱可以包含英文半形字元,底線,數字,英文的句點”.”。
名稱大小寫視為相同。
名稱第一個字不能為數字或句點”.”。
===============
在函數裡面宣告變數時使用,定義被宣告的參數為字串,傳入參數的位址。

stringseries Input:Name(StringSeries)
Name:參數時序的名稱。
名稱可以包含英文半形字元,底線,數字,英文的句點”.”。
名稱大小寫視為相同。
名稱第一個字不能為數字或句點”.”。
=================
在函數用來宣告字串時序(時間序列,有時間前後關係序列,例如開、高、低、收、成交量等)

stringsimple Input:Name(StringSimple)
Name:參數的名稱。
名稱可以包含英文半形字元,底線,數字,英文的句點”.”。
名稱大小寫視為相同。
名稱第一個字不能為數字或句點”.”。
StringSimple表示單一字串。
=================
在函數用來宣告字串,且不是時間序列只有單一字串。

truefalse Input:Name(TrueFalse);
Name:參數的名稱
名稱可以包含英文半形字元,底線,數字,英文的句點”.”。
名稱大小寫視為相同。
名稱第一個字不能為數字或句點”.”。
TrueFalse表示布林,邏輯值型態。
==================
在函數裡面宣告變數時使用,定義被宣告的參數為邏輯值,傳入參數邏輯值。

truefalsearray Input:Name1[PA1,PA2,PA3,….](TrueFalseArray);
Name1:宣告布林,邏輯值陣列的名稱。
PA1:有幾個參數就表示該陣列有多少維度,三個就表示三維的陣列。參數則表示陣列該維的長度。
名稱可以包含英文半形字元,底線,數字,英文的句點”.”。
名稱大小寫視為相同。
名稱第一個字不能為數字或句點”.”。
===============
在函數裡面宣告邏輯值陣列時使用,定義被宣告邏輯值陣列的陣列名稱與陣列長度。

truefalsearrayref Input:Name1[PA1,PA2,PA3,….](TrueFalseArrayRef);
Name1:宣告布林,邏輯值陣列的名稱。
PA1:有幾個參數就表示該陣列有多少維度,三個就表示三維的陣列。參數則表示陣列該維的長度。
名稱可以包含英文半形字元,底線,數字,英文的句點”.”。
名稱大小寫視為相同。
名稱第一個字不能為數字或句點”.”。
TrueFalseArrayRef表示傳回陣列的位址。
===============
在函數裡面宣告邏輯值陣列時使用,定義被宣告邏輯值陣列的陣列名稱與陣列長度。

truefalseref Input:Name(TrueFalseRef)
Name:參數的名稱
名稱可以包含英文半形字元,底線,數字,英文的句點”.”。
名稱大小寫視為相同。
名稱第一個字不能為數字或句點”.”。
===============
在函數裡面宣告變數時使用,定義被宣告的參數為邏輯值,傳入參數的位址。

truefalseseries Input:Name(TrueFalseSeries)
Name:參數時序的名稱。
名稱可以包含英文半形字元,底線,數字,英文的句點”.”。
名稱大小寫視為相同。
名稱第一個字不能為數字或句點”.”。
====================
在函數用來宣告邏輯值時序(時間序列,有時間前後關係序列,例如開、高、低、收、成交量等)

truefalsesimple Input:Name(TrueFalseSimple)
Name:參數的名稱。
名稱可以包含英文半形字元,底線,數字,英文的句點”.”。
名稱大小寫視為相同。
名稱第一個字不能為數字或句點”.”。
TrueFalseSimple表示單一邏輯值。
=====================
在函數用來宣告邏輯值,且不是時間序列只有單一邏輯值。

用週線反轉來確認主流股漲勢結束


今天跟大家報告一下,師父當年教我怎麼用週線判斷一檔股票的主流地位可能已經結束。

它的方法很簡單,各位請參照附圖,那就是週線上在前兩週出現噴出的情況,接下來的下一根不必管它,但最近一根的低點要比前一跟的收盤低到一定程度,師父認為如果週線上出現這樣的走勢,那就代表了一個反轉的訊號,當然如果這個最新收盤價愈接近前兩週的起漲點,那麼這個反轉的可信度就愈高,師父的說法是,從週線上看,在噴出後,代表要上車的都上車了,一旦下跌時殺到比前一週的收盤低超過一定比例,代表追高的都套牢了,接下來一有風吹草動,多殺多就會出現,所以師父就認為這是一種反轉的訊號。

以前不會有腳本,像這樣的反轉策略只能用目視判斷
現在有了XS,我就直接寫了一個腳本如下了

input:rate1(5);
input:rate2(3);
setinputname(1,"先前週線漲幅");
setinputname(2,"本週低點跌幅");
if high[2]>=close[3]*(1+rate1/100) and low < close[1]*(1-rate2/100)
then ret=1;

 

開盤後漲多跌少

各位可以參考附圖,這是昨天漲停的股票不同的分時走勢圖,各位可以發現,有的一開就漲停,有的是開高後整理後再拉一波,有的是先開高然後直接就攻上去,有的是階梯式向上。
型態雖有不同,但相同的是,漲的比較多,跌的比較小
所以大內高手再給我的兩個腳本
一個是開盤後m根bar中有n根上漲

input:RisingBars(5); setinputname(1,"開盤起至少上漲期數");
input:ContBars(10); setinputname(2,"第幾根K棒時提醒");

variable:KBarOfDay(0); KBarOfDay+=1; if date<>date[1] then KBarOfDay=1; //計算每天日內的Bar序數

if Date = CurrentDate and ContBars = KBarOfDay and //今天開盤起算到現
countif(close>close[1] and close > open,KBarOfDay) //收漲計算(包含開盤第一根是要漲)
>=RisingBars
then ret=1;

另一個是開盤後上漲的bar佔了幾成

nput:RisingBarsPercents(0.5); setinputname(1,"開盤起至少上漲期數比例");
input:ContBars(10); setinputname(2,"第幾根K棒時提醒");

variable:KBarOfDay(0); KBarOfDay+=1; if date<>date[1] then KBarOfDay=1; //計算每天日內的Bar序數

if Date = CurrentDate and KBarOfDay >2 and //今天至少要有3根Bar
ContBars = KBarOfDay and //今天開盤起算到現在第幾跟觸發
countif(close>close[1] and close > open,KBarOfDay)/KBarOfDay //收漲比例(包含開盤第一根是要漲)
>=RisingBarsPercents
then ret=1;

我個人的作法,是先用上一次給的腳本,用1分鐘線,找前四分鐘都上漲,三分鐘過後,換成第二個腳本,也是用1分鐘線,找前八分鐘有五根1分鐘K上揚的股票,9:08分之後,我就換第三個腳本,改成用2分鐘K,然後找開盤後2分鐘K,上漲比例超過七成的股票,一直用到收盤。

這樣用,會漲停的股票,除了一開盤就拉漲停,以及開盤後一直跌最後急拉漲停的股票之外,大部份會拉漲停的股票,都可以事先就發現。

尋找趨勢反轉的股票

以PVT反轉為例_朋友讓我用XS去挑原來下跌現在開始漲,原來沒量現在開始出量的股票。

坦白說,我個人比較喜歡挑的是強勢股,這種大跌過的,除非底打的很紮實,不然這種短線的上漲都可能只是反彈,不過朋友堅持V型反轉的也不少,所以我只好試著寫了下面這個腳本來試看看

variable: pvt(0);

If CurrentBar = 1 then
pvt = 0
else
pvt = pvt[1] + (close - close[1])/close[1] * Volume;
input:Length(20); setinputname(1,"下降趨勢計算期數");

value1 = linearregslope(PVT,Length);
value2 = linearregslope(PVT,5);

IF value1 < 0 and value2> 0 AND VOLUME>1000 then ret=1;

茲說明這腳本如下:
1.PVT是用當天的漲跌幅乘以當天的成交量,雖然可能出現大漲量縮但PVT仍向上的現象,但要連續數日都出現這種情況的機率並不高,所以我就拿PVT來當量價趨勢的衡量標準。
2.Linearregslope這個函數是指一個時間序列的區間線性回歸值的斜率。
3.如果長期斜率是負但短期斜率是正,代表趨勢已反轉。
不過朋友堅持說所有反轉的股票,這都是必要條件,對他來說,就算打底很久他也不在乎(這老小子口袋深),反而是停損好設(破底就砍),我想他說的也許有些道理(人家也是靠自己分析賺到錢的),所以我也就把這樣的腳本跟思考方式寫下來,覺得他有點道理的,也可以自己試試看。

我性子急,這種方法挑到的股票,我可能等打底打的更堅實了,一噴出我才進場。