Author Archives: 發財橘子

switch case

 

switchcase

透過switch..case的語法,可以在一個變數的數值不一樣時,往不同的流程進行,例如要計算外資過去十天買超超過七天時,可以運用以下的語法來寫腳本 :

範例:外資近日買超天數比例

//1.宣告參數:利用input宣告輸入的參數。

input:day(10);//過去幾天

input:ratio(0.7);//外資買超的天數佔多少比例

//2.宣告變數,利用variable

value1=GetField("Fdifference");//外資買賣超

variable:count(0);

variable:xi(0);

for xi= 1 to day

begin

//============================================

switch(value1[xi])

begin

case >0:count=count+1;

case <0:count=count;

case 0:count=count;

end;//所有case都表達完之後,最後必須加end;來表示各種數值選項已結束

//============================================

end;

//6.設定警示條件:if.. then ret=1;

if day<>0 and count/day>=ratio

then ret=1;

 

 

begin..end

有的時候,當符合if後面的敘述式時,我們希望電腦幫我們執行的,不只一行的敘述式時, 電腦要怎麼知道有那敘述是在前面條件符合時批次都要執行的呢?我們在DJ Script的語法中,使用begin …….end;的方式, 來標示所有要執行的敘述式。單條件多敘述

例如若要找出前N日漲幅超過X%且今天跳空開高超過Y%的股票,我們可以寫一個腳本如下:

//宣告參數:利用input宣告輸入的參數。
input:N(3);//前N日
input:X(10);//前n日漲幅%
input:_Y(4);//缺口大小%
if open>high[1] then //跳空開高
//用begin來呈現if 之後要執行的不只一件的事情
begin
value1=(1-close[1]/close[N])*100;//計算前N天的漲幅
value2=(open-high[1])/close*100;//計算跳空缺口的大小
 
end;
//最後用end來宣告if之後要執行程式的結束
 
if value1>=X and value2>=_Y
then ret=1;
 多條件多敘述簡單模式這樣的流程控制算是if ….then裡最複雜的,用白話文說就是如果……那就開始一連串的動作,反之如果不符合上述條件,就開始進到第二個如果…..那就開始另一連串的動作 以上述的例子的引申為例,我們也可以把上面的例子改寫成以下的腳本 :
多條件多敘述簡單模式sample
這腳本的意思是當一開盤就漲停時,我們幫它加一個條件:如果過去十根K棒漲幅都沒有超過2.5%就觸發, 至於對於那一些開盤沒有馬上漲停,但開高後在9:15之前就漲停的股票,如果過去十天漲幅不到兩成,就觸發警示。 這樣的流程基本上就可以同時COVER各種觸發的條件。
多條件多敘述複雜模式
這樣的流程控制結構就更複雜,它是用兩個條件式來把流程引導向三種不同的運算,我們最常用它來安排不同的觸發警示條件。 我們可以把上述的腳本再更進一步加上後面的另一種觸發警示的條件如下 :
多條件多敘述複雜模式sample

這腳本的意思是說有三種情況請電腦觸發警示 :

  1. 開盤就漲停且過去十天沒有一天漲超過2.5%。
  2. 開盤沒有漲停,但開高超過2.5%且9:15之前就漲停,而且過去十天合計漲幅小於兩成。
  3. 開盤沒有漲停,9:15之前也沒有漲停,但現在漲停了而且過去十天合計漲幅小於一成。

從上述的例子,我們就可以了解,這樣的流程控制,可以讓使用者像剝洋?一樣,把一個結果(漲停)安排出不同情境下的不同觸發但書。

 

if..then

一個腳本的完成,有幾個步驟:

  1. 我們透過參數及變數的宣告,準備好要加以運算的數據。
  2. 我們透過運算因子,完成各種數值間的運算。

接下來,我們必須為這些運算的結果安排其先後順序,以及建構與輸出語法間的的因果關係,這些工作,我們都是透過流程控制的語法來完成, 前面我們有用到的IF ……..THEN就是一個典型的流程控制語法。

接下來的章節,我們就一一來介紹這些控制流程的語法,完成這部份的學習,XS的基本語法,就大致完備了。

IF..Then

if then的流程控制,在腳本中我們最常運用到的流程控制,應該就是如果…………那就……….,也就是if ……..then了

