Author Archives: 發財橘子

私房版 台灣50的領先指標

台灣50是一個大家很熟悉的交易工具,因著這個指數所衍生出來的ETF及權證非常的多,這些商品佔每天的成交量非常可觀,顯示這個一個大家都經常拿來作為交易工具的標的。於是我試著想要設計一個自訂指標,用來預測台灣50的多空趨勢,試了幾個方法,沒想到最簡單的卻最有用,以下是我找到的方法。

這個方法的步驟如下:

1。找出台灣50的每一檔成份股(注意會隨時異動,故要隨時更新成分股的代號),然後計算其五日均線是否在20日均線之上。

2。如果是的話就加一分,如果不是的話就不加分。

3。計算五十檔的合計分數為多少分。

如下面的腳本來描述上述的步驟

array:T50[50](0);
t50[1]=GetSymbolField("1101.tw","收盤價");
t50[2]=GetSymbolField("1102.tw","收盤價");
t50[3]=GetSymbolField("1216.tw","收盤價");
t50[4]=GetSymbolField("1301.tw","收盤價");
t50[5]=GetSymbolField("1303.tw","收盤價");
t50[6]=GetSymbolField("1326.tw","收盤價");
t50[7]=GetSymbolField("1402.tw","收盤價");
t50[8]=GetSymbolField("2002.tw","收盤價");
t50[9]=GetSymbolField("2105.tw","收盤價");
t50[10]=GetSymbolField("2207.tw","收盤價");
t50[11]=GetSymbolField("2301.tw","收盤價");
t50[12]=GetSymbolField("2303.tw","收盤價");
t50[13]=GetSymbolField("2308.tw","收盤價");
t50[14]=GetSymbolField("2311.tw","收盤價");
t50[15]=GetSymbolField("2317.tw","收盤價");
t50[16]=GetSymbolField("2324.tw","收盤價");
t50[17]=GetSymbolField("2325.tw","收盤價");
t50[18]=GetSymbolField("2330.tw","收盤價");
t50[19]=GetSymbolField("2354.tw","收盤價");
t50[20]=GetSymbolField("2357.tw","收盤價");
t50[21]=GetSymbolField("2382.tw","收盤價");
t50[22]=GetSymbolField("2395.tw","收盤價");
t50[23]=GetSymbolField("2408.tw","收盤價");
t50[24]=GetSymbolField("2409.tw","收盤價");
t50[25]=GetSymbolField("2412.tw","收盤價");
t50[26]=GetSymbolField("2454.tw","收盤價");
t50[27]=GetSymbolField("2474.tw","收盤價");
t50[28]=GetSymbolField("2633.tw","收盤價");
t50[29]=GetSymbolField("2801.tw","收盤價");
t50[30]=GetSymbolField("2823.tw","收盤價");
t50[31]=GetSymbolField("2880.tw","收盤價");
t50[32]=GetSymbolField("2881.tw","收盤價");
t50[33]=GetSymbolField("2882.tw","收盤價");
t50[34]=GetSymbolField("2883.tw","收盤價");
t50[35]=GetSymbolField("2884.tw","收盤價");
t50[36]=GetSymbolField("2885.tw","收盤價");
t50[37]=GetSymbolField("2886.tw","收盤價");
t50[38]=GetSymbolField("2887.tw","收盤價");
t50[39]=GetSymbolField("2890.tw","收盤價");
t50[40]=GetSymbolField("2891.tw","收盤價");
t50[41]=GetSymbolField("2892.tw","收盤價");
t50[42]=GetSymbolField("2912.tw","收盤價");
t50[43]=GetSymbolField("3008.tw","收盤價");
t50[44]=GetSymbolField("3045.tw","收盤價");
t50[45]=GetSymbolField("3481.tw","收盤價");
t50[46]=GetSymbolField("4904.tw","收盤價");
t50[47]=GetSymbolField("4938.tw","收盤價");
t50[48]=GetSymbolField("5880.tw","收盤價");
t50[49]=GetSymbolField("6505.tw","收盤價");
t50[50]=GetSymbolField("9904.tw","收盤價");
 
var:count(0),i(0);
count=0;
for i=1 to 50
begin
if average(t50[i],5)>average(t50[i],20)
then count=count+1;
end;
plot1(count);
plot2(40);
plot3(10);

用這個腳本的2016/05/16台灣五十成分股

畫出來台灣五十與指標的對照圖如下:

051601

從這張圖我們可以很明顯的發現

1。這個指標是台灣50的領先指標。當這個指標從10以下回昇且迅速站上40,代表大部份台灣最重要的股票,都從空頭排列轉為多頭排列,如果這時候台灣50剛處於初昇段,那後市就值得期待

2。如果這個指標從40以上跌破40,而且一去不回,或者持續低於20,那就代表大部份的權值股正處於空排排列中,這對大盤可不是太好的徵兆。

