2016年5月31日 星期二

範例 - 2D選股(列表視窗)

2D指的是個股的"時間軸"與"價格",就像看一般技術分析的K線圖一樣,只看得到當下的標的,沒辦法做整體分析,這我稱為2D。而3D就是同時能看到"所有標的"的"時間軸"與"價格",可以參考排序與過濾(選股)


2D分析的邏輯就是僅能針對單一標的逐個執行,從腳本中可能看不太出來,不過事情就是這樣。
 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
lib "personal";

public class MyScript extends CustomCorePersonal
{
 //選單需要的變數
 double MA_N = 10;
 double PRICE = 10;

 MA ma = null;
 public void init()
 {
  dbg.open();
  //初始化圖形指標介面 (但要關閉一些項目)
  cc_cfg.SHOW_MENU = false;
  cc_cfg.PAINT_LAYER = false;
  CustomCore_UI_INIT();

  //加入指標 (程式碼從圖形介面導出)
  ma = addIdct("K線", "移動平均_2", new MA("N[0]="+MA_N));

  //加入欄位
  tbl.addCol("日期", 2, RIGHT, true);
  tbl.addCol("收盤", 2, RIGHT, true);
  tbl.addCol(MA_N+"MA", 2, RIGHT, true);
  tbl.addCol("交易量", 2, RIGHT, true);
 }

 //製作選單
 public void eventShowInput()
 {
  HtmlInputHelper html = new HtmlInputHelper(LIGHTGRAY);
  html.add("選出", new InpNum("MA_N", 1, 3), "日均線向上");
  html.add("且 收盤價大於", new InpNum("PRICE", 1, 3), "的股票");

  updateInput(html.get());
 }

 public void endOfPeriod(int type)
 {
  //於EOH時才執行過濾判斷
  if (type == EOH)
  {
   //stop()用於通知系統這個核心已經不再需要執行
   //若是在盤中仍需執行則不用stop(),但須注意記憶體的用量
   if (close.ref(0)<PRICE)
    {stop();return;}
   if (ma.isNullRef(1) || ma.ref(0)<ma.ref(1))
    {stop();return;}

   //通過選股條件後,新增一列資料到列表中
   AcTableRow row = tbl.newRow(symbol, name);
   tbl.addRow(row);

   row.setDate(date.ref(0));

   row.setCell(0, date.ref(0).getTime(), date2Str(date.get(t), "yyyy-MM-dd"), black);

   row.setCell(1, close.ref(0), close.ref(0), black);

   row.setCell(2, ma.ref(0), round(ma.ref(0), 2), black);

   row.setCell(3, (long)vol.ref(0), black);
   
   stop();
  }
 }
}

程式碼很好懂,看看程式註解應該就能掌握了。

比較會有問題的部分可能在設定,常有選股結果一片空白的情況,通常是下面幾種情形:
1.) 股票池的標的太少,試試看用[設定]>>[列表庫]>>[台股全部]。
2.) 報價資料的天數不夠,例如要找50ma向上的股票,但報價只有給40天。
3.) 選股條件太嚴苛。

大致上是這樣,設定的部分有哪些?可以看一下這個圖。


2D選股還有一種做法,不用寫腳本,用圖形介面點點選選就可以了,腳本在script/chart/99.AC提供/自訂選股.java。

2016年5月29日 星期日

怎麼進行版本更新?

AC一路上更新了很多次版本,也有改到面目全非的程度,好似換了軟體一樣,但軟體功能一直往上提升,有些陣痛也是值得的。

發展至今一直沒有"自動更新"的模組,其實也不是的,一開始是有的,但隨著更新過程不斷推翻太多的東西,自動更新也開始不適用了,所以還是要請各位手動更新,在此提供各位幾個小技巧,減少更新的陣痛。

小技巧
* 如果舊版本運做得很好,建議不要更新,或新舊版本並行。

* 要更新時,以新版本為基底,從舊版本選擇要保留的檔案覆蓋到新版本。