例如我們要電腦在股價創今天高點時通知我們,我們會寫成 :

close=q_dailyhigh then ret=1;
但在撰寫腳本時,並不是每個想法都只是單純的if……..then ,有時候我們在符合某個條件時,想要電腦幫我們處理的, 不只有一行敘述,有時候符合條件時我們希望電腦幫我們執行某動作,在不符合條件時執行另一個動作,因此, 本節我們來學習if…….then這個我們最常用的流程控制語法,到底有那幾種不同的寫法,用來處理不同的情境。
if then 1
這一種是我們最常用也最簡單的寫法,例如我們要電腦在股票出現K棒三連陽時通知我們,我們只要寫以下的兩行腳本 :
if trueall(close>close[1],3)
then ret=1;
這樣的敘述很單純,就是如果IF後面的那個敘述式為真,那就執行then後面的那一個敘述式。
單條件單敘述

但有的時候,我們在寫腳本的時候,除了希望在某敘述式為真時,請電腦幫我們執行某敘述,有時候我們也希望當該敘述式false時, 可以為我們執行另一個敘述,這時候的寫法很簡單,就是在then之後的那個敘述式的下方,用else起頭,寫下另一個敘述式就可以了。

例如我們在計算真實波動區間時,我們需要找真實的高點及真實的低點,所謂真實的高點是 :

  1. 如果昨天收盤比今天的高點高,那麼昨天的收盤價就是今天的真實高點
  2. 如果昨天收盤不比今天的高點高,那麼今天的最高價就是今天的真實高點

在寫成腳本時,我們就可以用if……then …….else的語法來處理如下方的敘述式

if Close[1] > High then TrueHigh = Close[1]
else TrueHigh = High;

我們最常用的語法是如果…….就……否則就……………,但有的時候,我們必須設下不止一層的過濾器,也就是在上面的語法的”否則就……”, 不是一個指示下一個直接運算的敘述式,而是另一個if….then的判斷式敘述。

多條件單敘述

 

 

 例如我們如果想找開盤就漲停或開盤跳空上漲後,不到九點十五就漲停的股票,我們可以運用以下的腳本 :
if open=q_DailyUplimit then ret=1;

if open>close[1]*1.025 and close=q_DailyUplimit and time<091500 then ret=1;
這樣的架構就是為觸發設定兩個不同的條件,當符合條件A時就觸發,但如果沒有符合條件A,如果符合條件B也可以觸發。
多條件單敘述sample

這當中有件事要請各位特別留意,那就是在語法上,要千萬記得

If……..

Then …….

else………..;

如果有else,前面then 之後的敘述式結束時,不要打逗號,要等到else後面的敘述式結束後才打逗號。

那一年,我們一起尋找的超跌股。

這幾日,有一檔股票走勢頗強勁,但從損益表來看,這根本就是一家沒啥前途的公司,但如果從資產負債表來看,感覺這是一家股價遠低於其變現價值的公司,於是,我寫了一個選股的腳本,把有類似這樣情況的公司通通找出來,這家公司叫做矽統,這類的公司,其特點就是市值遠低於帳上扣掉負債後,容易變現的資產。

故事的起頭是,前幾天,我用一個策略雷達挑出了矽統這檔股票。

101602

我看這家公司的損益表,直覺是這家公司基本沒救了。

因為這家公司股本61億,結果一個月營收很久以來都沒有超過3000萬,因此,每年本業總要虧個2到3億。

因為我真的很少看到這種營收比營業費用還小的公司,所以一開始我是覺得這樣的公司下市收掉算了。

但後來又想,這兩天在買股票的人應該也不是傻子,所以我把它的資產負債表拿出來看,一看就看出一些還蠻有趣的地方

101603

上面是它的流動資產及長期投資,其中帳上有13億的現金,至於47億的長期投資,如果我們看他的轉投資,就會發現,聯電這檔股票就佔了41億。

101604

也就是說,這家公司61億的資本額,其中光現金及聯電的股票就值54億。

接下來我們再看一下它的固定資產

101605

帳上是列了7.8億,其中土地就列了4.76億,我看了一下該公司的網站,再用google map的街景圖,找到了它的固定資產應該就是下面這棟位於竹科的廠辦

101606

