2012年12月3日

投資就不用工作?

這篇其實算是延續上一篇「%百分比的魔力」。

當景氣大好時,尤其是2008年金融風暴前,有一些人一些言論會出現,
多半是「唸甚麼書,炒股(投機)就能賺大錢啦!」,
「工作幹嘛,炒股(投機)都賺得比工作多啦!」。

而從上一篇我的想法中,我認為投資的資金大到一個程度後,
基本上工作賺錢已經沒有意義了,
因為你投資獲取的獲利,大於你工作獲取的獲利,
那麼你就不需要為了賺錢生活而工作。

但在上一篇有一個重點,投資的獲利,是根據本金決定的,
本金越大,獲取的獲利會等比增加,
可惜的是,每個人出生在這個世界上,
落地的當下,身上擁有的本金並不相同,
富二代之所以叫富二代,就是因為他們一出生,
身上就是有非常驚人的財富可以當本金。

正如前面說到的,大部分生產者都不是資本家,都沒有錢,
生產者生的孩子,一落地,就跟你、我一樣,
甚麼都有,就是沒有錢,
那麼,你、我要靠投資賺錢過生活,基本上是沒辦法的,
很簡單的計算公式:
0 x 3% = 0

就算今天給你30%獲利的機會:
0 x 30% = 0

基本上,在現在這個資本的世界中,
沒錢就是沒有進入「%百分比」世界的機會,
因此沒錢的人靠投資,是沒辦法的。

但工作不同。
工作和投資的區別是,投資是用錢賺錢;
工作則是用身體(勞力、體力、精力)賺錢。

這表示,工作賺錢不用成本(著裝、知識、技能、談吐...等在此不考慮)。
因此在一無所有時,工作是唯一獲取獲利的方式。

如果用工作產生獲利這樣的方式套入到「%百分比」的世界中計算:
假設今天月薪是1000元(假設成本為1)
1 x ?% = 1000

你會發現,靠工作賺錢,獲利高達1000倍,
因為實際上,工作是靠身體,不是靠本金,
套入很低很低的本金後,獲利非常大。
因此,在沒錢時,還是乖乖工作賺錢,沒錢時候投資的獲利,
不可能高過工作靠身體賺得錢。

但從前一篇來看,靠工作賺錢,當生產者,永遠只能被投資者剝削,
且永遠無法出頭,那怎麼辦?
所以比較好的辦法是,在年輕時努力工作賺錢,
賺來的錢進行穩當的投資,
此時的身份既是「生產者」也是「投資者」。
當本金增加後,本金多到足以產生足夠獲利(現金流)進行生活,
此時就能夠退休了,
而退休,實際上就是轉換身份為「投資者」,不再是「生產者」。

此時如果不退休繼續工作,工作的目的也不再是為了生活,
那麼工作時的心情、心態也會不同。

因此結論是,
不能因為投資就不工作,只要投資的現金流沒有建立完成,
是無法依靠投資養活自己,
此時當「生產者」工作能獲得的獲利是遠高於投資的,
當投資的本金大到某個程度後,
就能夠將自身的角色進行轉換,轉換成「投資者」,
更好的方式是,
在工作同時存錢和投資,一邊當「生產者」一邊當「投資者」。

最後一點,
現實世界總是不這麼美好,
為了吸引大量的「生產者」貢獻金錢,
會將金融商品包裝成奇奇怪怪的東西,
這些東西,10個有9個半都不美好,多半都有陷阱,
但介紹時,從來不會提它們的陷阱,只會提這些商品的好處,
甚至許多詐騙集團,擺明就是詐騙,
賣的東西連金融商品都不是,只是偷竊,偷「生產者」的錢。

對於投資,我只能說,
金融世界裡,「獲利」都伴隨「風險」,高獲利就是會有高風險
當今天你被推銷金融商品時,它告訴你獲利的當下,
請仔細檢視它的獲利和風險
獲利,請和「定存利率」比較,風險則要自己評估,
當獲利很高時(比定存利率高很多),請了解它的風險,
或者它根本是詐騙集團。

現在這個世界,沒有人會好心的推薦你穩賺不賠的投資,
只有自己了解風險,才能知道自己要的是甚麼投資。

%百分比的魔力

其實滿慶幸我在經歷金融風暴時,有開始買股票,並注意相關訊息,
當時的許多新聞或節目,多半會針對金融風暴給予評論,
讓我可以對投資理財有一點點認識,
這邊提出我對投資理財的第一個有趣的了解,
我取名叫「%百分比的魔力」。

在投資理財中,一句話經常被提出來,那就是「複利的威力勝過原子彈」,
但其實我認為,真正厲害的基礎其實是「%」。

在投機和投資中,如果稍微注意會發現到,
所有的賺賠都不是用「金額」,而是用「%」,
舉個例子:
一家公司股票每股單價為10元。
今年公司賺錢,給股東每股0.3元。
這時候小朋友都知道,這家公司股票的股息就是3%。
假設我有1,000股,以每股3%來計算,表示我可以獲得300元。
但如果我有10,000股,同樣以每股3%來計算,
表示我可以獲得3,000元。

從上面的例子可以發現,不用金額而用%百分比來計算的原因是因為,
每個股東持有的股份數量不同,因此獲得的股息也會不相同,
從這樣的角度來看,整個過程和計算都是非常合情合理的。

從%百分比的角度來看,利息的金額多寡沒有意義,
真正有意義的是持股單位和%百分比,它才真正決定了利息的金額高低。

1. 「%百分比」的世界,沒有獲利成本,沒有資源上限,而且大者恆大
從這裡可以推想出一個現實,以%百分比為單位的世界中,
本金(持股單位)越多,獲得的利息會等比例增加,
以上面的例子來說,
持有1,000股和10,000股相比,獲得的股息同樣差10倍。
這說明了,在%百分比的世界中,是大者恆大的,而在金融市場中,
基本上就是個%百分比的世界,而這裡不考慮內線...等不正規的投資方式,
在這個世界中,就是本金越多,獲利越大。

現實的世界是甚麼?跟%百分比的世界不同在哪?
現實是,我們都生活在地球,所有資源都是有限的,
田地是有限的,人力是有限的,
更白話的說,一個人一天就是只有24小時,一個人的精力就只有那麼多,
全地球田地的耕作面積就是這麼多,全部的一切都是有上限的,
但按照%百分比和比例,在%百分比的世界中,
只會有非常多的本金(持股的資金),
並希望按照%百分比獲得非常多的利息,但沒有上限。

例如:
今天耕作,1畝地可以產生等值10元的穀物,按%百分比來看,
我只要有100畝地,就可以產生等值1,000元的穀物,
我只要有1,000畝地,就可以產生等值10,000元的穀物,
所以我只要增加耕作面積,就可以賺到非常非常多的錢,
真的是這樣嗎?
事實上,現實是,當你有1,000畝地時,你無法單憑自己的力量耕種,
必須要依靠額外的人力,或者聰明的用機器,
但不論哪種方式,成本都會增加,
而且,1000畝地之後呢?10,000畝地?還是1,000,000畝地?
耕地從哪裡來?

但如果換一個角度,我們用投資的角度來看這件事情,
我們先不考慮物以稀為貴這件事情,單就%百分比來看。

例如:
今天某公司股票每股100元,我可以花100元買1股,也可以花100,000買1,000股,
我也可以花10,000,000,000買100,000,000股,
當公司賺錢給予3%股息時,獲利可以等比例的增加,
1股的只能得3元,但100,000,000股的可以得300,000,000元,
而且中間沒有任何額外的成本,
沒有耕地限制、沒有人力限制、沒有機器維護,油耗成本。

2. 投資者是在「固定%百分比」的世界計算獲利,生產者是在「固定金額」的世界計算獲利
目前的世界上,大部分的人努力花費勞力,體力,腦力,精力在進行生產,
而這些生產產生的獲利,就如同上面耕地的例子,它是用「金額」計算的,
而不是用「%」計算的。
例如:
我每天認真工作,一個月領取1000元。
我這個月加班,因此領取1200元。

但不論是1000元,或是1200元,都是用「金額」計算,不是用「%百分比」計算,
當你用「固定金額」來計算獲利,而投資者用「固定%百分比」計算獲利時,
你會發現,利基根本不同,不管你怎麼努力,你的最大獲利不可能和投資者相比。

3. 投資者的資金,不會腐爛變質,但穀物有保存期限
投資者進行投資時,它的資金是沒有時限的,舉例來說,30年前的黃金放到現在,
它還是黃金,並且可以繼續增加甚至增值,
但30年前的穀物,只會因為時間而腐爛,因此,對於投資者而言,
錢是會繼續滾錢,讓本金更大,而不會像生產者產出的穀物一樣,放著就爛了。

因此我認為,在現在這個時代,原物料嚴重上漲,全世界貧富差距大,
一個關鍵的原因就是,富者幾乎都是投資者,它們利用%百分比的魔力進行賺錢,
而窮者都是生產者,它們利用「固定的金額」在賺錢,
富者透過投資,將「金額」與「%百分比」間的差值賺到口袋中,
並用相同方式製造無限迴圈,讓這個世界富者更富,而窮者更窮,
並且窮者還在不斷的幫富人賺取大量金錢而不自知。

更恐怖的是,這整個金融世界的運作法則,已經是目前全世界的共通法則,
所有人都認定這一套法則是正確的,並繼續的在運作中
(事實上,歐美為主的資本主義運作這套法則到現在,
還是世界經濟的中心,
這表示目前全世界大部分的人都還是認同這樣的運作法則)。

最後一個問題是,
我們在這樣的世界裡要生存,要當投資者還是生產者?

2012年11月14日

JNX-2000D測電器(PowerMeter)-Linux讀取程式(程式碼下載、使用說明篇)

上一篇解說了JNX-2000D的USB無線接收器和PC間的溝通方式以及測電器的資料表示方式,
這一篇我將我寫好的程式、程式碼和使用方式附上。

程式介紹:
整份程式包含3支程式,2支C程式,1支php的程式,分別是:

  • jnx2000_meter.c
  • jnx2000_monitor.c
  • meter.php
