關於極短線交易策略撰寫上的一些小技巧(一)

By | 2020-02-18

先前介紹我撰寫當沖腳本的流程,今天接著來跟大家介紹一些我自己最常卡關的地方,以及公司高手們的寫法範本,讓大家可以做個參考,介紹卡關的部份之前,先列出我研究過去的分時圖之後,整理的一些想要寫成腳本的敘述

  1. 開盤下跌後馬上站上平盤且急拉後只回檔一兩檔即再創新高
  2. 10點之後帶量突破先前的箱型盤整區,且拉回幅度不大後再創新高
  3. 預估量爆增且大戶買盤成交比例很高
  4. 10點之後創當日新高,也創波段新高
  5. 開高後大盤下跌仍不跌且10點後創新高
  6. 開盤前三分鐘有一分鐘K拉超過2%
  7. 開高後長時間沒有拉回,12後創新高
  8. 開盤後緩步攻堅,一底高過一底,一峰高過一峰
  9. 開盤即暴量跳空突破前幾日盤整以來的高點且未拉回
  10. 開高拉回後迅速創新高
  11. 開盤五分鐘K棒連三紅
  12. 日線盤整結束,當日開高後,底部一路愈墊愈高
  13. 急拉後回檔然後再急拉創高
  14. 開高後多次探底後回升
  15. 開高後不拉回嚐試回補之前日線的跳空下跌
  16. 開盤急拉漲勢結束後現在拉回整理幅度為漲幅的1/3
  17. 沒量的股票突然暴大量急拉
  18. 當天已衝過前一日的高點
  19. 上攻走勢很陡之後拉回整理長期未破底
  20. 開高後拉回整理後突破當日高點
  21. 大跌後,開高直接跳空突破前一天高點且拉回未踫觸到前一天高點
  22. 開盤大跌,但超過10分鐘沒有再破底且一直創當日新高
  23. 開盤大跌但09:30之前就站回平盤
  24. 早盤有急拉,雖然之後有明顯的拉回,但接下來底部愈墊愈高
  25. 外盤量遠超過正水準

我在想要描述這些情況時,最常卡關的有以下的狀況,我請了公司同仁寫了範本給我參考,以下是這些範本的說明

卡關一: 在同一天裡有個值要一直累計該怎麼寫?

例如想要累計今天大買單或大賣單的成交金額或張數,想要累計外盤成交的筆數之類的,這是我們在寫極短線腳本時會常用到的,但卻不知道怎麼寫,後來我請了同事給了我一個範本,他寫的是今天大單買進超過N次的腳本

1input: atVolume(100,"大單門檻");
2input: LaTime(10,"大單筆數");
3input:TXT("須逐筆洗價","使用限制");
4settotalbar(3);
5variable: intrabarpersist Xtime(0);
6//計數器
7variable: intrabarpersist Volumestamp(0);
8Volumestamp =q_DailyVolume;
9if Date> date[1] or 
10Volumestamp = Volumestamp[1]
11then Xtime =0; //開盤那根要歸0次數
12if q_tickvolume > atVolume
13//單筆tick成交量超過大單門檻
14and GetQuote("BidAskFlag")=1
15//外盤成交
16then Xtime+=1; 
17//量夠大就加1次
18if Xtime > LaTime 
19and close>close[1]*1.01
20then 
21begin
22ret=1; 
23Xtime=0;
24end;

這個腳本可以在當個股外盤成交超過100張的次數超過10次時即發出警示訊號,這個腳本的眉角有幾個

1.宣告一個intrabarpersist的變數

關於intrabarpersist的意義及寫法,請參考這個網頁

使用這個語法,在同一根K線裡,逐筆的每個TICK帶來的新變化都會更新該K棒裡的特定宣告變數值,這麼一來,當根K棒裡每個TICK的數據都可以被累計。

2.開盤時計數器歸零的寫作技巧

1variable: intrabarpersist Volumestamp(0);
2Volumestamp =q_DailyVolume;
3if Date> date[1] or 
4Volumestamp = Volumestamp[1]
5then Xtime =0; //開盤那根要歸0次數

這一段的意思是當日量沒有再增加或日期不等於前一筆的日期時,就代表是隔一日的第一筆,這時候計數器就要歸零

3.計數器的寫法

