1. 特殊公式腳本編寫
要編寫一個公式,必須要明確這個公式對應的理論知識。一套完整的理論知識且能在通達信的公式平台上做成公式還要滿足如下要求:
1,從該理論應能分析出公式啟動的起始數據。如股票的開高低收價格、成交量、各財務數據、各即時數據、時間數據、一些常見的技術分析概念、其他理論的結果等,這些數據大部分是系統提供的,而最后兩項則要從其他公式中得來也就是對應於公式編寫中的指標引用操作(當然在這公式編寫前要確保該要引用的指標已實現)。
2,從理論中應能分析出起始數據到結果的明確運算過程。在公式平台中提供了一些系統函數,這些函數包含了部分常用的運算過程(如HHV(X,N) 可求N周期內X最高值)。如果理論中的運算過程拆解完全后,能由公式平台中的函數及允許的基本運算全部組成就可以編寫成公 式了。
在之前的學習當中,我們已經對公式系統、公式腳本編輯有了基本的認識。公式系統提供給我們的基本函數、系統公式,就是我們運用公式系統編寫自己的公式時的基本元素。對於一些常見的技術分析概念的編寫在上一章節已經給出了介紹和示例,本章節主要來介紹一下在公式腳本編寫如果用系統函數及基本運算來解決一些特殊難題。
1.1在分鍾周期下划分交易日
1. 均線(分鍾):
指標名稱:均線(分鍾)
指標原理:均價=累加自當日開市到當前K線時間內的成交金額/累加自當日開市到當前K線時間內的成交量。
編寫分析:
1.確定交易日內第一根K線的位置(難點);
2.自1中確定的位置累加成交金額、成交量(由系統函數SUM實現);
3.由成交金額、成交量求均價(由除法操作符實現)。
公式腳本:
FIRST:=IF(PERIOD=0,HOUR=9 AND MINUTE=31,
IF(PERIOD=1,HOUR=9 AND MINUTE=35,
IF(PERIOD=2,HOUR=9 AND MINUTE=45,
IF(PERIOD=3,HOUR=10 AND MINUTE=0,
IF(PERIOD=4,HOUR=10 AND MINUTE=30,0)))));
SUM(AMO,BARSLAST(FIRST)+1)/SUM(VOL,BARSLAST(FIRST)+1);
上面的公式適用於1分鍾,5分鍾,15分鍾,30分鍾,60分鍾等五個周期下。將給出每個交易日中各周期下均線的走勢。公式腳本編寫中的重點就是First變量的確定,這也是這段腳本的亮點。First變量表示的是當日當前周期的第一根K線位置,是通過IF函數的嵌套使用結合各分鍾周期的第一根K線的時間得來的。
1.2 跨周期引用數據
在同一個公式腳本中,所有變量的數據周期都是相同的,就是調用公式時設置的周期。在公式腳本中要用其它周期的數據,共有兩種方式:
1、 對變量用變周期符號(#),改變其周期。這種方式有局限性,只能在小周期公式中得到大周期數據,且僅適用於一些基本數據,如close,high,low,open等。
示例腳本:
日最高價:H;
周最高價:H#WEEK;
運行示例:
2)在公式腳本中調用其它公式以取得其它周期的數據。調用其它公式,並用#設置其周期。如,公式腳本在日線下運行時,可用Kdj.k#week;來獲得kdj在周線下的k值,另屬於於同一周線的日線將獲得相同的K值。
示例腳本:
公式1:
公式名稱:JBSJ
公式描述:基本數據
公式腳本:
JC:C;{當前周期收盤價}
JH:H;{當前周期最高價}
JL:L;{當前周期最低價}
JO:O;{當前周期開盤價}
JYC:REF(C,1);{前一個周期收盤價}
公式2:
公式名稱:TEST049
公式腳本:
日線開盤價:JBSJ.JO#DAY;
周線開盤價:O;
月線開盤價:JBSJ.JO#MONTH;
運行示例:
使用跨周期引用數據時要注意:
1.可供引用的周期類型有:
MIN1,MIN5,MIN15,MIN30,MIN60,DAY,WEEK,MONTH
分別表示將1,5,15,30,60分鍾K線數據,以及日,周,月K線數據,代入被引用的公式,進行運算。
2.意義:
可將大周期內跑的數據,引用到小周期內來跑;也可將小周期內跑的數據,引用到大周期內來跑。
3.切勿對開高低收以外的數據直接使用變周期轉換!
4.切勿對大周期內跑的數據使用小周期轉換!無論是開高低收等基本數據、還是自定義變量,都無法從大周期數據直接轉換成小周期數據,只能通過公式引用來獲得小周期數據。
1.3 對某個時間段統計
1)某絕對時間段最高價
此腳本段求1998年8月3日到1998年12月20日間的最高價:
HH:=IF(YEAR=1998 AND (MONTH>8 OR (MONTH=8 AND DAY>=3) ) AND (MONTH<12 OR (MONTH=12 AND DAY<=20) ),H,0);{HH變量在該時間段內等於H,其他時間為0}
HHV(HH,0);{此例求1998年8月3日到1998年12月20日間的最高價}
2)某相對時間段最高價
60天前到40天前之間的最高價
REF(HHV(H,60-40),40);
1.4 在某個時間段內某條件滿足
TT:=C/REF(C,1)>1.095;{是否漲停}
COUNT(TT,20)>0;{二十個交易日內時候漲停過}
上面的腳本配合1.3中示例可以寫出歷史某絕對時間段,或相對時間內是否漲停過的選股公式。
上圖中的效果還可以借助Filter這個函數來實現。
1.5 K線繪制
示例公式:博弈K線
公式名稱:博弈K線
公式腳本:
BKO:WINNER(O),NODRAW;
BKH:WINNER(H),NODRAW;
BKL:WINNER(L),NODRAW;
BKC:WINNER(C),NODRAW;
DRAWKLINE(BKH,BKO,BKL,BKC);
運行示例:
1.6 創新高周期數
成交量創新高周期數腳本:
FV:=IF(BARSCOUNT(C)=0,9999999999,VOL);
量創新高周期數:SUMBARS(REF(FV,1)-FV,0);
{這里的關鍵是 REF(FV,1)-FV ,想想看寫成 FV-REF(FV,1) 行不行?};
1.7腳本控制
在通達信的公式腳本中沒有專門的控制語句,一切都是變量(僅有輸出與不輸出的區別),所以要實現應用於多種情況的腳本也要依靠變量來控制。
系統函數中有幾個重要的函數就是IF,IFF,IFN,TESTSKIP.請大家注意的是通達信的函數的參數都是先計算出結果然后將參數傳給函數的。因此對於TESTSKIP,最好作為一條單獨的語句來使用。
公式腳本1:同1.2中的JBSJ公式。
{用於引用股票的基本數據。}
公式腳本2:FZMN分鍾模擬
{用於通過幾種分鍾周期的數據模擬出當天對應於改周期的各項數據}
N:=IF(PERIOD=0,1,
IF(PERIOD=1,5,
IF(PERIOD=2,15,
IF(PERIOD=3,30,
IF(PERIOD=4,60,0)))));
CTRL:=TESTSKIP(N=0);{僅用於分鍾周期}
TTIME1:=(TIME/100);
TTIME2:=IF(TTIME1<1000,TTIME1-930,
IF(TTIME1<1100,TTIME1-1000+30,
IF(TTIME1<1131,TTIME1-1100+90,
IF(TTIME1<1300,120,
IF(TTIME1<1400,TTIME1-1300+120,
IF(TTIME1<1500,TTIME1-1400+180,
240))))));
TTIME:=TTIME2/N;
YTC:="JBSJ.JYC#DAY";
YTDPC:="399300$CLOSE#DAY";
ZFS:=(C*1000/YTC)-1000;
AC:="399300$CLOSE";
ZFA:=(AC*1000/YTDPC)-1000;
DJC:(ZFS-ZFA)*YTC/1000+YTC;
DJH:IF(TTIME<2,DJC,HHV(DJC,TTIME-1));
DJL:IF(TTIME<2,DJC,LLV(DJC,TTIME-1));
DJO:REFV(DJC,TTIME-1);
{DRAWKLINE(DJH,DJO,DJL,DJC);};
公式腳本3:
在日線周期下,引用公式2中的數據(通過引用指標設置周期的方法來獲得分鍾周期的數據),通過K線繪制的函數就可以畫出模擬 的K線了。
JH:="FZMN.DJH#MIN5";
JO:=" FZMN.DJO#MIN5";
JLC:=" FZMN.DJL#MIN5";
JC:=" FZMN.DJC#MIN5";
DRAWKLINE(JH,JO,JLC,JC);