jnx2000_meter.c:
USB無線接收器的讀取程式,它根據前一篇的流程將測電器數據讀出後,
將數據寫到Linux的SHM(ShareMemory)當中,並持續更新。
為了能同時支援多台JNX2000D的USB無線接收器,
每個Channel Number會使用獨立的SHM Key,例如:
Channel 0時,SHM Key為70248070
Channel 1時,SHM Key為70248071
.....
依Channel Number增加使用不同的SHM Key


jnx2000_monitor.c:
Linux Console的測電器資訊顯示程式。
程式執行時,要帶入測電器的Channel Number,
如果SHM Key存在(jnx2000_meter讀取程式正常執行),
就會在終端機中顯示目前的測電器資訊。
畫面如下:


















meter.php:
Linux PHP Web版的測電器資訊顯示程式。
直接透過網頁可以讀取到Web Server的測電器資訊,
Web URL同樣要帶入測電器的Channel Number。
畫面如下:















編譯方式:
jnx2000_meter.c:
jnx2000_meter.c的編譯非常簡單,直接如下即可產生jnx2000_meter:
gcc -o jnx2000_meter jnx2000_meter.c

jnx2000_monitor.c:
jnx2000_monitor.c編譯時要稍微注意一下,
jnx2000_monitor的Console繪圖,是使用ncurses這個library,
因此編譯前要先確定有安裝libncurses5-dev這個套件。
在Debian/Ubuntu下,如下安裝:
apt-get install libncurses5-dev

確定有ncurses的library後,如下執行即可產生jnx2000_monitor:
gcc -o jnx2000_monitor jnx2000_monitor.c -lncurses


使用說明:
jnx2000_meter:
jnx2000_meter使用前要注意幾點:

  1. USB無線接收器的USB要確定插在Linux電腦上,且要確定ttyUSB有抓到
  2. 要確定USB無線接收器是開機狀態(有數值顯示),因為它有省電保護,一段時間沒有和PC通訊,就會自動關機。
  3. 操作順序必須是,先開USB無線接收器,確定有開機,再執行jnx2000_meter。如果先執行jnx2000_meter,是抓不到USB無線接收器的

按照上述幾點,操作順序如下圖:

執行方式如圖片所示,輸入
jnx2000_meter
例如:jnx2000_meter /dev/ttyUSB1&
例如:jnx2000_meter ttyUSB1&


成功取的測電器資訊,會如圖片一樣顯示:
JNX-2000D Channel=9
Share Memory Key=70248079


這就表示jnx2000_meter成功執行中。
最後面記得加上&,讓它在背景執行。

jnx2000_monitor:
jnx2000_monitor使用相對簡單些,要注意的是:

  1. 要確定ncurses library有安裝,在Debian/Ubuntu下可以安裝libncurses5
    apt-get install libncurses5
  2. 必須要先執行jnx2000_meter,才可以執行jnx2000_monitor
要執行jnx2000_monitor,要先知道Channel Number,知道後,如下執行:
jnx2000_monitor <Channel Number>
例如:jnx2000_monitor 9


meter.php:
php版的meter.php功能和jnx2000_monitor相同。
要使用它,首先將meter.php放在php可以執行的Web路徑中,
以我這邊為例,我的Web路徑在
/var/www/

將meter.php放入/var/www/中,之後Web URL輸入如下:
http://192.168.1.6/meter.php

成功了會看到下面的畫面:














此時同樣的,根據Channel Number,在網址列加入Channel Number,
在這裡,我使用的Channel是9,加上:
http://192.168.1.6/meter.php?channel=9

即可出現下面畫面:















SHM資訊:
jnx2000_meter會將測電器資訊寫入SHM當中,
如果要在其他程式中使用SHM資訊,直接讀取即可使用,
SHM的資訊如下:

  1. 每個Channel Number會使用獨立的SHM Key,例如:
    Channel 0時,SHM Key為70248070
    Channel 1時,SHM Key為70248071
    .....
    依Channel Number增加使用不同的SHM Key

  2. SHM結構如下:
  3. typedef struct power_meter_string_data PowerMeterStringData;
    struct power_meter_string_data
    {
            char voltage[10];
            char current[10];
            char quantity[10];
            char duration_days[10];
            char duration_hours[10];
            char duration_mins[10];
            char factor[10];
            char wattage[10];
            char reserve[60];
    };
    所有資訊都使用char表示,並且均為10個字元(含字串結尾),
    最後面包含保留空間60個字元。


程式碼下載:
程式碼與程式

2012年11月13日

JNX-2000D測電器(PowerMeter)-Linux讀取程式(流程、格式說明篇)

延續上篇的JNX-2000D介紹,這篇正式來po出Linux的讀取程式。
如果對程式流程和內容沒興趣,可以直接跳過本篇,看下一篇下載程式和使用說明。

JNX-2000D的USB無線接收器,實際上只是USB to RS-232,將它插到Linux電腦後,
一般來說就能抓到pl2303的USB to serial port裝置,從dmesg顯示如下:
[ 18.283060] usb 3-1: pl2303 converter now attached to ttyUSB1 
[ 18.283090] usbcore: registered new interface driver pl2303 
[ 18.283092] pl2303: Prolific PL2303 USB to serial adaptor driver 

正常來說,大多會抓到ttyUSB0,如果跟我一樣已經有一個USB to SerialPort裝置,
它就會是ttyUSB1...之後遞增。

USB無線接收器它在連接到電腦後,按下面的流程先進行初始化:


這段流程完成後,PC和USB無線接收器就會完成初始化,接著按下面流程,
即可取出測電器資訊:

這裡注意到一點,當第一次送出0x64 0x63後,收到的第一筆測電器資訊是獨特的,
它類似如下:
A2 09 0D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

這裡的09表示使用Channel 9,同樣的如下:

A2 0A 0D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
這裡的0A表示使用Channel 10。


其他正常的測電器資訊,格式我看起來有3種,
每種都是29個bytes,區別在開頭,有0A、0B、0C這3種。
這3種資訊,有部份資訊是相同的,部份資訊不同。
這部份我認為一開始設計為0A,後來欄位不夠了,就以0A為基礎改為0B,
再來又加上0C,因此有些欄位在0A、0B、0C都表示相同資訊,有些則不同。
我總共提取了如下6項資訊:

  1. 消耗瓦數
  2. 使用電壓
  3. 消耗電流
  4. 功率因數
  5. 花費度數
  6. 持續測量時間

花費金額的部份我沒有設定,因此都是0,看不出來是哪幾個欄位,其他上述資訊如下:
消耗瓦數:
0A、0B、0C都有,類似如下:
0A 00 00 01 04 08 xx xx xx xx xx
00 00 01 04 08表示消耗瓦數為: 0014.8W

0C 00 00 00 03 02 xx xx xx xx xx
00 00 00 03 02表示消耗瓦數為: 0003.2W

使用電壓:
0A、0B、0C都有,類似如下:
0A xx xx xx xx xx 01 01 02 07 xx xx xx xx
01 01 02 07表示電壓為: 112.7V

0C xx xx xx xx xx 01 01 02 09 xx xx xx xx
01 01 02 09表示電壓為: 112.9V

消耗電流:
0A、0B、0C都有,類似如下:
0A xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 00 00 02 05
00 00 02 05表示電流為: 00.25A

功率因數:
0A、0B都有,0C沒有,類似如下:
0A xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 00 05 01 01
00 05 01 01表示功率因數為: 051.1%

花費度數:
0A有,其他都沒有,類似如下:


0A xx xx xx xx xx xx xx xx xx 00 00 03 03 02 07 01 02
00 00 03 03 02 07 01 02 表示度數為: 0033.2712度



持續測量時間:
持續時間比較麻煩,它由2部份組合而成,分別是
  • 天數
  • 小時分鐘
小時分鐘:
0B有,其他沒有,類似如下:
0B xx xx xx xx xx xx xx xx xx 03 08 00 01 00
03 08 00 01 00表示: 01h 38m (小時和分鐘倒過來放置)

天數:
0C有,其他沒有,類似如下:
0C xx xx xx xx xx xx xx xx xx 00 00 03 01 00
00 00 03 01 00表示 31天(0031)

最後一點,它每筆資料的結尾2 bytes相加均為D0,用來做結尾表示,例如:
0C C4 (0C + C4 = D0)
11 BF (11 + BF = D0)

JNX-2000D測電器(PowerMeter)介紹

這系列其實是遲來的文章。

今年夏天,台電調漲電費,很自然的就有不少人對測電器這類PowerMeter很有興趣,
其中mobile01的便宜電力計心得分享介紹了幾款容易買到且價格便宜的測電器,
而這次要介紹的主角,就是其中提到的JNX-2000D,特別提到它除了是因為我有買來用之外,
最重要的是,它提供連接電腦的功能,可以讓我們將電力的消耗量直接數位化,
可以在電腦中進一步統計,甚至像是把它放上網頁,動態的更新即時的耗電量,
甚至繪製成一段時間的耗電圖表。

JNX-2000D硬體分為2個部份,分別為

  • 測電器本身
  • USB無線接收器

在這裡,我就直接借用mobile01的venon大大拍的照片(已授權使用):
測電器本身
測電器正面
測電器背面




















USB無線接收器
USB無線接收器正面
USB無線接收器背面




















USB接頭則在側面,如下圖:
USB無線接收器USB接頭








這款測電器,它因為能夠連結電腦,
所以它另外提供了Windows的軟體,
軟體照片如下,同樣是mobile01的venon大大抓的圖:




注意到,它左邊深灰色和咖啡黃的部份,就是它即時從測電器抓到的目前資訊。
上面Signal後面的5,則是它的頻道號碼。

這款測電器買來後,我最不滿意的部份,就是它程式感覺很鳥,又沒有提供API,
最重要的是,沒有提供Linux的程式,
因此,我花了些時間將它的RS-232信號抓出來(它實際上是USB to RS-232),
寫出了Linux的讀取程式。

這部份我會在下篇po出。

新20年期儲蓄險之我見


最近很多保險公司在推20年期複利儲蓄險,當然網路上有些人有些看法,
但我想提個我自己的看法,由流動性為出發點提出我對這保單的想法。

