2010年2月27日 星期六

Moving Band 4 Stock Entry

  1. 這是我最常用到的進出場方式,相信很多人應該都聽過.好啦話不多說,直接進入主題 底下是"2317.TW"鴻海的量價圖,我們會分別定義出我們的上通道,下通道,跟最基本的移動平均線.透過上下通道形成我們股價波動所可以容忍的範圍.在通道中走動一般視為盤整的動作,一但跌出通道表示股價超跌.等收十字線或者是底部大量形成且內外盤比高於5成.代表下跌後有人在底部接手的動作,切記,一定要融資使用率不能操過20%,不然籌碼還是處於浮動的狀態.
  2. 買進訊號: 跌出通道且收十字線成交量收紅,就可敲進2成的資金.等股價從下越過下通道到通道內時,可做加碼的動作.切記加碼資金不能操過資本的5成. PS: 最好搭配買賣超的filter在前面,避免超賣時,股價瞬間跌出通道外,而我們的買入訊號立刻敲進,但還有一波的下跌空間,這樣就很容易被套在中間點.要先確保好頭部的反轉點是否形成.
  3. 出場訊號: 一但股價漲出上通道,或者達到獲利目標,一般我是設定10%,就可以找時間出場.
  4. 優點: 風險低 . 缺點: 進出場次數低,要空頭市場反轉時比較會看到. 如遇到多頭市場就不準了. Code 4 MaBand
    Inputs: OPrice(Open), CPrice(Close), HPrice(High),LPrice(Low),Length(9), PrcntAbv(.5), PrcntBlw(.5), Displace(0); input:n(9),stoploss(.5),stopprofit(.5); Variables: UpperEnvelope(0), LowerEnvelope(0); UpperEnvelope = AverageFC(HPrice, Length) * (100 + PrcntAbv) / 100; LowerEnvelope = AverageFC(LPrice, Length) * (100 - PrcntBlw) / 100; if CPrice <= LowerEnvelope and OPrice <= CPrice then Buy("B") next bar at market; if marketposition > 0 and CPrice >= UpperEnvelope then exitlong("XB") next bar at market;
  5. 績效表 一年只交易了4次,好像有點少....不過至少都能獲利出場. Case 2311.TW(日月光),測試時間2009/02/16~2010/02/09

youtube catcher

  1. 現在市面有很多youtube的Download軟體,本來以為只要打開網頁原始檔就可以看到連結位置,可能是我想法太天真了..呵呵.這裡就拿別人已經寫好的code 當例子講解一下要如何download. 程式碼跟原理主要參考 Ref: http://www.catonmat.net/blog/downloading-youtube-videos-with-a-perl-one-liner/
  2. 其實主要還是透過封包分析出規則,首先youtube會建立個mirror的網址這個是我們一般所看到的http://www.youtube.com/後面接的是影片的資訊,如下http://www.youtube.com/watch?v=5f-MYl-HzNw&feature 我們點入後,他會定義好要回傳給Server所要的值,如width="425" height="350"...還有影片的檔名. Server的位置在http://youtube.com/get_video?video_id=$_&t=$t, 很明顯可以看到影片所存在的位置,透過 Wget or WWW::Mechanize 的方式把影片抓回到 local
  3. sample code from http://www.catonmat.net/blog/downloading-youtube-videos-with-a-perl-one-liner/
use WWW::Mechanize;
use Number::Bytes::Human qw(format_bytes);

for (@ARGV) {
    s{http://www\.youtube\.com/watch\?v=}{}g;

    $m = WWW::Mechanize->new;
    $m->get("http://www.youtube.com/watch?v=$_&gl=US&hl=en");
    ($t) = $m->content =~ /, "t": "([^"]+)"/;

    open $f, "> $_.flv";
    binmode $f;

    $m->get(
        "http://youtube.com/get_video?video_id=$_&t=$t",
        ':content_cb' => sub {
            ($c, $r) = @_;
            $b += length($c);
            if ($r->content_length) {
                printf STDERR "$_: %.2f%%: %s of %s            \r",
                    100. * $b / $r->content_length,
                    format_bytes($b),
                    format_bytes($r->content_length);
            }
            print $f $c;
        });

    $b = 0;
    print "\n";
    close $f;
}

4.執行結果,在console下鍵入 %perl youtub.pl http://www.youtube.com/watch?v=5f-MYl-HzNw&feature=fvsr 下載完後請用 KMPlayer來撥放.

2010年2月26日 星期五