這顯示它的固定資產應該值帳上列的這個錢。

看完了資產我們來看它的負債

101607

這家公司竟然是一家幾乎無負債的公司,短期借款是零,長期負債也是零。

看到這裡,我們來算一下,它這一波最低跌到4.41 元,以它的股本61億來算,在這種價位附近真的把它買下來,等於花30億買到54億的現金+聯電股票,外加一棟位於竹科的廠辦。

難怪它的股價會很快的就回到五元以上。

這種公司我要是早點找到,這趟反彈就押上去了。這次就算了,下次如果它再跌下來我就知道該怎麼做。

不過因為研究過矽統這檔股票,所以我很好奇這市場上還有沒有矽統第二,所以我就寫了以下這個腳本

input:percent(20);
setinputname(1,"每股易變現資產與股價間的落差比");
value1=GetField("現金及約當現金","Q");//百萬;
value2=GetField("短期投資","Q");//百萬
value3=GetField("應收帳款及票據","Q");//百萬
value4=GetField("長期投資","Q");//百萬
value5=GetField("負債總額","Q");//百萬
value6=GetField("最新股本");//單位: 億
value7=(value1+value2+value3+value4-value5)/(value6*10);
if value7>close*(1+percent/100)
then ret=1;
outputfield1(value7);
setoutputname1("每股快速變現價值");
outputfield2(close/value7);
setoutputname2("股價與快速變現價值");

根據上述的算法,我試著找出股價跟每股快速變現價值差距超過兩成的股票

附圖就是我挑到的股票,有興趣的朋友,不妨也一檔一檔找找看這當中有沒有便宜的太過份的股票。

101601

要先說明的是,這個名單只是初步篩選的結果,能不能真的下去買,還得一檔一檔下去仔細分析才行。

我以藍天為例,這家公司的股本是68億,現金,短期投資加應收帳款有61億,負債66億,但它的長期投資帳上是910億,說穿了,藍天這家公司到底值多少錢,就看這900多億的長期投資值多少錢?

101608

可惜藍天的轉投資主要都是海外的控股公司,像這種的我們就無從查出這裡頭到底真正值多少錢,我們拿來分析矽統的方法,也就不合適拿來套在藍天上面。

 

在使用這個方法時,有幾個眉角還是要跟大家交代一下

1.短投資裡,如果是上市櫃公司佔多數那還好,不過也要考慮流動性,但如果轉投資裡都是一堆未上市或投資公司,那就得還要再花精神研究這些東西會不會其實已經變成壁紙

2.固定資產我們沒有拿進來算,因為變現不容易,不過如果是位於市區的辦公大樓,其實也可以考慮進去。

3.在挑這一類股價跌過頭的股票時,一定要留意公司經營者的誠信,帳上現金再多,如果經營者是屬於惡搞型的,那也可能兩三下就五鬼搬運光了。

4.這類的公司如果有要減資或是被人借殼,反而股價會比較有表現的機會。

 

私房交易策略之強勢股整理結束

以前寫情書的時候,我們常說: 妳的過去我來不及參與,但妳的未來一定有我。

作為一個操作者,我們對那些來不及上車的強勢股,也往往有這樣的心情,

這樣的心情,如果用波浪理論來解釋,那就是在初昇段來不及參與之後,希望在主昇段發動前夕,來得及坐上車。

101701

為了尋找這一類的股票,我試著寫一個腳本,這個腳本有三個步驟

1.尋找特定日期以來漲幅最大,走勢最強的股票

2.這樣的股票,從這段時間以來的最高點到前一日的收盤,已修正一定的幅度

3.今天盤中該個股明顯走強。

在要寫這個腳本時,首先得先找出某特定日到最新的收盤價,一共是幾根Bar。

公司同仁寫了一個函數來做這件事,他把這個函數稱之為

getbaroffset

 

這個函數的腳本如下:

Input: target(numeric);

if barfreq <> "D" AND barfreq <> "W" AND barfreq <> "M" then raiseruntimeerror("只支援日/週/月頻率");

variable: i(0);
variable: target_ym(0), date_ym(0);

if barfreq = "D" then
begin
 if target >= date then
 begin
 GetBarOffset = 0;
 return;
 end;
 i = 1;
 GetBarOffset = 1;
 while i < currentbar
 begin
 if date[i] <= target then return;
 i = i + 1; 
 GetBarOffset = GetBarOffset + 1;
 end;