這種20年期儲蓄險通常如下:
前6年利率很低,約0.8%~0.9%,
第7年開始利率用2%~3%計算,
複利滾入直到領回。

我從流動性想到個有趣的觀點,試想:
1. 正常人,一筆錢放著不動,6年算長嗎?能持續6年嗎?
如果不能,那麼顯而易見的,保險公司可以用超低的利率跟你借這筆錢,
並跟你賭,6年內你會領回,你領回了,保險公司還現賺30%(6年內領回,只能領回約70%)

2. 非常有恆心毅力的人,一筆錢放著不動,就一直放到老....直到.....世界末日......
如果今天遇到個有恆心的人,他真的按照遊戲規則一直把這筆錢存放在保險公司,
那麼問題來了,這筆錢,是保險公司的?還是這個人的?
這問題怎麼說?
想看看,當你為了第7年開始的高額複利,因此把錢放在保險公司不動,
你想著高額利息,因此一直放著不領,那麼利息對你來說,是現金,還是紙上富貴?
我們反過來想,當這樣的人為了高額利息持續放在保險公司,
對保險公司而言,這筆錢幾乎等於送給保險公司,因為你不領,錢永遠都是保險公司的。

再想看看,保險公司規劃的複利通常為2.x%,那其實也只是略高於長期平均的定存利率,
考慮到大部分人6年內會解約,少部份人一放就不領了(很多八成忘了這筆錢),
剩下來一點點人,給他平均的定存利率,
這對長年投資股市、房地產...等賺高額股息、房租的保險公司而言,
根本是穩賺不賠的生意,再加上這種保險,無解約時間,那可以假設大額資金的解約時間其實不同,
那麼對保險公司的現金流量影響其實很小,怎麼看都覺得對保險公司合算。

2012年2月27日

我目前投資的兩句諍言,以及目前我的看法

很久沒po文了,上次po文已經是去年了,趁著連假來一篇。

在經過了一段時間的投資、上網看文、看幾本書(漫步華爾街),
加上金融危機,這次歐債危機後,我認為我開始有了投資的Rule,
而這Rule我認為可以簡化成兩句諍言:
景氣好時買債券(賣股票),
景氣不好時買股票(賣債券)。

而債券,必須是長期政府公債,也可以現金、定存替代。
債券和現金差異在於,債券有較高配息,
但同樣受景氣影響,只是跌幅較低,
現金、定存沒有配息(或配息較低),但不受景氣影響而虧損。

而股票,如果本錢夠多夠大,可以用房地產替代。


至於景氣好壞的判定,目前我的判斷方式,還是用平均值來判斷,
以台股來說,我會以金融風暴前後的指數為依據:
9000甚至10000為最高點
4000為最低點
7000左右均為平均範圍(6000~8000)

以歐債危機而言,雖然已經是事後諸葛,
但我認為實際問題並沒有媒體報導的嚴重,
因為包括台股在內的全球市場和歐洲市場,
最低不過是跌到平均值的位置,
台股的許多權值股事實上根本跌不多,沒有跌到適合買入的價位,
因此這次歐債危機,我的年終獎金,主要就拿來買小型傳產股,
因為小型股不在台灣50、中型100當中,容易受到景氣影響而大幅波動,
比較容易出現不錯的價格。

最近,我傾向航運股,因為BDI指數目前在歷史低點,
航運股價格目前還不算太高。

而考慮到歐債幾個國家減債,
金融風暴造成美國和全球的虧損,
以及像X鋼、X積電...等績優股配息並不多的事實,
甚至從電視看起來,許多評論家認為的中國可能發生的許多問題,
我認為股價長期維持在平均值上下是比較好的,
如果全球股價飆得高,
那我猜想,可能容易出現暴漲暴跌的情況
(我猜國外的投機基金喜歡這樣,暴漲暴跌才能炒作撈錢)。

短期來說,我自己的看法是,
歐債還沒完全過(大部分散戶多少還有一點疑慮),
美國、歐洲幾隻豬準備選總統(選前景氣太差或變化太大可能影響選情),
中國也要換領導人(接棒前景氣太差或變化太大可能影響政局),
伊朗、以色列問題(要打嗎?) ,
因此我猜全球股市可能漲或維持平盤(震盪形式?)一段時間,
但時間多長我不確定
(要屠宰散戶,總要等散戶信心恢復,股價維持高點一段時間再宰)。

現階段,我只希望航運股維持低價,
讓我可以繼續買幾個月就很滿足了。

2011年10月16日

買房策略-地段、地段、地段與房價

首先我必須說,房子是我很不瞭解的部份。
再來我必須說,我很幸運家裡有個在台北市的房子,沒有租屋付房租的壓力,
因此這篇,比較接近我以投資觀點來看買房這件事情。
這篇主要是看到了張金鶚的房產七堂課讀後感續1-----購屋的大同世界
加上之前看過的漫步華爾街後的有感而發。

因為前陣子房價很高,老媽走在路上,就會到處看房子,然後嘆息說
「以前應該在這裡買房,現在價格如何」。

然後我問我老媽,買房重點是啥,她回答了一個名人的經典說法
「買房重點有3個:地段、地段、地段」。

我聽完之後,一直覺得哪裡不大對勁,
在前陣子看過「漫步華爾街」之後,終於想明白問題在哪了......

漫步華爾街的作者在書後段提到房地產投資,作者對房地產的看法是
「他不瞭解房地產的價格如何被評估,認為房地產價格無法像公司股票比較容易量化和分析,而房地產的價格會隨著市場景氣高低波動,波動幅度會比市場景氣來得大」。
看完這段之後,我就瞭解到了一件事,
買房地段的確很重要,但實際上還是要考量到房價,一個簡單的問題:
同地段相同等級的房屋,且條件相同,
同一時間一間賣300萬,一間賣500萬,正常人會買哪間?
如果只按照「地段」作為選擇依據,
那麼300萬的房子和500萬的房子「都是值得購買的」,
可是顯然不大對,正常人都會買300萬那間而不會買500萬那間。
所以事實上,除了「地段」這項條件外,還要考慮到「價格」這個條件。

當買房條件出現了「價格」,甚至於和市場景氣出現關聯時,
那麼買房子就會和買股票、基金、黃金差不多,一樣會有價格高點和價格低點。

而股市在遇到空頭時,往往會出現一些有趣的說法,如:
「當擦鞋童都知道如何買股票時」
「當新聞版面隨處可見股市消息時」
「當某某名人說他賺了幾間房子時」
就是股市高點出現了。

那麼,如果套用到房地產呢?
如果房地產真的這麼厲害,只會漲不會跌,那美國次級房貸的問題怎麼會出現?
又如果房地產只會漲不會跌,那次級房貸後,美國房地產價格為何會破底再破底?
在回想下,前陣子台股9000點時,新聞是否經常出現買房大賺,房價大漲的新聞?
甚至可以比較一下,現在的房價和當時的房價相比有沒有差異?

所以我認為,買房只是另一種投資,
同樣要低買高賣或低買不賣,買進的時機點可能在市場景氣低點時會比較適合,
在景氣大好時,可能不適合買房,
我也認為,房價在任何時候價格不應該是相同的,
房價應該也會受到景氣影響而有房價高點跟房價低點。

2011年7月31日

OpenOffice聚會之心得分享 - 過程與範例程式、投影片下載


當天報告的投影片、範例程式:OpenOffice範例程式與投影片

年初時參加OpenOffice聚會,當時依瑪貓說,
之後OpenOffice Macro有成果,要和我們分享唷~

我當時義不容辭的同意了,於是在之後準備了這份報告。

這份報告,同時也是我到目前對OpenOffice Macro的認識與學習心得。

2011年7月8日

複委託之優點

日本發生海嘯後,我就在積極的查詢購買海外股票的方法和比較,
最後發現,目前在台灣,可以透過2種方式購買到國外股票:
1. 在海外開設股票帳戶
2. 透過國內證券公司的海外複委託購買

在經過比較後,最後我選擇使用海外複委託。

因為,用海外複委託搜尋,會發現有人在詢問海外複委託好不好,
所以這裡我大致列出我選擇的原因和海外複委託的優點和缺點。

海外複委託的缺點:
1. 手續費
我想,包括我在內所有人,
都認為海外複委託最大的缺點是「手續費
海外複委託的手續費都很貴。
以寶來證券日股交易來說,
每次交易1%計算,但最少5000日幣,
這相當於台幣1850左右(以1:2.7計算)。
其他應該也差不多,
日盛是最少5000日幣,
超過xx萬改以1%計算。

2. 人工單
除了港股、美股之外,都只有人工單,
電話呼叫很麻煩,有時候會打不進去,
詢問報價,和奇摩查到的報價會有誤差。

3. 帳戶操作麻煩
a. 沒有T+2
和台股不同,沒有T+2天,
必須帳上有足夠外幣現金(有些可以台幣交割了),
轉成外幣買完後,盛下的零碎外幣不好處理,
轉回有匯損,放著又不知道能幹嘛。
b. 轉出需要Fax+電話確認
錢從外幣帳戶轉出,需要傳真要求,
而且需要電話確認,很麻煩。

4. 限制比較多
我不用信用和融資買賣(槓桿太恐怖了),
複委託在信用買賣和融資操作,
是有限制的,印象中是不可以的。

5. 海外股票無法辦理退稅
以美股來說,美股配息先扣30%稅金,
透過複委託無法辦理退稅。

海外複委託的優點:
1. 多市場買賣
許多人推薦直接開立海外股票帳戶操作,但指的都是美股,
所以事實上,它並不是多市場,它只有美股可以操作,
只是因為美股中有全世界大部分公司的股票發行,或者ADR,
所以才說可以買到全世界公司的股票,但實際上,它還是美股,
而不會是日股、韓股、港股。
以這次日本海嘯後,我想買的日股來說,美股中的日本公司股價,
其海嘯造成的影響沒有很大,真正造成衝擊是日本股價。