OllyICE 4 PassWord hack

  1. OllyICE 可以模擬X86的Machine code,藉由Assembly的分析,找出斷點跟Register的status,達到PassWord hack. OllyICE支援軟體除錯、脫殼、分析算法 ... (破解) Ref http://forum.slime.com.tw/thread224674.html 詳細說明文件請上網google
  2. 這邊我們就以最簡單的方式來做教學, sample code 判斷輸入的值是否為 "1234", 確定就Pass.
  3. 打開OllyICE, 載入a.exe檔,因為我是用Cygwin內的gcc compiler出來的,所以要加入Cygwin的路徑,不然會fail,如果你是在Dos底下,請把Sample code抓回去,自己重新compiler一次. a.exe : 自行complier,THX sample code : http://sites.google.com/site/funningboy/perl_code/guess.c?attredirects=0&d=1
  4. 先按F9 run 一次,猜猜看程式的架構,發現會斷在 0040114E . /0F84 9C010000 je 004012F0 在console會出現input password的字樣. 就先隨便打入猜一下輸入的格式. 發現只要是chart的型態會出現無窮回圈,如果全int會跳過,表示輸入的PassWord是0~9的數字組合.
  5. 再透過查找關鍵字的方式,回推出Program所在的Address區段 按右鍵 search for -> all referenced text strings , 發現關鍵字, Pass Ok.得知記憶體的區段位置
  6. 再回到Assembly code的位置,發現 00401089 . 817D FC D2040>cmp dword ptr [ebp-4], 4D2 ; 要經過cmp才能夠往下走,所以在cmp這邊做斷點check.如果Pass,就會走到 00401092 . C70424 332040>mov dword ptr [esp], 00402033 ; ASCII "Pass Ok",LF. 所以我們就拿4D2當作input PassWord看看,發現可以走道Pass OK. 而4D2轉成10進位得1234,就大概可以猜出是否是PassWord. 或者是改JP的位置,直接跳過Check到PassOk,如果能直接跳到Pass Ok,就表示在Check的loop一定是輸入Pass Word的地方.
  7. 關掉OllyICE,重新打開a.exe,輸入1234就OK了 Ref: http://www.pediy.com/

2010年2月25日 星期四

MSN robot 1

  1. 在之前的Warning System中,我們用mail當我們的通報系統, 詳細請參考底下連結 http://funningboy.blogspot.com/2010/02/arning.html
  2. 這邊我們替換掉mail的通報系統改成MSN的模組. Step1. 請安裝 SOAP::Lite; http://search.cpan.org/~mkutter/SOAP-Lite-0.710.10/lib/SOAP/Lite.pm Step2. 請參考 << 微程式資訊(股)有限公司 >> 所開發的MSN套件 ref: http://blog.udn.com/lukeshei ps.也請參考 msnSDK的使用流程
  3. sample code 要先Run register(); 讓MSN Robot成為你的聯絡人 再來Run sendmsg(); 發送訊息 sample code http://rd-program.blogspot.com/2008/11/3msn-perl_14.html

