既然是一串資料,讀取資料時就必須指定資料的位置(時間、索引),所以我們先看看資料存放的樣子。
\ | 前天 | 昨天 | 今天 |
5月10日 | 5月11日 | 5月12日 | |
t | 0 | 1 | 2 |
sft | 2 | 1 | 0 |
報價 | 100 | 105 | 108 |
又過一天...
\ | 大前天 | 前天 | 昨天 | 今天 |
5月10日 | 5月11日 | 5月12日 | 5月13日 | |
t | 0 | 1 | 2 | 3 |
sft | 3 | 2 | 1 | 0 |
報價 | 100 | 105 | 108 | 109 |
取值
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) | 加權移動平均運算 |
沒有留言:
張貼留言