2. 無銀行開戶限制
這點其實和第一點是關聯的。
要開立海外帳戶購買海外股票,必須針對單一地區開立銀行帳戶,
例如買港股要去香港銀行開戶,買美股要開立美國證券帳戶,
買日股要開立日本銀行帳戶...等。
香港和美國相對問題比較少,香港近,請假2天去玩一玩,
就能順便開好戶頭;美國可以用郵寄解決。
韓國、新加坡不清楚。
但針對日本,上網搜尋會發現,日本銀行排外性很高,
留學生都不容易找到可以開戶的銀行,何況是觀光客。

3. 手續費高,但其他費用少
海外複委託雖然手續費高,
但買賣時不用其他費用(配息手續費大家都有,費用也相同,看市場),
但其他海外帳戶不同。

我同事買港股,
選擇香港匯豐銀行(應該是很多人都會選擇的,香港最大)。
香港匯豐銀行規定,帳戶內金額(聽同事說,
含股票市值)必須大於20萬港幣,
否則每個月都要收取保管費,這筆錢複委託並不需要。

美股的話,除非人到美國去開戶,否則需要匯款,
匯款需要一筆不低的手續費,
我當時計算,如果「每次買美股都匯款」,
那手續費其實接近海外複委託的美股手續費,
因此網路上都說,
一次匯入大筆金額後,再進行操作,
而像我這樣靠薪水投資的,並不合適。

另外,如果我沒記錯的話,匯款是有時差的,
好像需要2~3天,
海外複委託的操作都是台灣的銀行的外幣帳戶操作,
放錢到可以操作,大概2~3個小時即可
(這應該是證券公司帳戶資訊沒更新,
我從銀行帳戶看,是立刻就有錢)。

4. 可靠度高
這點網路上的人都提過,透過海外複委託購買可靠度比較高,
比較不怕證券公司倒閉或者股票不見,
在網路上有人提到過,他透過美國的線上證券公司買股票,
結果股票不見的事情。
針對這點,網路上的人是說,
你可以找有加入「投資人保障協會」的線上證券公司,
但問題是,當你真的發生問題時,
你要如何和投資人保障協會聯絡?要怎麼把股票拿回來?
你的操作紀錄都在線上證券公司裡,
它股票都能不見,你怎麼能保證它操作紀錄還在?
那你怎麼舉證你的股票?

基於上述原因,
我最後選擇透過海外複委託買股票,
不過對我來說,
最主要原因還是因為我要買的是日股而不是美股或港股,
但我想,未來我要購買港股或美股,我不用因此跑到香港,
或者郵寄、匯款到美國搞很久,就能直接購買了,
這應該在便利性上也會好很多。

2011年4月4日

OpenOffice Calc BASIC Macro位址、名稱轉換

在OOo Calc中寫OOo BASIC時,會遇到個問題是,
要取得Cell時,常使用getCellByPosition() Method,例如:
oCell = oSheet.getCellByPosition(0,0)
oCell.String = now 'This function returns the current date and time

這樣可以取得A1這個Cell,並修改它的內容。

但getCellByPosition() Method使用的是0 Base,且X、Y都是數值
可是在Calc當中,
我們一般操作都使用A1這樣的字母+數值,且是1 Base
為了解決這個麻煩的小問題,我寫了個簡單的轉換函式,如下:
Function CellPositionToName(X As Integer, Y As Integer) As String
Dim LETTER_ARRAY As Variant
LETTER_ARRAY = Array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","AA","AB","AC","AD","AE","AF","AG","AH","AI","AJ","AK","AL","AM","AN","AO","AP","AQ","AR","AS","AT","AU","AV","AW","AX","AY","AZ","BA","BB","BC","BD","BE","BF","BG","BH","BI","BJ","BK","BL","BM","BN","BO","BP","BQ","BR","BS","BT","BU","BV","BW","BX","BY","BZ","CA","CB","CC","CD","CE","CF","CG","CH","CI","CJ","CK","CL","CM","CN","CO","CP","CQ","CR","CS","CT","CU","CV","CW","CX","CY","CZ","DA","DB","DC","DD","DE","DF","DG","DH","DI","DJ","DK","DL","DM","DN","DO","DP","DQ","DR","DS","DT","DU","DV","DW","DX","DY","DZ","EA","EB","EC","ED","EE","EF","EG","EH","EI","EJ","EK","EL","EM","EN","EO","EP","EQ","ER","ES","ET","EU","EV","EW","EX","EY","EZ","FA","FB","FC","FD","FE","FF","FG","FH","FI","FJ","FK","FL","FM","FN","FO","FP","FQ","FR","FS","FT","FU","FV","FW","FX","FY","FZ","GA","GB","GC","GD","GE","GF","GG","GH","GI","GJ","GK","GL","GM","GN","GO","GP","GQ","GR","GS","GT","GU","GV","GW","GX","GY","GZ","HA","HB","HC","HD","HE","HF","HG","HH","HI","HJ","HK","HL","HM","HN","HO","HP","HQ","HR","HS","HT","HU","HV","HW","HX","HY","HZ","IA","IB","IC","ID","IE","IF","IG","IH","II","IJ","IK","IL","IM","IN","IO","IP","IQ","IR","IS","IT","IU","IV","IW","IX","IY","IZ","JA","JB","JC","JD","JE","JF","JG","JH","JI","JJ","JK","JL","JM","JN","JO","JP","JQ","JR","JS","JT","JU","JV","JW","JX","JY","JZ","KA","KB","KC","KD","KE","KF","KG","KH","KI","KJ","KK","KL","KM","KN","KO","KP","KQ","KR","KS","KT","KU","KV","KW","KX","KY","KZ","LA","LB","LC","LD","LE","LF","LG","LH","LI","LJ","LK","LL","LM","LN","LO","LP","LQ","LR","LS","LT","LU","LV","LW","LX","LY","LZ","MA","MB","MC","MD","ME","MF","MG","MH","MI","MJ","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NB","NC","ND","NE","NF","NG","NH","NI","NJ","NK","NL","NM","NN","NO","NP","NQ","NR","NS","NT","NU","NV","NW","NX","NY","NZ","OA","OB","OC","OD","OE","OF","OG","OH","OI","OJ","OK","OL","OM","ON","OO","OP","OQ","OR","OS","OT","OU","OV","OW","OX","OY","OZ","PA","PB","PC","PD","PE","PF","PG","PH","PI","PJ","PK","PL","PM","PN","PO","PP","PQ","PR","PS","PT","PU","PV","PW","PX","PY","PZ","QA","QB","QC","QD","QE","QF","QG","QH","QI","QJ","QK","QL","QM","QN","QO","QP","QQ","QR","QS","QT","QU","QV","QW","QX","QY","QZ","RA","RB","RC","RD","RE","RF","RG","RH","RI","RJ","RK","RL","RM","RN","RO","RP","RQ","RR","RS","RT","RU","RV","RW","RX","RY","RZ","SA","SB","SC","SD","SE","SF","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SP","SQ","SR","SS","ST","SU","SV","SW","SX","SY","SZ","TA","TB","TC","TD","TE","TF","TG","TH","TI","TJ","TK","TL","TM","TN","TO","TP","TQ","TR","TS","TT","TU","TV","TW","TX","TY","TZ","UA","UB","UC","UD","UE","UF","UG","UH","UI","UJ","UK","UL","UM","UN","UO","UP","UQ","UR","US","UT","UU","UV","UW","UX","UY","UZ","VA","VB","VC","VD","VE","VF","VG","VH","VI","VJ","VK","VL","VM","VN","VO","VP","VQ","VR","VS","VT","VU","VV","VW","VX","VY","VZ","WA","WB","WC","WD","WE","WF","WG","WH","WI","WJ","WK","WL","WM","WN","WO","WP","WQ","WR","WS","WT","WU","WV","WW","WX","WY","WZ","XA","XB","XC","XD","XE","XF","XG","XH","XI","XJ","XK","XL","XM","XN","XO","XP","XQ","XR","XS","XT","XU","XV","XW","XX","XY","XZ","YA","YB","YC","YD","YE","YF","YG","YH","YI","YJ","YK","YL","YM","YN","YO","YP","YQ","YR","YS","YT","YU","YV","YW","YX","YY","YZ","ZA","ZB","ZC","ZD","ZE","ZF","ZG","ZH","ZI","ZJ","ZK","ZL","ZM","ZN","ZO","ZP","ZQ","ZR","ZS","ZT","ZU","ZV","ZW","ZX","ZY","ZZ","AAA","AAB","AAC","AAD","AAE","AAF","AAG","AAH","AAI","AAJ","AAK","AAL","AAM","AAN","AAO","AAP","AAQ","AAR","AAS","AAT","AAU","AAV","AAW","AAX","AAY","AAZ","ABA","ABB","ABC","ABD","ABE","ABF","ABG","ABH","ABI","ABJ","ABK","ABL","ABM","ABN","ABO","ABP","ABQ","ABR","ABS","ABT","ABU","ABV","ABW","ABX","ABY","ABZ","ACA","ACB","ACC","ACD","ACE","ACF","ACG","ACH","ACI","ACJ","ACK","ACL","ACM","ACN","ACO","ACP","ACQ","ACR","ACS","ACT","ACU","ACV","ACW","ACX","ACY","ACZ","ADA","ADB","ADC","ADD","ADE","ADF","ADG","ADH","ADI","ADJ","ADK","ADL","ADM","ADN","ADO","ADP","ADQ","ADR","ADS","ADT","ADU","ADV","ADW","ADX","ADY","ADZ","AEA","AEB","AEC","AED","AEE","AEF","AEG","AEH","AEI","AEJ","AEK","AEL","AEM","AEN","AEO","AEP","AEQ","AER","AES","AET","AEU","AEV","AEW","AEX","AEY","AEZ","AFA","AFB","AFC","AFD","AFE","AFF","AFG","AFH","AFI","AFJ","AFK","AFL","AFM","AFN","AFO","AFP","AFQ","AFR","AFS","AFT","AFU","AFV","AFW","AFX","AFY","AFZ","AGA","AGB","AGC","AGD","AGE","AGF","AGG","AGH","AGI","AGJ","AGK","AGL","AGM","AGN","AGO","AGP","AGQ","AGR","AGS","AGT","AGU","AGV","AGW","AGX","AGY","AGZ","AHA","AHB","AHC","AHD","AHE","AHF","AHG","AHH","AHI","AHJ","AHK","AHL","AHM","AHN","AHO","AHP","AHQ","AHR","AHS","AHT","AHU","AHV","AHW","AHX","AHY","AHZ","AIA","AIB","AIC","AID","AIE","AIF","AIG","AIH","AII","AIJ","AIK","AIL","AIM","AIN","AIO","AIP","AIQ","AIR","AIS","AIT","AIU","AIV","AIW","AIX","AIY","AIZ","AJA","AJB","AJC","AJD","AJE","AJF","AJG","AJH","AJI","AJJ","AJK","AJL","AJM","AJN","AJO","AJP","AJQ","AJR","AJS","AJT","AJU","AJV","AJW","AJX","AJY","AJZ","AKA","AKB","AKC","AKD","AKE","AKF","AKG","AKH","AKI","AKJ","AKK","AKL","AKM","AKN","AKO","AKP","AKQ","AKR","AKS","AKT","AKU","AKV","AKW","AKX","AKY","AKZ","ALA","ALB","ALC","ALD","ALE","ALF","ALG","ALH","ALI","ALJ","ALK","ALL","ALM","ALN","ALO","ALP","ALQ","ALR","ALS","ALT","ALU","ALV","ALW","ALX","ALY","ALZ","AMA","AMB","AMC","AMD","AME","AMF","AMG","AMH","AMI","AMJ")