end;

if barfreq = "W" then
begin 
 target_ym = year(target) * 100 + weekofyear(target);
 if dayofweek(target) = 0 then target_ym = target_ym - 1;
 
 GetBarOffset = 0;
 i = 0;
 while i < currentbar
 begin
 date_ym = year(date[i]) * 100 + weekofyear(date[i]);
 if dayofweek(date[i]) = 0 then date_ym = date_ym - 1;
 
 if date_ym <= target_ym then return;
 i = i + 1;
 GetBarOffset = GetBarOffset + 1;
 end; 
end;

if barfreq = "M" then
begin
 target_ym = year(target) * 100 + month(target);
 
 GetBarOffset = 0;
 i = 0;
 while i < currentbar
 begin
 date_ym = year(date[i]) * 100 + month(date[i]);
 
 if date_ym <= target_ym then return;
 i = i + 1;
 GetBarOffset = GetBarOffset + 1;
 end; 
end;

這個函數是只要輸入一個日期,就會回傳從現在到該特定日期共隔了幾根Bar。

如果今天是2015年10月15日,那如果我們寫value1=getbaroffset(20151014);

那代表是前一根bar,所以value1=1;

有了這個函數,我就來寫出上面所提到的這個腳本

input: stardate(20150824);
input:ratio(30);
input:ratio1(7);
input:ratio2(2);
setinputname(1,"輸入上漲起始日");
setinputname(2,"輸入上漲最低幅度");
setinputname(3,"輸入最小拉回幅度");
setinputname(4,"今日最低漲幅");
value1=getbaroffset(stardate);//找出輸入的日期是在第幾根bar
value2=highest(high[1],value1+1);//找出這一波的最高點

condition1=false;
condition2=false;

if value2>=close[value1]*(1+ratio/100)//計算波段漲幅有沒有符合要求
then condition1=true;

if value2>=close[1]*(1+ratio1/100)//計算拉回的幅度夠不夠要求
then condition2=true;

if nthhighestbar(1,high,10)>=5//從最高點到今天超過五根bar
then begin
if condition1 and condition2 and close>=close[1]*(1+ratio2/100)
then ret=1;
end;

在解釋這個腳本之前,我們先來看一下大盤最近的走勢

101702

 

所以我上面寫的這個腳本,就是找出符合下面四個條件的股票

1.從8/24日以來,到最高點漲幅超過30%的股票

2.從最高點到前一個交易日的低點修正幅度超過7%

3.今天收盤比前一天收盤漲超過2%

4.從高點拉回整理超過五天。

這樣的腳本要尋找的,就是整理結束後的強勢股。

下面這張圖就是這個腳本今天跑出來的股票

101501

 

當然不是每檔股票都會在初昇段之後就一定有主昇段,也不見得每檔股票都是休息了幾天後就開始再往上攻,不過這個策略的好處是,對於那些從特定日期以來走勢很強的股票,一旦整理結束,我們在第一時間就會收到電腦的通知,這樣的好處是我不必一直盯著強勢股等拉回結束。

這個腳本可以名列我的私房腳本第二名,介紹給大家,至於日期及漲幅,拉回幅度,這些參數就請大家自己調整囉!

 

 

私房交易策略介紹之旱地拔葱

先跟大家分享幾檔股票這幾天的走勢。

101706 101704 101705 101703 101702

眼尖的各位,從上面這幾張圖可以發現,一段時間量縮橫向整理後的中長紅,後市往往還有高點。

是的,這是自從我開始從事程式交易以來,最靠譜的交易策略

這個策略有三個原則

1.超過十個交易日股價橫向整理

2.在整理期間成交量明顯萎縮

3.以中長紅的姿態突破整理

4.突破時帶著比先前多出不少的成交量

過去為了找到這樣的股票,我曾經寫過也用過幾個策略

例如我常推薦大家使用的多次到頂而破策略雷達

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

variable: theHigh(0); theHigh = Highest(High[1],Length); //找到過去其間的最高點
variable: HighLowerBound(0); HighLowerBound = theHigh *(100-RangeRatio)/100; // 設為瓶頸區間上界
variable: TouchRangeTimes(0); //期間中進入瓶頸區間的低點次數,每跟K棒要歸0

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