* 將自己開發的腳本放在屬於自己建立的目錄,更新時可以直接搬走。

* 要更新前先備份舊版本,並大膽嘗試直接覆蓋config目錄或其他xml設定檔到新版本。

* 最保險的方式就是全部用新版本,只將腳本搬過去,其餘再手動設定。

* 資料庫以5.x版為分界,前後版不能共用。

lib-api - 各指標API(accustomcore)

雖然我覺得很容易,但可能還是要提一下。我們已經知道如何透過圖形介面新增指標,也知道怎麼把指標的程式碼導出寫到腳本上,但是在腳本要怎麼取得這些指標的各種數值?

例如一個KD指標,我要如果分別取得k跟d值呢?我先講解一個例子,後面就依樣畫葫了。

KD (script\library\accustomcore\src\IDCTs\02.指標\KD.java)
KD指標的長的像是這樣,但剃除了多餘的部分,僅留下你們會用到的部分。
1
2
3
4
5
public class KD extends IDCT
{
 public MovinNum k;
 public MovinNum d;
}

用法範例如下 : (14與15行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
public class MyScript extends CustomCorePersonal
{
 KD kd = addIdct("KD", "KD_3", new KD("")); 

 public void init()
 {
  CustomCore_UI_INIT();
 }

 public void endOfPeriod(int type)
 {
  if (type == EOH)
  {
   dbg.print("K為 : " + kd.k.ref(0));
   dbg.print("D為 : " + kd.d.ref(0));
  }
 }
}


MA
再看一個最常用的均線。
1
2
3
4
public class MA extends IDCT
{
 MovinNum[] value_arr = new MovinNum[DEF_VAR_SIZE];
}

稍微有點不一樣,變成是一個MovinNum的陣列了,會這樣設計是為了讓使用者透過一個指標設定多條均線,但用法大同小異。

1
2
3
dbg.print("預設(同第一條均線) " + ma.ref(0));
dbg.print("第一條均線 " + ma.value_arr[0].ref(0));
dbg.print("第二條均線 " + ma.value_arr[1].ref(0));


---

大致上都可以用類似kd.ref(0)直接取得該指標預設的值,除非該指標含有多種數值,就需要用類似kd.d.ref(0)的寫法。

恕我沒能將所有指標都像這樣帶各位瀏覽一遍,是覺得有點麻煩,但其實accustomcore這個部分是有開放原始碼的,大概看一下變數的宣告其實就知道有什麼變數能用,不算太難,也算是一個小小的考驗吧。

程式交易系統(ACTrader)

這個交易系統我執行了差不多四、五年了,一直沒有釋出,只有幾個朋友在玩,因為早期的版本不完善、不容易上手,直到最近感覺各方面似乎都還挺不錯的,才有了釋出的想法。



2016年5月25日 星期三

lib-api - 指標圖形介面(accustomcore)

除非是要做系統應用的開發,否則這個章節用到的東西極少,一般專注在指標使用、策略、選股等的使用者可以跳過不看。

為求簡單,這個章節只就介面部分提及一些比較有可能用到的變數、函數、類別,更精準用法可以直接參考原始碼(script/library/accustomcore)。

2016年5月24日 星期二

範例 - 排序與過濾(3D選股)

選股的兩大手段,想做機械或程式化者必看。

範例 - 多符號(股票)並行(InnerCore)

大多數狀況下我們的腳本都在處理單一標的物,但面對股票市場,除了單一標的物的時間價格分析外,還必須分析整體的強弱程度,不僅要讓程式告訴我們哪裡進出場,還要能告訴我們該進什麼股票...當然這是一個很大的題目,但我們在這僅討論工具的實現,如果哪天我有資格討論財富的實現,一定會大肆分享一番的XD。

2016年5月23日 星期一

範例 - 引用外部程式+SQLite範例

所謂引用外部程式,就是借助其他外部的.java或.jar程式碼或檔案,使腳本功能得以被擴充,像是SQLite與JFreeChart都是我會引用的jar檔。其實我們一直都在"引用",看看下面這個熟悉的範例。

2016年5月22日 星期日

2016年5月19日 星期四

範例 - 輸入元件(介面)

輸入元件是腳本互動性很重要的一環,就像指標如果無法改變參數造成的困擾一樣,不過如果有繼承CustomCore(指標圖形介面),就不太需要自己做輸入元件的介面了。但對於需要自行開發指標或參數選單的人,這一章可以得到很多東西。


AC可以儲存的變數類型有int、long、double、boolean、String與以上類型的陣列,儲存的方式是透過"變數的名稱"(字串),所以元件的初始化都要給變數的名稱。可以顯示輸入介面的地方有圖格右鍵選單、圖格左側選單、列表則是固定在上方。詳細的用法就透過範例來了解吧。

圖格右鍵選單(或列表選單)


2016年5月16日 星期一

acs-api快速入門(4) - 畫圖與雜項

這是最後一個章節,也是重點比較少的章節,用一個範例快速解決它吧!剩下的以後再以範例解說。

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

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

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


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

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

2016年5月13日 星期五

acs-api快速入門(2) - ScriptBasic

承接上篇未完的acscriptcore,還欠ScriptBasic沒介紹到。

ScriptBasic - 腳本基礎
ScriptBasic中沒有任何的執行機制,純粹就是宣告常數,與一些常用的數學與系統函數。ScriptCore也繼承了這個類別,所以這些常數與函數都是可以直接使用的。

---

基礎數學運算。
函數說明
double abs(double a)取絕對值
long round(double a)四捨五入
double round(double value, int digi)保留小數的四捨五入
double ceil(double a)無條件進位
double floor(double a)無條件捨去
double pow(double a, double n)次方運算
double sqrt(double a)開根號
double log(double a)取對數
double log(double a, double base)取對數
double random(double min, double max)取隨機值
double chgrate(Number value, Number base)回傳變動率


---

"動態陣列"運算。寫指標或策略時這部分是最常用的。
因為同名函數的變形太多,這裡僅列出函數名稱,並以avg做概括說明。
函數名稱說明
highest取最大值
lowest取最小值
sum取總和
avg取平均值
median取中位數
stddev取標準差
linear取線性回歸值
change取變動值
change_rate取變動率

函數說明
double avg(NumSet nset, int range)取nset陣列在range內的平均值
double avg(NumSet nset, int shift, int range)取nset陣列位移shift在range內的平均值
double ma5 = avg(close, 0, 5);

acs-api快速入門(1) - ScriptCore

前面已經介紹過acs-api在系統中的角色了,這邊就直接切入程式的部分吧!

首先從package的分類開始看

PACKAGE說明
acscriptcore腳本核心
acscriptcore.period週期控制
acscriptcore.inpcom圖形輸入元件
acscriptcore.datactnr資料容器
acscriptcore.dataset資料集
acscriptcore.calc統計運算
acscriptcore.layer圖層類
acscriptcore.table表格類
acscriptcore.gears小工具

這些PACKAGE中約莫有50個類別,要都看一遍?實在很乏味...所以這一系列講api的文章,我盡量挑常用的講,用瀏覽的方式看過一遍即可,是你用得上的東西自然就會記住,暫時用不上的留個印象即可,往後會再拿腳本實例來說明如何使用,就比較會不感到艱澀,或硬要搞懂一些與自身無關的東西,浪費時間。

2016年5月11日 星期三

腳本應用型態

AC中腳本的應用主要有兩種型態,一種是圖格,另一種就是列表,除了顯示輸出的方式不同外,下圖可以看出執行上的差異。



2016年5月4日 星期三

腳本系統架構

先談一下何謂API(程式介面),舉例來說,我寫了一個功能強大的程式,在你的程式中想要用我程式中的某些功能,這時候透過的就是所謂的API,即程式與程式間的接合介面。我們先看一下哪些部份有提供API讓腳本使用。

java-api:Java語言原生的程式介面。

ac-api:AC系統提供給使用者開發Plugin(外掛)的程式介面。
acs-api:AC系統提供給使用者開發腳本的程式介面。

plugin-api:Plugin(外掛)提供給使用者開發腳本的程式介面。

library-api:使用者自行設計、或第三方提供給使用者開發腳本的程式介面。



(API一詞我們稱"介面",對岸稱做"接口",聽慣了也算蠻貼切的。)

2016年5月3日 星期二

腳本中預先實體化指標

在前面有介紹過指標圖形介面操作示範 ,教我們怎麼透過圖形介面在圖格中加上指標,但這樣建完了指標要怎麼在腳本中使用啊?


最陽春的腳本
既然都要提到腳本了,就先來看一下最陽春的腳本長什麼樣子
1
2
3
4
5
6
7
8
9
lib "personal";

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

行1 : 引用script\library\personal下的程式碼。
行3 : MyScript是主腳本類別的固定名稱,後面並說明這個類別繼承了另一個叫CustomCorePersonal的類別。
行7 : CustomCore_UI_INIT()是指標圖形介面初始化的函數。
這樣的寫法幾乎是固定的,如果上面的解釋真的看不懂也無所謂,接觸多了自然就懂了。

即時報價與盤後更新

介紹兩個最常用的外掛,都跟報價有關,一個是即時報價,另一個是盤後更新。像我自己是做期貨的,盤中時跑即時報價,收盤再跑盤後更新,因為盤中的報價算是相對不穩定,所以盤後再複寫一次期交所公布的報價,確保隔日開盤所有的技術分析指標是正確的。

報價的用途應該不用多說吧!直接看看怎麼設定。

即時報價


大致看到的畫面是這樣,左邊是要報價的項目,右邊是報價源的設定。這邊以"康和期貨"的"全都賺"為例,進到報價項目的設定看看。

2016年5月2日 星期一

指標圖形介面操作示範

這個章節要示範怎麼透過圖形介面把指標加入到圖格中,並做成範本,再做成佈局。

指標設定畫面
在我的設定中,每個指標(或功能)都對應一個圖層,所以新增指標就要先新增圖層。圖層又區分主圖層跟子圖層,區別在於子圖層是依附在主圖層中,而圖格的定義是以其外觀視之,就類似這裡的主圖層。聽不懂!?沒關係~就通通當作圖層就好。

接著看看影片中的操作就懂了。

檔案及目錄簡介

從上一篇畫面及選單簡介其實可以看出來AC的選單選項並不是很多,但實際上還有一些不太常調整的設定沒有做出介面,透過這個章節將介紹一些相關的檔案與目錄架構讓你更上手。


根目錄
config:AC主要設定目錄。
database:數據資料庫。
docs:API文件。
plugin:外掛放置目錄。
plugin_dev:外掛開發原始碼放置目錄。
script:腳本放置目錄。
sound:聲音檔目錄(給腳本用)。
sqldb:SQLite資料庫放置目錄(給腳本用)。
---
AceChart.exe:AC的主要也是唯一執行檔。
ace.NAME.160309.license:授權檔,保留最新的即可,避免混淆。
acapi.jar:AC-API,供外掛使用的程式介面。
acsapi.jar:AC-Script-API,供腳本使用的程式介面。
vm.ini:可用來設定AC記憶體的大小。通常在巨大的回測系統才有修改的必要。


2016年5月1日 星期日

安裝過程示範

AC是綠色軟體,本身只要解壓縮就可以用了,但作業系統上仍要先具備一些軟體(Java)才行。
特地申租了一台乾淨的雲端機器來示範安裝過程,其實很簡單,看一次就會了。

因為是綠色軟體,可以放在隨身碟中執行,需要備份的話也只要拷貝目錄或壓縮就可以了。

---

這裡再額外補充申請授權的方式
複製UID:一組特殊字串,用來申請授權。
選購:點選後會連結到AC的下載頁面,
再點選中間的"選購軟體",即可看到申請表單。
軟體資訊:可以確認授權的期間。

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