如何將台指期的每一分鐘資料都紀錄在sheet 1裡..請教版上高手前輩~~
- 帖子
- 2035
- 主題
- 24
- 精華
- 0
- 積分
- 2031
- 點名
- 0
- 作業系統
- Win7
- 軟體版本
- Office2010
- 閱讀權限
- 100
- 性別
- 男
- 註冊時間
- 2012-3-22
- 最後登錄
- 2024-2-1
|
|
|
|
|
|
|
|
- 帖子
- 2035
- 主題
- 24
- 精華
- 0
- 積分
- 2031
- 點名
- 0
- 作業系統
- Win7
- 軟體版本
- Office2010
- 閱讀權限
- 100
- 性別
- 男
- 註冊時間
- 2012-3-22
- 最後登錄
- 2024-2-1
|
為了讓更多人進一步明瞭整體的作業過程,未來也可以自己在實務上實際演練
及摩擬,故將作業畫面與程式一併貼附上來分享。
希望每個人都能從中學習領悟、寫出更佳的程式,再將成果分享提供給大家!- Option Explicit
- Dim Ov As Single, Hv As Single, Lv As Single, Cv As Single
- Dim timerEnabled As Boolean ' 判定開啟本工作表單的時段是否為開盤前啟動。
- Public turnKey As Integer
- Private Sub Workbook_Open()
- timerEnabled = False
- Sheets("Sheet4").[I2] = Sheets("Sheet4").[H2] ' 設定前成交量
- Call timerStart ' 程式一啟始,便去自動執行 timerStart
- End Sub
- Private Sub Workbook_BeforeClose(Cancel As Boolean)
- On Error Resume Next
- Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkbook.RTimer", , False
-
- Me.Save
- End Sub
- Public Sub RTimer(tm As Date)
- Dim TimeRange As Range, Rng As Range
- Dim pos As Integer
-
- On Error Resume Next
- If (TimeValue(Now) > TimeValue("13:45:00")) Then Exit Sub
-
- If (TimeValue(Now) >= TimeValue("08:45:00")) Then ' 開盤、收盤時段設定
- ' 盤中處理,將資料匯入寫入工作表單內儲存。
- With Sheets("Sheet1")
- If Not IsError(.[B2]) Then
- .[B1] = "成交價"
- .[C1] = "最高價"
- .[D1] = "最低價"
- .[E1] = "成交量"
-
- Set TimeRange = .[A:A].Find(TimeSerial(Hour(tm), Minute(tm), 0)) ' 檢查 "A" 欄位對應之時間資料
- Set Rng = TimeRange.Offset(, 1).Resize(1, 4)
-
- Rng(1) = Cv ' 成交價
- Rng(2) = Hv ' 最高價
- Rng(3) = Lv ' 最低價
- Rng(4) = Sheets("Sheet4").[H2] - Sheets("Sheet4").[I2] ' 成交量
- Sheets("Sheet4").[I2] = Sheets("Sheet4").[H2] ' 重新設定前成交量
- End If
- End With
- End If
- End Sub
- Sub timerStart()
- turnKey = 0 ' 計數器重新歸零
- Sheets("Sheet4").[A3] = "( " & turnKey & " 秒 )"
-
- If timerEnabled Then
- ' 第二次(含)以後均以設定之 "間隔時段" 來處理執行序的作業。
- Application.OnTime (Now + TimeValue("00:00:01")), "ThisWorkbook.inProcess"
- Else
- timerEnabled = True
-
- ' 將第一次啟動時間更改為設定 "開盤時間"前,如果開啟 Excel 時,已經過了設定 "開盤時間",則一進入系統即直接去執行紀錄作業。
- If (TimeValue(Now) <= TimeValue("08:45:00")) Then
- Sheets("Sheet1").[B2:E301].ClearContents ' 清除前一日之資料
- Application.OnTime (TimeValue("08:45:00")), "ThisWorkbook.inProcess"
- Else
- ' 系統剛連上 DDE 至資料匯入Excel工作表單,須有一個緩衝時段,
- ' 這時如果馬上去抓取DDE資料,會有型態不符的錯誤訊息產生,並中斷執行序的作業。
- Application.OnTime (Now + TimeValue("00:00:05")), "ThisWorkbook.inProcess"
- End If
- End If
- End Sub
- Private Sub inProcess()
- Static Msg As Boolean ' 用以判定是否為每日第一次執行
- Static timeCalc As Date ' 記錄每分鐘的時間
-
- On Error Resume Next
- If (TimeValue(Now) < TimeValue("08:45:00") Or TimeValue(Now) > TimeValue("13:46:01")) Then Exit Sub
-
- If Msg = False Then
- timeCalc = TimeSerial(Hour(Time), Minute(Time), 0) ' 設定目前起始的時間
- Msg = True
- End If
-
- If IsError(Sheets("Sheet4").Range("B2").Value) Then
- Cv = 0
- Else
- Cv = Sheets("Sheet4").Range("B2").Value ' 成交價
- End If
-
- If (turnKey = 0 Or Ov = 0) Then
- Ov = Cv ' 開盤價
- Hv = Cv ' 最高價
- Lv = Cv ' 最低價
- End If
-
- If (Cv > Hv) Then Hv = Cv ' 最高價
- If (Cv < Lv) Then Lv = Cv ' 最低價
-
- turnKey = turnKey + 1
- Sheets("Sheet4").[A3] = "( " & turnKey & " 秒 )"
- If Time >= timeCalc + #12:01:00 AM# Then
- If (Cv > 0) Then Call RTimer(Time)
- timeCalc = TimeSerial(Hour(Time), Minute(Time), 0) ' 重新設定下一分鐘比對的時間
- If timerEnabled Then Call timerStart
- Else
- Application.OnTime (Now + TimeValue("00:00:01")), "ThisWorkbook.inProcess"
- End If
- End Sub
複製代碼
|
|
|
|
|
|
|
|
- 帖子
- 2035
- 主題
- 24
- 精華
- 0
- 積分
- 2031
- 點名
- 0
- 作業系統
- Win7
- 軟體版本
- Office2010
- 閱讀權限
- 100
- 性別
- 男
- 註冊時間
- 2012-3-22
- 最後登錄
- 2024-2-1
|
回復 5# cfuxiong
在跑這支程式執行中,切記勿開啟另一隻Excel 程式,請回憶看看是否有這種情形?
如果只是單純跑這隻的話,除非是電腦本身有狀況,你說的情況是不可能會發生的! |
|
|
|
|
|
|
|
- 帖子
- 2035
- 主題
- 24
- 精華
- 0
- 積分
- 2031
- 點名
- 0
- 作業系統
- Win7
- 軟體版本
- Office2010
- 閱讀權限
- 100
- 性別
- 男
- 註冊時間
- 2012-3-22
- 最後登錄
- 2024-2-1
|
回復 5# cfuxiong
還有如果券商的軟體掛了重新開啟, EXCEL 亦要一併先予關閉後再開 (重新連結DDE)。 |
|
|
|
|
|
|
|
- 帖子
- 2035
- 主題
- 24
- 精華
- 0
- 積分
- 2031
- 點名
- 0
- 作業系統
- Win7
- 軟體版本
- Office2010
- 閱讀權限
- 100
- 性別
- 男
- 註冊時間
- 2012-3-22
- 最後登錄
- 2024-2-1
|
回復 c_c_lai
c_c_lai版大你好;昨天實測是有與[量態]同時使用....
今天就沒問題了...那要與[量態]併用 ...
cfuxiong 發表於 2012-10-4 19:10 
能不能將它們合併在一個 EXCEL 內應用?
這也是我一直的困擾,不知是 EXCEL 的 VBA 相互間處理所導致,還是其它因素? |
|
|
|
|
|
|
|
- 帖子
- 2035
- 主題
- 24
- 精華
- 0
- 積分
- 2031
- 點名
- 0
- 作業系統
- Win7
- 軟體版本
- Office2010
- 閱讀權限
- 100
- 性別
- 男
- 註冊時間
- 2012-3-22
- 最後登錄
- 2024-2-1
|
回復 10# cfuxiong
你直接將DDE匯入字串公式 J2 改成 K2 就 OK 了。 |
|
|
|
|
|
|
|
- 帖子
- 2035
- 主題
- 24
- 精華
- 0
- 積分
- 2031
- 點名
- 0
- 作業系統
- Win7
- 軟體版本
- Office2010
- 閱讀權限
- 100
- 性別
- 男
- 註冊時間
- 2012-3-22
- 最後登錄
- 2024-2-1
|
回復 13# cfuxiong
你的券商是用哪家?
譬如:元大 成交價 =YT|KS!TXFJ2.124 ---> =YT|KS!TXFK2.124
易利得 成交價 =CATDDE|'FUTOPT<FO>TXFJ2 '!CurPrice ---> =CATDDE|'FUTOPT<FO>TXFK2 '!CurPrice
以此類推。 |
|
|
|
|
|
|
|
- 帖子
- 2035
- 主題
- 24
- 精華
- 0
- 積分
- 2031
- 點名
- 0
- 作業系統
- Win7
- 軟體版本
- Office2010
- 閱讀權限
- 100
- 性別
- 男
- 註冊時間
- 2012-3-22
- 最後登錄
- 2024-2-1
|
回復 13# cfuxiong
送你一支轉換涵式,你只要更換成你寫入的欄位便成 (元大及易利得)。- Sub changeMonth() ' 執行結算轉月
- Dim sCode, tCode As String, mArray()
-
- sCode = Sheets("Omega").Range("U17").Value ' [color=Red]目前(本月)引入值為 "K211"[/color]
- If (Len(sCode) = 4) Then
- mArray = Array("一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月")
- tCode = Right(sCode, 2)
- sCode = Left(sCode, 2)
-
- With Sheets("Omega")
- .Range("A2").Value = "TXF" & sCode ' 元大
- .Range("B2").Formula = "=YT|KS!TXF" & sCode & ".402"
- .Range("C2").Formula = "=YT|KS!TXF" & sCode & ".122"
- .Range("D2").Formula = "=YT|KS!TXF" & sCode & ".123"
- .Range("E2").Formula = "=YT|KS!TXF" & sCode & ".124"
- .Range("F2").Formula = "=YT|KS!TXF" & sCode & ".125"
- .Range("G2").Formula = "=YT|KS!TXF" & sCode & ".126"
- .Range("H2").Formula = "=YT|KS!TXF" & sCode & ".128"
- .Range("I2").Formula = "=YT|KS!TXF" & sCode & ".130"
- .Range("J2").Formula = "=YT|KS!TXF" & sCode & ".131"
- .Range("K2").Formula = "=YT|KS!TXF" & sCode & ".132"
- .Range("L2").Formula = "=YT|KS!TXF" & sCode & ".133"
- .Range("M2").Formula = "=YT|KS!TXF" & sCode & ".135"
- .Range("N2").Formula = "=YT|KS!TXF" & sCode & ".136"
- .Range("O2").Formula = "=YT|KS!TXF" & sCode & ".437"
- .Range("P2").Formula = "=YT|KS!TXF" & sCode & ".405"
- .Range("Q2").Formula = "=YT|KS!TXF" & sCode & ".406"
- .Range("R2").Formula = "=YT|KS!TXF" & sCode & ".407"
- .Range("S2").Formula = "=YT|KS!TXF" & sCode & ".422"
- .Range("T2").Formula = "=YT|KS!TXF" & sCode & ".423"
- .Range("U2").Formula = "=YT|KS!TXF" & sCode & ".431"
- .Range("V2").Formula = "=YT|KS!TXF" & sCode & ".170"
- .Range("W2").Formula = "=YT|KS!TXF" & sCode & ".172"
- .Range("X2").Formula = "=YT|KS!TXF" & sCode & ".171"
- .Range("Y2").Formula = "=YT|KS!TXF" & sCode & ".173"
- .Range("Z2").Formula = "=YT|KS!TXF" & sCode & ".290"
- .Range("AA2").Formula = "=YT|KS!TXF" & sCode & ".291"
- .Range("AB2").Formula = "=YT|KS!TXF" & sCode & ".201"
- .Range("AC2").Formula = "=YT|KS!TXF" & sCode & ".202"
- .Range("AD2").Formula = "=YT|KS!TXF" & sCode & ".203"
- .Range("AE2").Formula = "=YT|KS!TXF" & sCode & ".204"
- .Range("AF2").Formula = "=YT|KS!TXF" & sCode & ".205"
- .Range("AG2").Formula = "=YT|KS!TXF" & sCode & ".211"
- .Range("AH2").Formula = "=YT|KS!TXF" & sCode & ".212"
- .Range("AI2").Formula = "=YT|KS!TXF" & sCode & ".213"
- .Range("AJ2").Formula = "=YT|KS!TXF" & sCode & ".214"
- .Range("AK2").Formula = "=YT|KS!TXF" & sCode & ".215"
- .Range("AL2").Formula = "=YT|KS!TXF" & sCode & ".221"
- .Range("AM2").Formula = "=YT|KS!TXF" & sCode & ".222"
- .Range("AN2").Formula = "=YT|KS!TXF" & sCode & ".223"
- .Range("AO2").Formula = "=YT|KS!TXF" & sCode & ".224"
- .Range("AP2").Formula = "=YT|KS!TXF" & sCode & ".225"
- .Range("AQ2").Formula = "=YT|KS!TXF" & sCode & ".231"
- .Range("AR2").Formula = "=YT|KS!TXF" & sCode & ".232"
- .Range("AS2").Formula = "=YT|KS!TXF" & sCode & ".233"
- .Range("AT2").Formula = "=YT|KS!TXF" & sCode & ".234"
- .Range("AU2").Formula = "=YT|KS!TXF" & sCode & ".235"
- .Range("AV2").Formula = "=YT|KS!TXF" & sCode & ".147"
- .Range("AW2").Formula = "=YT|KS!TXF" & sCode & ".148"
- .Range("A12").Value = "台期 " & tCode ' 易利得
- .Range("B12").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & " '!BuyPrice1"
- .Range("B13").Value = "臺指 " & tCode
- .Range("C12").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & " '!SellPrice1"
- .Range("D12").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & " '!CurPrice"
- .Range("E12").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & " '!TickVol"
- .Range("F12").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & " '!Volume"
- .Range("G12").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & " '!High"
- .Range("H12").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & " '!Low"
- .Range("I12").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & " '!Diff"
- .Range("J12").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & " '!DiffRate"
- .Range("K12").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & " '!UpLimit"
- .Range("L12").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & " '!DownLimit"
- .Range("M12").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & " '!TheoryPrice"
- .Range("D13").Formula = "=CATDDE|'FUTOPTTRADE<T>TXF" & sCode & " '!TrustBuyVol"
- .Range("D14").Formula = "=CATDDE|'FUTOPTTRADE<T>TXF" & sCode & " '!TrustSellVol"
- .Range("F13").Formula = "=CATDDE|'FUTOPTTRADE<T>TXF" & sCode & " '!TotalBuyCnt"
- .Range("F14").Formula = "=CATDDE|'FUTOPTTRADE<T>TXF" & sCode & " '!TotalSellCnt"
- .Range("H13").Formula = "=CATDDE|'FUTOPTTRADE<T>TXF" & sCode & " '!TrustBuyCnt"
- .Range("H14").Formula = "=CATDDE|'FUTOPTTRADE<T>TXF" & sCode & " '!TrustSellCnt"
- .Range("K14").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & " '!Open"
- .Range("A18").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & " '!BuyVol1"
- .Range("A19").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & " '!BuyVol2"
- .Range("A20").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & " '!BuyVol3"
- .Range("A21").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & " '!BuyVol4"
- .Range("A22").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & " '!BuyVol5"
- .Range("A23").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & " '!TotalBuyVol"
- .Range("B18").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & " '!BuyPrice1"
- .Range("B19").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & " '!BuyPrice2"
- .Range("B20").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & " '!BuyPrice3"
- .Range("B21").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & " '!BuyPrice4"
- .Range("B22").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & " '!BuyPrice5"
- .Range("C18").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & " '!SellPrice1"
- .Range("C19").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & " '!SellPrice2"
- .Range("C20").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & " '!SellPrice3"
- .Range("C21").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & " '!SellPrice4"
- .Range("C22").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & " '!SellPrice5"
- .Range("D18").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & " '!SellVol1"
- .Range("D19").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & " '!SellVol2"
- .Range("D20").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & " '!SellVol3"
- .Range("D21").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & " '!SellVol4"
- .Range("D22").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & " '!SellVol5"
- .Range("D23").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & " '!TotalSellVol"
- End With
- End If
- End Sub
複製代碼 |
|
|
|
|
|
|
|
- 帖子
- 2035
- 主題
- 24
- 精華
- 0
- 積分
- 2031
- 點名
- 0
- 作業系統
- Win7
- 軟體版本
- Office2010
- 閱讀權限
- 100
- 性別
- 男
- 註冊時間
- 2012-3-22
- 最後登錄
- 2024-2-1
|
這邊小弟有個想法,如果使用DDE的成交量
然後用時間來截止每分鐘(因人而異)紀錄一次成交量
作個簡單減法, ...
momowu 發表於 2012-10-22 11:36 
無論是一分鐘、五分鐘、十分鐘、基本上你還是需要有每一循環的成交量起始值,
程式碼並不會因此而有所增減,變的只是使用端的需求不同罷了。 |
|
|
|
|
|
|
|
- 帖子
- 2035
- 主題
- 24
- 精華
- 0
- 積分
- 2031
- 點名
- 0
- 作業系統
- Win7
- 軟體版本
- Office2010
- 閱讀權限
- 100
- 性別
- 男
- 註冊時間
- 2012-3-22
- 最後登錄
- 2024-2-1
|
回復 c_c_lai
c_c_lai大你好;
能否把 附件【策略記錄】欄[摩台][韓國][日本]也增列每30秒記錄?
連同 ...
cfuxiong 發表於 2012-12-8 12:53 
看了你策略記錄的內容,匯入時間是固定欄紀錄時間
(目前是每一分鐘記錄一筆),你說的 "也增列" 每30秒記錄?
不太明白你想的是甚麼?
又、 [摩台][韓國][日本] 資料源在哪裡? |
|
|
|
|
|
|
|