if TouchRangeTimes >= HitTimes and ( q_ask> theHigh or close > theHigh) then ret=1;

要使用這個策略,可以直接在雲端策略中心中訂閱多次到頂突破這個策略即可

101707

訂閱後每天可以從警示中心這一頁盤中即時跳出符合這個策略的股票

101708

這個腳本的最大問題是只考慮價沒有考慮量,而且只考慮向上突破而沒有考慮先有是否有量縮盤整。

後來我有寫過另一個叫股票箱突破的策略雷達

腳本如下:

input:length(12);
value1=NthHighest(1,high,length);
value3=nthhighest(3,high,length);
value4=Nthlowest(1,low,length);
value5=nthlowest(3,low,length);

if
value1[1]<=1.03*value3[1]
and value5[1]<=value4[1]*1.03
and value1[1]<=value4[1]*1.1
and close>value1[1]
then ret=1;

這個腳本昨天出現訊號的股票如下圖

101709

大家不妨參考對照未來的走勢。

除了上述兩個腳本之外,各位也可以根據上面的那四個定義,另外再寫出一個符合上述邏輯的策略,我覺得只要follow這四個精神,應該可以找到短多的股票,而且,勝率真的夠高。

這個交易策略背後的邏輯是,當股價脫離原先的盤整區域,代表原來的多空平衡已被破壞,一根中長紅代表的是多方正式撃潰空方的最後防線,接下來就是長驅直入了,我們在這時候進場,圖的就是這種空頭全面潰敗,多頭乘勝追擊追撃的過程,這個過程很重要的是

1.要一確定中長紅就跟進去。

2.最好挑那種對峙很久的,這種一被撃潰就後防空虛,多頭可以一路追撃。

3.最好上面沒有太多解套賣壓的。

根據上述這三個原則,各位可以把這個策略的腳本改寫的更精準。

 

 

 

趨勢檢定器

我們透過技術分析指標建構交易策略時,最大的困難在於,當趨勢指標通知我們出現買進訊號時,往往只是盤整過程中的一次假的警報。

我們以移動平均線出現黃金交叉為例,當短天期移動平均突破長天期移動平均時,僅能代表近日的股價走勢平均下來終於高於比較長期的平均值,並不代表接下來股價就會出現明顯的漲勢。

這樣的情況讓我們在透過趨勢指標撰寫交易策略時,往往會有買進訊號過多,過濫的情況,如果我們把這樣的策略直接拿下去交易,極可能繳了大量的手續費及交易稅,而沒有賺到什麼錢。

於是,我們試著從歷史的經驗中,尋找當一檔股票出現明顯的波動方向時,往往伴隨著什麼樣的跡象,然後看看這些跡象,在趨勢指標出現買進訊號時,有沒有同步出現,如果有,代表這個趨勢改變的訊號,成功的機率大增。

我們可以試著把這些跡象集合起來,然後做出一個趨勢檢定器,用這個檢定器來過濾那些可能的假訊號。

例如老市場常說,當MACD黃金交叉時,如果伴隨著成交量突破10日均量,那就代表趨勢是真的,這裡的成交量突破10日均量,就是一個趨勢檢定器。

趨勢檢定器

這些年從我累積的看盤經驗裡,通常當一檔股票技術指標如果出現買進訊號時,我會同步check以下幾件事,然後再來判斷這個訊號是不是玩真的

1.總成交筆數有沒有增加?  有就代表交投變熱絡了,表示市場參與者變多了。

2.佔全市場總成交量的比重是不是在增加?  有增加才代表不是因為盤好才出量。

3.外盤的佔比是否增加? 外盤代表的是追價的意願,追價意願提高是上漲的重要動力。

4.主力是否買超?  籌碼被收集而不是被發散,是行情啟動的基本要件

5.波動幅度是否變大? 一灘死水的突破通常是假突破。

6.開盤委買有沒有增加? 如果增加代表新的買盤在進駐中。

於是我寫了一個腳本,在這腳本中我應用上面的這六個面象,做出一個計分器,如果每個面象近兩個交易日有任一天有明顯比以往平均值突出的數字,就加一分,然後如果總得分超過4分,代表通過這個趨勢檢定器的檢定。

