2016年5月16日 星期一

acs-api快速入門(3) - 資料容器

資料容器,就是放置一連串歷史資料的容器(類別),這是寫腳本最最最常用的東西了,所以講的淺顯一點。

既然是一串資料,讀取資料時就必須指定資料的位置(時間、索引),所以我們先看看資料存放的樣子。


\前天昨天今天
5月10日5月11日5月12日
t012
sft210
報價100105108

又過一天...
\大前天前天昨天今天
5月10日5月11日5月12日5月13日
t0123
sft3210
報價100105108109


取值
t跟sft都是這個資料容器的索引,只是t是順時間算,而sft是逆時間算,只要有新的K棒出現這兩個值就會有些變化。t的特性是特定的t永遠能取得特定日期的資料,例如t等於1時永遠是5月11日。sft的特性是永遠能取得與今天保持特定距離的資料,例如sft等於1時永遠能取得'昨天'的資料。通常是sft比較符合我們分析資料的習慣,接下來我直接舉例用法比較快。
 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
lib "personal";

public class MyScript extends CustomCorePersonal
{
 public void init()
 {
  CustomCore_UI_INIT();
 }

 //建立一個叫ma5的資料容器
 MovinNum ma5 = addMovinNum(null);
 public void run()
 {
  //透過MovinNum的內部連續運算(加速)方法運算5日均價
  ma5.ma(close, 0, 5);
  if (t == 100)
  {
   dbg.print("今天的收盤價 : " + close.get(t) + " 或 " + close.ref(0));
   dbg.print("昨天的收盤價 : " + close.ref(1));

   dbg.print("---");
   dbg.print("今天的5ma : " + ma5.ref(0));
   dbg.print("昨天的5ma : " + ma5.ref(1));

   //以下highest、lowest、avg函數在ScriptBasic中可以找到
   dbg.print("---");
   dbg.print("近5日的最高價 : " + highest(high, 5));
   dbg.print("近5日的最低價 : " + lowest(low, 5));
   dbg.print("---");
   dbg.print("今天的5ma : " + avg(close, 0, 5));
   dbg.print("昨天的5ma : " + avg(close, 1, 5));

   //到t等於100時結束腳本執行
   dbg.oprn();
   stop();
  }
 }
}

執行結果:
close就是"收盤價"的資料容器,後面接了get(t)與ref(sft)就是操作容器的函數(方法),這兩個函數都是取值用的,如果還看不懂?自己執行一次試試看吧。

應該不算難理解吧?比較怪的是22跟30行,兩個都可以取得5日均價,其實兩個寫法都沒問題,主要是ma5.ma(close, 0, 5);與avg(close, 0, 5);的用處稍有不同,前者是用MovinNum內部的ma函數,有運算加速功能,後者是用ScriptBasic提供的avg函數,寫法比較簡短。如果ma5會在腳本中一直反覆被使用,建議用前者,如果只是偶爾用或求方便不考慮執行速度,可以用後者。


怎麼宣告?
直接看範例。
 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
lib "personal";

public class MyScript extends CustomCorePersonal
{
 //從核心取得一個每個元素初始值為50的MovinNum
 public MovinNum var_1 = addMovinNum(50);

 //從核心取得一個沒有初始值MovinNum
 public MovinNum var_2 = addMovinNum();

 //自己建立一個每個元素初始值為MovinNum(異步)
 public MovinNum var_3 = new MovinNum(50);

 //自己建立一個沒有初始值MovinNum(異步)
 public MovinNum var_4 = new MovinNum();

 public void init()
 {
  //將自己建立的MovinNum加入核心(異步轉同步)
  joinMovinNum(var_3);
 }

 public void endOfPeriod(int type)
 {
  if (type == EOH)
  {
   dbg.open();
   dbg.print("執行了 : " + (t+1) + "根K棒");
   dbg.print("---");
   dbg.print("var_1 元素量 : " + var_1.size());
   dbg.print("var_2 元素量 : " + var_2.size());
   dbg.print("var_3 元素量 : " + var_3.size());
   dbg.print("var_4 元素量 : " + var_4.size());

   dbg.print("---");
   dbg.print("var_4 push 一個值進去 ");
   var_4.push(99);
   dbg.print("var_4 元素量 : " + var_4.size());
  }
 }
}


這裡宣告四個MovinNum,不同之處參考看註解,比較特別的是var_3跟var_4之後的用法。var_3之後在init時做了joinMovinNum的動作,其實就相當於透過addMovinNum函數得到的MovinNum,通常會這樣寫都是在宣告時不確定這個變數未來是會與K棒數量同步還是異步。var_4則沒有join,所以會變成一個異步的MovinNum,資料必須透過push的動作才會增加。


MovinNum的API
最後大致提一下操作資料容器常用的函數,這章就結束了。
函數說明
double get(int t)以t取值
double ref(int sft)以sft取值
NumSet set(int t, Number value)寫值,回傳自己
NumSet set(Number value)寫值,回傳自己
boolean isNull(int t) 檢查第t個元素是否為null
boolean isNullRef(int sft) 檢查第sft個元素是否為null
NumSet highest(NumSet sample, int shift, int periodN)最大值運算
NumSet lowest(NumSet sample, int shift, int periodN)最小值運算
NumSet median(NumSet sample, int shift, int periodN)中位數運算
NumSet stddev(NumSet sample, int shift, int periodN)標準差運算
NumSet linear(NumSet sample, int shift, int periodN)線性迴歸運算
NumSet avg(NumSet sample)整體平均值運算
NumSet sum(NumSet sample, int shift, int periodN)加總運算
NumSet ma(NumSet sample, int shift, int periodN)移動平均運算
NumSet ema(NumSet sample, int shift, int periodN)指數移動平均運算
NumSet sma(NumSet sample, int shift, int periodN)平滑移動平均運算
NumSet wma(NumSet sample, int shift, int periodN)加權移動平均運算

沒有留言:

張貼留言

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