Xtime+=1這樣的寫法,其實是Xtime=Xtime+1的快速寫法,也就是符合前面if的條件時,就加1的意思。這個寫作技巧在計算分數或次數常會用到。

結合這三個撰寫的技巧,就可以在日線的計算的基礎下去累計每個tick的相關數據。

卡關二:計算開盤到現在一共是多少根bar

我們常會寫一些腳本是屬於那種要從第N根1分鐘線開始作計算的腳本,例如開盤八法是去計算前三根五分鐘線的漲跌情況,我的同事寫了一個開盤前三根都是紅K棒的腳本給我

1if barfreq <> "Min" or Barinterval <>1 then RaiseRuntimeError("請設定頻率為1分鐘");
2variable:BarNumberOfToday(0);
3if Date <> Date[1] then
4BarNumberOfToday=1
5else
6BarNumberOfToday+=1;{記錄今天的Bar數}
7if barnumberoftoday=3 then begin
8//今天第三根1分鐘K,也就是開盤第三分鐘
9if trueall(close>=close[1],3)
10//連三根K棒都是紅棒
11and volume>average(volume[1],3)*2
12//成交量是過去三根量平均量的兩倍以上
13and close=highd(0)
14//收最高
15then ret=1;
16end;

這個腳本主要是透過計數器,去計算現在是分鐘K的第幾根,可以用在不同頻率的分鐘K

另外這個腳本也示範了策略指定頻率時要怎麼寫

卡關三:從那一根開始算起,以及第一根要往前引用多少根

我在寫極短線腳本時,經常用到1分鐘線,這時候常會想要確定要拿多少跟K棒來算,以及每一根K棒是計算的第幾根,還有第一根如果要計算像十根移動平均時,必須再往前多拿九根來算,這些到底在腳本上要怎麼設,我常弄的迷迷糊糊,後來我同事就寫了一個範本給我

1input:Length(100,"計算期數");
2input:Ratio(0.5,"突破幅度%");
3input:RRatio(1.5,"盤整區間幅度%");
4input:TXT1("僅適用5分鐘線","使用限制");
5
6settotalbar(3);
7setbarback(Length);
8
9if barfreq<> "Min" or barinterval <> 5 then return;
10
11variable: RangeHigh(0);
12variable: RangeLow(0);
13RangeHigh=highest(close[1],length);
14RangeLow=lowest(close[1],length);
15
16if RangeHigh[1] < RangeLow[1] * (1+ RRatio/100) then begin
17if Close crosses over RangeHigh*(1+Ratio/100)
18and volume>average(volume,length)*1.5
19then ret=1;
20end;

 

這個腳本用到兩個內建函數,一個是用來設定資料讀取範圍的settotalbar,以及設定最大引用範圍的setbarback。這兩個函數的意義,可以參考這一頁

在這個腳本裡,為了要表達糾結均線,所以要拿過去100根的5分鐘K來計算,所以必須把setbarback設為100,但要觀察現在的K棒有沒有突破這糾結的均線,只要看最近幾筆,所以settotalbar設的很短。

透過這兩個函數,我們就可以框定這個腳本要從最近一根之前的第幾根bar開始計算起,然後要往前引用多少根的資料,把每根bar標示號碼之後,就可以用currentbar這個函數來表達現在要的是第幾根,例如以下的腳本是去計算加權平均值,這時候第一根必須引用收盤價作為加權平均值,所以腳本可以如下面這麼寫

1if CurrentBar = 1 then
2    XAverage = Close
3else
4    XAverage = XAverage[1] + Factor * (Close - XAverage[1])

透過Currentbar這個函數,就可以宣告要從第幾根bar開始計算,透過這三個函數,我們就可以很清楚知道要計算的這個時間序列,會從那裡開始被計算,要標定任何一根的特定數據,都可以用currentbar=n來處理,這樣我們就可以楚理這個時間序列裡的每個數據而不會對錯位置。

卡關四:設定某特定時點作為結算點

我在寫極短線腳本時,會希望設定一些特定時間的關卡點,例如09:15或是10點,是午飯時間如12:00之類的,我們同事寫了一個範本給我