input:Length(10);

input:ratio(20);
input:cn(4);

setinputname(1,"移動平均天數");
setinputname(2,"超出均值比率");
setinputname(3,"最低符合條件數");
variable:count(0);
value1=GetField("總成交次數","D");
value2=GetField("佔全市場成交量比","D");
value3=GetField("內外盤比","D");
value4=GetField("外盤均量","D");
value5=GetField("主力買賣超張數","D");
value6=GetField("真實範圍波幅","D");
value7=GetField("開盤委買","D");
count=0;
if countif(value1 >=average(value1,length)*(1+ratio/100),2)>0
then count=count+1;

if countif(value2 >=average(value2,length)*(1+ratio/100),2)>0
then count=count+1;

if countif(value3 >=average(value3,length)*(1+ratio/100),2)>0
then count=count+1;

if countif(value4 >=average(value4,length)*(1+ratio/100),2)>0
then count=count+1;

if countif(value5>0,2)>0
then count=count+1;

if countif(value6 >=average(value6,length)*(1+ratio/100),2)>0
then count=count+1;

if countif(value7 >=average(value7,length)*(1+ratio/100),2)>0
then count=count+1;

if countif(volume >=average(volume,length)*(1+ratio/100),3)>0
then count=count+1;

if count>cn
then ret=1;

outputfield1(count);
setoutputname1("檢定值");

透過這個檢定器,我們可以過濾掉不少的假買進訊號

舉個例子

如果我們用昨天的收盤價來跑以下這個腳本

input:Length(20); //"計算期間"

LinearReg(close, Length, 0, value1, value2, value3, value4);
//做收盤價20天線性回歸
{value1:斜率,value4:預期值}
value5=rsquare(close,value4,20);//算收盤價與線性回歸值的R平方
if value1>0 and value5>0.2
then ret=1;

這個腳本跑出來的股票是屬於那種近20天股價呈現上昇趨勢的股票,結果符合上述腳本條件的股票共有286檔,這286檔今天盤中在平盤以上的共有128檔。

但如果加了趨勢檢定器,就如下圖,符合兩個條件的只剩109檔

101301

 

而這109檔今天在大盤下跌46點時,還維持在平盤上的,有69檔。

我們在寫趨勢型策略時,最怕的就是把no trend的歸成up trend,今天跟大家介紹這個趨勢檢查表,大家可以根據自己的經驗,調整內容,把那些no trend的通通都濾掉。

 

從月線與季線看台股當前的漲昇架構

台股能不能繼續漲? 如果可以,會是什麼股票領漲?

要回答這個問題,我們先來對市場的多空架構做個定義

101205

 

如果根據這樣的定義,那麼加權指數已經即將正式翻多

101204

如果從細產業來看,我們會發現,這當中塑化原料及不鏽鋼兩大族群是衝的最快的兩類產業,他們的指數分別在九月中旬及下旬就領先翻多。

101201

101203

 

為了很快的了解到底目前有那些股票位於這六階段不同的位置,我寫了一個腳本如下: 我特別濾掉那些股價不到10元,成交量不到1000張的股票,

input:status(1);
setinputname(1,"1:復甦期,2:收集期,3:多頭,4:警示期,5:發散期,6:空頭");
variable:m20(0),m60(0),message("0"),userchoice("0");
m20=average(close,20);
m60=average(close,60);
if close > m20 and c< m60 and m20<m60
then message="復甦期"
else
if close > m20 and c> m60 and m20<m60
then message="收集期"
else
if close > m20 and c> m60 and m20 > m60
then message="多頭"
else
if close < m20 and c>m60 and m20>m60
then message="警示期"
else
if close < m20 and c<m60 and m20>m60
then message="發散期"
else
if close < m20 and c<m60 and m20<m60
then message="空頭";

switch(status)
begin
case=1 :
userchoice="復甦期";
case=2 :
userchoice="收集期";
case=3 :
userchoice="多頭";
case=4 :
userchoice="警示期";
case=5 :
userchoice="發散期";
case=6 :
userchoice="空頭";
end;

if message=userchoice
and volume>1000 and close>10
then ret=1;
outputfield1(message);
setoutputname1("今日訊號");
outputfield2(message[1]);
setoutputname2("昨日訊號");
outputfield3(message[2]);
setoutputname3("前日訊號");

