2016年5月22日 星期日

範例 - 自訂指標類別

這一章用一個計算N日高點的指標作為一個自訂指標的範例。





 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在除錯視窗回報有意外,因為這是一件已經被理解的意外。

沒有留言:

張貼留言

本人僅以個人知識經驗分享,多所無知,難免有錯,還請見諒。