- 帖子
- 2035
- 主題
- 24
- 精華
- 0
- 積分
- 2031
- 點名
- 0
- 作業系統
- Win7
- 軟體版本
- Office2010
- 閱讀權限
- 100
- 性別
- 男
- 註冊時間
- 2012-3-22
- 最後登錄
- 2024-2-1
|
本帖最後由 c_c_lai 於 2012-5-28 08:01 編輯
回復 14# mead
看了一下你那三合一的程式,我將它整理了一下 (你直接貼上就 OK 了,另外我也會將檔案E-Mail給你):- ' 以多空力道、反向勢力、主力控盤的資料列來處理
- Option Explicit
- Dim timerEnabled As Boolean '
- Dim Ov(1 To 3), Hv(1 To 3), Lv(1 To 3), Cv(1 To 3) As Single ' 開盤價、最高價、最高價、收盤價(成交價) 等設定之變數。
- ' 改以陣列處理。(1. 多空力道、2. 反向勢力、3. 主力控盤)
- Dim turnKey As Integer ' 判斷每一輪迴上列變數初始值之設定。
- Dim nums As Integer ' 將每隔 "多少時間" 處理時段,移到此處來處理。
- Private Sub Workbook_Open()
- Sheets("策略記錄").Cells(4, 2) = 10
-
- nums = 30 ' 設定每隔 30 秒處理時段,亦可更改成 30 (每隔 30 秒)、 10 (每隔 10 秒)、20 (每隔 20 秒)等等。
- timerEnabled = False ' 此處不建議使用 1 秒時段來處理,因為還要去求出開盤、最高、最低、成交價。
- Call timerStart ' 程式一啟始,便去自動執行 timerStart
- End Sub
- Private Sub Workbook_BeforeClose(Cancel As Boolean)
- On Error Resume Next
- Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkbook.Timer", , False
- End Sub
- Public Sub Timer()
- Dim Pos As Integer
-
- On Error Resume Next
- ' Sheets("策略記錄").Cells(2, 1) = Time '將時間show至策略的a2欄位
-
- If (TimeValue(Now) >= TimeValue("08:45:00") And TimeValue(Now) <= TimeValue("13:46:01")) Then ' 開盤、收盤時段設定
- ' 盤中處理,將資料匯入寫入工作表單內儲存。
-
- With Sheets("策略記錄")
- Cells(4, 2).Value = Cells(4, 2).Value + 1 '將變動行號加一行
-
- Pos = Cells(4, 2).Value
-
- Cells(Pos, 1).Value = Time
- Cells(Pos, 2).Value = Ov(1) ' B 欄
- Cells(Pos, 3).Value = Hv(1) ' C 欄
- Cells(Pos, 4).Value = Lv(1) ' D 欄
- Cells(Pos, 5).Value = Cv(1) ' E 欄
-
- Cells(Pos, 6).Value = Ov(2) ' F 欄
- Cells(Pos, 7).Value = Hv(2) ' G 欄
- Cells(Pos, 8).Value = Lv(2) ' H 欄
- Cells(Pos, 9).Value = Cv(2) ' I 欄
-
- Cells(Pos, 10).Value = Ov(3) ' J 欄
- Cells(Pos, 11).Value = Hv(3) ' K 欄
- Cells(Pos, 12).Value = Lv(3) ' L 欄
- Cells(Pos, 13).Value = Cv(3) ' M 欄
- End With
- End If
- End Sub
- Sub ExeSelf()
- timerEnabled = True
- If IsError(Sheets("策略記錄").Range("B2").Value) Then ' 假設 B2 欄位為多空力道
- Cv(1) = 0
- Cv(2) = 0
- Cv(3) = 0
- Else
- Cv(1) = Sheets("策略記錄").Range("B2").Value ' 多空力道成交價
- Cv(2) = Sheets("策略記錄").Range("C2").Value ' 反向勢力成交價
- Cv(3) = Sheets("策略記錄").Range("D2").Value ' 主力控盤成交價
- End If
-
- If (turnKey = 0 Or Ov(1) = 0) Then ' 當 turnKey 值為0,表示其為初始值設定。為考量系統剛連上 DDE,
- ' 有時在第一根數值產生時 Ov = Cv 值可能為 0 (IsError()的狀態)。
- Ov(1) = Cv(1) ' 多空力道開盤價初始值設定
- Hv(1) = Cv(1) ' 多空力道最高價初始值設定
- Lv(1) = Cv(1) ' 多空力道最低價初始值設定
-
- Ov(2) = Cv(2) ' 反向勢力開盤價初始值設定
- Hv(2) = Cv(2) ' 反向勢力最高價初始值設定
- Lv(2) = Cv(2) ' 反向勢力最低價初始值設定
-
- Ov(3) = Cv(3) ' 主力控盤開盤價初始值設定
- Hv(3) = Cv(3) ' 主力控盤最高價初始值設定
- Lv(3) = Cv(3) ' 主力控盤最低價初始值設定
- End If
-
- turnKey = turnKey + 1
-
- If (Cv(1) > Hv(1)) Then Hv(1) = Cv(1) ' 判斷多空力道最高價
- If (Cv(2) > Hv(2)) Then Hv(2) = Cv(2) ' 判斷反向勢力最高價
- If (Cv(3) > Hv(3)) Then Hv(3) = Cv(3) ' 判斷主力控盤最高價
- If (Cv(1) < Lv(1)) Then Lv(1) = Cv(1) ' 判斷多空力道最低價
- If (Cv(2) < Lv(2)) Then Lv(1) = Cv(2) ' 判斷反向勢力最低價
- If (Cv(3) < Lv(3)) Then Lv(1) = Cv(3) ' 判斷主力控盤最低價
- If (turnKey < nums) Then
- Application.OnTime (Now + TimeValue("00:00:01")), "ThisWorkbook.ExeSelf"
- Else
- If (Cv(1) <> 0) Then Call Timer
- ' Call Timer
- Call timerStart
- End If
- End Sub
-
- Sub timerStart()
- turnKey = 0 ' 每一輪迴盤中初始值之設定。
- If timerEnabled Then
- ' Application.OnTime (Now), "ThisWorkbook.ExeSelf"
- [color=Red]Application.OnTime (Now + TimeValue("00:00:01")), "ThisWorkbook.timerOnTimer"[/color]
- Else
- ' 系統剛連上 DDE 至資料匯入Excel工作表單,須有一個緩衝時段,這時如果馬上去抓取DDE資料,會有型態不符的錯誤訊息產生,並中斷執行序的作業。
- Application.OnTime (Now + TimeValue("00:00:05")), "ThisWorkbook.ExeSelf"
- End If
- End Sub
複製代碼 有關設定間格時段可依個人需求而設置 (個人是選擇 B、或 C, B 是寫死在程式內, C 可從工作表單內之"A5"欄位依個人需求去外部更改)
(A) LastMin = Hour(Time) * 3600 + Minute(Time) * 60 + Second(Time) 是求出現在時間之換算值,
如:現在是 11:25:10, 則 LastMin = 41110 秒;
(B) 範例中的 nums = 30, 是直接設定為 30 秒;
(C) 設定一固定欄位 (假設為 "A5"),其欄位值直接輸入 00:00:30。
nums = Hour(Cells(5,1).Value) * 3600 + Minute(Cells(5,1).Value) * 60 + Second(Cells(5,1).Value)
則 nums = 30 秒。
P.S. 如果你想要靈活運作的話, 可選擇 C 項,較有彈性, A 項程式碼在處理上會無謂的增大
(如加上多少時間再去判對比較,然後又再求得目前時間等)。
附上程式執行畫面共擬參考:
0526元大記錄量態OHLC.rar (22.53 KB)
|
|