If X < 1024 Then CellPositionToName = LETTER_ARRAY(X) + (Y + 1) Else MsgBox "Out Of Range" End If End Function

傳入X、Y 2個數值,回傳A3這樣的名稱,
因為X最大是AMJ(0~1023),因為數值並不大,
我直接定義成變數查表即可。

注意:已經自動轉換Base 0為Base 1,傳入時不用刻意加1。

2011年4月3日

007先生的交易歷程 的 讀後回文

本來在找匯率表之類的,就找到這個有趣的Blog
007先生看來年紀跟我差不多,不是同年就是小個1~2歲,
整個Blog看下來後,我認為007先生實際的以金錢去做了個實驗,
實驗證明了,程式交易並不是神,
僅僅依靠程式交易搭配特定演算法就要套利,
結果就是直接被市場KO,
我後來想了想,覺得007先生這麼做,並以日記形式寫成Blog,
應該可以作為不錯的反向教材,
而在倒數第二篇文章中,因為007先生的不甘心,
提到「一定是哪裡出了問題」,
因此我把我這段時間的想法寫成回文,
這段回文,算是目前我對交易市場和程式交易的想法。


沒做過外匯,只有最近(算前陣子)台幣升值時有換一些美金玩玩。
我是看到「我知道必定是哪裡出了錯...」這句話,才想回應的。

我對程式交易有興趣,但我只打算用程式交易做股市中長期(月為單位、長期持有定存股),代替人工下單(上班沒時間)。
我目前認為,除非遇到系統風險或異常超跌,否則在交易市場要套利,應該很難和大戶或法人玩。

我目前認為,程式交易會失敗有幾個關鍵因素:
1. 常見的程式交易,都是用EasyLanguage去寫的,你仔細想一下,事實上它能做到的條件很死板,它的條件幾乎都是軟體寫好提供的,感覺有點像是說,給你玩個沒規則的遊戲,但只給你幾個條件去搭配判斷,這聽起來就很受限,只要我知道你能夠使用的條件,我想贏你的機會應該很大

2. 目前沒有任何聖杯,可以保證獲利,沒有任何條件套用在金融市場是百分百正確的,我們透過一連串無法保證的條件去判斷,並期望它要有6成勝率,那可能用亂數感覺還快些

3. 去年發生過一次美股異常交易的事件有上新聞,大家都知道,有人說可能是高頻交易引發的連鎖效應,我查了高頻交易,才知道國外很多大型投資公司用高頻交易套利,它們利用電腦,以「每秒400次成交」的速度,高速的進行買跟賣,利用利差來套利,甚至我認為,能以此掌握最短期的市場變化,在設備、環境、程式、資金大小、消息面都不對等的情況,我不認為我的程式有辦法跟這樣的程式作對

4. 程式是人寫的,換言之,它只能代替人去按照特定模式交易,既然你我都沒找到一個勝率達6成的模式,又怎麼能要求程式能有6成勝率?

最後,我想我可以把最近幾個月的想法說一下,我認為,憑空希望能透過投機的方式來獲利,不如注意系統風險的發生。
你買了這麼多書,相信有提到一點,交易市場會有系統性風險跟非系統性風險,系統性風險不可預期,且影響巨大,像金融風暴、次級房貸...等。
事實上你稍微注意一下會發現,當遇到系統風險時,該投資標的很有機會跌到非常不錯的價格,只要不破產,此時買入並長期持有(預期至少1~2年),那麼我認為績效應該都不會太差。
你前面常提到,有錢人一開始也是從無到有的,這點我認同,但不完全認同,一些人它可能父母有庇蔭,一開始就有一筆不少的資金,當他剛好遇到某個系統風險時,大膽的投入,運氣不好可能破產,但此時只要沒破產,勝率很高,且因為資金大,獲得的獲利非常可觀,原因是,在交易市場,你玩了這麼久就知道,它的獲利是以%數計算的,他有資金,又在系統風險最低點投入,上來時,那種以%數計算的獲利非常驚人。
最後,我們生在台灣,天生就不平等,你想想,我們辛辛苦苦一個月不過3,4萬,一個月有辦法也不過存2萬,美國人薪資是我們的2~3倍,扣除開銷和稅金,還是比我們多很多,他們的資金水平和我們不是同一個水平,對賠率的容忍度比我們高,這是沒辦法的事,但好消息是,跟對岸或東南亞國家相比,薪資水準、物價水平我們又好一些。

OpenOffice BASIC Macro資料庫操作-2

在上集中,我們完成了現在要使用的資料庫,
接著我們就可以透過OpenOffice BASIC來操作剛剛產生的資料庫。

在OOo BASIC中要操作資料庫,整個過程需要6個動作:
  1. 連結DataSource
  2. 取得查詢
  3. 連結SQL伺服器
  4. 從查詢中取得SQL Code,並查詢SQL伺服器
  5. 查詢完成,取出查詢結果
  6. 關閉SQL伺服器連線

整個程式碼如下:
Sub Main

REM 連結 DataSource
Dim DatabaseContext As Object
Dim DataSource As Object
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("OOoTEST")

REM 取得查詢
Dim QueryDefinitions As Object
QueryDefinitions = DataSource.getQueryDefinitions()
QueryDefinition = QueryDefinitions("ProductQuery")

REM 連結SQL伺服器
Dim InteractionHandler As Object
Dim Connection As Object
InteractionHandler = createUnoService("com.sun.star.task.InteractionHandler")
Connection = DataSource.ConnectWithCompletion(InteractionHandler)

REM 從查詢中取得SQL Code,並查詢SQL伺服器
Dim Statement As Object
Statement = Connection.createStatement()
ResultSet = Statement.executeQuery(QueryDefinition.Command)

REM 查詢完成,取出查詢結果
Dim DATA_ID As String
Dim DATA_NAME As String
Dim DATA_PRICE As String
If Not IsNull(ResultSet) Then
While ResultSet.next
DATA_ID = ResultSet.getString(1)
DATA_NAME = ResultSet.getString(2)
DATA_PRICE = ResultSet.getString(3)
MsgBox "ID:"+ DATA_ID + " 名稱:" + DATA_NAME + " 價格:" + DATA_PRICE
Wend
End If

REM 關閉SQL伺服器連線
Connection.Close()
End Sub


接著我們分段來解說每個部份:
1. 連結 DataSource
在OpenOffice中,所有要被Calc使用的資料庫都需要先被「註冊」,
在建立資料庫時,預設都會自動幫你把它註冊到OpenOffice當中,
回憶一下,如下圖:
當我們將資料庫註冊到OpenOffice後,
我們就可以將它當成DataSource進行連結,
這裡要注意到,註冊的名稱可以和DataBase名稱不同,
要以「註冊名稱」為「DataSource名稱」,
不過預設,兩者名稱相同。

在這裡,我們指定DataSource為剛剛建立好的資料庫OOoTEST
分段程式碼如下:
Dim DatabaseContext As Object
Dim DataSource As Object
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("OOoTEST")

我們先定義DatabaseContext和DataSource這兩個變數,
接著建立DatabaseContext服務
透過DatabaseContext服務來取得OOoTEST這個DataSource

延伸:
這裡有個延伸的程式碼可以參考,如下:
Dim DatabaseContext As Object
Dim DataSource As Object
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
Names = DatabaseContext.getElementNames()
For I = 0 To UBound(Names())
MsgBox Names(I)
Next I

我們可以透過這段程式碼,將所有註冊的資料庫全部列出。

2. 取得查詢
取得DataSource後,還記得剛剛我們在OOo Base裡面,
有建立好一個叫做ProductQuery的查詢項目。
接著,我們取得這個查詢,分段程式碼如下:
Dim QueryDefinitions As Object
QueryDefinitions = DataSource.getQueryDefinitions()
QueryDefinition = QueryDefinitions("ProductQuery")

定義QueryDefinitions這個變數,
透過DataSource的getQueryDefinitions() Method,
我們取得全部的Query,
並從裡面取出我們要使用的Query - ProductQuery

延伸:
如果我們不清楚有哪些Query,希望透過Macro動態查詢,如下:
Dim QueryDefinitions As Object
QueryDefinitions = DataSource.getQueryDefinitions()
REM 顯示所有查詢
For I = 0 To QueryDefinitions.Count() - 1
QueryDefinition = QueryDefinitions(I)
MsgBox QueryDefinition.Name
Next I

我們可以用這段程式碼,將所有已經儲存的Query全部列出。

如果我們想要用Macro建立新的Query,我們可以使用下面的程式碼:
Dim QueryDefinitions As Object
QueryDefinitions = DataSource.getQueryDefinitions()
QueryDefinition = createUnoService("com.sun.star.sdb.QueryDefinition")
QueryDefinition.Command = "SELECT Name FROM ProductTable"
QueryDefinitions.insertByName("OurNewQuery", QueryDefinition)

