先前有提過,我想要把大家常用的策略想法,都寫成腳本,讓大家不用寫程式,就可以直接拿來用,這次我整理了二十個除了MACD,KD等常用技術指標之外,也稍具知名度且普遍被大家使用的技術指標常用買進訊號腳本,把它們寫成市場常用語法腳本,讓大家可以直接用勾選及改參數的方式就能使用。
這二十個腳本如下
下載點在以下
在編輯器匯入腳本後,即可以在選股平台中使用
匯入後的使用UI如下
接下來會跟大家分享基本面及財務面的常用腳本。
如果沒有投資過美股的朋友,想要找一本入門的書,我會推荐30歲警官靠美股提早退休這本書,這本書的作者 是筆名美股夢想家的施雅棠先生,他本身是一位警官,而且他才30歲,但他靠投資美股已經達到提早退休的人生,他寫的這本書裡,除了美股之外,也觸及了美債,特別股等金融商品,適合不同投資風格的投資人。
這本書一開始先教大家如何開美股戶,以及開戶券商的選擇,(不過因為我們在推人人都是巴菲特方案,所以歹勢,要用XQ操盤高手美股即時模組下單的朋友,請選擇與我們配合的券商,小弟代替我們所有員工一起感謝您,啾咪),也跟大家介紹了美股的交易規則及稅賦等相關規定。
接下來書上開始分別介紹股票,公司債及特別股等不同的美股商品。其中股票的部份由於美股可以每季配息一次,所以書上有教大家如何投資美股賺股息。
接下來有介紹大家如何查詢個股定期公佈的財報,年報等資料,教大家如何作功課,甚至包括如何研判經營階層的誠信及估值等進階版的研究方法
最後兩章則很詳細的介紹了特別股及美國公司債的投資方法,這兩章非常值得一讀,寫的非常詳細,這是實戰經驗豊富的人才寫得出來的。
我看完後非常佩服作者 ,年紀輕輕就知道把關注的焦點放在全球最大的資本市場,而且勇於嚐試各種金融商品,並且把投資的心得分享給大家。
這本書非常值得有興趣投資美股的朋友一看
當然也提醒有志於投資美股的朋友來加入XQ操盤高手的人人都是巴菲特方案
有網友希望提供內外盤的即時指標,但因為目前指標裡無法支援內外盤的flag,所以我改變一下寫法,寫了一個盤中上漲量與下跌量的差額指標,大家可以參考看看
首先依慣例還是先給腳本
variable:i(0),tv(0),tp1(0),tp(0); i=0; if date<>date[1] then begin value1=0; value2=0; end; if V>0 then begin while GetField("時間","Tick")[i]>=time and GetFieldDate("成交量","Tick")[i]=date i+=1; while i>0 begin i-=1; tv=GetField("成交量","Tick")[i]; tp=GetField("收盤價","Tick")[i]; tp1=GetField("收盤價","Tick")[i+1]; if tp>tp1 //上漲 then begin condition1=true; condition2=false; end; if tp<tp1 then begin condition1=false; condition2=true; end; if condition1 then value1+=tv;//上漲成交量累加 if condition2 then value2+=tv;//下跌成交量累加 end; end; value3=value1-value2; plot1(value3,"累計上漲下跌量差");
用這個腳本畫出來的圖如下
用在期指上的圖形如下
這種盤中統計市場買賣方道消長的指標,確實在作當沖或進出場點決策時,有很大的幫助,我聽說XQ7.0會支援更多QUOTE的欄位可以支援到指標畫圖腳本中,到时候再跟大家分享更多的指標畫法。
昨天分享股票的盤中大戶散戶指標之後,有不少網友希望也提供期指專用的盤中大戶散戶指標,我試著拿昨天的腳本改了一下,不曉得符不符合大家的需求
首先還是先PO腳本
input: bos(true,"類別",inputkind:=dict(["大戶",true],["散戶",false]),quickedit:=true), p(50,"大戶門檻(口數)");//預設值先訂50口,大家可以改成自己的定義 variable:i(0),tv(0),tp1(0),tp(0); i=0; if date<>date[1] then begin //當天開盤開始從新起算 value1=0; value2=0; end; if V>0 then begin while GetField("時間","Tick")[i]>=time and GetFieldDate("成交量","Tick")[i]=getfield("日期", "D") i+=1; while i>0 begin i-=1; //做一個從這一根往前算到開盤共幾根的計數器 tv=GetField("成交量","Tick")[i]; tp=GetField("收盤價","Tick")[i]; tp1=GetField("收盤價","Tick")[i+1]; condition1=tv>=p;//設定符合大戶的口數門檻 if tp>tp1 //分上漲及下跌時的情況,這裡沒有考慮平盤的口數 then begin condition2=true; condition3=false; end; if tp<tp1 then begin condition2=false; condition3=true; end; if condition1 then begin if condition2 then value1+=tv;//計算累積的大戶量 if condition3 then value1-=tv; end else begin if condition2 then value2+=tv;//計算累積的非大戶量 if condition3 then value2-=tv; end; end; end; if bos then value3=value1 else value3=value2; if value3>=0 then plot1(value3,"大戶買賣超"); if value3<0 then plot2(value3,"大戶買賣超"); if not bos then begin setplotlabel(1,"散戶買賣超"); setplotlabel(2,"散戶買賣超"); end;
用這腳本畫出來的畫面如下,我用的是一分鐘線,然後大戶的門檻是單筆50口
這一頁的下載點如下
如果是直接複製上述腳本的朋友,繪圖的設定如下
請記得到技術分析設定視窗中把XS指標計算範圍改成如下圖
我把頻率改成用五分鐘線
要改大戶的門檻 可以在下圖這地方更改
以上是我修改的內容,不曉得有沒有符合網友的需求?
前天跟大家分享了盤中大戶即時買賣超的警示腳本,然後在文中提到說現在盤中是無法畫出指標的,這句話敝公司的天才工程師們很不服氣,抗議說分時圖是畫不出來沒有錯,但分鐘K是畫的出來的(以為我不知道哦,我只是寫不出來而己),結果其中一位天才就直接把它寫出來了,今天就來跟大家分享這個分鐘K版的即時大戶散戶買賣超指標
先跟大家分享這個指標腳本
input: bos(true,"類別",inputkind:=dict(["大戶",true],["散戶",false]),quickedit:=true), p(100,"大戶門檻(萬元)"); variable:i(0),tv(0),tp1(0),tp(0); i=0; if date<>date[1] then begin value1=0; value2=0; end; if V>0 then begin while GetField("時間","Tick")[i]>=time and GetFieldDate("成交量","Tick")[i]=date i+=1; while i>0 begin i-=1; tv=GetField("成交量","Tick")[i]; tp=GetField("收盤價","Tick")[i]; tp1=GetField("收盤價","Tick")[i+1]; condition1=0.1*tv*tp>=p; if tp>tp1 then begin condition2=true; condition3=false; end; if tp<tp1 then begin condition2=false; condition3=true; end; if condition1 then begin if condition2 then value1+=tv; if condition3 then value1-=tv; end else begin if condition2 then value2+=tv; if condition3 then value2-=tv; end; end; end; if bos then value3=value1 else value3=value2; if value3>=0 then plot1(value3,"大戶買賣超"); if value3<0 then plot2(value3,"大戶買賣超"); if not bos then begin setplotlabel(1,"散戶買賣超"); setplotlabel(2,"散戶買賣超"); end;
這個指標腳本在計算上請在技術分析設定的第一個視窗底下,作如下圖的設定,不然會算很久線都出不來
這個指標在一分鐘K頻率下,畫出來的圖如下
也可以用五分鐘K
其實只要是分鐘K都能用
在應用上,可以挑那些大戶持續買超但散戶是賣超的公司
但要小心大漲後,散戶買但大戶賣超的股票
以上是在分鐘K底下所呈現的大戶及散戶買賣超指標
公司高手如雲,我應該負責許願就好,各位有什麼想寫寫不出來的,不要客氣,儘管提出來,這些人對於我說寫不出來的,都非常有意願想化不可能為可能,大家儘管提。
在XQ個人版選股中心裡,內建的籌碼類選股欄位都有內建的選股條件 ,只是內建的選股條件大多是屬於簡單敘述,但有的時候,我們內心想的選股條件,就不是簡單敘述所可以表達出來的。於是,我們會再用XS語法,寫出一些系統內建的選股腳本
目前選股系統內建的籌碼腳本如下
但除了系統內建的腳本之外,也會陸陸續續收到使用者建議再增加的選股條件,於是,每隔一陣子,我就會整理一些新增的腳本放到網路硬碟裡,供大家自行下載後匯入使用。
以下是這一次整理出來的籌碼選股腳本,一共有22個
上面是下載點,之後等到這一批所有選股腳本都整理過後,下一次改版時,再把這些腳本都分門別類的放到系統內建的選股腳本中。
除了跟大家介紹過的價量型,籌碼型之外,接下來再陸續上傳指標型,基本型及財務型的選股腳本。
大家如果還有那些選股腳本想要直接我們提供,也歡迎提出來
我們的目標是希望可以讓大家不用寫程式就完成完全符合您想法的選股策略
坊間有軟體號稱可以在盤中就即時算出當天主力的買賣超,根據我的了解,這是判斷當天的單筆交易金額的大小,然後根據內外盤,定義為大戶或散戶的買進或賣出,我根據這樣的精神,用XS語法寫出一個盤中找出主力買進佔個股整體成交量超過一定比例的腳本,大家看看合不合用。
這個腳本如下,這是一個警示腳本,中中大戶的定義各位可以自行調整,要佔成交量比例超過多少才讓電腦發出訊號? 也是可以調整的。
input: BigBuy(300,"大戶買單(萬)"); input: bigbuyratio(30,"大戶買單比例下限%"); variable: intrabarpersist Xvolume(0);//累計大戶買單 variable: intrabarpersist Volumestamp(0); Volumestamp =q_DailyVolume; if Date <> currentdate or Volumestamp = Volumestamp[1] then Xvolume =0; //開盤那根要歸0 if q_tickvolume*q_Last > BigBuy*10 and q_BidAskFlag=1 then Xvolume=Xvolume+q_tickvolume; //量夠大就加到累計大戶買單 if volumestamp >=1000 then begin if Xvolume/volumestamp*100> bigbuyratio then ret=1; end;
這個腳本由於到到getquote的語法,目前這語法不支援指標,也不支援回測,所以目前僅能以這樣警示腳本的方式來呈現。
我用把這種概念下算出來的大戶累計買進張數及大戶累計賣出張數,分別寫成兩個函數:XBvolume及XSvolume,公式分別如下
XBvolume
variable: intrabarpersist XBvolume(0);//累計大戶買單 variable: intrabarpersist Volumestamp(0); Volumestamp =q_DailyVolume; if Date <> currentdate or Volumestamp = Volumestamp[1] then XBvolume =0; //開盤那根要歸0 if q_tickvolume*q_Last > 1000 and q_BidAskFlag=1 then XBvolume=XBvolume+q_tickvolume; //量夠大就加到累計大戶買單 //1000代表大戶的標準是100萬,如果想要改變定義請自行修改數字
XSvolume
variable: intrabarpersist XSvolume(0);//累計大戶賣單 variable: intrabarpersist Volumestamp(0); Volumestamp =q_DailyVolume; if Date <> currentdate or Volumestamp = Volumestamp[1] then XSvolume =0; if q_tickvolume*q_Last > 1000 and q_BidAskFlag=-1 then XSvolume=XSvolume+q_tickvolume;
所以如果想要算大戶盤中即時買賣超張數,就可以直接XBvolume-XSvolume就可以
如果想要算散戶,也可以用這樣的概念來作。
不過要跟大家抱歉的是,目前只能用在策略雷達的腳本上,不能用在指標也不能用在選股,這點要先跟大家說明。
由於預估量對當沖操作者很重要,一直有使用者來信詢問我們系統內建預估量的計算方法,也有不少熱心的使用者建議了一些演算方式。我們目前系統內建的演算法是依過往每分鐘成交量分佈比重,然後從當天的累計量去估算預估量,這樣的作法大家意見不大,但對於要拿多少天的歷史資料去估算成交量分佈情況,大家的意見差很多,我們公司的高手高高手,索性公開預估量的計算腳本,並且把成交量分佈比重究竟要拿多少天的歷史資料去估算,設成參數讓使用者自行來設計,這樣一來,大家就可以很容易的透過調整參數的方式,找到自己認為最貼近事實的估計量
這個估計量的腳本如果作成指標,其腳本如下
// // 參數: 統計天期(N) // 繪製: 當日估計成交量 // // 支援任何頻率(分鐘/日) // // 計算方式: 依照過去N日, 每日1分鐘累計成交均量(統計天期平均), 算出每分鐘累計成交量的分佈比例, // 然後依照目前的累計日成交量以及分佈比例, 推算當日收盤估計成交量 // input: length(5, "統計天數"); variable: BARPERDAY(270); // 1分鐘bar每一天270筆 array: arr_minvolume[](0); // (過去N日)每日每分鐘累計: 共length * 270筆 array: arr_minvolume_percent[270](0); // (平均)每分鐘累計成交量比例: 共270筆 array: arr_avg_minvolume[270](0); // (平均)每分鐘累計成交量: 共270筆 variable: _i(0), _j(0), _k(0); variable: _totaldays(0); variable: _lastdate(0); Array_SetMaxIndex(arr_minvolume, length * 270); { print(text( "currentbar=", numtostr(currentbar, 0), ",date=", numtostr(date, 0), ",time=", numtostr(time, 0), ",lastdate=", numtostr(_lastdate, 0), ",totaldays=", numtostr(_totaldays, 0) )); } if _lastdate = 0 then begin // 跳過第一個不滿一天的資料 if barfreq = "Min" and time = 090000 then _lastdate = date else begin // 日線的話則從20190101才開始算 if date >= 20190101 then _lastdate = date; end; end; if _lastdate <> 0 and date <> _lastdate then begin _lastdate = date; _totaldays = _totaldays + 1; if _totaldays >= length then begin // 計算過去N天的成交量分佈 // // 因為我可能跑在不同頻率上, 所以要先算出過去N日'1分鐘'資料的起點跟終點 // variable: _start(0), _end(0), _startdate(0), _accvolume(0); _end = 1; while getfield("time", "1")[_end] <> 132900 begin _end = _end + 1; end; _start = _end + BARPERDAY * length - 1; // _start = 統計日期第一日第一筆1分鐘資料的位置 // _end = 統計日期最後一日最後一筆1分鐘資料的位置 // // arr_minvolume[]: 儲存過去N天, 每一分鐘的日累積成交量 // arr_minvolume[1] = 09:00, // arr_minvolume[2] = 09:01 // arr_minvolume[271] = 第二天09:00 // .. _startdate = getfield("date", "1")[_start]; _accvolume = 0; for _i = _start downto _end begin if _startdate <> getfield("date", "1")[_i] then begin // 換日 _accvolume = 0; _startdate = getfield("date", "1")[_i]; end; _accvolume += getfield("volume", "1")[_i]; arr_minvolume[_start - _i + 1] = _accvolume; // 當日累積volume end; // arr_avg_minvolume[]: 每一分鐘的日平均累積成交量 // for _j = 1 to BARPERDAY begin arr_avg_minvolume[_j] = 0; for _i = 1 to length begin arr_avg_minvolume[_j] += arr_minvolume[_j + (_i - 1) * BARPERDAY]; end; end; for _j = 1 to BARPERDAY begin arr_avg_minvolume[_j] = arr_avg_minvolume[_j] / length; end; // arr_minvolume_percent[]: 每一分鐘的日平均累積成交量% // for _j = 1 to BARPERDAY begin arr_minvolume_percent[_j] = arr_avg_minvolume[_j] / arr_avg_minvolume[BARPERDAY]; end; { print(text( "main-date=", numtostr(date, 0), ",", "main-time=", numtostr(time, 0), ",", "start=", numtostr(_start, 0), ",", "end=", numtostr(_end, 0), ",", "startdate=", numtostr(getfield("date", "1")[_start], 0), ",", numtostr(getfield("time", "1")[_start], 0), ",", "enddate=", numtostr(getfield("date", "1")[_end], 0), ",", numtostr(getfield("time", "1")[_end], 0), "," )); for _i = 1 to 270 begin print(text( numtostr(_i, 0), "=", numtostr(arr_minvolume_percent[_i] * 100, 2))); end; } end; end; if _totaldays >= length then begin // 如果已經有分佈資料了, 則計算估計成交量 // variable: _estvolume(0); variable: _timeindex(0); variable: _time(0), _v(0); // 算出目前時間應該是1~270的哪一筆 // 分鐘線的話就用bar的時間 // 日線的話, 如果是歷史日線, 就用收盤時間估算, 如果是最後一天(盤中日線), 用目前時間估算 // if barfreq = "Min" then _time = time else begin if date < currentdate then _time = 132900 else _time = currenttime; end; _timeindex = floor(timediff(_time, 090000, "M")) + 1; _timeindex = minlist(_timeindex, 270); _timeindex = maxlist(1, _timeindex); // 預估量 = 累計到目前的日成交量 / 這個時間點之前所佔的日成交量% // _v = GetField("volume", "D"); if arr_minvolume_percent[_timeindex] > 0 then _estvolume = _v / arr_minvolume_percent[_timeindex] else _estvolume = 0; plot1(_estvolume, "預估量"); end;
我也試著把這個預估量的腳本寫成函數
input: length(numericsimple); variable: BARPERDAY(270); // 1分鐘bar每一天270筆 array: arr_minvolume[](0); // (過去N日)每日每分鐘累計: 共length * 270筆 array: arr_minvolume_percent[270](0); // (平均)每分鐘累計成交量比例: 共270筆 array: arr_avg_minvolume[270](0); // (平均)每分鐘累計成交量: 共270筆 variable: _i(0), _j(0), _k(0); variable: _totaldays(0); variable: _lastdate(0); Array_SetMaxIndex(arr_minvolume, length * 270); { print(text( "currentbar=", numtostr(currentbar, 0), ",date=", numtostr(date, 0), ",time=", numtostr(time, 0), ",lastdate=", numtostr(_lastdate, 0), ",totaldays=", numtostr(_totaldays, 0) )); } if _lastdate = 0 then begin // 跳過第一個不滿一天的資料 if barfreq = "Min" and time = 090000 then _lastdate = date else begin // 日線的話則從20190101才開始算 if date >= 20190101 then _lastdate = date; end; end; if _lastdate <> 0 and date <> _lastdate then begin _lastdate = date; _totaldays = _totaldays + 1; if _totaldays >= length then begin // 計算過去N天的成交量分佈 // // 因為我可能跑在不同頻率上, 所以要先算出過去N日'1分鐘'資料的起點跟終點 // variable: _start(0), _end(0), _startdate(0), _accvolume(0); _end = 1; while getfield("time", "1")[_end] <> 132900 begin _end = _end + 1; end; _start = _end + BARPERDAY * length - 1; // _start = 統計日期第一日第一筆1分鐘資料的位置 // _end = 統計日期最後一日最後一筆1分鐘資料的位置 // // arr_minvolume[]: 儲存過去N天, 每一分鐘的日累積成交量 // arr_minvolume[1] = 09:00, // arr_minvolume[2] = 09:01 // arr_minvolume[271] = 第二天09:00 // .. _startdate = getfield("date", "1")[_start]; _accvolume = 0; for _i = _start downto _end begin if _startdate <> getfield("date", "1")[_i] then begin // 換日 _accvolume = 0; _startdate = getfield("date", "1")[_i]; end; _accvolume += getfield("volume", "1")[_i]; arr_minvolume[_start - _i + 1] = _accvolume; // 當日累積volume end; // arr_avg_minvolume[]: 每一分鐘的日平均累積成交量 // for _j = 1 to BARPERDAY begin arr_avg_minvolume[_j] = 0; for _i = 1 to length begin arr_avg_minvolume[_j] += arr_minvolume[_j + (_i - 1) * BARPERDAY]; end; end; for _j = 1 to BARPERDAY begin arr_avg_minvolume[_j] = arr_avg_minvolume[_j] / length; end; // arr_minvolume_percent[]: 每一分鐘的日平均累積成交量% // for _j = 1 to BARPERDAY begin arr_minvolume_percent[_j] = arr_avg_minvolume[_j] / arr_avg_minvolume[BARPERDAY]; end; { print(text( "main-date=", numtostr(date, 0), ",", "main-time=", numtostr(time, 0), ",", "start=", numtostr(_start, 0), ",", "end=", numtostr(_end, 0), ",", "startdate=", numtostr(getfield("date", "1")[_start], 0), ",", numtostr(getfield("time", "1")[_start], 0), ",", "enddate=", numtostr(getfield("date", "1")[_end], 0), ",", numtostr(getfield("time", "1")[_end], 0), "," )); for _i = 1 to 270 begin print(text( numtostr(_i, 0), "=", numtostr(arr_minvolume_percent[_i] * 100, 2))); end; } end; end; if _totaldays >= length then begin // 如果已經有分佈資料了, 則計算估計成交量 // variable: _estvolume(0); variable: _timeindex(0); variable: _time(0), _v(0); // 算出目前時間應該是1~270的哪一筆 // 分鐘線的話就用bar的時間 // 日線的話, 如果是歷史日線, 就用收盤時間估算, 如果是最後一天(盤中日線), 用目前時間估算 // if barfreq = "Min" then _time = time else begin if date < currentdate then _time = 132900 else _time = currenttime; end; _timeindex = floor(timediff(_time, 090000, "M")) + 1; _timeindex = minlist(_timeindex, 270); _timeindex = maxlist(1, _timeindex); // 預估量 = 累計到目前的日成交量 / 這個時間點之前所佔的日成交量% // _v = GetField("volume", "D"); if arr_minvolume_percent[_timeindex] > 0 then _estvolume = _v / arr_minvolume_percent[_timeindex] else _estvolume = 0; destvolume=_estvolume; end;
利用這個Destvolume的函數,我們就可以寫出預估量比五日均量增加N%的警示腳本
input:day(10,"預估量估算期間"); input:period(20,"均量計算期間"); input:ratio(80," 暴量比例"); if destvolume(day) crosses over average(volume,period)*(1+ratio/100) and close>close[1]*1.01 then ret=1;
至於預估量的成交量分配要用過往幾天的值來估算,我個人偏向於不要太長,因為太長要計算的時間很久,而且跟目前的交易實況可能會有落差。
以上是預估量的計算腳本大公開
有不同想法的朋友也可以再提出來
大家的目標都是想要把預估量計算的愈來愈貼近實際量
在美股隊長操作秘笈這本書裡,有提到一個概念:指數見底時,率先上漲及創新高的類股,往往就是下一波的強勢族群。目前在XQ全球贏家美股版中,有提供道瓊中產業指數,我運用這組報價組合,配合書上介紹的相對強勢概念,設了一個類股輪動的觀察頁面。
這個頁面的樣式如下:
頁面的下載點如下
RS的腳本如下
input:preiod(20,"RS移動平均線計算期別"); value1=GetSymbolField("GSPC.FS","收盤價","W"); variable:rss(0); variable:rssav(0); if value1<>0 then rss=CLOSE/value1; rssav=average(rss,10); plot1(rss,"美股RS指標"); plot2(rssav,"移動平均");
這裡用的比較商品是用S&P500指數。
目前道瓊中產業指數裡約有184個不同的行業指數,其中跟台灣比較有產業連動的,包括輪胎,汽車零件,半導體,服裝零售業,傢俱,海運,化工,科技硬體與設備,基本原料,航太與國防,鞋業,電腦硬體,紙業,消費電子等產業。
有興趣的朋友可以下載這一頁來監控美股產業的輪動