先前介紹我撰寫當沖腳本的流程,今天接著來跟大家介紹一些我自己最常卡關的地方,以及公司高手們的寫法範本,讓大家可以做個參考,介紹卡關的部份之前,先列出我研究過去的分時圖之後,整理的一些想要寫成腳本的敘述
- 開盤下跌後馬上站上平盤且急拉後只回檔一兩檔即再創新高
- 10點之後帶量突破先前的箱型盤整區,且拉回幅度不大後再創新高
- 預估量爆增且大戶買盤成交比例很高
- 10點之後創當日新高,也創波段新高
- 開高後大盤下跌仍不跌且10點後創新高
- 開盤前三分鐘有一分鐘K拉超過2%
- 開高後長時間沒有拉回,12後創新高
- 開盤後緩步攻堅,一底高過一底,一峰高過一峰
- 開盤即暴量跳空突破前幾日盤整以來的高點且未拉回
- 開高拉回後迅速創新高
- 開盤五分鐘K棒連三紅
- 日線盤整結束,當日開高後,底部一路愈墊愈高
- 急拉後回檔然後再急拉創高
- 開高後多次探底後回升
- 開高後不拉回嚐試回補之前日線的跳空下跌
- 開盤急拉漲勢結束後現在拉回整理幅度為漲幅的1/3
- 沒量的股票突然暴大量急拉
- 當天已衝過前一日的高點
- 上攻走勢很陡之後拉回整理長期未破底
- 開高後拉回整理後突破當日高點
- 大跌後,開高直接跳空突破前一天高點且拉回未踫觸到前一天高點
- 開盤大跌,但超過10分鐘沒有再破底且一直創當日新高
- 開盤大跌但09:30之前就站回平盤
- 早盤有急拉,雖然之後有明顯的拉回,但接下來底部愈墊愈高
- 外盤量遠超過正水準
我在想要描述這些情況時,最常卡關的有以下的狀況,我請了公司同仁寫了範本給我參考,以下是這些範本的說明
卡關一: 在同一天裡有個值要一直累計該怎麼寫?
例如想要累計今天大買單或大賣單的成交金額或張數,想要累計外盤成交的筆數之類的,這是我們在寫極短線腳本時會常用到的,但卻不知道怎麼寫,後來我請了同事給了我一個範本,他寫的是今天大單買進超過N次的腳本
input: atVolume(100,"大單門檻"); input: LaTime(10,"大單筆數"); input:TXT("須逐筆洗價","使用限制"); settotalbar(3); variable: intrabarpersist Xtime(0); //計數器 variable: intrabarpersist Volumestamp(0); Volumestamp =q_DailyVolume; if Date> date[1] or Volumestamp = Volumestamp[1] then Xtime =0; //開盤那根要歸0次數 if q_tickvolume > atVolume //單筆tick成交量超過大單門檻 and GetQuote("BidAskFlag")=1 //外盤成交 then Xtime+=1; //量夠大就加1次 if Xtime > LaTime and close>close[1]*1.01 then begin ret=1; Xtime=0; end;
這個腳本可以在當個股外盤成交超過100張的次數超過10次時即發出警示訊號,這個腳本的眉角有幾個
1.宣告一個intrabarpersist的變數
關於intrabarpersist的意義及寫法,請參考這個網頁
使用這個語法,在同一根K線裡,逐筆的每個TICK帶來的新變化都會更新該K棒裡的特定宣告變數值,這麼一來,當根K棒裡每個TICK的數據都可以被累計。
2.開盤時計數器歸零的寫作技巧
variable: intrabarpersist Volumestamp(0); Volumestamp =q_DailyVolume; if Date> date[1] or Volumestamp = Volumestamp[1] then Xtime =0; //開盤那根要歸0次數
這一段的意思是當日量沒有再增加或日期不等於前一筆的日期時,就代表是隔一日的第一筆,這時候計數器就要歸零
3.計數器的寫法
Xtime+=1這樣的寫法,其實是Xtime=Xtime+1的快速寫法,也就是符合前面if的條件時,就加1的意思。這個寫作技巧在計算分數或次數常會用到。
結合這三個撰寫的技巧,就可以在日線的計算的基礎下去累計每個tick的相關數據。
卡關二:計算開盤到現在一共是多少根bar
我們常會寫一些腳本是屬於那種要從第N根1分鐘線開始作計算的腳本,例如開盤八法是去計算前三根五分鐘線的漲跌情況,我的同事寫了一個開盤前三根都是紅K棒的腳本給我
if barfreq <> "Min" or Barinterval <>1 then RaiseRuntimeError("請設定頻率為1分鐘"); variable:BarNumberOfToday(0); if Date <> Date[1] then BarNumberOfToday=1 else BarNumberOfToday+=1;{記錄今天的Bar數} if barnumberoftoday=3 then begin //今天第三根1分鐘K,也就是開盤第三分鐘 if trueall(close>=close[1],3) //連三根K棒都是紅棒 and volume>average(volume[1],3)*2 //成交量是過去三根量平均量的兩倍以上 and close=highd(0) //收最高 then ret=1; end;
這個腳本主要是透過計數器,去計算現在是分鐘K的第幾根,可以用在不同頻率的分鐘K
另外這個腳本也示範了策略指定頻率時要怎麼寫
卡關三:從那一根開始算起,以及第一根要往前引用多少根
我在寫極短線腳本時,經常用到1分鐘線,這時候常會想要確定要拿多少跟K棒來算,以及每一根K棒是計算的第幾根,還有第一根如果要計算像十根移動平均時,必須再往前多拿九根來算,這些到底在腳本上要怎麼設,我常弄的迷迷糊糊,後來我同事就寫了一個範本給我
input:Length(100,"計算期數"); input:Ratio(0.5,"突破幅度%"); input:RRatio(1.5,"盤整區間幅度%"); input:TXT1("僅適用5分鐘線","使用限制"); settotalbar(3); setbarback(Length); if barfreq<> "Min" or barinterval <> 5 then return; variable: RangeHigh(0); variable: RangeLow(0); RangeHigh=highest(close[1],length); RangeLow=lowest(close[1],length); if RangeHigh[1] < RangeLow[1] * (1+ RRatio/100) then begin if Close crosses over RangeHigh*(1+Ratio/100) and volume>average(volume,length)*1.5 then ret=1; end;
這個腳本用到兩個內建函數,一個是用來設定資料讀取範圍的settotalbar,以及設定最大引用範圍的setbarback。這兩個函數的意義,可以參考這一頁
在這個腳本裡,為了要表達糾結均線,所以要拿過去100根的5分鐘K來計算,所以必須把setbarback設為100,但要觀察現在的K棒有沒有突破這糾結的均線,只要看最近幾筆,所以settotalbar設的很短。
透過這兩個函數,我們就可以框定這個腳本要從最近一根之前的第幾根bar開始計算起,然後要往前引用多少根的資料,把每根bar標示號碼之後,就可以用currentbar這個函數來表達現在要的是第幾根,例如以下的腳本是去計算加權平均值,這時候第一根必須引用收盤價作為加權平均值,所以腳本可以如下面這麼寫
if CurrentBar = 1 then XAverage = Close else XAverage = XAverage[1] + Factor * (Close - XAverage[1])
透過Currentbar這個函數,就可以宣告要從第幾根bar開始計算,透過這三個函數,我們就可以很清楚知道要計算的這個時間序列,會從那裡開始被計算,要標定任何一根的特定數據,都可以用currentbar=n來處理,這樣我們就可以楚理這個時間序列裡的每個數據而不會對錯位置。
卡關四:設定某特定時點作為結算點
我在寫極短線腳本時,會希望設定一些特定時間的關卡點,例如09:15或是10點,是午飯時間如12:00之類的,我們同事寫了一個範本給我
input: timeline(100000); setinputname(1,"時間切算點"); input:TXT1("限用分鐘線"); setinputname(2,"使用限制"); input:TXT2("高點自開盤起算"); setinputname(3,"使用說明"); settotalbar(3); if barfreq<> "Min" then return; variable:RangeHigh(0); if date <> date[1] then RangeHigh = 0; if Time < timeline then RangeHigh = maxlist(RangeHigh,high) else if time >= timeline and RangeHigh > 0 and Close > RangeHigh*1.005 then ret=1 ;
這個範本的概念是在10點以後,如果突破10點之前的高點就出訊號
這是用Time這個回傳值與設定一個 timeline這樣的參數來設定計算的時間區段,我用這個範本就知道怎麼處理時間的問題了
卡關五:如何在分鐘線裡引用日線的價量資料
我們在透過分鐘線描述當天走勢時,常常會想要考慮到日線對應的價量關係,例如今天盤中一分鐘線突破前一根日線高點之類的想法,這時候會希望可以在分鐘線的腳本中,引用日線的價量資料,這時候就需要用到一些語法上的小技巧,茲舉例如下
input: volumeRatio(0.1, "分鐘量暴量比例"); input: changeRatio(3, "最近3日最大上漲幅度"); input: averageVolume(1000, "5日均量"); variable:KBarOfDay(0), BreakHigh(false); KBarOfDay+=1; if date<>date[1] then begin KBarOfDay=1; BreakHigh = false; end; condition1 = KBarOfDay = 6; //一分鐘線每天的第六根 condition2 = Countif(High > High[1] and Close > Close[1] ,5) >=3; //近五根裡至少三根最高價比前一根高且收盤比前一根高 if KBarOfDay = 1 and close > getfield("close", "d")[1] //一分鐘線第一根的最新價格高於前一日的收盤價 then BreakHigh = true; //開高 value1 = average(GetField("Volume", "D")[1], 5); //用getfield語法來取得過去五天成交量再作移動平均 //五日均量 condition3 = value1 > averageVolume; //五日均量大於某張數 value2 = rateofchange(GetField("Close", "D")[1], 3); condition4 = AbsValue(value2) < changeRatio; //前三日漲帳幅小於一定標準 condition5 = summation(volume, 5) > value1 * volumeRatio; //前五根一分鐘線成交量的合計大於五日均量某個比例 if condition1 and condition2 and condition3 and Condition4 and Condition5 and BreakHigh then ret=1;
這個腳本裡跑的是一分鐘線,主敘述是近幾天整理格局的股票,開盤跳空上漲且五分鐘內到少三次創新高,且成交量增加,這裡必須用日線來描敘跳高,計算五日均線,以及描敘過去幾點基本上屬於盤整格局,這些都是需要用到日線,這個樣本透過 getfield語法,在1分鐘線裡,大量的使用日線的收盤價及成交量來協助運算。
卡關六:如何撰寫突破盤中整理時高點的腳本?
我在描繪分時圖盤整後突破高點時,不知道要怎麼寫才合適? 同事給了我一個範本如下
input:HitTimes(3,"設定觸頂次數"); input:RangeRatio(1,"設定頭部區範圍寬度%"); input:Length(20,"計算期數"); settotalbar(Length + 3); variable: theHigh(0); theHigh = Highest(High[1],Length); //找到過去其間的最高點 variable: HighLowerBound(0); HighLowerBound = theHigh *(100-RangeRatio)/100; // 設為瓶頸區間上界 variable: TouchRangeTimes(0); //回算在此區間中 進去瓶頸區的次數 TouchRangeTimes = CountIF(High[1] > HighLowerBound, Length); if TouchRangeTimes >= HitTimes and close > theHigh then ret=1;
這個腳本是用來描繪在分鐘線下底下,一段時間以來,多次股價有上攻到高點附近但都拉回,最後則順利站上新高點的腳本,這個腳本的做法是先把高點標示出來,然後畫出一塊高原區,只要股價有進到高原區就算一次上攻,然後如果先前有進攻三次以上,就算是多次上攻。
以上是我在撰寫分鐘線腳本時所踫到的一些卡關的地方,以及語法上對應的寫法樣本,祝大家都能順利寫出自己的想法。