根據這個腳本,我選出的多頭的股票如下圖

101207多頭

空頭的股票如下圖

101206空頭

 

我們從多頭及空頭架構的股票,可以發現,受惠於台幣貶值的外銷股,景氣到底的塑化股,以及跌深且旺季到的電子股,目前是處於多頭走勢,金融股,航空股及部份先前比較強的個股則處於空頭走勢。

從這樣的架構來看,台幣續貶力道,電子旺季持續力,美國需求,以及全球景氣循環股的續航力(油價及工業金屬),會是這個盤能持續多頭多久的主要指標。

除了用這一套方法來研判大盤漲昇架構之外,我稍稍更改一下腳本如下:

variable:m20(0),m60(0),message("0") ;
m20=average(close,20);
m60=average(close,60);
if close > m20 and c< m60 and m20<m60
then message="復甦期"
else
if close > m20 and c> m60 and m20<m60
then message="收集期"
else
if close > m20 and c> m60 and m20 > m60
then message="多頭"
else
if close < m20 and c>m60 and m20>m60
then message="警示期"
else
if close < m20 and c<m60 and m20>m60
then message="發散期"
else
if close < m20 and c<m60 and m20<m60
then message="空頭";

if message<>message[1]
and volume>500 and close>10
then ret=1;
outputfield1(message);
setoutputname1("今日訊號");
outputfield2(message[1]);
setoutputname2("昨日訊號");
outputfield3(message[2]);
setoutputname3("前日訊號");

這個腳本可以找出最近一日訊號跟前一日不同的股票,以下幾張圖就是根據上述的腳本跑出來的,有的變好,有的變壞,加減參考囉。

101208

101209

101210

101211

 

 

自訂指標Step by Step

市場上有非常多的技術指標,學都學不完,但如果大家用的武器都一樣,總覺得很難能夠見人所未見,賺人所未賺,特別是有時候就是會有靈光乍現,電光火石的那一刻,當下如果能把靈感化為交易的策略,這快樂是我輩程式交易者,千金難換之快樂也。 容我舉個例子,跟大家分享這樣的快樂。

 

昨天同事來跟我借K線的書,我聊到其實有不少指標是本著K線的精神發明出來的。 我一直以來的體會是,每一根的K線都是那段時間多空爭戰的痕跡,

100701

以前一根K棒收盤價為基點,所能測到的最高與最低點,就是當日多空雙方角力的最大範圍,在技術分析上我們稱之為真實區間

100702

那麼在這樣的多空角力區間裡,我們怎麼知道多方與空方的力道各是多大呢?
我們常用的DMI指標,他的發明者是這麼計算的
071003

他認為如果今天的高點比前一天高點多出來的部份就是正的向上力量,今天的低點比前一天低點低的部份就是向下的力量。

然後它拿這兩股力量去相比,那邊強,另一邊就只能以零計算,然後再去跟這樣的力量跟真實區間相除,看向上的力量佔真實波動區間的比例是多少

// DirectionMovement function (for DMI相關指標)
// Input: length
// Return: pdi_value(+di), ndi_value(-di), adx_value(adx)
//
input:
length(numericsimple),
pdi_value(numericref),
ndi_value(numericref),
adx_value(numericref);

variable:
padm(0), nadm(0), radx(0),
atr(0), pdm(0), ndm(0), tr(0),
dValue0(0), dValue1(0), dx(0),
idx(0);

if currentbar = 1 then
begin
padm = close / 10000;
nadm = padm;
atr = padm * 5;
radx = 20;
end
else
begin
pdm = maxlist(High - High[1], 0);
ndm = maxlist(Low[1] - Low, 0);

if pdm < ndm then
pdm = 0
else
begin
if pdm > ndm then
ndm = 0
else
begin
pdm = 0;
ndm = 0;
end;
end;

if Close[1] > High then
tr = Close[1] - Low
else
begin
if Close[1] < Low then
tr = High - Close[1]
else
tr = High - Low;
end;

padm = padm[1] + (pdm - padm[1]) / length;
nadm = nadm[1] + (ndm - nadm[1]) / length;
atr = atr[1] + (tr - atr[1]) / length;

dValue0 = 100 * padm / atr;
dValue1 = 100 * nadm / atr;

