顯示具有 1分鐘K線 標籤的文章。 顯示所有文章
顯示具有 1分鐘K線 標籤的文章。 顯示所有文章

2018年1月5日 星期五

使用 bash tick

程式碼 ( Bash Code )

#!/bin/sh

# V 1.2.0 2016-02-27 change url
# V 1.1.1 2015-04-24 change prg dir ( tick -> trade )
# V 1.1   2009-10-10 change Last-Trading-Days

# tick K 

# Get Tick
# Use Argv

# if [ $1 = ]; then
if [ $# -lt 1 ]; then
  echo "Argv number is less  than 1."
  echo "EX:  $0  20090610"
  exit 1
fi

year=`echo $1 | cut -c 1-4`
month=`echo $1 | cut -c 5-6`
day=`echo $1 | cut -c 7-8`

workFile=`printf "%s_%s_%s" $year $month $day`
workday=`printf "%s%s%s" $year $month $day`
workMonth=`printf "%s%s" $year $month`

url_zipDailyFile=http://www.taifex.com.tw/DailyDownload/DailyDownload/Daily_$workFile.zip
dailyStoreDir=/home/redjoe/trade/prg_bash/daily/
tickStoreDir=/home/redjoe/trade/prg_bash/tick/
log_File=/home/redjoe/trade/prg_bash/rj_crontab.log
ltd=`tac /home/redjoe/trade/last-trading-days/last-trading-days`

wget -c -a $log_File -P $dailyStoreDir $url_zipDailyFile


# Process Tick

cd $dailyStoreDir

zip_DailyFile=Daily_$workFile.zip
rpt_DailyFile=Daily_$workFile.rpt

workmonth=./tmp1

wkproduct=`ls -l $zip_DailyFile | cut -d ' ' -f 5 `

# echo $wkproduct

if [ "$wkproduct" -ne '93' ]; then

  unzip $zip_DailyFile

  # echo $rpt_DailyFile
  # echo $workFile.TX

  for td in $ltd
  do
    #echo "$td="$td , "$workday="$workday
    if [ "$td" -ge "$workday" ]; then
      #echo " $td > $workday "
      wkmonth=`echo $td`
    fi
  done

  echo $wkmonth > $workmonth

  wkproduct=`cut -c 1-6 $workmonth`
  # echo $wkproduct


  # TX 台指
  head -n 1 $rpt_DailyFile > $workFile.TX
  sed '/MTX/d' $rpt_DailyFile | sed -n '/TX/p' | sed -n 's/ //gp' | awk -F, 'BEGIN{OFS=","}($3=='$wkproduct'){ print $1,$2,$3,$4,$5,$6/2 }' >> $workFile.TX
  echo "TickTime,Price,Vol" > txf$workday.csv
  sed '/MTX/d' $rpt_DailyFile | sed -n '/TX/p' | sed -n 's/ //gp' | awk -F, 'BEGIN{OFS=","}($3=='$wkproduct'){ print $4,$5,$6/2 }' >> txf$workday.csv

  # MTX 小台
  head -n 1 $rpt_DailyFile > $workFile.MTX
  sed -n '/MTX/p' $rpt_DailyFile | sed -n 's/ //gp' | awk -F, 'BEGIN{OFS=","}($3=='$wkproduct'){ print $1,$2,$3,$4,$5,$6/2 }' >> $workFile.MTX
  echo "TickTime,Price,Vol" > mxf$workday.csv
  sed -n '/MTX/p' $rpt_DailyFile | sed -n 's/ //gp' | awk -F, 'BEGIN{OFS=","}($3=='$wkproduct'){ print $4,$5,$6/2 }' >> mxf$workday.csv

  # TE 電指期
  head -n 1 $rpt_DailyFile > $workFile.TE
  sed -n '/TE/p' $rpt_DailyFile | sed -n 's/ //gp' | awk -F, 'BEGIN{OFS=","}($3=='$wkproduct'){ print $1,$2,$3,$4,$5,$6/2 }' >> $workFile.TE
  echo "TickTime,Price,Vol" > exf$workday.csv
  sed -n '/TE/p' $rpt_DailyFile | sed -n 's/ //gp' | awk -F, 'BEGIN{OFS=","}($3=='$wkproduct'){ print $4,$5,$6/2 }' >> exf$workday.csv

  ## TF 金指期
  head -n 1 $rpt_DailyFile > $workFile.TF
  sed '/GTF/d' $rpt_DailyFile | sed -n '/TF/p' | sed -n 's/ //gp' | awk -F, 'BEGIN{OFS=","}($3=='$wkproduct'){ print $1,$2,$3,$4,$5,$6/2 }' >> $workFile.TF
  echo "TickTime,Price,Vol" > fxf$workday.csv
  sed '/GTF/d' $rpt_DailyFile | sed -n '/TF/p' | sed -n 's/ //gp' | awk -F, 'BEGIN{OFS=","}($3=='$wkproduct'){ print $4,$5,$6/2 }' >> fxf$workday.csv

  rm $workmonth


  if [ ! -d $workMonth ]; then
    mkdir $workMonth
  fi
  mv $rpt_DailyFile $zip_DailyFile  $workMonth/

  if [ ! -d "/home/redjoe/trade/prg_bash/tick/$workMonth" ]; then
    mkdir /home/redjoe/trade/prg_bash/tick/$workMonth
  fi
  mv $workFile.TX txf$workday.csv $workFile.MTX mxf$workday.csv $workFile.TE exf$workday.csv $workFile.TF fxf$workday.csv $tickStoreDir$workMonth/


fi

2017年2月19日 星期日

Perl - 貨日交易檔分拆成當月:台指,小台,電指期,金指期

程式 : perl 
說明 : 期貨日交易檔分拆成當月:台指,小台,電指期,金指期
# prg : perl_proc_tick.pl
#       期貨日交易檔分拆成當月 台指, 小台, 電指期, 金指期

# V 1.3.1 2015-04-24 change workDir to ~/trade/prg_perl/trade_data/
#                           tickDir to ~/trade/prg_perl/tick/
# V 1.3.0 2010-01-05 Auto Create Store Dir
# V 1.2.0 2009-10-10 change Last-Trading-Days
# V 1.1.0 2009-05-30 get taiwan future tick 
# V 1.0.0 2009-06-17 change Work Directory and move to Storage

use POSIX qw(strftime);
use integer;
# $workDir = '/home/redjoe/tick/prg_perl/trade_data/';
# $tickDir = '/home/redjoe/tick/prg_perl/tick/';
# my $LastTradingDays_file = "/home/redjoe/tick/last-trading-days/last-trading-days";
$workDir = '/home/redjoe/trade/prg_perl/trade_data/';
$tickDir = '/home/redjoe/trade/prg_perl/tick/';
my $LastTradingDays_file = "/home/redjoe/trade/last-trading-days/last-trading-days";

# $target = 'hm30:~/public_html/future/daily/';

# 
my $TX_Product  = 'TX';  # 台指
my $MTX_Product = 'MTX'; # 小台
my $TE_Product  = 'TE';  # 電指期
my $TF_Product  = 'TF';  # 金指期

my $startHH  = '08';  # 開始時
my $startMM  = '45';  # 開始分
# my $MinuteK  = 5;  # K
my $MinuteK  = 1;  # K
my $IdxK  = -1;    # idx
my $PreIdxK  = -1;    # idx

chdir $workDir;

# $now_string = strftime "%a %b %e %H:%M:%S %Y", localtime;

($sec, $min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)  = localtime(time);

$year = $year + 1900;
$mon  = $mon  + 1;

# :34,43s/^# //g  :47,55s/^/# /g  # testing use
# :34,43s/^/# /g  :47,55s/^# //g  # Auto get date

# $today_ziptickfile = "Daily_" . $year . "_" . $mon ."_" . $mday . ".zip";

$today             = strftime "%Y%m%d", localtime;
$wtoday            = strftime "%Y/%m/%d", localtime;
$today_ziptickfile = strftime "Daily_%Y_%m_%d.zip", localtime;
$today_tickfile    = strftime "Daily_%Y_%m_%d.rpt", localtime;

$today_wt_tx_tickfile  = strftime "%Y_%m_%d.tx", localtime;
$today_wt_mtx_tickfile = strftime "%Y_%m_%d.mtx", localtime;
$today_wt_te_tickfile  = strftime "%Y_%m_%d.te", localtime;
$today_wt_tf_tickfile  = strftime "%Y_%m_%d.tf", localtime;

$today_wt_tx_kfile  = $today_wt_tx_tickfile .'_' . $MinuteK . 'k';
$today_wt_mtx_kfile = $today_wt_mtx_tickfile .'_' . $MinuteK . 'k';
$today_wt_te_kfile  = $today_wt_te_tickfile .'_' . $MinuteK . 'k';
$today_wt_tf_kfile  = $today_wt_tf_tickfile .'_' . $MinuteK . 'k';

$outRec = "交易日期,商品代號,交割年月,成交時間,成交價格,成交數量";

open(open_LastTradingDays, $LastTradingDays_file)|| die("Cannot open $LastTradingDays_file.\n");
@recs = <open_LastTradingDays>;

for($row=@recs-1; $row >= 0; $row=$row-1)
# for($row=0; $row < @recs; $row++)
{
   my $LastTradingDays = $recs[$row];
   if ($LastTradingDays >= $today ) {
      $TradingDays = $LastTradingDays;
   }
}
my $wkMonth = substr $TradingDays, 0, 6;

close(open_LastTradingDays);


open(open_file, $today_tickfile) || die("Cannot open $workDir$today_tickfile.\n");

open(wf_tx, ">$today_wt_tx_tickfile");
open(wf_mtx,">$today_wt_mtx_tickfile");
open(wf_te, ">$today_wt_te_tickfile");
open(wf_tf, ">$today_wt_tf_tickfile");

open(wf_ktx, ">$today_wt_tx_kfile");
# open(wf_kmtx,">$today_wt_mtx_kfile");
# open(wf_kte, ">$today_wt_te_kfile");
# open(wf_ktf, ">$today_wt_tf_kfile");

# print wf_tx  "成交時間,成交價格,數量\n";
print wf_tx  "Date Time,Price,Vol\n";
print wf_mtx "Date Time,Price,Vol\n";
print wf_te  "Date Time,Price,Vol\n";
print wf_tf  "Date Time,Price,Vol\n";

print wf_ktx  "Date Time,Open,High,Low,Close,Vol\n";
# print wf_kmtx "成交時間,,,,,數量\n";
# print wf_kte  "成交時間,,,,,數量\n";
# print wf_ktf  "成交時間,,,,,數量\n";


# print "Processing...\n";

while(my $record = <open_file>)
{
   chomp $record;
   $record =~ s/ //g;
   # 交易日期,商品代號,交割年月,成交時間,成交價格,成交數量(B+S),近月價格,遠月價格
   ($tDays, $tProduct, $tMonth, $tickTime, $tPrice, $tVol, $nPrice, $fPrice)=split(/,/ , $record);

   # print "$record\n";
   $tVol = $tVol / 2;
   # print "$tDays, $tProduct, $tMonth, $tickTime, $tPrice, $tVol, $nPrice, $fPrice\n";

   $tTimeHh = substr $tickTime, 0, 2;
   $tTimeMm = substr $tickTime, 2, 2;
   $tTimeSs = substr $tickTime, 4, 2;
   # my $tTimeMs = substr $tickTime, 6, 6;
   $tTime   = $tTimeHh . ':' . $tTimeMm . ':' . $tTimeSs;

   # print "\$wkMonth = $wkMonth  \n\$tMonth = $tMonth\n";
   # print "\$tProduct = $tProduct  \n";

   # 當月
   if ($tMonth eq $wkMonth)
   {
      if ($tProduct eq $TX_Product) { # 台指
         # # print "\n # $tProduct# $tTime,$tPrice,$tVol,  =$tDays, $tProduct, $tMonth, $nPrice, $fPrice=";
         # print wf_tx "$tTime,$tPrice,$tVol,=$tDays, $tProduct, $tMonth, $nPrice, $fPrice=";
         print wf_tx "$tTime,$tPrice,$tVol\n";
      }
      elsif ($tProduct eq $MTX_Product) { # 小台
         # # print "\n # $tProduct# $tTime,$tPrice,$tVol,  =$tDays, $tProduct, $tMonth, $nPrice, $fPrice=";
         print wf_mtx "$tTime,$tPrice,$tVol\n";
      }
      elsif ($tProduct eq $TE_Product) { # 電指期
         # print "\n # $tProduct# $tTime,$tPrice,$tVol,  =$tDays, $tProduct, $tMonth, $nPrice, $fPrice=";
         print wf_te "$tTime,$tPrice,$tVol\n";
      }
      elsif ($tProduct eq $TF_Product) { # 金指期
         # print "\n # $tProduct# $tTime,$tPrice,$tVol,  =$tDays, $tProduct, $tMonth, $nPrice, $fPrice=";
         print wf_tf "$tTime,$tPrice,$tVol\n";
      }

      if ($tProduct eq $TX_Product) { # 台指
         $IdxK  = int(((($tTimeHh - $startHH) * 60) + ($tTimeMm - $startMM)) / $MinuteK);
         if ($IdxK == $PreIdxK) { # 同根k
            if ($tPrice > $HPrice) {
               $HPrice = $tPrice;
            }
            if ($tPrice < $LPrice) {
               $LPrice = $tPrice;
            }
            $CPrice = $tPrice;
            $KVol   = $KVol + $tVol;
         }
         else {
            if ($PreIdxK != -1){
               print wf_ktx "$KTime,$OPrice,$HPrice,$LPrice,$CPrice,$KVol\n";
            }
            $OPrice = $tPrice;
            $HPrice = $tPrice;
            $LPrice = $tPrice;
            $CPrice = $tPrice;
            $KVol   = $tVol  ;

            # $PreIdxK = $IdxK - 1;
            my $KTimeHH = ((($IdxK + 1) * $MinuteK) + ($startHH * 60) + $startMM) / 60 + 100;
            my $KTimeMM = ((($IdxK + 1) * $MinuteK) + ($startHH * 60) + $startMM) % 60 + 100;
            $KTimeHH = substr $KTimeHH, 1, 2;
            $KTimeMM = substr $KTimeMM, 1, 2;
            $KTime   = $wtoday . ' ' . $KTimeHH . ':' . $KTimeMM;
            # print "\n\$IdxK = $IdxK  \$PreIdxK = $PreIdxK  \$KTime = $KTime  \$MinuteK = $MinuteK  \$tTimeHh = $tTimeHh  \$tTimeMm = $tTimeMm  \$startHH = $startHH  \$startMM = $startMM ";
            $PreIdxK = $IdxK;

         }
      }
   }
}
   if ($IdxK == $PreIdxK) { # 同根k
       print wf_ktx "$KTime,$OPrice,$HPrice,$LPrice,$CPrice,$KVol\n";
       # print "\n\$IdxK = $IdxK  \$PreIdxK = $PreIdxK  \$KTime = $KTime  \$MinuteK = $MinuteK  \$tTimeHh = $tTimeHh  \$tTimeMm = $tTimeMm  \$startHH = $startHH  \$startMM = $startMM ";
   }
# close(wf_ktf);
# close(wf_kte);
# close(wf_kmtx);
close(wf_ktx);

close(wf_tf);
close(wf_te);
close(wf_mtx);
close(wf_tx);

close(open_file);

# 2009-08-01 stop
# my $scp_content = `/usr/bin/scp $today_wt_tx_kfile $target`;


# 2009-06-17   for move File to Storage Directory

$workdayfile       = strftime "%Y_%m_%d", localtime;
$daily_trade_file  = 'Daily_' . $workdayfile;

$saveDir        = substr $today, 0, 6;
$tickStoreDir   = $tickDir . $saveDir . '/';
$dailyStoreDir  = $workDir . $saveDir . '/';

unless (-e $tickStoreDir     ) { mkdir($tickStoreDir     , 0700) || print $!; }
unless (-e $dailyStoreDir    ) { mkdir($dailyStoreDir    , 0700) || print $!; }

for $file (<$daily_trade_file*.*>) {
  $targetFile = $dailyStoreDir . $file;
  rename $file, $targetFile;
  # print "Rename File : source(\$file)=$file  destination(\$targetFile)=$targetFile\n";
}

for $file (<$workdayfile*.*>) {
  $targetFile = $tickStoreDir  . $file;
  rename $file, $targetFile;
  # print "Rename File : source(\$file)=$file  destination(\$targetFile)=$targetFile\n";
}

2014年6月3日 星期二

台指期轉檔程式 - part5 (只用AutoHotkey)

AutoHotkey到期交所抓交易檔, 並分拆成Tick及K線 (多天)

寫過幾個 到期交所抓交易檔, 並分拆成Tick及K線 "台指期轉檔程式" - 轉檔程 Linux Bash ~ 轉檔程 part4.

這次是只用 AutoHotkey 及外部程式 unzip.exe 來處理





ahk 程式
  \twfTrade2K.exe  (主程式)
  \Tick2mk.exe
  \Tick2dk.exe
  \chk_Ver.exe   檢查 AutoHotkey 版本

設定檔
  \twfTrade2K.ini (設定檔)

  \last-trading-days (期貨最後交易日檔)

Source code 在 ahk_code 目錄下

程式



相關


2014年4月26日 星期六

MultiCharts DDE 設定

MultiCharts DDE 設定

2014-04-26
大三元 DDE 設定
商品代碼 欄名設定
小台2014-05 價格=TS|KS!MXFe4.124
小台2014-05 單量=TS|KS!MXFe4.128
台指2014-06 價格=TS|KS!TXFf4.124
台指2014-06 單量=TS|KS!TXFf4.128
康和全都賺 DDE 設定
商品代碼 欄名設定
台指 價格=MMSDDE|FUSA!'WTX&.125'
台指 單量=MMSDDE|FUSA!'WTX&.404'

超級大三元

  • 先開大三元

QuoteManager

  • 打開 QuoteManager
  • menu(選單) → Tools(工具) → Data Sources(資料源)
  • 選 Universal DDE, 按 Clone(複製) 鈕,

    並輸入
    • Data Source Name : MyDDE (自訂)
    • Data Source Abbr : MDD (隨便打, 不要重複)

  • 再選 MyDDE, 按 Settings 鈕 (設定), (以大三元小台2014-05為例)


    • Template(模組) : MyDDE
    • Trade (成交)
      • Price : =TS|KS!MXFe4.124 (價格)
      • Volume : =TS|KS!MXFe4.128 (單量 )
    • Bid (買)
      • Price : =TS|KS!MXFe4.124
      • Volume : =TS|KS!MXFe4.128
    • Ask (賣)
      • Price : =TS|KS!MXFe4.124
      • Volume : =TS|KS!MXFe4.128
    • 按 test, 如圖
      DDE Test

  • 資料源設定好之後, 開始設定商品 : menu(選單) → Instrument → Add Symbol(新增商品) → Manually (手動)
  • 商品代碼設定, 不要重複
    • Data Source(數據源) : MyDDE
    • Symbol(商品) : twf
    • Cateory : Futures (期貨)
    • Exchange(交易所) : TAISE

MultiCharts

  • 打開 MultiCharts
  • Create New Chart Window (新增圖表視窗)
    • Instrument (商品)頁面
      • Data Source(數據源) : MyDDE
      • Instrument (選擇商品) : twf
    • Settings(設定)頁面
      • Regular(週期) Chart Type
      • Resolation : 1 menuite(分鐘)
      • Date Range(資料區間) : 5000 , Days Back, From:2009/01/01
      • Display SubChart:(顯示副圖) : Show On Top(顯示在最上方)
    • Style(樣式)頁面
      • Chart Type(圖形類型) : Candlestick(蠟燭線)
      • Advanced(進階) : Last Price Market(顯示最新價格) (打勾)
在 MultiCharts 設定完成, 即可看到, 畫出盤中即時的K棒圖形

2010年6月25日 星期五

AutoHotKey補一個月的轉檔主程式

這支程式是用AutoHotKey寫的,用來補前幾天(前30天)沒有做轉檔, 要配合
台指期轉檔程式 - part4(懶人包), 自動取得交易檔, 轉Tick及1分K線。

程式中用到他人的 SimpleArray.ahk 要放在同個資料夾(目錄)下。下載SimpleArray.zip, 下載後要解zip檔。

getTick.ahk程式碼


;
; AutoHotkey Version: 1.0.0
; Platform: Win XP
; Author: R.J
; Date : 2010/6/11
; Script Function:
; Get Tick
;
#Include SimpleArray.ahk

; 1 2 3 4 5 6 7 8 9 10 11 12
Month = 31|28|31|30|31|30|31|31|30|31|30|31

PerlExe = c:\perl\bin\perl.exe
plGetTick = c:\tick\prg_perl3w\gettick3w.pl
plProc3wTick = c:\tick\prg_perl3w\proc3w_tick.pl

ToDay = %A_YYYY%-%A_MM%-%A_DD%

if (%A_MM% == 1 ){
sStartMonth := 12 ; 前月
} else {
sStartMonth := A_MM + 99
sStartMonth := SubStr(sStartMonth, 2, 2) ; 前月
}

sStartDay = %A_YYYY%-%sStartMonth%-%A_DD%
sStopDay = %A_YYYY%-%A_MM%-%A_DD%


Gui, Font, S12,
Gui, Add, Text, x10 y25 w70 h20 , Start Date :
Gui, Add, Text, x10 y85 w70 h20 , Stop Date :
Gui, Add, Edit, x90 y23 w90 h20 r1 vStartEdit, %sStartDay%
Gui, Add, Edit, x90 y83 w90 h20 r1 vStopEdit, %sStopDay%
Gui, Add, Button, x220 y18 w46 h29 , Start
Gui, Show, x300 y150 h250 w320, Get Future Daily-Trade from TAIFEX
Return

GuiClose:
ExitApp


ButtonStart:
Gui, Submit
stopDate := StopEdit

stYYYY := SubStr(StartEdit, 1, 4)
stMM := SubStr(StartEdit, 6, 2)
stDD := SubStr(StartEdit, 9, 2)

WorkDate = %stYYYY%-%stMM%-%stDD%

; While (stopDate >= WorkDate) {
While (WorkDate <= stopDate) {
if (stDD > SA_Get(Month, stMM)) {
; 換月
stDD -= SA_Get(Month, stMM)
if (stDD < 10) {
stDD += 100
stDD := SubStr(stDD, 2, 2)
}
stMM += 1
if (stMM > 12) {
stMM := 01
stYYYY += 1
} else if (stMM < 10) {
stMM += 100
stMM := SubStr(stMM, 2, 2)
}
}
WorkDate = %stYYYY%-%stMM%-%stDD%

RunWait, %comspec% /c date %WorkDate%, , min
sleep, 1000

if (A_WDay >= 2 and A_WDay <= 6) {
RunWait, %PerlExe% %plGetTick%
RunWait, %PerlExe% %plProc3wTick%
}

stDD += 1
if (stDD < 10) {
stDD += 100
stDD := SubStr(stDD, 2, 2)
}
WorkDate = %stYYYY%-%stMM%-%stDD%
}

RunWait, %comspec% /c date %ToDay%, , min ;; Reset Today DateTime
Return


-

2010年4月28日 星期三

康和全都賺轉出1分鐘K線

康和全都賺轉(匯)出300筆(近3個月)的1分鐘K線

  1. 開技術分析。
  2. 選一分K線。
  3. 滑鼠右鍵->重新回補資料。
  4. 滑鼠右鍵->瀏覽歷史資料。
  5. 儲存到CSV檔。


註:
  • 資料開頭會多兩行, 第一行瀏覽歷史資料名稱, 第二行是抬頭, 在TS匯入時要先刪除。
  • 若是在盤中轉(匯)出, 要刪除最後一筆, (很可能時間還沒到, 最後一筆還不完整)。

2010年4月27日 星期二

台指期轉檔程式 - part4(懶人包)

因應 JameX 網友所提的"懶人包",

1. tick.zip
2. tool.zip
3. CRONw_crontab.zip

為配合TS的匯入, 這次改了一分K線的檔案名稱, 及輸出目錄, 並刪除抬頭

安裝說明, 參照 台指期轉檔程式 - part4

---

2010年4月20日 星期二

台指期轉檔程式 - part4

因為我比較懶, 用K線轉檔機還要按按鈕, 所以用 CRONw 排程, 自行到期交所抓當日的成交檔, 分類 tick, 再轉K線...

最近在 win XP sp3 下安裝
  • perl - ActivePerl-5.8.2.808-MSWin32-x86.msi
  • CRONw - CRONw_2.0.zip
  • tool - wget.exe unzip.exe
  • perl 轉檔程式
之前的操作忘了, 這次記錄一下。



1. perl
ActivePerl-5.8.2.808-MSWin32-x86.msi
2. CRONw
CRONw_2.0.zip
a.unzip CRONw_2.0.zip
b. CRONw -> C:\CRONw
3. tool.zip
a.unzip put at c:\tool\
b.file
1. c:\tool\wget.exe
2. c:\tool\unzip.exe
3. c:\tool\unzip32.dll
4. tick.zip (perl script)
a. unzip put at c:\tick
b.file
1. c:\tick\prg_perl3w\gettick3w.bat
2. c:\tick\prg_perl3w\proc3w_tick.bat
3. c:\tick\prg_perl3w\gettick3w.pl
4. c:\tick\prg_perl3w\proc3w_tick.pl
5. c:\tick\prg_perl3w\last-trading-days
6. c:\tick\prg_perl3w\movefile2dir.pl
(其他-手動補之前的K線)
7. c:\tick\ext\make_kline
8. c:\tick\ext\win_crontab.txt
9. c:\tick\ext\user_proc3w_tick.ba
10. c:\tick\ext\tick2kline.pl
c. 排程時間 copy c:\tick\ext\win_crontab.txt to c:\CRONw\crontab.txt
(add crontab rule)
27 15 * * 1-5 c:\perl\bin\perl.exe C:\tick\prg_perl3w\gettick3w.pl
29 15 * * 1-5 c:\perl\bin\perl.exe C:\tick\prg_perl3w\proc3w_tick.pl

5. install CRONW modules -> read \INSTALL.txt
a.
installer.pl

6. install CRONw to WinXP Service
a. 安裝服務 - perl cronHelper.pl --install

b. 起動服務 - net start CRON
c. 檢查 -> Cron Service (CRONw) -
net start

時間定在 15:27 以後, 是確保當時可以抓得到今日的成交檔


相關 -  台指期轉檔程式 - part4(懶人包)
 

2009年7月30日 星期四

台指期轉檔程式 - perl 程式 2 (配合前支gettick3w.pl-自行下載交易檔)

配合前支程式 : 自期交所自行下載交易檔 perl 程式(win-XP) - gettick3w.pl

  1. 配合環境: windows xp sp2
  2. 程式名稱 : proc3w_tick.pl
  3. 程式目的 : 將當天交易檔分拆成台指期,小台,電指期,金指期當月分tick檔
  4. 程式碼



#!C:\Perl\bin\perl.exe

# 2009-06-25 change output file name
# 2009/6/25 Change directory to C:\\tick\\prg_perl3w\\
# 2009/6/18 For Win32 ActivePerl
# 2009-06-17 for move File to Storage Directory
# 2009-06-06 Process Tick and Make K-Line File

use POSIX qw(strftime);
use integer;

$workDir = 'C:\\tick\\prg_perl3w\\daily\\';
$tickDir = 'C:\\tick\\prg_perl3w\\tick\\';
# 可以改成 5 分K
# my $Minute5K = 5; # 5分K
my $Minute1K = 1; # 1分K

# 讀取最後交易日檔
my $LastTradingDays = "C:\\tick\\prg_perl3w\\last-trading-days";


$today = strftime "%Y%m%d", localtime;

$today_YY = substr $today, 0, 4;
$today_mm = substr $today, 4, 2;
$today_dd = substr $today, 6, 2;

$tick_day = $today_YY . "-" . $today_mm . "-" . $today_dd;

$wkMonth = &get_current_month_product($LastTradingDays);

print "Process $today Tick and Make $Minute1K Minute K-Line File..\n";

chdir $workDir;

&split_Tick ($today_YY, $today_mm, $today_dd, $wkMonth);

$tickdayfile = '???' . $today;

$daily_trade_file = 'Daily_' . $today_YY . '_' . $today_mm . '_' . $today_dd;

$saveDir = substr $today, 0, 6;
$tickStoreDir = $tickDir . $saveDir . '/';
$dailyStoreDir = $workDir . $saveDir . '/';

`C:\\tick\\prg_perl3w\\movefile2dir.pl $workDir $dailyStoreDir $daily_trade_file`;
`C:\\tick\\prg_perl3w\\movefile2dir.pl $workDir $tickStoreDir $tickdayfile`;

exit;

sub process_kline {
# in參數 $tickfile $KMinute

my $startHH = '08'; # 開始時
my $startMM = '45'; # 開始分
my $IdxK = -1; # idx
my $PreIdxK = -1; # idx

my $tickfile = $_[0];
my $KMinute = $_[1];

$workday = substr $tickfile, 3, 8;
my $kline_file = substr($tickfile, 0, 11) . '_' . $KMinute . 'k' . substr($tickfile, 11, 4);

open(infile, $tickfile) || die("Cannot open $tickfile.\n");
open(outfile, ">$kline_file");

print outfile "Date Time,Open,High,Low,Close,Vol\n";

# print "K File Processing...\n";

;

while(my $tk_record = )
{
chomp $tk_record;
$tk_record =~ s/ //g;
($tickTime, $tickPrice, $tickVol)=split(/,/ , $tk_record);

$tkTimeHh = substr $tickTime, 0, 2;
$tkTimeMm = substr $tickTime, 3, 2;
$tkTimeSs = substr $tickTime, 6, 2;

$IdxK = int(((($tkTimeHh - $startHH) * 60) + ($tkTimeMm - $startMM)) / $KMinute);
if ($IdxK == $PreIdxK) { # 同根k
if ($tickPrice > $HPrice) {
$HPrice = $tickPrice;
}
if ($tickPrice < $LPrice) {
$LPrice = $tickPrice;
}
$CPrice = $tickPrice;
$KVol = $KVol + $tickVol;
}
else {
if ($PreIdxK != -1){
print outfile $KTime,$OPrice,$HPrice,$LPrice,$CPrice,$KVol\n";
}
$OPrice = $tickPrice;
$HPrice = $tickPrice;
$LPrice = $tickPrice;
$CPrice = $tickPrice;
$KVol = $tickVol ;

my $KTimeHH = ((($IdxK + 1) * $KMinute) + ($startHH * 60) + $startMM) / 60 + 100;
my $KTimeMM = ((($IdxK + 1) * $KMinute) + ($startHH * 60) + $startMM) % 60 + 100;
$KTimeHH = substr $KTimeHH, 1, 2;
$KTimeMM = substr $KTimeMM, 1, 2;

$KTime = $tick_day . ' ' . $KTimeHH . ':' . $KTimeMM;
$PreIdxK = $IdxK;
}
}
if ($IdxK == $PreIdxK) {
# 同根k
print outfile "$KTime,$OPrice,$HPrice,$LPrice,$CPrice,$KVol\n";
}
close(outfile);
close(infile);
}

# get current month product. ex: 200906 (取得當月月分)
sub get_current_month_product{
my $LastTradingDays_file = $_[0];
open(open_LastTradingDays, $LastTradingDays_file)|| die("Cannot open $LastTradingDays_file.\n");
@recs = ;

for($row=@recs-1; $row >= 0; $row=$row-1)
{
my $LastTradingDays = $recs[$row];
if ($LastTradingDays >= $today ) {
$TradingDays = $LastTradingDays;
}
}
my $wkMonth = substr $TradingDays, 0, 6;

close(open_LastTradingDays);
return $wkMonth;
}

sub split_Tick {
chdir $workDir;
# in參數 $today_YY $today_mm $today_dd $wkMonth

$workday_YY = $_[0];
$workday_mm = $_[1];
$workday_dd = $_[2];
$workMonth = $_[3];

$workdayfile = $workday_YY . $workday_mm . $workday_dd;


$trade_file = 'Daily_' . $workday_YY . '_' . $workday_mm . '_' . $workday_dd . '.rpt';

my $TX_Product = 'TX'; # 台指
my $MTX_Product = 'MTX'; # 小台
my $TE_Product = 'TE'; # 電指期
my $TF_Product = 'TF'; # 金指期

# 2009-06-25 change output file name
$tx_tickfile = 'txf' . $workdayfile . '.csv'; # 台指
$mtx_tickfile = 'mxf' . $workdayfile . '.csv'; # 小台
$te_tickfile = 'exf' . $workdayfile . '.csv'; # 電指期
$tf_tickfile = 'fxf' . $workdayfile . '.csv'; # 金指期

open(read_file, $trade_file) || die("Cannot open $trade_file.\n");


open(out_tx, ">$tx_tickfile");
open(out_mtx,">$mtx_tickfile");
open(out_te, ">$te_tickfile");
open(out_tf, ">$tf_tickfile");

print out_tx "Date Time,Price,Vol\n";
print out_mtx "Date Time,Price,Vol\n";
print out_te "Date Time,Price,Vol\n";
print out_tf "Date Time,Price,Vol\n";

# print "Split Tick File Processing...\n";

while(my $record = )
{
chomp $record;
$record =~ s/ //g;
# 交易日期,商品代號,交割年月,成交時間,成交價格,成交數量(B+S),近月價格,遠月價格
($tDays, $tProduct, $tMonth, $tickTime, $tPrice, $tVol, $nPrice, $fPrice)=split(/,/ , $record);
# print "$tDays, $tProduct, $tMonth, $tickTime, $tPrice, $tVol, $nPrice, $fPrice\n";

$tVol = $tVol / 2;

$tTimeHh = substr $tickTime, 0, 2;
$tTimeMm = substr $tickTime, 2, 2;
$tTimeSs = substr $tickTime, 4, 2;

$tTime = $tTimeHh . ':' . $tTimeMm . ':' . $tTimeSs;

# 當月
if ($tMonth eq $workMonth)
{
if ($tProduct eq $TX_Product) { # 台指
print out_tx "$tTime,$tPrice,$tVol\n";
}
elsif ($tProduct eq $MTX_Product) { # 小台
print out_mtx "$tTime,$tPrice,$tVol\n";
}
elsif ($tProduct eq $TE_Product) { # 電指期
print out_te "$tTime,$tPrice,$tVol\n";
}
elsif ($tProduct eq $TF_Product) { # 金指期
print out_tf "$tTime,$tPrice,$tVol\n";
}
}
}

close(out_tf);
close(out_te);
close(out_mtx);
close(out_tx);

close(read_file);

&process_kline($tx_tickfile, $Minute1K);
}

參考我的 wiki : Process split tick - proc3w_tick.pl

聯絡表單

名稱

以電子郵件傳送 *

訊息 *