透過這段程式碼,我們可以建立一個新的Query叫做OurNewQuery
這個Query的SQL Code為「SELECT Name FROM ProductTable」。

3. 連結SQL伺服器
再來我們要正式連結SQL伺服器,分段程式碼如下:
Dim InteractionHandler As Object
Dim Connection As Object
InteractionHandler = createUnoService("com.sun.star.task.InteractionHandler")
Connection = DataSource.ConnectWithCompletion(InteractionHandler)

這裡我們要建立InteractionHandler服務
接著使用DataSource的ConnectWithCompletion()來連結SQL伺服器

4. 從查詢中取得SQL Code,並查詢SQL伺服器
SQL伺服器連結完成後,我們要查詢SQL伺服器,如下:
Dim Statement As Object
Statement = Connection.createStatement()
ResultSet = Statement.executeQuery(QueryDefinition.Command)

我們先定義Statement變數
接著透過Statement的executeQuery()查詢SQL伺服器

這邊注意到,事實上executeQuery()使用的是SQL Code,
因此我們要透過QueryDefinition.Command
將剛剛我們取得的Query - ProductQuery內的SQL Code取出。

延伸:
因為executeQuery()使用的是SQL Code,
因此我們可以不透過Query,直接用SQL Code進行資料庫的查詢,
程式碼如下:
Dim Statement As Object
Statement = Connection.createStatement()
ResultSet = Statement.executeQuery("SELECT Name FROM ProductTable")

5. 查詢完成,取出查詢結果
如果資料庫是INSERT或者UPDATE的操作,不需要取得資料,
那麼這個步驟是完全不需要的,這個步驟只有在查詢資料,
需要從資料庫中取得資料才需要。

分段程式碼如下:
Dim DATA_ID As String
Dim DATA_NAME As String
Dim DATA_PRICE As String
If Not IsNull(ResultSet) Then
While ResultSet.next
DATA_ID = ResultSet.getString(1)
DATA_NAME = ResultSet.getString(2)
DATA_PRICE = ResultSet.getString(3)
MsgBox "ID:"+ DATA_ID + " 名稱:" + DATA_NAME + " 價格:" + DATA_PRICE
Wend
End If

這裡很簡單,在前面步驟4的最後,
我們透過executeQuery()查詢資料庫後,
結果會儲存在變數ResultSet當中,
這裡我們先檢查ResultSet,確定它是有東西的,
接著使用ResultSet.next取出每條結果,
再來我們使用ResultSet.getString(1)取出第1個欄位資料
使用ResultSet.getString(2)取出第2個欄位資料,
利用MsgBox將資料用訊息視窗顯示出來

6. 關閉SQL伺服器連線
最後,我們要有好習慣,將SQL伺服器斷線,分段程式碼如下:
Connection.Close()
到這裡,整個資料庫的查詢全部完成。

這裡延續前面的慣例,可以出個作業,
這裡我們完整的取得了資料庫的資料,
那要如何填入OpenOffice的Calc呢?

OpenOffice BASIC Macro資料庫操作-1(資料庫建立)

要操作資料,或者進行歷史資料處理,資料庫的操作都是不可避免的,
在前面入門課題結束了,我們就開始直奔主題,而第一個po的心得,
就是頗有難度,但在資料處理上很重要的,資料庫操作,這裡是操作讀取,
但寫過資料庫程式的都知道,讀取比寫入麻煩,會讀取,要會寫入都不難。
因為篇幅可能會比較長,我分上下兩集介紹,上集是建立資料庫。

開始工作前,首先需要個資料庫,在這裡我們使用OpenOffice Base的資料庫來操作。

1.建立資料庫,並存檔為OOoTEST.odb放置於桌面



2. 建立Table、輸入資料



3. 建立查詢,查詢ProductTable內全部項目


如果偏好直接用SQL Code,也可以用下列SQL Code直接建立:
SELECT "ID", "Name", "Price" FROM "ProductTable";

4. 至此,資料庫和查詢建立完成,可以開始透過Macro操作了

2011年3月19日

日本祈福與福島核災

日本這次發生誇張的地震和歷史性的海嘯,在慶幸不是台灣的同時,
祝福他們,希望他們能夠早日重建完成,我相信強大的日本,
絕對可以在短時間內重建,恢復如常。

這次,我繼四川地震、八八風災後,第三次捐款,
同樣捐助了3000元台幣,雖然不算太多,但以我目前的收入來說,
是3日所得,算是我能力所及的,因為我最近比較忙碌,
經常加班,恐怕沒辦法有力出力,錢,大概也只能出這些,
希望大家都能幫忙,讓日本能更快得回覆原來生活。

至於福島的核災,現在很多媒體報導的很誇張,
我實在不想點名,但有些新聞台報導的實在太離譜了,
記得第二天某新聞台的報導,
一邊說原能會說輻射線對台灣沒影響,風向也不對,
但另一邊打跑馬說輻射線晚上就會來台灣,這實在是......

在到達第4天時,某新聞台晚上的新聞評論,
幾個名嘴一邊說反應爐已經破洞了,一邊說水不夠,
一邊說他們拿水桶衝過去潑水,
這看得我笑到眼淚都噴出來了,這也太扯了......

我認為,日本核電廠的問題算嚴重,
但並沒有嚴重到會發生核子爆炸,也不會發生核子爆炸,
事實上,他們第一時間反應爐就停機了,
核子反應第一時間就降到最低了,所以不會核爆,
但因為核子反應「不會完全停止」,因此需要持續水循環作降溫,
而供水設備沒電、故障,才引發後續問題。

到了現在第6天,事實上狀況「漸趨穩定」了,
從新聞來看,他問題的背景是:
遭遇地震+海嘯時
1號、2號、3號反應爐機組運作中
4號、5號、6號停機歲修中(全世界核電廠的反應爐機組,運作1年半都要歲修一次)

所以4、5、6正常來說,反應爐是不應該有問題的。
所以4號失火,第一時間日本官防長官(台灣的行政院長)說正在瞭解情況,
因為不應該有問題,而之後的瞭解是,「廢燃料棒儲存槽失火」。

到今天(2011-03-19)原能會發佈的狀況是:
1號反應爐機組,反應爐圍阻體正常,冷卻水(海水)有進入,勉強可控制
2號反應爐機組,反應爐圍阻體「可能受損」,冷卻水無法進入,無法控制
3號反應爐機組,反應爐圍阻體「可能受損」,冷卻水無法進入,無法控制
4號「廢燃料棒儲存槽」「可能受損」,冷卻水無法進入,無法控制
5號「廢燃料棒儲存槽」原本水位降低,柴油發電機已能正常動作,冷卻水循環已經正常
6號「廢燃料棒儲存槽」和5號相同,柴油發電機已能正常動作,冷卻水循環已經正常

所以現在要注意的是:
1. 4號儲存槽是否有受損,這關係到輻射線是否外洩?
4號儲存槽的冷卻水循環何時能恢復?
2. 2號跟3號的反應爐圍阻體到底受損多嚴重,是變形還是破洞?
因為這關係到輻射線外洩的嚴重程度
3. 2號跟3號的冷卻水循環,或者外部海水注入,何時可以完成?

這3個點才是目前要關注的,這3個點,也才是輻射線外洩程度的關鍵問題。
至於爆炸,目前我認為再發生爆炸的機會不大,核爆的可能性更低,
而輻射線外洩,是「已經洩了」,但「洩漏程度」是目前的問題點。

至於台灣,我認為台灣的核電廠安全係數比福島的高一些,
就原能會的新聞來看,台灣核電廠的選址地形、備援機制都要比日本福島的好很多,
同樣的災難發生在台灣,可能不至於讓核電廠出問題,
但我認為,台灣的核電廠未必會出現和日本一樣的災難,
卻可能因為其他災難造成其他問題,因此我認為,加固或增加安全機制有必要性,
但因此反核我就不認同了。

最後,我的結論是,在為日本祈福,有錢出錢有力出力的同時,
對於核能的問題,還是應該理性一點看待,不應該被一些怪怪的媒體報導左右,
然後搞得認為世界末日或者福島要核彈爆炸了,
以冷靜的腦袋,儘可能的瞭解資訊,讓自己不要驚慌,應該是這時候比較適合做的事。

OpenOffice巨集參考資料

繼上篇的UNO架構介紹和上上偏的簡單範例後,
相信已經有能力寫個HelloWorld的Macro(巨集;之後都會直接用Macro表示)了,
但記得我在很多年前寫過,要學習一個新的程式語言,需要知道幾個部份:
1. Main結構
2. 程式語法
3. API或Class Reference

從上上篇的範例看完,以及上篇的UNO解說,
我相信1和2大概都能掌握了,接著是3的部份,而這篇,
就是列出一些我在寫OpenOffice時,參考的網站、文件。

書:
我在學習OpenOffice Macro時,第一個找的是書,但很不幸的,
中文書是完全沒有的(正體、簡體),
我找到的一本值得的書是:

這本書基本上不錯,但仍舊有缺點,它細節的部份很多都略過了,
所以看起來也會有一知半解的感覺。

文件:
針對OpenOffice Macro的基本概念和語法教學,寫得最好的我認為是:
這個算是Oracle(前Sun)提供的官方教學文件,
針對OpenOffice的BASIC Macro寫得非常詳盡,
事實上,我認為前面介紹的書,有一些是從這裡面Copy出來的。
雖然文件是介紹StarOffice的BASIC,
但事實上,
OpenOffice的BASIC和StarOffice的BASIC在語法上幾乎是一樣的。

網頁:
 針對OpenOffice BASIC,OpenOffice網站的教學當然不能錯過:
OpenOffice.org BASIC Programming Guide

這個教學頁面有提供簡體中文的翻譯,如下:
OpenOffice.org BASIC 編程指南
這個教學頁面我認為部份內容寫得還ok,
但它幾乎沒有圖片,解說內容也很少,看得很模糊,
看完之後,感覺上還是甚麼都沒看懂,
但基本上,有比沒有好,還是一個值得參考的教學頁面。