1input: timeline(100000); setinputname(1,"時間切算點");
2input:TXT1("限用分鐘線"); setinputname(2,"使用限制");
3input:TXT2("高點自開盤起算"); setinputname(3,"使用說明");
4settotalbar(3);
5if barfreq<> "Min" then return;
6variable:RangeHigh(0);
7if date <> date[1] then RangeHigh = 0;
8if Time < timeline then RangeHigh = maxlist(RangeHigh,high)
9else if time >= timeline and RangeHigh > 0 and Close > RangeHigh*1.005 then ret=1 ;

這個範本的概念是在10點以後,如果突破10點之前的高點就出訊號

這是用Time這個回傳值與設定一個 timeline這樣的參數來設定計算的時間區段,我用這個範本就知道怎麼處理時間的問題了

卡關五:如何在分鐘線裡引用日線的價量資料

我們在透過分鐘線描述當天走勢時,常常會想要考慮到日線對應的價量關係,例如今天盤中一分鐘線突破前一根日線高點之類的想法,這時候會希望可以在分鐘線的腳本中,引用日線的價量資料,這時候就需要用到一些語法上的小技巧,茲舉例如下

1input: volumeRatio(0.1, "分鐘量暴量比例");
2input: changeRatio(3, "最近3日最大上漲幅度");
3input: averageVolume(1000, "5日均量");
4
5variable:KBarOfDay(0), BreakHigh(false);
6
7KBarOfDay+=1;
8if date<>date[1] then begin
9KBarOfDay=1; 
10BreakHigh = false;
11end; 
12
13condition1 = KBarOfDay = 6;
14//一分鐘線每天的第六根
15
16condition2 = Countif(High > High[1] and Close > Close[1] ,5) >=3;
17//近五根裡至少三根最高價比前一根高且收盤比前一根高
18
19if KBarOfDay = 1
20and close > getfield("close", "d")[1] 
21//一分鐘線第一根的最新價格高於前一日的收盤價
22then BreakHigh = true;
23//開高
24
25value1 = average(GetField("Volume", "D")[1], 5);
26//用getfield語法來取得過去五天成交量再作移動平均
27//五日均量
28
29condition3 = value1 > averageVolume;
30//五日均量大於某張數
31
32value2 = rateofchange(GetField("Close", "D")[1], 3);
33condition4 = AbsValue(value2) < changeRatio;
34//前三日漲帳幅小於一定標準
35
36condition5 = summation(volume, 5) > value1 * volumeRatio;
37//前五根一分鐘線成交量的合計大於五日均量某個比例
38
39if condition1 and condition2 and condition3
40and Condition4 and Condition5 
41and BreakHigh
42then ret=1;

這個腳本裡跑的是一分鐘線,主敘述是近幾天整理格局的股票,開盤跳空上漲且五分鐘內到少三次創新高,且成交量增加,這裡必須用日線來描敘跳高,計算五日均線,以及描敘過去幾點基本上屬於盤整格局,這些都是需要用到日線,這個樣本透過 getfield語法,在1分鐘線裡,大量的使用日線的收盤價及成交量來協助運算。

卡關六:如何撰寫突破盤中整理時高點的腳本?

我在描繪分時圖盤整後突破高點時,不知道要怎麼寫才合適? 同事給了我一個範本如下

1input:HitTimes(3,"設定觸頂次數");
2input:RangeRatio(1,"設定頭部區範圍寬度%");
3input:Length(20,"計算期數");
4
5settotalbar(Length + 3);
6
7variable: theHigh(0);
8theHigh = Highest(High[1],Length); 
9//找到過去其間的最高點
10variable: HighLowerBound(0); 
11HighLowerBound = theHigh *(100-RangeRatio)/100;
12// 設為瓶頸區間上界
13variable: TouchRangeTimes(0); 
14
15//回算在此區間中 進去瓶頸區的次數 
16TouchRangeTimes = CountIF(High[1] > HighLowerBound, Length);
17
18if TouchRangeTimes >= HitTimes and close > theHigh then ret=1;

這個腳本是用來描繪在分鐘線下底下,一段時間以來,多次股價有上攻到高點附近但都拉回,最後則順利站上新高點的腳本,這個腳本的做法是先把高點標示出來,然後畫出一塊高原區,只要股價有進到高原區就算一次上攻,然後如果先前有進攻三次以上,就算是多次上攻。

 

以上是我在撰寫分鐘線腳本時所踫到的一些卡關的地方,以及語法上對應的寫法樣本,祝大家都能順利寫出自己的想法。