1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | lib "personal"; public class MyScript extends CustomCorePersonal { //這行是指標做後才從UI導出的程式碼 EXAMPLE_HIGHEST idct = addIdct("K線", "N日高_2", new EXAMPLE_HIGHEST("")); public void init() { //對CustomCore_UI初始化 CustomCore_UI_INIT(); } public void endOfPeriod(int type) { if (type == EOH) dbg.print("最後的N日高為 " + idct.ref(0)); } } //指標類別必須繼承IDCT class EXAMPLE_HIGHEST extends IDCT { //一定要有cate與title final static String cate = "範例"; final static String title = "N日高"; //建構子 public EXAMPLE_HIGHEST(String param) { super(param); //設定參數初始值 _ref_sample_id[0] = CustomCoreUI.SAMPLE_ID_HIGH; _color[0] = GOLD; } //指標初始化 public void init() { //取得參考樣本 sample = getRefSample(0); //使value與樣本資料量同步 setGrowWith(value, sample); //將指標加入CorePartner,與腳本同步執行 core.addCorePartner(this); //設定數值ID與其對應 regValue("值", value, LINE); } //週期參數N public int N = 5; //宣告並實體化一個動態陣列 用來放置計算出來的數值 public MovinNum value = new MovinNum(null); //宣告參考樣本 public NumSet sample = null; //計算指標 public void befTickRun() { try { //將value的值 設定為 sample的N日最高值 value.set(highest(sample, 0, N)); } catch (Throwable e) { /*e.printStackTrace();*/ } } //設定選單 public void setMenu(HtmlInputHelper html) { html.add("參考樣本", core.new InpMenu("_ref_sample_id[0]", core.ARR_SAMPLE_DIR, core.ARR_SAMPLE_ID, 0, this)); html.add("週期", core.new InpNum("N", 1, this)); } } |
這邊的指標(IDCT)其實泛指所有能做成一個有意義的模組的類別,是從CustomCore的library中衍生,並不一定是技術分析裡所講的指標。
逐行的解釋可以先看程式碼的註解,大致的流程是:
1.) 物件初始化(建構子)時先將會用到的參數初始化,改成自己設想好的,或直接不做,後續再透過圖形介面(UI)點選。
2.) 指標初始化(init)時,此時指標後台已經備妥,可以開始做一些相關的指定。第一個regValue的MovinNum即為這個指標的預設參考變數,也就是idct.ref(0)同等於idct.value.ref(0)。
3.) 在befTickRun中計算指標值。
成功執行後就可以在指標的選單上找到"範例>N日高"了。
---
都是蠻制式的寫法,主要幾個名詞需要定義一下。
1.) 樣本(sample),就是指數值取樣的來源,像是計算均線一樣,樣本可以是收盤價,也有人用開盤價。每個樣本都會有自己名字可以對應,像是"基樣.收盤價"("指標名稱.值的名稱"),有些系統預設的。
同樣的,在這個指標範例中的"value"變數也會變成一個樣本,可供其他指標參考。
2.) 資料量同步。因為樣本也可能是一個異步週期,例如核心是日線,但樣本是周線,兩者資料量就會不同,造成無法顯示在同一個週期的圖上。所以這裡的做法是,若樣本是一個異步資料,會先讓指標資料量跟樣本同步(也就是同樣與核心異步),需要同步時(要顯示時)再透過圖形介面(UI)點選,此時會產生另一個同步的動態陣列。這部分聽起來會比較不好理解,其實也不用想太多,就是複製貼上照抄就好。
---
通常指標在開發時我會這樣寫,就是一個檔案裡把MyScript跟IDC寫在一起,但開發完成後我會將指標的部分移到\script\library\personal或\script\library\default下,因為這樣每個腳本都可以用這個指標,主腳本看起來也會比較乾淨。
AC內部寫好的指標都放在\script\library\accustomcore\src\IDCTs\下,大致都有分類,也盡量給予有意義的檔案名稱,是很好的參照範例。
---
此外在66~71處有一個try-catch,是Java的意外捕捉陳述,意思就是說如果try{}裡面的程式碼執行時出現"意外",就會被中斷跳至catch{}裡的程式碼執行。那什麼是意外呢?舉個例子,現在只有50根K棒,但是要函數算出100根K棒的平均價,這時候就會產生一個意外。在AC中通常可以不用處理意外,因為有意外發生大多是該次的run()被中斷,下幾次run()可能就沒問題了,這裡會特別處理是不想AC在除錯視窗回報有意外,因為這是一件已經被理解的意外。
沒有留言:
張貼留言