3。如果在一個多頭市場,這個指標很難跌破40,相反的,空頭市場這條線很難突破20

051601

4.如果這個指標一直在25上下遊走,代表這個盤基本上是盤整的格局

 

以上是我的一個小小嚐試,腳本中用到的Getsymbolfield是用來在腳本中支援跨商品跨頻率的方法,大家可以把這個腳本拿去改成自己更私房更好用的領先指標,從指數成份股的多空表現來預測指數後市,這個方法我個人是覺得可行的。

 

 

 

多空趨勢指標

我們看到很多的技術指標,它的計算基礎都建立在單支K棒開,高,低,收的相互關係上,甚至不少只用到收盤價。過於受限於電腦的運算能力,這樣的作法可以理解,現如今進入雲端運算時代,我們不妨用更週延的思維,來找出多空的角力痕跡,今天想用兩根K棒開,高,低,收合計八個價位的運算,來跟大家介紹不同思維的交易策略。

常常有人說,投資像推理,那麼交易的軌跡就像是推理所需要的跡證,一根K棒是四個點, 兩根K棒是八個點,從兩根K棒可以收集到的多空角力跡證比一根K棒要多很多。

我試著把兩根K棒可以拿來運算的數值整理了一下,分成八類,如下圖

k線衍生的力量

其中前四個是多空力道的綜合,後面四個分別代表多頭與空頭的力量

根據這樣的分類,我寫了一個自訂指標的腳本,計算每檔商品的多空力道差距及多頭與空頭各自力量的消長。

array:k[22](0);
if close<>0
then begin
//最近一日與前一日的多空力道總差額
k[1]=(open-open[1])/close;
k[2]=(high-high[1])/close;
k[3]=(low-low[1])/close;
k[4]=(close-close[1])/close;

//當日
k[6]=(high-close)/close;
k[7]=(high-open)/close;
k[8]=(open-low)/close;
k[9]=(close-open)/close;
k[10]=(close-low)/close;
k[11]=(open-high[1])/close;
k[12]=(open-low[1])/close;
k[13]=(open-close[1])/close;
k[14]=(high-open[1])/close;
k[15]=(high-low[1])/close;
k[16]=(high-close[1])/close;
k[17]=(low-open[1])/close;
k[18]=(low-high[1])/close;
k[19]=(low-close[1])/close;
k[20]=(close-open[1])/close;
k[21]=(close-high[1])/close;
k[22]=(close-low[1])/close;
end;

array: v1[8](0);
v1[1]=k[1]+k[11]+k[12]+k[13];//隔日開盤多空總力道
v1[2]=k[1]+k[2]+k[3]+k[4];//隔日多空總力道
v1[3]=k[20]+k[21]+k[22];//隔日收盤多空結果
v1[4]=k[9]+k[10]-k[6];//當日收盤多空結果
v1[5]=k[14]+k[15]+k[16];//多頭最大力量
v1[6]=(k[17]+k[18]+k[19])*-1;//空頭最大力量
v1[7]=k[7]+k[9]+k[10];//當日多頭最大力量
v1[8]=k[6]+k[8]-k[10];//當日空頭最大力量

value1=v1[1]+v1[2]+v1[3]+v1[4];
value2=v1[5]+v1[7];
value3=v1[6]+v1[8];
plot1(average(value1,5),"多空淨力");
plot2(average(value2,5),"多頭總力");
plot3(average(value3,5),"空頭總力");

 

這個腳本可以同時衡量多空力道的差額及多頭與空頭各自的力量

用在加權指數上可以畫出的圖形就如下圖

051301

我們可以從這張圖上看到幾個可以形成交易決策的原則

1.當多空淨力在 0以上是基本上是多頭市場,0以下是空頭市場。

2.當多頭總力與空頭總力糾結時是盤整格局

3.當多頭總力與空頭總力的差距愈來愈大時代表一個多頭或空頭的趨勢被確認

4.多空淨力差距過大時代表市場一面倒,屬於超買或超賣的情況,短線有拉回或反彈的機會

 

根據這些跡證,我們就可以訂出一些更精準的交易策略

 

 

 

 

 

 

把股性拿來作為過濾條件

我們在設定個股的買進策略時,有時候會踫到假的訊號,例如震盪型指標踫到盤整時,就容易出現假訊號,就算嚴格執行停損,還是會因為過度交易,浪費交易成本而必影響獲利,今天來跟大家考論一個概念,如果我在寫一個股性轉變的濾網,當策略出現買進訊號時,透過這個濾網來觀察股性是否真的有明顯改變,只有真的有明顯改變時才觸發訊號,這麼做應該可以避免過度交易的情況

我曾經跟大家分享過我有十二個衡量股性的標準

衡量股性的指標

我試著用計分卡的方式寫了一個衡量股性的腳本如下:

