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

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次的腳本

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;

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

 

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