Facebook Login

  1. 先安裝 LWP::UserAgent http://search.cpan.org/~gaas/libwww-perl-5.834/lib/LWP/UserAgent.pm 用於Web 的 Application func,適用於Web Login, URL get, FTP Connect....
  2. 安裝OpenSSL 做網路安全加密的傳輸Lib 安裝教學請參考 http://nxforce.blogspot.com/search/label/SSH%2FSSL
  3. Check Web Login Methods 可檢視Login網頁原始碼 確定傳輸方式,底下可之是用表單來連接.在依序填入表單的欄位 <form method="POST" action="https://login.facebook.com/login.php?login_attempt=1"
  4. sample code $ua->cookie_jar(\%cookies); $response = $ua->post('https://login.facebook.com/login.php', { email => 'xxxxx', # would be the actual email pass => 'xxxxx', # would be the actual password login => 'Login', });
  5. 程式碼下載 http://sites.google.com/site/funningboy/perl_code/facebook.pl?attredirects=0&d=1

ref: http://www.ibm.com/developerworks/linux/library/wa-perlsecure.html http://www.experts-exchange.com/Programming/Languages/Scripting/Perl/Q_23940417.html

2010年2月24日 星期三

JTAG

  1. JTAG(Joint Test Action Group),利用邊界掃描的方式,依序的做Shift and Capture for each test Vector,即可對HardWare內部的Flip-Flop做Debug的動作. 優點: 簡單,不需要用到Probe的方式,可針對內部的Scan-Flip-Flop. 缺點: Boundary Scan Length/Scan Length過大時,會降低Debug的效能. Pin Assignment TDI (Test Data In) TDO (Test Data Out) TCK (Test Clock) TMS (Test Mode Select) TRST (Test Reset) optional 利用TDI/TDO的 I/O端口做Vector的輸入跟輸出, Test Vector in(TDI), Result out(TDO), TMS為FSM Mode Select, TCK為Trigger Clock, TRST 為系統Reset.

    Ref: http://en.wikipedia.org/wiki/Joint_Test_Action_Group

    利用FSM來判斷status,Mode select先選 Instruction Mode決定HardWare 內部要做怎樣的Mode,如現在是JTAG Debug Mode or Function Mode...等Mode 決定好時, 在下個Clock切換到Data Mode,開始打我們所要的Pattern,在此同時TDO會收到上一筆我們所要測的Result.

    Ref: http://en.wikipedia.org/wiki/Joint_Test_Action_Group
  2. 如果對JTAG Debug 有興趣的人,可以參考 http://urjtag.org/ 這裡面有已經開發好的Driver跟Debug,不過限制只有他內部提供的Board跟Cable有效.如果不是的,可能要自寫個Interface2Interface的Converter.

GDB Debug

  1. 在Embedded系統上常被用到的就是GDB Debug的機制,透過Remote control 設定 break point or print register status... 底下是目前最常看到的Debug平台,透過PC 端compiler好 Target(ARM)端的執行檔(.EXE),在藉由JTAG燒入到Target上,最後透過GDB Remote Debug的方式,設定Break Point or Dump Register的方法,達到Realtime Debug.
  2. 這邊我們簡化流程,把Target端跟Host端都在我們的PC上來模擬Embedded Debug的流程.
  3. Step 1. 安裝GDB Debug http://www.gnu.org/software/gdb/ 安裝參考 http://www.zychip.com/html/support/linux_gdb/index.php 這邊要注意,因為我們不須代入ARM-Linux的compiler.只要鍵入安裝路徑就可 % cd gdb-7.0.1 % ./configure --prefix=/usr/local/bin % make % make install PS: 切記路徑必須要在Path中,這樣才能被呼叫. Step 2. check /usr/local/bin/ 內有 gdb.exe, gdbserver.exe check GDB 安裝完成 % gdb 看使否會進GDB 的 console Step 3. sample code && Debug hello.c 程式碼下載 http://sites.google.com/site/funningboy/perl_code/hello.c?attredirects=0&d=1

    Step 4. 模擬Target 端 % gcc -g -O0 -o hello.gdb hello.c % cp hello.gdb hello % strip -s hello 這邊藉由gcc complie出我們要模擬的Target端,Post的部分我們就省略了. 要模擬Traget的部分要靠 gdbsever的功能,請鍵入 % gdbserver :3333 hello
    會模擬在Target端是由port 3333來連線,且運行hello
    Step 4 模擬PC連到 Target 端 請在開個新的console,鍵入 % gdb target remote 127.0.0.1:3333 會連到我們剛剛設定的Target端.連上後,就可以做Remote Debug
執行結果
Reference links

    http://opencsl.openfoundry.org/Lab05_debugger.rst.html http://opencsl.openfoundry.org/ http://www.zychip.com/html/support/linux_gdb/index.php

2010年2月23日 星期二

Trading Performance v2

  1. 接續 http://funningboy.blogspot.com/2010/02/trading-performance-v1.html
  2. 這邊我們會根據使用者設定的參數做篩選的動作,根據Poluation, Generation...的condition,來篩選適當的基因.
  3. 最後再透過移動視窗法把每一季的結果交叉比對,看是否能達到我們所要的目標.
  4. 執行結果 1101.TW(台泥) EndDay 2010/02/09, test sequence 90 days Dispaly mode Indictor name : MACD Fast Length : 12 Slow Length : 26 BuyOrSell : 1 EnterTradeDate: 2009/10/02 LeaveTradeDate: 2009/10/28 EnterPrice : 37.00 LeavePrice : 35.00 Profit : 2 LifeTime : 56 Indictor name : OLDOBV Fast Length : 4 Slow Length : 24 BuyOrSell : 1 EnterTradeDate: 2009/10/06 LeaveTradeDate: 2009/10/29 EnterPrice : 36.60 LeavePrice : 34.45 Profit : 2.15 LifeTime : 45 基因解 0,9 Parents:: PARENTA,HASH(0x2490bac) PARENTB,HASH(0x1ca2ba4) Mutation:: 6 -> 2 Length:: BIASFAST,2 BIASSLOW,24 KD,8 MACDAVG,9 MACDFAST,12 MACDSLOW,26 OBVFAST,6 OBVSLOW,22 RSIFAST,5 RSISLOW,11 WRFAST,13 WRSLOW,24 Profit:: AVGPRF,1.89285714285714 BIAS,2.2 KD,0 MACD,3.05000000000001 NEWOBV,0 OLDOBV,4.2 RSI,0 TOTPRF,13.25 WR,3.8 http://sites.google.com/site/funningboy/perl_code/Ga_rst.txt?attredirects=0&d=1
  5. 結論 每種技術指標會對於市場而言,會有不同的表現,當多頭市場形成時KD反而不準.反而MACD會比較準確,所以每個指標都有其相對的市場基礎,要先行確定目前是盤整,多頭,空頭.在套用過去模擬的結果做推斷跟分析.達到降低進出市場的風險性.

Trading Performance v1

  1. 相信有在做程式交易的人應該對進出場的訊號特別敏感,而這些進出場的訊號如何決定,不外乎透過一些技術指標(KD, RSI...),成交量(OBV),法人買賣超...,要怎樣評斷說當KD=?,OBV=?...時我們買進或者出場?我想就必須要靠歷史資料的回測跟分析.當然市面上有很多相關的軟體套件,如TS(TradeStation),HTS... 上網google下,其實就有很多人在做類似的研究 http://ssdkchang.blogspot.com/ http://skyelephant.blogspot.com/ http://www.programtrading.tw/index.php 不過這邊不是教你如何使用TS or HTS...因為在開發套件上還是有些限制,如法人買賣超明細,基本面分析....,這是在TS所沒有提供的.其實是我也不知道怎樣inlude到TS內.呵呵.... PS:我拿TS當圖形介面(K線)跟簡易的回測分析...
  2. 底下進入我們的核心部分
  3. 1.利用SDDE 抓取我們每日所要的資訊, SDDE 請參考 http://funningboy.blogspot.com/2010/02/sdde-server-v1.html http://funningboy.blogspot.com/2010/02/dde-server-for-stock.html 2.透過GA演算法找出最佳的進出場策略 http://en.wikipedia.org/wiki/Genetic_algorithm 3.假設策略決定好後,回報給下單機做下單的動作 PS: 目前還是手動下單.
  4. GA 演算法流程 利用適者生存,不適者淘汰的方式重複的Run Case,找到最適合的基因解,其實在做最佳化的過程會抹平很多CoFactor,導致我們所得到的數據不符合真實情況.應該說我們找到的解應該不只一個,而是一個群集,有一個space的空間,即使不是最佳的解,但我們也能藉由這些解集合達到獲利出場的結果. PS: Global min我個人認為是很難達到,因為我們是做歷史資料的最佳化,未來的量價是很難被確定的.只能做Prediction的方式來避免這樣的問題發生.當然要做的好還是要靠不斷的驗證跟經驗累積,在之後會介紹FANN(Fast Artificial Neural Network)的系統,透過學習跟訓練達到未來價量的預測.
  5. 基因的決定 目前基因鍊上的染色體, - 染色體 : 我們預設用各種指標函數來表示, - 染色體的優劣: 分別由各個指標的獲利來表示. - 染色體 : 存在每個指標內,代表進出場時間跟訊號,生存時間 - 進出場判斷: 以KD 為例: - KD 進出場判斷 - Step1當(K<20>D : Buy=1, EntryCot++, Profit=0, LifeTime=50. - Step2 計算T+n天的 Profit. 如果 (Price > EntryPrice) LifeTime+=1, Profit=(Price-EntryPrice)/EntryPrice*100% (Price 待續.....

Warning System

  1. 通報系統的應用範圍很廣,有財務通報系統,火災通報系統,IT Server 通報系統.... 透過Sensor Nodes 回傳 Warning 訊息給 Server,讓 Server端能夠快速的知道在哪個Sensor發生錯誤,可運用在大範圍資料的處理減少每個Sensor Node的負載跟人力成本的付出.
  2. 設計架構 以IT Server為例,假設我們要確保每台 work station都能work,但有100台work stations要處理,總不能每次都一台一台慢慢登入,如果有通報系統,我們就不用手動一台一台的Check. Mail + Sensor Nodes + PC Mail : 我們用Mail Server來接收Warning Message (Gmail,Hotmail...) Sensor Nodes: 要待測的Work Station PC : PC 流程圖,透過Request,跟Response的機制

  3. 安裝套件 Email::Send::Gmail http://search.cpan.org/~lbrocard/Email-Send-Gmail-0.33/lib/Email/Send/Gmail.pm openSSL -> 傳輸加密套件 MD5,SHA http://www.openssl.org/ 安裝流程 http://nxforce.blogspot.com/search/label/SSH%2FSSL
  4. sample code Sensor Node Detection 1.可以用內建的Telnet判斷workstation alive/dead http://zh.wikipedia.org/wiki/Telnet 2.Ping workstation http://en.wikipedia.org/wiki/Ping 在加入判斷條件,最後導入mail.pl mial.pl http://sites.google.com/site/funningboy/perl_code/mail.pl?attredirects=0&d=1
  5. 執行結果

2010年2月22日 星期一

Audio Beep

  1. 當初會做這個sample是因為我找不到Board上BeeBee音而找的替代方案,不像在Linux的環境下只要% beep,就會發出提示音,不過這樣也好拉,古人說塞翁失馬焉知非福...就順其自然摟.沒想到這個model下還可以開發出很多奇怪的東西呢.
  2. 請先下載 Audio::Beep 套件 安裝教學 http://perl.hcchien.org/ch13.html
  3. Sample code 底下以Windows XP為範例 Windows API 控制Kernel32.dll的Driver my $player = Win32::API->new('kernel32', 'Beep', 'NN', 'N'); Win32::Beep ( [FREQUENCY, DURATION] )

Kernel32.dll相關說明 http://en.wikipedia.org/wiki/Kernel32.dll#Kernel32.dll Kernel32.dll API http://www.webtropy.com/articles/art9-2.asp?lib=kernel32.dll http://search.cpan.org/dist/Win32-API/samples/Win32/kernel32.pm

如對轉檔有興趣可參考 Perl Audio Converter http://sourceforge.net/projects/pacpl/

SDDE Server-V1

  1. 這邊是透過 "Web" 連到"Yahoo"跟"元太"卷商抓取每日的成交 資訊,不是透過DDE的報價機,如果要Access DDE 報價機請看我之前寫的DDE for Stock http://funningboy.blogspot.com/2010/02/dde-server-for-stock.html
  2. 主要功能介紹 主力進出表 : 抓當日前30大買賣超股票. 買賣超明細 : 抓當日卷商的進出明細. 歷史股價 : 抓從2009/01/01到今天的 "Open", "High", "Low", "Close", "Volume". 當日進出場提醒: 假設進出場策略已訂,可藉由當日交易時間內做進出場的提醒. 當日買賣明細 : 每隔1分鐘抓yahoo stock的資訊. PS: 因為是透過網路抓取,一但所需要的資訊量太大,會造成資料延遲的狀況.如果只是做盤後分析,應該是沒什麼問題.如果要在盤中做即時策略分析我想還是有點難度,因為不可能只考慮10幾支股票吧...都至少要100支一上的份量.... 對於操作現股跟資料v.s卷商的相關性有比較大的幫助.
  3. 執行前請先對Perl 或者是 程式語言有基礎的架構. 程式碼跟教學下載 http://sites.google.com/site/funningboy/perl_code/DDE_v1.rar?attredirects=0&d=1

Thread

  1. 每次碰到 Thread就很頭大,不知道哪個執行緒會先完成,哪個又會被呼叫...雖然可以針對每條thread做Priority的設定,但這又扯到CPU的架構,跟硬體的loading....X86跟MIPS底下,想同的程式碼,跑出來的Performance也會有差. 底下大概介紹一下不同架構的差異性,我們在之後會詳述每個Architecture. X86 : http://en.wikipedia.org/wiki/X86 MIPS:http://en.wikipedia.org/wiki/Instructions_per_second
  2. Threads 的種類 Kernel Thread 即 Thread 由 Kernel Create 和 Distory, 共同生活在 Kernel space中.如Display, KeyBoard Access ...Driver control,系統要run 時所要用到的Process. Lightweight Process 特別是指給 User用的 Kernel Thread,因為 Kernel Thread 分為給user用和自己用的兩部份(asychronous I/O, ex: disk write),所以 Lightweight Process 也就是 Kernel Thread.如 HardDisk 的存取, USB...,平常不需要時會idle,等需要用到時才Wake Up. User Thread 由 Library 控制. Creating, Scheduling, Synchronization, Managing... 都由 Library 負責, Kernel 跟它是獨立的
  3. Thread Sample code 假設我們現在有4個獨立的Thread,不考慮join的問題.分別為Priority 1,2,3,4.且模擬執行時所需要的時間,預設為3s. 我們發現當執行之後,thread會沒有跑完.而死在裡面. 如果把 sleep 8 打開後,發現所有的thread 都做完了.如果以單一個Procss來看四個至少要4*3=12s,但用thread之後, performance 還小於8 s, 看來裡面有用到Parallel的機制. 程式碼下載 http://sites.google.com/site/funningboy/perl_code/thread.pl?attredirects=0&d=1

Port Scanner

  1. 一般駭客做系統入侵時,會針對系統上面所開的port跟安全上的漏洞做 inject,把惡意的程式碼植入到系統上,這邊我們不討論駭客是如何入侵,因為當駭客是非法的..... port number list http://www.iana.org/assignments/port-numbers 主要還是 80: Http, 21:FTP, 25:SMTP...大家比較熟知的部分
  2. 這邊用到Socket的範例 http://funningboy.blogspot.com/2010/02/internet-socket.html
  3. 執行結果
  4. 程式碼來源 http://blog.linym.net/archives/93

Game for Snake

  1. 想當初在高中時代紅極一時的3310遊戲 "貪食蛇",堪稱是手機遊戲的先驅呢.話不多說,來介紹一下 "Snake" 設計架構.
  2. 主要分成兩大部分 1. Core,為我們的Data Base,計算每個Snake Node的X,Y座標. 2. Display為GUI的圖形介面(Layout). 下圖我們用最簡單的範例來講解Core的部分,(X,Y)為在圖表上X,Y的座標,Snake上的每個Node用structure的方式記錄每個Node所在的位置跟方向,假設下一步為向左的方向,等下個time strobe時 update每個Node. 經過update之後可以看到我們更改了Node內部的X,Y座標.跟Direction.等下個time strobe來決定Direction . 依此類推可以得到下一次每個Node的X,y座標. Display的部分就比較簡單了,用Array的方是依序填入每個[i][j]值,在導入Java的Display API.最後在設定Strobe的速度,food的位置,record,wall.... 執行結果. 程式碼下載 http://sites.google.com/site/funningboy/perl_code/Snake.java?attredirects=0&d=1 執行檔下載 http://sites.google.com/site/funningboy/perl_code/Snake.jar?attredirects=0&d=1

Internet Socket

  1. 有修過網路概論,或是計組的人應該對socket不陌生,而我會接觸到這個套件,也是因為工作上的需要.....,主要是能透過分散式的處理程序減少在local端的運算量,把複雜的運算跟大量的Data Base存在Work station上,PC 端就可以藉由Socket 的套件 Access 到我們想要的結果.
  2. 透過GDB Rmote debug幫我們在embedded bord上做Debug跟燒入的動作 http://www.study-area.org/cyril/opentools/opentools/x1265.html Socket 基礎介紹 Socket 類別針對網路通訊提供一組方法和屬性。 Socket 類別可以讓您使用 ProtocolType 列舉型別中列出的任何通訊協定來執行非同步資料傳送。 目前唯一支援的 ProtocolType 為 TCP 通訊協定。 Ref: http://msdn.microsoft.com/zh-tw/library/system.net.sockets.socket(VS.95).aspx
  3. Socket的開發套件,目前有很多支援的程式語言,如Java, C, C++, VC, Perl...,這邊用Perl當範例,因為Perl的語法簡單易懂,如此而已. Java: http://www.cis.nctu.edu.tw/~is82001/NetProg/6/main.html http://java.sun.com/j2se/1.4.2/docs/api/java/net/Socket.html C: http://www.scottklement.com/rpg/socktut/introclient.html perl: http://www.tutorialspoint.com/perl/perl_socket.htm
  4. 我們主要分成兩塊來運行,Server, Host(Client)端. 先Check IP Address,跟所開的Port 是否能通過防火牆. 如果是在自己電腦端對自己電腦端請把IP address 改成 "127.0.0.1" local host
  5. sample code for Server $socket = new IO::Socket::INET ( LocalHost => '127.0.0.1', LocalPort => '80', Proto => 'tcp', Listen => 5, Reuse => 1 ); die "Coudn't open socket" unless $socket; //連線到 127.0.0.1 : 80 /TCP傳輸... Listen 5次,重新傳輸1次 $client_socket = $socket->accept(); //確定連線 close $client_socket; //close 連線
  6. Sample code for Client $socket = new IO::Socket::INET ( PeerAddr => '127.0.0.1', PeerPort => 80, Proto => 'tcp', ) or die "Couldn't connect to Server\n";
  7. 執行結果,黃色部分為Server端,紅色部分為Client端 程式碼下載 Server: http://sites.google.com/site/funningboy/perl_code/tcpserver.pl?attredirects=0&d=1 Client :http://sites.google.com/site/funningboy/perl_code/tcpclient.pl?attredirects=0&d=1

DBI Driver

  1. DBI(Data Base Interface),相信有學過資料結構的人應該不陌生,Data Base就像是一個資料庫,可供我們做查詢的動作,大致上可分為 File access, Excel, SQL...這邊我們不詳述每個Data Base的架構.我們主要探討如何透過Perl Wrapper 去call API,進行資料存取的動作.
  2. API 參考 http://search.cpan.org/~timb/DBI/DBI.pm
  3. Data Base Line 最簡單就是發出 request 給 Server,Server在根據我們所下的request 在response我們所要的結果,有些資料庫連線必須透過加密解密的動作,如網路的表單查詢... 如果只是自己host端,只友我們可以access的話,我們就不需要做到加密解密的動作. openSSL 加密/解密 傳輸 http://csc.ocean-pioneer.com/docum/ssl_basic.html http://www.openssl.org/ 最簡單的方式,就是輸入使用者名稱跟密碼,透過明碼加密的方式. $dbh = DBI->connect($dsn, $user, $password, { RaiseError => 1, AutoCommit => 0 });
  4. Driver Check,我們透過Check的方式,來抓取現有系統下,我們所能夠handle的Data Base
  5. sample code for "DBI_Driver.pl"
    #!/usr/bin/perl -w use DBI; use strict; use warnings; DBIDriverTest(); sub DBIDriverTest{ my @drivers = DBI->available_drivers(); die "No drivers found!\n" unless @drivers; # should never happen ### Iterate through the drivers and list the data sources for each one foreach my $driver ( @drivers ) { print "Driver: $driver\n"; my @dataSources = DBI->data_sources( $driver ); foreach my $dataSource ( @dataSources ) { print "\tData Source is $dataSource\n"; } print "\n"; } }
      執行結果如下
      程式碼下載
    http://sites.google.com/site/funningboy/perl_code/DBI_Driver.pl?attredirects=0&d=1

    2010年2月21日 星期日

    OLE function

    1. 因為要做策略分析要用到Excel的套件來幫我把圖表做好,不得已只好打開API lib,如果已經內建好了Active Perl,裡面有個model "Win32::OLE" 的套件,這是存取excel API lib 微軟的範例網頁提供了簡易的教學範例 http://support.microsoft.com/kb/214797/zh-tw
    2. sample code use Win32::OLE; $xlApp = Win32::OLE->new('Excel.Application'); ..... // 填入我們所需要的欄位,跟參數 $mydata = [["Item", "Category", "Price"], ["Nails", "Hardware", "5.25"], ["Shirt", "Clothing", "23.00"], ["Hammer", "Hardware", "16.25"], ["Sandwich", "Food", "5.00"], ["Pants", "Clothing", "31.00"], $rng = $xlBook->ActiveSheet->Range("A1:C7"); //抓column A1 到 column C7的值 # Create a chart too... $chart = $xlBook->Charts->Add; $chart->SetSourceData($rng, 2); $chart->{ChartType} = 70; # 3D-pie chart $chart->Location(2, "Sheet4"); // plot chart PS: Excel有支援的圖形介面有 "折線圖", "圓餅圖", "柱狀圖"... 其控制碼可以參考 Excel API http://www.fred.net/brv/chart/ 最後會把統計的數字自動建出我們所要圖表. 其他參考 http://www.xav.com/perl/faq/Windows/ActivePerl-Winfaq12.html http://www.ngbdigital.com/perl_ole_excel.html

    DDE server for Stock

    1. 有在做程式交易的人應該對DDE(Dynamic Data Exchange)不陌生, 這是 "微軟" 為了做資料交換所做的傳輸模式,透過server hanlde 我們所需的要求,減少在PC端所需要的運算量.從微軟官方的角度,制訂了 DDEML (Dynamic Data Exchange Management Library) 的規格,是 Windows 32-bit 的 APIs(Application Programming Interfaces),是被實作在 "User32.DLL".
    2. http://en.wikipedia.org/wiki/Windows_library_files
    3. 最為大家所熟知的,就是透過DDE跟Excel相連,在Excel內部做進出場判斷,等策略決定後,再回傳給DDE做下單的動作. 其實上網google就一堆API的範例了... http://www.programtrading.tw/viewtopic.php?t=36 http://ssdkchang.blogspot.com/2009/09/ts.html 其實一般卷商的看盤軟體都有支援DDE的報價,這邊我們是用富邦證卷所提供的報價機,在藉由perl access DDE的方式.抓取我們所需要的"時間", "股票名稱", "量", "價"....畢竟還要去parse Excel有點不符合效率....
    4. 請先安裝 "Win32 DDE client" model,因為這不是 cpan裡的model請在 command line底下鍵入 % ppm repo add bribes % ppm install Win32-DDE 請參考 http://www.mail-archive.com/perl-win32-users@listserv.activestate.com/msg38134.html http://www.bribes.org/perl/win32ddeclient.html PS: 確保安裝完全,可鍵入 % perl -e 'use Win32::DDE::Client;'
    5. sample code use Win32::DDE::Client; use Win32::DDE; $Client = new Win32::DDE::Client ($MySerNm, $MyHostNm); die "Unable to initiate conversation" if $Client->Error; defined ($StockNmPtr = $Client->Request ($StockNm)) die "DDE request Name failed"; 這邊我們有紅色的地方是我們要填入的欄位參數,分別為 $MySerNm, $MyHostNm, $StockNm, 以我們富邦DDE報價機的範例,假設我們要查2330.TW台積電的"量","價" XQFAP::Quote::{2330.TW-Name} //抓2330.TW 的名稱 XQFAP::Quote::{2330.TW-Price} //抓2330.TW的成交價 XQFAP::Quote::{2330.TW-TotalVolume} //抓今日的總成交量 藉由這些範例我們可以得知我們要填入的欄位 $MySerNm = 'XQFAP'; $MyHostNm = 'Quote'; $StockNm = '2330.TW-Name'; 以此類推可以得到 "價", "量", "內外盤比" .... 在之後會 討論進出場理論跟判斷原則.......

    print port control

    1. 在嵌入式的系統架構下,如何把data燒入到target board(ARM,embedded...)上,不外乎透過ARM 的 multi ice/ADS,而這些傳輸的動作,必須要用到cable線來連接target(board) and host(PC),以下我們就用最簡單的方式透過print port 打出我們所要的vector. "Wiggler" 為目前最為廣泛應用的cable線,因為便宜且製作方便,材料器材都可在電子材料行買到,詳細資料可以在此找到 http://blog.xuite.net/kyanite0909/techshare/15457382
    2. http://www.frozeneskimo.com/electronics/arm-tutorials/jtag-wiggler-clone/
    3. 我們在這邊主要是介紹如何藉由 "Perl" 呼叫 Windows 的 DLL,透過Driver control的方式把vector打出去,首先要Perl模擬環境,目前我是用active perl 當我的environment, 因為active perl 可以安裝在Windows上,且ppm套件可以從cpan下載 . http://www.activestate.com/activeperl/ 安裝流程請上網查詢
    4. 假設已經有了perl的模擬環境,現在就必須透過cpan的連線下載perl的model套件, 進入command line % % cpan % get Device::ParallelPort::Printer % exit 在 /c/Perl/cpan/build/內會看到你下載好的model,在鍵入以下的command % cd /c/Perl/cpan/build/Device-ParallelPort-1.00 % perl Makefile.pl % make test % make install PS: 如果你是用windows的command line下,請先下載專為DOS nmake,在把make的command改成nmake . http://msdn.microsoft.com/zh-tw/library/dd9y37ha(VS.80).aspx 不然就請先下載好cygwin的Linux模擬環境. http://www.cygwin.com/ 如果以上步驟都ok了,可以在command line下鍵入 % perl -e 'use Device::ParallelPort::Printer;' 來確保model已經安裝完成.
    5. 再來請到http://logix4u.net/Legacy_Ports/Parallel_Port/Inpout32.dll_for_Windows_98/2000/NT/XP.html 安裝我們所需要的DLL driver檔 "Inpout32.dll". 請放到Windows\sytem32的資料夾底下. 底下來簡略介紹一我們要如何控制 "Inpout32.dll" 的input/output的接口,首先要確定我們的print port的硬體driver是否已安裝好. 可以到 控自台->系統-> 進階 -> 硬體 -> 裝置管理員 check 一下 bios 要driver print port時所要用到的address 區段,一般是用"LPT1" address為 "0x378" 這個記憶體區段 http://logix4u.net/Legacy_Ports/Parallel_Port/How_to_read_Parallel_Serial_Port_address_from_BIOS.html 在第一個框框我們已經確定好我們的address區段後,在第二個框框我會check我們的DLL是否可以被呼叫起來. 利用Win32的API做input,output的接口測試,以這段為例子Win32::API->new("inpout32", "Inp32", ['I'], 'I'); 會create一個new的ptr,後面依序接的是DLL的name,DLL下的call func,再來是input,output的接口.這邊必須要注意到parallel port是用byte作傳輸,一次8個bit.如果只是單純對一個bit而言,可以用MSB LSB的方式,定義好所要傳的格式,把騎他的bit填成o/1.
    sample code my $port = Device::ParallelPort->new(); // 建立ParallelPort 物件 $port->set_bit(3,1); //透過print port的 pin3 送出 High的訊號,輸出電壓為5.5v print $port->get_bit(3) . "\n"; //抓取print port上 pin3 的 data, print ord($port->get_byte(0)) . "\n"; //抓取 pin0-pin7 的值,並轉成8進位的型態 $port->set_byte(0, chr(255)); //送出 int(255) -> bit(11111111) from pin0-pin7 主要參考 http://search.cpan.org/~scott/Device-ParallelPort-1.00/lib/Device/ParallelPort.pm