OpenOffice.org Developer's Guide
這個同樣是OpenOffice wiki內的教學頁面,
它的特點是,它介紹了OpenOffice內多種語言的開發,
包括OOo BASIC、Java、C++...等,
但如果前面的BASIC Programming Guide是有比沒有好的話,
這個頁面就實在是不怎麼樣,每個篇幅看下來,
反應就是,只有2句話我能看懂甚麼... :(
但,憑著它有多個語言的描述,勉強可以參考參考。

The OpenOffice.org API Project
OpenOffice.org Global Index A
OpenOffice.org Module star
這3個網頁是OpenOffice API內的頁面,
它們其實是同一串網頁的東西,
它們其實就是UNO的API Reference,
第2個網頁是將所有Service、Method、Properties全部以字母排列,
然後列出來。

第3個網頁則是以Module Name來排列描述的樹狀頁面。

第1個網頁則是它們的首頁,
如果知道Module、Method、Property的名稱,
首頁提供了很難用的搜尋引擎可以直接尋找。

我認為這幾個API Reference的頁面非常重要,
它提供了OpenOffice能夠使用的所有API的說明,
也非常有價值,但它寫得很爛,遠比Java在使用的API Reference爛得多,
我不瞭解,明明有Java的API Reference這麼好得樣板,
為啥還要作成這種鬼樣子。

Calc Functions listed by category
這同樣是OpenOffice wiki的網頁,但內容非常不錯,
我們回到最初提過的,我們這麼辛苦的學習OOo Macro,
就是為了使用它的Calc幫助我們運算和資料整理,
Calc裡面最強大的莫過於它的許多「function」,
這些function能幫助我們進行數學、財經...等運算,
透過Macro,我們還是要知道這些function怎麼用,
這個頁面,就是列出了所有Calc的function,
並有簡單的解說和Example教我們怎麼使用它。

The OpenOffice.org Wiki
因為前面的推薦頁面中,很多個都來自OpenOffice的wiki,
因此,還是把它的首頁列出來推薦,
這個可以算是前面幾個教學頁面的目錄。
不過因為它是針對OpenOffice的wiki,
而不是專門針對OpenOffice開發,
所以大部分的教學都還是針對OpenOffice的操作進行說明和教學。

OpenOffice Help:
沒看錯,就是OpenOffice的Help,
和前面的Calc Functions listed by category類似,
OpenOffice的Help能夠提供我們Calc Function的使用說明,
還有一部分BASIC的解說,包括OOo BASIC的資料型態,
運算符號和方式...等。
OpenOffice的Help最方便的地方在於,它可以直接搜尋,
雖然命中率有點低,但相對來說,還是比較方便的。

範例程式:
要使用OpenOffice的Macro,通常需要安裝OpenOffice SDK,SDK安裝好後,除了相關的Library外,還提供了一些範例和說明,
路徑在:
OpenOffice.org 3\Basis\sdk\examples

這裡必須要提一下,它的範例,我個人覺得有些複雜難懂。

論壇:
Macros and UNO API(OpenOffice Forum)
壓箱寶一定要放在最後面。
因為OpenOffice的Macro開發實在是文件稀少,
很多人都有相關的疑問,因此它的Forum真的是很熱鬧,
裡面有幾個國外的高手,看起來從很早前就在用OOo Macro了,
不少相關的解說和文章都相當的有用,直接提供了Code。
事實上,我看了前面的API Reference,
還是沒辦法獨立的根據API Reference寫出OOo的BASIC程式,
需要到Forum裡面查看看有沒有人有寫過並po文,
交互參考後才寫得出來,由此可知這個Forum的強大。

到這裡,我認為OpenOffice Macro入門所需的知識應該已經夠了,
下一篇開始,我會將這段時間的研究後得到的一些技巧性的程式段po出來,
一些是來自於論壇的Code的改寫,一些則是翻翻找找後拼湊出來的,
還請期待。

OpenOffice Macro API(UNO)架構說明

承接前一篇,在知道了簡單的開發環境和程式流程後,
這篇簡單的介紹OpenOffice Macro的API的架構,
瞭解架構後,可以比較容易瞭解API怎麼使用。

要接觸OpenOffice BASIC前,
我原本認為它的BASIC語法應該會跟VBA差不多,
學習下去後才發現,它跟VBA完全不同,類似的只有基本語法,
但API的使用,操作完全不同,基本上沒辦法無痛,
一定要下去瞭解UNO才有辦法使用。

OOo(OpenOffice.org簡稱)的Macro支援很多套程式語言,
包括:BASIC、Java、Java Script、C++、Java BeanShell Script

它們的核心,都是呼叫OOo提供的一整套API,
這套API被稱為UNO(Universal Network Objects),
透過UNO,上述所有語言都能呼叫和操作OpenOffice,
好處是跨語言,壞處是,就算只是想學BASIC,也得瞭解UNO。

如果先前學的是Java,要瞭解UNO很容易,UNO不愧是Sun設計的,
很有Java的概念。

一般來說,常見的UNO概念圖如下:

這裡我不得不說,我第一次看得時候,看一眼就沒興趣了,
但事實上它只是描述了一個簡單的架構。

UNO(Universal Network Objects),我猜測,
也許是為了要設計一個能跨平台使用的溝通模式,
又因為是Sun,所以以Java的物件導向為架構,用網路來實做,
我想用網路而不用其他溝通機制的原因,
應該是因為網路是各平台都有,
而且在UNIX、Linux的環境,他是很基本又常見的溝通機制,
也因為這樣,取名為Universal Network Objects。

簡單的說,它跟Java的物件導向概念雷同,它們的類比如下:
UNO ServiceJava Class
UNO PropertiesJava Object Properties
UNO MethodJava Object Method

簡單的說,它是以Java的物件導向為基本概念,
所有的Java Class在UNO上,都稱為Service
每個Service都有自己的Properties和Method

要使用Service,則和使用Java Object有些許不同,類比如下:
UNO:
Dim oDesk as Object
oDesk = createUnoService ("com.sun.star.frame.Desktop")


Java:
Object oDesk;
oDesk = new com.sun.star.frame.Desktop();


這樣應該很清楚,差異在於,要定義物件時,使用
Dim <名稱> as <物件名稱>

要實體化時(UNO下應該說是建立Service),使用
<名稱> = createUnoService("com.sun.star.frame.Desktop")

這樣描述,應該就能清楚的瞭解UNO的Service概念,
而要使用UNO Service也很容易,同樣以上面的oDesk為例子,
可以如下使用:
Dim oDoc as Object
oDoc = oDesk.loadComponentFromUrl("private:factory/scalc", "_blank",0,Array ())


在這裡,loadComponentFromUrl()就是com.sun.star.frame.DesktopMethod
使用上和Java的語法差不多。

要定義或修改Properties也很容易,類似如下:
oCell.String = "我的第一個Input"

這樣就能修改oCellString這個Property
並將內容改為"我的第一個Input"



最後,同樣出個簡單的問題,答案很好找,
卻在使用時頭一個會遇到疑問。
在Java中,每個Object幾乎都有相對應的Object名稱,
例如:
JFrame f = new javax.swing.JFrame();

像是JFrame f裡面的JFrame。

那類比到UNO Service時,這個建立後的Service,
是否也有獨立的名稱?
如果有,那會是甚麼?
如果沒有,那又會是甚麼?

補充:
漏了一個部份.....
我們回到前面常見的UNO概念圖,圖上在Service的外圍,
有一個ModuleService包裹住,Module是甚麼?
這也是很簡單的概念,同樣取自Java,類比如下:
UNO ModuleJava Package

實際上,和Java的Class一樣,OpenOffice的Service根據不同的用途,
會被包裹在不同的Module裡面,例如:
javax.swing.JFrame

我們可以知道JFrame屬於javax.swing這個Package,同樣的,在UNO中
com.sun.star.frame.Desktop

Desktop就是屬於com.sun.star.frame這個Package

2011年2月28日

OpenOffice Calc巨集最簡範例

很久很久沒更新了,主要是工作忙碌,一個個bug接著來,一直處於很忙碌狀態。

從上次po文說要開發Stock程式後沒多久,
我開始轉移方向到OpenOffice巨集的學習,
原因是,Stock程式的前段、後段都完成了
(前段,透過AutoIT控制證券軟體後,DDE取得即時資料;後段,透過AutoIT控制證券軟體或網頁下單),
而最關鍵的行為判斷(也就是演算法)的開發一直沒有很好得構想,
我的期望是,能夠有個簡易但富有彈性的開發環境可以進行演算法開發和評估,
但Java要開發這樣的程式,實在是不大方便,要作所謂的回測(用歷史資料測試效果)也沒辦法,
曾經考慮過整個用Java寫,也考慮過修改OpenSource的看盤軟軟體,
但感覺效果都很差,複雜度都很高,最後回頭看Excel,
考慮到Linux,因此決定改以OpenOffice為中心,連結先前開發的前段和後段,
以OpenOffice的Calc來開發和測試演算法的部份,
這部份在今天有很大的突破,以後再說。

這裡這篇,我寫上OpenOffice Calc的簡單巨集開發,算是熱身,
之後再陸續貼些在使用不錯的Macro。

環境:Windows or Linux 均可
OpenOffice版本:3.2.1(新版亦可)

1. 開啟OpenOffice Calc後,點選
工具巨集組織巨集OpenOffice Basic

2. 選取要編輯的巨集(Macro)檔案
我的巨集StandardModule1Main編輯

3. 巨集(Macro)編輯視窗簡介

4. 輸入程式碼
在剛剛看到的Sub Main和Sub之間輸入如下程式碼:
Sub Main
Dim oDoc As Object
Dim oSheet As Object
Dim oCell as Object

REM 新建一個試算表檔案
oDoc = starDeskTop.loadComponentFromUrl ("private:factory/scalc", "_blank",0,Array ())
REM 開啟目前的試算表視窗
REM oDoc = StarDesktop.CurrentComponent

REM 建立新試算表分頁
REM http://docs.sun.com/app/docs/doc/819-0439/faail?l=en&a=view
oSheet = oDoc.createInstance("com.sun.star.sheet.Spreadsheet")
oDoc.Sheets.insertByName("Stock1", oSheet)
REM 取得試算表分頁
oSheet = oDoc.Sheets.getByName("Stock1")
REM 取得第幾個試算表分頁
REM oSheet = oDoc.Sheets(0)

oCell = oSheet.getCellByPosition (0,0)
oCell.String = "我的第一個Input"
End Sub


如下圖:

5. 執行
將游標移到「Sub Main」,接著點擊「執行」按鈕

6. 執行結果
執行後,會發現新開了一個新的Calc試算表視窗,如下圖:

這個新的試算表視窗,就是透過剛剛的巨集(Macro)程式建立的,
而其中可以注意到,它會多一個叫做「Stock1」的試算表分頁,
這也是剛剛巨集(Macro)程式產生的。

接著我們點擊切換到Stock1分頁,如下圖:

我們可以發現,在「A1」這個 Cell 當中,會顯示「我的第一個Input」,
BINGO,這也是我們剛剛寫在巨集(Macro)裡面的程式碼。

至此,我們整個巨集(Macro)的開發流程就很確定了。

接著,可以出個作業自己玩玩看,
用單步執行的方式,把剛剛的巨集(Macro)程式執行一次,
搭配程式碼的註解來看看,可以對整個程式內容更有感覺。

2010年10月24日

AutoIT自動化證券下單伺服器

簡介:
去年開始開發自己的程式交易系統,目前還在開發中,而目前已經有一部分成果,下單伺服器便是其中一個重要的成果。
有鑑於下單伺服器需要長期的維護、更新,個人力量有限,因此將它Open出來,歡迎大家加入修改與使用。
目前「AutoIT自動化證券下單伺服器」已經註冊為自由軟體,並放置在http://www.openfoundry.org/of/projects/1741,歡迎大家使用、修改、更新,提出建議。

前言:
目前在網路上看到的下單系統通常有2類,一類是證券公司或第三方公司提供的API,利用API撰寫程式後開發而成;另一類則是利用AutoIT、按鍵精靈...等撰寫出獨立的UI下單程式。
第一類程式有些限制,證券公司提供的API,經常會限制每個月的交易額,以我這種少量長期且定期定額購買的人來說就不合適,第三方公司提供的API,則通常都要花錢,
最大的麻煩是,不論是證券公司提供的API或者第三方公司提供的API,幾乎都綁定Windows,要在Linux平台開發有其困難。

為了符合我想要的環境,我希望系統的核心部份能夠運作在Linux或Windows上,下單、資料擷取等子系統相互獨立在不同平台,且各子系統間能夠溝通,
因此想到了使用AutoIT為基礎開發一個TCP Socket的下單機,如此一來,我可以用獨立的電腦,或者虛擬電腦來安裝Win2000、XP(目前我使用Win2k+IE6),
以這台獨立的電腦來執行AutoIT的下單伺服器和證券軟體(網頁或應用程式),其他包括分析系統...等直接透過Socket(telnet)下指令給它,完成下單動作。

下單系統功能:
目前的下單機版本為0.2-beta版,是我目前在使用的版本,它有如下功能:
1. TCP Socket(telnet) 命令式交談介面
2. 支援寶來證券、日盛證券股票下單
3. 股票下單支援現貨、零股、盤後交易(盤後交易沒用過)
4. 寶來證券支援下單與成交回報;日盛證券僅支援下單
5. 下單系統的下單功能使用證券公司網頁下單(日盛證券的下單支援程式下單和網頁下單),網頁下單不會有多久沒交易後,停用系統的問題(日盛證券目前3個月沒交易,HTS禁止使用,網頁下單無此限制)。
6. 本系統正式註冊為「自由軟體」,為GPL3.0授權,可任意使用、傳播,唯一要求,修改過、增加功能後,請協助更新下單系統功能,至少請把程式碼公佈。

下單系統原理:
下單系統以AutoIT撰寫而成,原理很如下:
系統核心為一個AutoIT的TCP Socket Server,當連入後,可以以命令方式下達指令。
當系統收到指令後,按特定指令進行特定的操作,例如:login IEHTS2 A1234567890,xxxxxxxx。
便會自動的打開IE,自動登入到日盛證券。

下單系統系統需求:
1. 獨立的Windows系統(目前我使用Win2K)
2. IE6(IE7沒測試過)
3. AutoIT v3
4. 記憶體至少256MB
5. .Net 2.0(此為證券軟體、及之後其他相關程式需要)
6. Java 6(此為證券軟體、及之後其他相關程式需要)

我這邊的虛擬電腦分配給它的是:
Win2K+IE6+256MB RAM

下單系統簡單操作方法:
1. 拿到程式後,如果是.exe檔,直接執行即可;如果是整個SourceCode,直接執行StockServer.au3。
2. 連接埠預設為58890
3. telnet連入後(請使用linux的telnet或Windows的PieTTY,,不要使用Windows命令提示字元的telnet,會有顯示和輸入問題),可輸入help,即可顯示出使用的指令和參數說明。如下:
xxxx [/xxxx] -oooo- telnet 192.168.1.1 58890
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.
help
200--
Command list:
login [HTS2|IEHTS2|IEFin|EWinner] [Account],[Password]
Ex: login HTS2 A123456789,12345678

logout [HTS2|IEHTS2|IEFin|EWinner]
Ex: logout HTS2

trade [HTS2|IEHTS2|IEFin] [buy|sell],[spot|fractional|afterhour],[StockID],[StockPrice],[StockCount]
Ex: trade IEFin buy,spot,2002,29.3,2

report
Ex: report

exit
Ex: exit

shutdown
Ex: shutdown
200--

4. HTS2表示日盛證券程式版;IEHTS2表示日盛證券網頁版;IEFin表示寶來網頁版;EWinner表示寶來程式版(寶來點金靈)
目前寶來點金靈只支援程式開啟,不支援下單與查詢動作。
IEFin支援下單與查詢。
HTS2和IEHTS2均支援下單,不支援查詢。

下單系統0.2-beta注意事項:
1.
這個版本雖然是beta版,但它是我目前正在使用的版本,穩定性我認為還算可以接受。

2.
因為我自己是在寶來松山分行開戶的,因為寶來網頁的分行選擇是用select group,不大會處理,因此當時就先寫死了。
目前暫時性的解法是,先連上寶來的
https://trade.finairport.com/FinTradeSys/Utility/login/login_page.asp
然後按選擇分公司,然後看自己是哪個分公司,接著數數看,是0-base,這表示「忠孝分公司」是0,接著往下數,目前預設是「松山分公司」,是「17」,如果是「土城分公司」,就是「4」。
確定數值後,下載「AutoStockServer-src.7z」,並解開,修改「IELogin.au3」,把
_IEFormElementOptionSelect ($oUNITNO, 17, 1, "byIndex")
改為(以「土城分公司」為例)
_IEFormElementOptionSelect ($oUNITNO, 4, 1, "byIndex")
即可正常使用IEFin下單。
如果要透過AutoStockServer啟動EWinner,同樣的,要修改分公司,
啟動EWinner後,看看自己分公司,假設還是「土城分公司」,則複製「9794 - 土 城」,然後修改「EWinnerLogin.au3」,把
ControlSetText("系統登入", "", "[CLASS:Edit; INSTANCE:2]", "979H - 松 山")

改為
ControlSetText("系統登入", "", "[CLASS:Edit; INSTANCE:2]", "9794 - 土 城")
即可登入EWinner。

3.
這個版本我忘了把GPL3.0 Licenses File加入,此時成為GPL3.0授權。

4.
操作方法、說明目前還沒準備好,應該會在下週或下下週處理。

5.
這個專案還很新,還有不少需要修改的部份,也歡迎會或熟AutoIT並對程式交易有興趣的同好加入修改,雖然code有點醜,但想寫新功能或其他證券公司支援的,都歡迎加入。

6.
雖然目前還沒寫使用說明,但操作原則上如下:
a. 先確定有安裝AutoIT v3,如果沒有,請到
http://www.autoitscript.com/autoit3/downloads.shtml
下載安裝,這是免費的,不需要花錢或註冊。
b. src要執行,解壓縮到某個目錄後,直接執行「StockServer.au3」,右下角狀態列出現AutoIT圖示,即表示執行中。
c. 目前預設的TCP Port是58890(要改,請修改StockServer.au3,改Global Const $Port = 58890),要使用,可用Linux上的telnet連入58890(Windows可以使用PieTTY,不要使用Windows命令提示字元的telnet,顯示會有問題)
d. 連入後,可直接打help,即可出現所有操作的說明

7.
目前功能中的report,僅支援寶來證券的IEFin(寶來網頁)的回報,且回報部份文字顯示的分隔還有些問題。
日盛證券的部份,目前report遇到瓶頸,還沒辦法成功實做出來。

8.
目前僅支援「股票下單」,不支援期貨下單;股票下單支援「現貨」、「零股」,程式支援盤後交易,但我自己沒玩過。

9.
本程式因為使用AutoIT操作系統,會類比的模擬鍵盤和滑鼠的輸入,因此強烈建議讓程式執行在獨立電腦或者虛擬電腦上,避免人為介入後影響程式動作。
如果有興趣又有些無聊,可以跟我一樣,下指令後,看著它操作程式。

10.
本程式僅供測試、研究使用,如果因為錯誤操作造成巨大損失(例如下單買現貨或賣現貨,單位/數量輸入錯誤);又如果因為證券公司網頁修改、作業系統不穩、個人憑證沒更新...等問題導致下單失敗,作者概不負責。

下單系統專案網站與下載連結:
專業網站:http://www.openfoundry.org/of/projects/1741
下載位置:http://www.openfoundry.org/of/projects/1741/download

2010年10月19日

減慢更新速度...

因為開始上班了,每天過著忙碌而疲勞的生活,因此更新速度會減慢很多。
另外,從去年金融風暴前後開始,開始注意到股票交易,因此從去年開始了新的計畫~自己的程式交易系統。
雖然離「堪用」還有段距離,但開始有些心得了!
因此之後也許會開始po一些跟股票交易相關的程式。
但身為工程師,相關的程式應該會跟一般認知上的有些差異,
不會有明牌,不會有股票名,會出現的會是AutoIT操作心得、DDE操作心得之類的。
還請有點耐心,有空再來更新。