if dValue0 + dValue1 <> 0 then
dx = AbsValue(100 * (dValue0 - dValue1) / (dValue0 + dValue1));

radx = radx[1] + (dx - radx[1]) / length;
end;

pdi_value = dValue0;
ndi_value = dValue1;
adx_value = radx;

 

上面的程式碼就是DMI的計算過程

 

但我對這個指標有個想法,每天都有向上的力量跟向下的力量,不能因為其中一股力量大於另一股,就把另一邊計算為零,兩邊的力量應該要都被計算到,然後看那一邊的力量比較大

所以我就寫了以下的腳本:

input:sd(5);
input:ld(20);

setinputname(1,"短天期");
setinputname(2,"長天期");

variable:h1(0),l1(0),nf(0),snf(0),lnf(0),dd(0);

H1=HIGH-HIGH[1];
L1=LOW-LOW[1];

if truerange<>0
then
begin
NF=(H1+L1)/truerange;
SNF=average(NF,sd);
lnf=average(nf,ld);
dd=snf-lnf;
end;
plot1(dd,"多空淨力");

我去計算一檔股票每天多空角力的差距,佔真實波動區間的比重,然後看看短天期平均跟長天期平均之間的差。

以下這張圖就是我拿這個指標來畫在加權指數上的對應圖

100901

 

這樣的指標,比起K線圖,更清楚地可以判斷現在是該站在多方還是空方。

上述的過程,是一個一步一步發展自訂指標的過程,我們可以透過這樣的過程,逐漸完備我們對一檔股票的多空判斷體系,當我們透過一連串自訂的指標來研判一檔股票的多空方向時,其實就像是透過多樣的儀器來做身體檢查,當我們發展出愈多愈觀察細微的健康檢查儀器,我們對於一檔股票的多空方向,就會有更高的掌握度。

以上是這些日子以來,我使用XS發展各種自訂指標的小小心得

野人獻曝,祝大家找到自己的股票多空檢查體系。

 

 

 

紅色供應鍊可能有興趣的股票

最近台股購併風愈來愈烈,日月光收矽品股權,聯發科併立錡,風華收購光頡。

這些被併購的公司都有不小的溢價,如果我們能夠事先預知那些公司會被合併,那就美呆了。

可惜我們不是007,也沒有水晶球,所以我們只能用猜的,猜對了,就是中樂透,猜錯了,只要大盤還OK,個股沒急跌,那麼風險也有限。

怎麼猜呢?

我觀察這些被購併的公司,都是屬於董監持股不高且獲利穩定的公司,這些公司就像是漂亮的小姐深夜獨自行走於無人的暗巷之中,比較容易吸引他人的非份之想。

以矽品為例,如下圖,林文伯先生的持股比例才2.91%,整體董監事的持股比例才5%

1007010

但過往 10年,矽品每年EPS都超過1.5元。

100702

根據這樣的觀察,我寫了一個腳本,專門找那些董監持股比例低,集保庫存比例高的公司,這些公司就是那種比較容易被他人下手的標的。

//大股東持股不高
//集保比例很高
input:r1(15),r2(80);
setinputname(1,"董監持股比例");
setinputname(2,"集保比例");

value1=GetField("董監持股佔股本比例","D");
value2=GetField("集保張數佔發行張數百分比","W");

if value1<r1 and value2>=r2 //董監持股比例小於15%且集保比例高於八成
then ret=1;

我把這個腳本的名字稱為”容易被別人介入的股票

然後我把這個腳本加入其他的條件式選股,完成一個選股策略如下

100703

在這個策略裡,要挑的股票除了符合上述的條件外,市值不能太大,股價不能太貴,過去五年有賺錢。

符合上面條件的股票目前台股有兩百多檔,所以我加上一條近三日主力買超超過100張,因為我相信雞蛋再密也有縫,預知春江水將暖的鴨子一定會有。

以下是我用這些條件今天篩選出來的股票

100704

 

我相信隨著大環境的變化,產業裡的合緃連橫會愈來愈普遍,透過這樣的選股法,我們可以了解市場有那些公司奇貨可居,至於是不是真的出現有緣人,我們再從籌碼面的變化去判斷。

祝大家都有機會中到小樂透,大樂透。