input:day(20);
input:ratio(10);
var:count(0),x(0);
value1=GetField("總成交次數","D");
value2=average(value1,day);
value3=GetField("強弱指標");
value5=GetField("外盤均量");
value6=average(value5,day);
value7=GetField("主動買力");
value8=average(value7,day);
value9=GetField("開盤委買");
value10=average(value9,day);
value11=GetField("資金流向");
value13=countif(value3>1,day);
value14=average(value13,day);//比大盤強天數
value16=GetField("法人買張");

count=0;
if value1>value2*(1+ratio/100)
then count=count+1;
if value13>value14*(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;
if truerange> average(truerange,20)//真實波動區間
then count=count+1;
if truerange<>0
then begin
if close<=open
then
value15=(close-low)/truerange*100
else
value15=(open-low)/truerange*100;//計算承接的力道
end;
if value15>average(value15,day)*(1+ratio/100)
then count=count+1;
if volume<>0
then value17=value16/volume*100;//法人買張佔成交量比例

if value17>average(value17,10)*(1+ratio/100)
then count=count+1;

if value11>average(value11,10)*(1+ratio/100)
then count=count+1;
x=0;
value18=summationif(close>=close[1]*1.02,x,5);
if value18>=2 
then count=count+1;//N日來漲幅較大的天數



value19=GetField("融資買進張數");
value20=GetField("融券買進張數");
value21=(value19+value20);
value22=average(value21,day);
if value21<value22*0.9 //散戶作多指標
then count=count+1;

plot1(average(count,3),"股性綜合分數指標");
plot2(average(count,day),"移動平均");

從以下幾檔這個月逆勢上漲的股票,我們可以發現,股票有大行情時,股性會有明顯的變化

051201

 

051202

 

各位不妨以這個例子為基礎,發展各自不同的股性過濾腳本,這樣就可以減少過度交易及盤整時出現假訊號的機率

 

 

 

 

 

高現金股利低本益比且本業仍不差

網友想要挑一些急跌後可以留意的股票,我設了三個條件: 高現金股利,低本益比,本益穩定

寫了一個選股腳本如下:

input:peratio(17,"本益比上限倍數");
input:ratio(60,"現金股利佔股利之比重下限");
input:epsl(2,"預估本業EPS下限");
input:rate1(5,"累計營收成長率下限");
 
value1=GetField("累計營收年增率","M");//單位%
value2=GetField("現金股利佔股利比重","Y");
value3=GetField("營業利益","Q");//單位百萬;
value4=GetField("最新股本");//單位億;
value5=summation(value3,4)/(value4*10);//每股預估EPS

if
value1>rate1//本業持續成長
and 
value2>ratio//主要以現金股利為主
and
value5>EPSl//每股推估本業獲利高
and 
close/value5<peratio//本益比低
then ret=1;

 

我用比較嚴格的條件

1。本益比低於十

2。現金股利佔八成以上

3。預估eps大於五

4。累計營收成長率超過兩位數

 

挑出來的股票如下:

050902

 

 

 

 

sector trade(類股輪動操作法)初體驗

類股輪動操作法的邏輯很簡單,找到現在表現最強的產業,投資其龍頭股。以前這種操作很難把它自動化,更別說去回溯測試這個策略的勝率及績效了,我試著把它程式化,算是拋磚引玉,希望各位可以發展出更強大的類股輪動操作策略。

 

我的演算過程分成兩部份,一部份是找出走勢比加權指數強的產業指數,另一部份則是找出各細產業中股價最活潑的個股

在第一部份,我的作法還是計算各產業指數與大盤相除後的BB值,這個值突破BB值上限就是表現異常強勢,以塑化原料為例就像下面這張圖

050601

 

第二部份的作法則是先找出貝他最高的股票

我訂了兩個條件

1.貝他值大於1

2.月成交量平均大於5000張

結果選出了433檔股票。

接下來我就開始把這433檔股票,拿去跑下面我寫的這個腳本

這個腳本的概念就是先把這433檔的相關細產業指數拿去跟大盤比強度,強度異常時,就觸發該產業在這433檔中所屬的股票。

我從這433檔股票中,挑出18檔股票,這些股票分別是其所屬產業中的龍頭股,然後請了公司的高手高手高高手寫了以下的指標

input: Length(20); SetInputName(1, "布林通道天數");
input: BandRange(2);SetInputName(2, "上下寬度");
input: MALength(10);SetInputName(3, "MA天期");
array:
ValueArray[18](0),
ratioarray[18](0),
uparray[18](0),
dnarray[18](0);
var:x(0);
var:si(0);// 商品所在的產業
if symbol="1101.TW" then si=1;
if symbol="1305.TW" then si=2;
if symbol="1452.TW" then si=3;
if symbol="1536.TW" then si=4;
if symbol="1460.TW" then si=5;
if symbol="1476.TW" then si=6;
if symbol="6269.TW" then si=7;
if symbol="2031.TW" then si=8;
if symbol="2014.TW" then si=9;
if symbol="2393.TW" then si=10;
if symbol="2615.TW" then si=11;
if symbol="2409.TW" then si=12;
if symbol="2882.TW" then si=13;
if symbol="6005.TW" then si=14;
if symbol="2606.TW" then si=15;
if symbol="3044.TW" then si=16;
if symbol="6244.TW" then si=17;
if symbol="9914.TW" then si=18;
if si = 0 then return;
valuearray[1]=GetSymbolField("I011010.TW","收盤價");//水泥
valuearray[2]=GetSymbolField("I013010.TW","收盤價");//塑化原料
valuearray[3]=GetSymbolField("I014010.TW","收盤價");//加工絲
valuearray[4]=GetSymbolField("I022020.TW","收盤價");//汽車零組件
valuearray[5]=GetSymbolField("I014040.TW","收盤價");//織布
valuearray[6]=GetSymbolField("I014030.TW","收盤價");//成衣
valuearray[7]=GetSymbolField("I023320.TW","收盤價");//軟板
valuearray[8]=GetSymbolField("I020010.TW","收盤價");//不銹鋼
valuearray[9]=GetSymbolField("I020020.TW","收盤價");//平板鋼
valuearray[10]=GetSymbolField("I023060.TW","收盤價");//LED
valuearray[11]=GetSymbolField("I026020.TW","收盤價");//貨櫃航運
valuearray[12]=GetSymbolField("I023080.TW","收盤價");//面板
valuearray[13]=GetSymbolField("I028010.TW","收盤價");//金控
valuearray[14]=GetSymbolField("I028030.TW","收盤價");//證券
valuearray[15]=GetSymbolField("I026030.TW","收盤價");//散裝航運
valuearray[16]=GetSymbolField("I023230.TW","收盤價");//印刷電路板
valuearray[17]=GetSymbolField("I023130.TW","收盤價");//太陽能
valuearray[18]=GetSymbolField("I099040.TW","收盤價");//自行車

value1=GetSymbolField("TSE.TW","收盤價");
ratioarray[si]=valuearray[si]/value1;
uparray[si]=bollingerband(ratioarray[si],length,bandrange);
dnarray[si]=bollingerband(ratioarray[si],length,-1*bandrange);
plot1(uparray[si], "UB");
plot2(dnarray[si], "DB");
plot3(ratioarray[si], "Ratio");
if ratioarray[si] cross over uparray[si] then
plot4(1, "穿越")
else
noplot(4);

這個指標如果畫成圖就像下圖

050602

 

這個腳本把plot4改成ret=1就成了警示腳本

下圖就是過去三年的回測報告

050603

 

績效還真的不錯。

透過這個腳本,未來這十八檔股票所屬的細產業如果比大盤表現異常突出,系統會針對該檔股票觸發信號

 

以上就是所謂sector trade的一種基本類型,希望可以激發大家更多的靈感

 

由市場老手的交易秘訣所衍生出來的交易策略(一)

這陣子盤這麼差,只作多不作空的人日子難過,想起一位多空都作的老業內,他的作法是多頭時挑剛開始冒出來比大盤強的作多,空頭時挑剛開始比大盤弱的作空,我把這樣的思維寫成交易策略,回測的結果不差,提供給大家,以此為基礎,進一步優化成更佳的交易策略。

我的思維如下

1.把加權指數五日MA在20日MA均線之上視為多頭,反之則是空頭。

2.我把股價當分子,加權指數當分母,然後拿這個值去算BBand,一旦這個值突破BBand的上沿,代表這檔股票跟大盤的相對強度已經出現跟以往正常的區間不同。

3.這檔股票短線沒有急漲的太過頭

符合以上三個條件的腳本寫法如下:

value1=GetSymbolField("TSE.TW","收盤價")/close;
if value1<>0
then value1=1/value1;

input: Length(20); SetInputName(1, "布林通道天數");
input: BandRange(2);SetInputName(2, "上下寬度");

variable: up(0), down(0), mid(0);

up = bollingerband(value1, Length, BandRange);

if value1 cross over up 
and average(GetSymbolField("TSE.TW","收盤價"),5)>
average(GetSymbolField("TSE.TW","收盤價"),20)
and close<close[2]*1.07
then ret=1;

我拿這個腳本來跑今年以來有量的中小型股,回測報告如下 050501 這個策略的核心精神就是大盤多頭時找比大盤還強的作多,大盤空頭時找比大盤還弱的作空,我們以楠梓電這檔個股為例,請看下圖 050502 從這張圖也可以看到,當BBand上下兩條線縮的很近時一旦數值突破上限或下限時,訊號的可信度更高

多空交易(long-short trading)

在金融情勢詭譎多變的時候,我們很難判斷接下來的股市會怎麼走,但如果我們很清楚知道,在同一行業裡的某A股票,基本面長期表現會比某B股票好,這時候我們就可以作多A股票,放空B股票,不管大盤漲還跌,都可以靠這樣的操作賺到錢,這樣的操作就稱之為多空交易(long-short trading)

舉個例子,大家都知道台積電跟聯電長期以來競爭力差很大,但以往聯電的股性有時候會突然活潑了起來,短期不見得表現比台積電差,這時候我們可以把兩家公司的總市值相除,然後再取兩個長短天期不同的移動平均線,這樣我們就可以觀察兩家公司總市值的長期趨勢變化,也可以透過長短天期移動平均線的黃金交叉及死亡交叉,來決定多空交易的進場點及平倉時點。

根據上述的精神,我寫了一個畫圖的腳本如下:

input:period1(4,"短期別");
input:period2(12,"長期別");
setbackbar(12);
settotalbar(600);
value1=GetSymbolField("2303.tw","總市值");
value2=GetField("總市值");
value3=value1/value2;
value4=average(value3,period1);
value5=average(value3,period2);
plot1(value4);
plot2(value5);

使用這個腳本,用週線的頻率,可以畫出下面這張圖

050402從這張圖,我們就可以很清楚的看到如果我們在2014年八月四日那一週開始作多台積電,放空聯電,到目前為止,都還沒有出現平倉的訊號,而到目前為止的投資報酬率是三成左右,如果我們用個股期貨來操作,報酬率就會因為槓桿而變得很驚人。

我想大家一定會說我在看圖說故事,台積電與聯電的例子大家都太瞭解了,應該要提供一些新的多空交易標的。

在這個部落格,我一貫不報明牌,但我很喜歡分享我的交易經驗及思考的方式,所以,我提出幾個多空交易的配對思考方向,供大家作參考

方向一: 尋找因為某事件或議題,造成一個長期趨勢,這時就可以把因此趨勢而會受益與受害的公司作配對

這個例子最明顯的就是統一跟味全

050403

另外像是台幣升值時,作多食品股,作空外銷電子股

方向二,當某原料長期上漲時,作多生產該原物料的上游,作空下游,相反的,某原料價格長期下跌時,作多下游,作空上游,不過必須留意的是下游是否有高價庫存待消化,如果有,那轉折點會在原料下跌趨勢一段時間之後

方向三,同一產業競爭力有明顯差異的兩家公司,前面提到的台積電與聯電是一個明顯的例子,以前友達跟華映也是很好的多空交易標的,台郡跟嘉聯益是另一個明顯的例子

050404

方向四  爭奪特定有限市場(如國內市場)而明顯分出勝負時

這種最有名的就是國泰金與新光金

050405

 

 

隨著個股期貨以及借券等措施的開放,也隨著XS即將支援跨商品功能,我們愈來愈有機會透過XS尋找及實踐各種不同類型的多空交易。如此一來,我們可以專心研究同產業或特定議題趨勢下的受益與受害公司,並且透過一多一空的方式,進行多空交易,如此一來,我們就不必理會國際金融市場對於台股的多空衝擊,只要專注在企業競爭力的研究上。

 

 

 

 

 

報復性反彈

股票市場情緒很極端,漲的時候眾星拱月,跌的時候棄如敝屣,超漲超跌時有所見,超跌的股票,往往像是過街老鼠,人人喊打,但真的跌的太過頭了,也會有報復性上漲的一天,今天我們就來探討,像這樣的公司,要透過什麼策略程式,才能提早發現。

報復性上漲的例子很多,這幾年,最有名的例子大約有下面幾個

050302 050301

這些股票的特徵如下:

1.從還原月線看,股價都連續跌了好幾個月

2.從日線看,在報復性反彈時,成交量佔大盤的比重回昇,股價比大盤強且都有出現至少一根的長紅棒

根據這兩個特徵,我使用XS即將上線的跨頻率語法,寫了一個用月線RSI找超跌,用日線找短線轉強的股票,腳本如下:

//先來找出月線RSI小於5的股票
input:period(6,"RSI期別");
var:x(0),up(0),down(0);
up=0;
down=0;
for x=0 to period-1
begin
if GetField("收盤價","AM")[x]>GetField("收盤價","AM")[x+1]
//取得還原月線的收盤價 並計算RSI
then
up=up+GetField("收盤價","AM")[x]-GetField("收盤價","AM")[x+1]
else
down=down+GetField("收盤價","AM")[x+1]-GetField("收盤價","AM")[x];
end;
value1=up/(up+down)*100;

value2=GetField("資金流向");
value3=GetField("強弱指標","D");

if value1<=25
then begin
if countif(value3>0,5)>=4
or countif(value2-value2[1]>0,5)>=3
or countif(close>=close[1]*1.04,3)>=1
then ret=1;
end;

之所以月線要這麼不厭其煩的用Getfield的方式來模擬RSI,主要是因為跨頻率如果以是日線為計算基準時,若直接套用RSI的期別時,電腦計算期別時是以日線為準,這時候,每天的月RSI其實是同樣的數字,這樣算出來的結果,就不是我們想要的了。

今早用這個腳本跑出來的股票有潤泰全,三商壽這兩檔,由於這個腳本對於日線轉強的標準訂的比較低,後續還是要搭配日線其他指標及籌碼來觀察是否真的轉強

 

 

 

 

撰寫交易策略的SOP

隨著開始使用XS寫交易策略的朋友們愈來愈多,我們愈來愈常被求救,問題看多了,歸納整理後,我寫了一個撰寫交易策略的SOP,我認為在撰寫交易腳本時,有四大步驟,嚴謹且按步就班地作好每個步驟,應該可以協助我們完成交易策略的撰寫。

這四個步驟如下圖

撰寫腳本的SOP

 

茲分項說明之

一,準備數據

程式交易語法跟其他如C++,Java等不同之處,是在於它的目標很明確~透過大量金融數據的運算,作成交易決策,所以在一個程式交易腳本中,最基本的課題是: “要拿那些金融數據進來運算?”

每個腳本,都像一道食譜,每個食譜,都會要我們先準備食材,腳本的食材,就是我們要拿下去運算的每個元素,在XS的腳本中,這些要拿來加減乘除作運算的元素,可以歸類為以下幾種

1. 即時行情的數據。包括單量,當日漲幅,內盤量,外盤量,五檔委買賣的價與委託量等等,我們可以用 Getquote的語法把它們拉出來使用。

2. 盤後數據。包括法人進出,資券變化,主力進出等等數據,我們用Getfield的語法把這些欄位拿到腳本中來使用

3. 回傳值。開高低收成交量等語法中最基本的元素,在以K棒為基礎的架構裡,我們可以用Close[n]之類的語法,把K棒中 的每一個被存下來的值拿來運算。

4. 參數。為了更改參數方便而由使用者以INPUT的語法所設定的參數,也是可以被拿來腳本中作運算。

5. 變數。為了運算方便,由使用者自行宣告的變數,也是腳本中常見的元素。

6. 常數。有的時候,就是會運用到簡單的阿拉伯數字,或是True及false這兩個布林值,這些都是腳本運算中常用的元素。當我們要要撰寫一個腳本時,就像食譜要先準備的食材一樣,我們得先決定要用上述六大類裡的那些元素,這個決定的工作,就像是煮一道菜之前,先把相關的食材從冰箱裡取出來。

0 42201 

決定好之後,接下來要做的是事情有兩個

第一個是宣告: 我們先透過宣告的方式,把要用的變數及參數先準備好,我們為它們取名字,設初始值。

第二個是指定: 然後接下來我們用getquote及getfield的語法,把盤後資料及盤中資料指定到特定的某個變數

二,建構演算

以上的這兩個步驟,就好像是煮菜之前的備料工作。備完料,接下來就是建構演算的機制,在這當中,若是有需要,會使用到系統或自訂的 函數。    大家可以透過先前學會的流程控,以及各種函數,透過數學及邏輯運算,完成各種運算。

這部份主要是看個人的功力,只能多看多寫,多看別人寫過的好語法。

三,設定輸出條件

接下來,就是建立輸出條件,我們用if ……..then  ret=1; 來指定策略雷達的觸發條件,以及選股的符合條件,用if………then plot1…;來輸出自訂指標。

我與個例子來說明以上的流程

我們希望電腦在個股符合下列三個條件時通知我們,

  1.    十日法人買超的移動平均超過1000張
  2.    當日外盤量佔成交量超過五成
  3.    當日股價比前一日上漲

那麼我們可以寫下一個腳本如下:

各位可以看到,我們依以下的步驟在完成一個警示腳本

步驟一: 宣告參數

步驟二: 宣告變數

步驟三: 取得盤後資料

步驟四: 取得即時數據

步驟五: 建構運算關係

步驟六: 設立觸發,畫指標或確認 函數的敘述式

當然在實作上,步驟一到步驟五的任何一項 ,都可能因為沒有用到相關數據而被省略,最簡單的警示腳本如if close=high then ret=1;就只有步驟六而已。

但如果大家記得這六個基本的步驟,應該可以很快的把各式各樣的數據,同步放在一個警示腳本中來使用。

042202

 

 

 四,編譯與勘誤

接下來的編譯及勘誤,是另一個重點,很多朋友就算是提供了中文的勘誤,還是無法自行找出程式碼的問題之所在,所以我把大家常見的程式上的疏誤,以及在勘誤時系統會出現的訊息做了一個對照表如下,供大家參考。

XS的勘誤方式,跟其他的IDE類似,在使用者按下編譯按鈕之後,如果程式有Bug,會在訊息視窗中,以表格的方式來呈現錯誤的地方,其呈現方式如下:

 

物件名稱 行號 字元 錯誤描述
呈現腳本的名稱 顯示錯誤的敘述在第幾行 錯誤的地方是從該行的第幾個字元開始 表達錯誤的可能原因,俾使用者正確地找到錯誤。

 

根據我自己使用的經驗,User通常會出現的錯誤,以及XS編輯器對應會出現的勘誤訊息,大致有以下幾類。

 文字上的小失誤

 

錯誤描述 原因說明及備註
未知的關鍵字 “xxx”,請檢查是否有宣告此變數或是拼字是否有誤。 可能是自己宣告的參數或變數的名稱打字時打錯了,造成電腦無法理解這個字代表的意思
需要輸入更多參數。 通常是像plot1之類的忘了把裡頭的參數輸進去,如果是函數忘了輸入正確的參數個數,系統會直接呈現”需要輸入x個參數”
需要輸入 x ~ y 個參數。 輸入的參數比系統要求的多時會出現這個message
在 “xxxxxx” 之前可能少了”;”, “DOWNTO”, “TO”, “OR”, “XOR”, “AND”, “=”, “<>”, “<“, “>”, “<=”, “>=”, “Crosses Above”, “Crosses Over”, “Crosses Below”, “Crosses Under”, “+”, “-“, “*”, “/” 最有可能的是前一行忘了打分號。
編譯器看到了一個無法辨認的字 “x”,請檢查這個字有沒有寫錯。 這種情況通常是輸入了之前沒有宣告過的文字格式內容

 流程的錯誤

 

錯誤描述 原因說明及備註
for 迴圈的變數型態應為數值。 for的用法為for 某變數=xx to xxxxx及xxx必須都是數值
「IF/Once/While/Repeat」後面需要一個真偽值或是真偽值的判斷式。 這些流程的後面必須是一個布林值的判斷式,不能是一個結果是特定數值的運算式

 

 函數的錯誤使用

 

錯誤描述 原因說明及備註
需要輸入x個參數 這代表使用這函數所需要輸入的參數的個數與user實際輸入的參數並不相符,可能是漏打或是多打了某個參數。
函數 xxxxx:第 x 個參數應該是 Numeric(string)。 這代表使用者輸入的函數參數格式錯了,該是數字的地方使用了文字,或是該是文字的地方使用了數字。
函數宣告的輸入型態有誤,應該是 Numeric,NumericSimple,NumeircSeries, String,StringSimple,StringSeries,TrueFalse,TrueFalseSimple,TrueFalseSeries。 在自訂函數宣告參數時必須宣告資料的型態而不是直接使用初始值
函數 xxxxx:第 x 個參數應該是 Numeric 函數裡每一個參數的格式(type)必須是對的,不能把文字放到該填數值的函數去
參數的數值不可以在函數中被修改,如果有需修改參數值,請將參數型態改為 NumericRef(數值)或是 NumericArray(陣列)。 在函數中的參數,它的數值是不能在宣告後直接被賦予特定值的,例如不能寫input:abc(numeric);abc=1;

 

 用到不該用的欄位

 

錯誤描述 原因說明及備註
在「警示」腳本中無法使用「plot」 在警示類的腳本中不能使用plot
此欄位無法使用 [ ](無法索引前期值)。 例如在getquote的欄位裡使用前期值的語法
在「指標」腳本中無法使用「xxxxx」。 在指標類型的腳本中不能使用getquote的欄位

 

 數值與布林值使用上的混淆

 

錯誤描述 原因說明及備註
“=” 左右兩邊的型態不同。 數值是無法等於布林值的,例如不能寫value1=true; 因為value1是數值變數,true是布林值,應該要寫成condition1=true;
“+” 左右兩邊的型態不同。 數值跟布林值是無法相加的
“AND” 與左右兩邊的型態不同。 and的兩邊必須都是布林值的敘述,不能有數值
“-” 與右邊的型態不同 減號的兩邊都必須是數值
“not” 與右邊的型態不同。 not的兩邊都必須是布林值

 

 宣告參數時容易發生的失誤

 

錯誤描述 原因說明及備註
在指標跟警示裡面不用型態的方式,請修正。 在指標跟警示裡,使用input宣告參數時直接用初始值,而不是宣告資料型態。

 

 變數使用上的錯誤

 

錯誤描述 原因說明及備註
變數 “xxx” 為系統保留文字,請更改變數名稱。 宣告變數時用到了其他關鍵字, 或是重覆宣告了同名字的變數
變數 “xxx” 沒有宣告,請用 Vars: 的方式宣告,冒號後面是變數名稱再用括號填入預設值。例如: Vars:varA(100); 如果要宣告陣列請用 Arrays: 冒號後面是名稱再用 [] 設定維度與大小,括號填入預設值。例如 Arrays:arr1[10](0);。 直接使用了某個電腦看不懂的英文字詞,電腦會提醒把這個字詞宣告成變數後再來使用
xxxx不是陣列,不能在後面加 [ ],請把  [ ] 與裡面的數字移除掉。 在使用變數前一期值時要小心,不要直接指定特定一期值為某常數,因為這是陣列才會有的行為,例如可以寫value1=value1[1]+value1[2];但不能寫value1[1]=5;

 

 陣列使用上出現的疏誤

 

錯誤描述 原因說明及備註
變數宣告為 Array 但沒有宣告陣列維度,例:Array:arr[X](numericarray); 使用陣列時只記得宣告是陣列卻忘了宣告陣列的維度
有宣告陣列維度但變數並不是宣告為 Array。 宣告了陣列的參數,但忘了宣告陣列格式的變數,兩邊對不起來
陣列參照不正確。 宣告陣列後,必須按陣列的格式來assign值或變數,而不能像非陣列的assign方式,例如宣告了一個陣列如下:array:arr1[5](0);arr1[1]=1; 這樣寫是可以的,但不能寫成

arr1=1; 因為在陣列中的每一個變數都是獨立的,不能透過這種語法想要一次assign所有陣列的值都是1

同樣的,也不能寫成

value1=arr1;

因為左邊是一個變數,右邊是一個陣列。
另外維度兩邊對不起來時也可能出現陣列參照不正確的訊息

陣列(Array)宣告不支援超過9維的維度。 這種情況代表使用者宣告的陣列維度超過九個,這超出了系統所能提供的上限。

 

 

當編譯後出現錯誤訊息後,即可根據上面表格的說明,找出錯誤的原因並且加上修正,如此一來可以縮短程式開發的速度,並且讓程式可以忠實呈現使用者的想法。

 

 

 

魚骨圖在投資決策上的實踐方式

魚骨圖又被稱為特性要因圖,是經理人們常用的工具,在要解決一個問題時,透過魚骨圖的方式,列出會影響結果的每個重要環節,然後透過腦力激盪,找出每個重要環節的核心要素。在進行投資決策時,魚骨圖也是一個蠻好用的工具,可以讓我們找出真正會影響股價波動的要素。

以下圖為例

魚骨圖範例

我每天都會把漲幅較大,且有一定成交量的股票,拿出來研究一翻,然後我歸納出這些股票常有的共同特徵

1.線型上在上昇趨勢中

2.籌碼是穩定的

3.今天開盤就明顯比較強

所以我就試著以魚骨圖的方式,列出要符合上述三個特徵,它們各別的要素是什麼,然後把這些要素寫成腳本

//先準備需要被拿來運算的資料
value1=GetField("法人買賣超張數");
value2=GetField("主力買賣超張數");
value3=GetField("融券增減張數");
value4=q_BoughtLotsAtOpen;//開盤委買張數
value5=q_SoldLotsAtOpen;//開盤委賣張數

//先宣告魚骨圖的魚骨數並先為false
condition1=false;
condition2=false;
condition3=false;
//描述魚骨在什麼情況下由false變成true
if value1[1]>0 and value2[1]>0 and value3[1]>0 
then condition1=true; //符合籌碼穩定的條件
//===============MACD =================================
input: FastLength(12,"DIF短期期數"), SlowLength(26,"DIF長期期數");
input: MACDLength(9,"MACD期數");
variable: difValue(0), macdValue(0), oscValue(0);
MACD(weightedclose(), FastLength, SlowLength, MACDLength, difValue, macdValue, oscValue);

if oscValue > 0 and average(close,5)>average(close,20)
then condition2=true; //符合上昇趨勢的條件

if open > close[1]*1.015 and value4>highest(value4[1],20) or value4-value5>200
then condition3=true; //符合開盤走強

if condition1 and condition2 and condition3
then ret=1;

這個腳本的結構,主要是用condition1………到conditionN來界定投資決策的重要環節,然後列出所有該環節底下的核心要素,並寫成條件式,然後再透過關係運算子and或是or來建構核心要素與該環節的成立要件,而投資決策的形成,必須是所有環節都成立。

在語法上,它的架構就如下圖

魚骨圖架構

在擬定交易策略時,針對當沖,隔日沖,短線,波段等不同的交易方式,會影響績效的環節不會一樣,每個環節裡的核心要素也不一樣,我的研究方法是把不同交易方式裡成功的例子拿出來研究,尋找真正會影響績效的環節,然後再透過各種嚐試及回測,找出最能代表每個環節表現的核心要素,然後透過上述的語法結構,完成一個投資決策的腳本。各位不妨試著以類似的方法完成自己的交易決策魚骨圖,然後根據上面的語法範例完成自己的投資決策腳本。