- 帖子
- 2035
- 主題
- 24
- 精華
- 0
- 積分
- 2031
- 點名
- 0
- 作業系統
- Win7
- 軟體版本
- Office2010
- 閱讀權限
- 100
- 性別
- 男
- 註冊時間
- 2012-3-22
- 最後登錄
- 2024-2-1
|
10#
發表於 2012-5-26 15:59
| 只看該作者
感謝c_c_lai大大的熱心詳細解說 學習了解些了
再請問 c_c_lai 大大 即時比對的O/H/L/C 要如何指定暫存 ...
mead 發表於 2012-5-26 11:57 
依你目前的需求來說,要以多空力道、反向勢力、主力控盤的資料列來處理的話,
是有難度,而且我本身是不做這麼處裡的。
一般常見的多以成交價為主圖、成交量、多空力道、反向勢力等為附圖。
也就是說多以 K 線的 O/H/L/C 來處理股價圖,以折線、柱狀圖來輔助附圖。
而且你目前的多空力道、反向勢力、主力控盤的數據均有正負數,我沒試過
股價圖能否處理此正負值的數列。你可以試試看,方法如下:
(1) 假設你設定每隔 30 秒處理資料一筆。 (我之前附上的範例即是)
(2) 假設你設定BCDE欄位為多空力道之O/H/L/C,FGHI欄位為反向勢力之O/H/L/C,JKLM欄位為主力控盤之O/H/L/C。
(3) 我之前附上的範例加以修改成你要的 (想了想還是幫你完成吧!):- Option Explicit
- Dim timerEnabled As Boolean '
- Dim counter As Single ' 示範用計數器
- 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()
- counter = 0
- nums = 30 ' 設定每隔 30 秒處理時段,亦可更改成 10 (每隔 10 秒)、20 (每隔 20 秒)等等。
- ' 此處不建議使用 1 秒時段來處理,因為還要去求出開盤、最高、最低、成交價。
- timerEnabled = False
- Call timerStart ' 程式一啟始,便去自動執行 timerStart
- End Sub
- Sub Timer()
- Dim str As String
-
- If (TimeValue(Now) >= TimeValue("08:45:00") And TimeValue(Now) <= TimeValue("13:46:01")) Then ' 開盤、收盤時段設定
- ' 盤中處理,將資料匯入寫入工作表單內儲存。
- With Sheets("策略記錄")
- .Cells(4, 2) = .Cells(4, 2) + 1 '將變動行號加一行
- Pos = .Cells(4, 2)
- .Cells(Pos, 1) = Time
- .Cells(Pos, 2) = Ov(1) ' B 欄
- .Cells(Pos, 3) = Hv(1) ' C 欄
- .Cells(Pos, 4) = Lv(1) ' D 欄
- .Cells(Pos, 5) = Cv(1) ' E 欄
- .Cells(Pos, 6) = Ov(2) ' F 欄
- .Cells(Pos, 7) = Hv(2) ' G 欄
- .Cells(Pos, 8) = Lv(2) ' H 欄
- .Cells(Pos, 9) = Cv(2) ' I 欄
- .Cells(Pos, 10) = Ov(3) ' J 欄
- .Cells(Pos, 11) = Hv(3) ' K 欄
- .Cells(Pos, 12) = Lv(3) ' L 欄
- .Cells(Pos, 13) = 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 timerStart
- End If
- End Sub
- Sub timerStart()
- turnKey = 0 ' 每一輪迴盤中初始值之設定。
- If timerEnabled Then
- Application.OnTime (Now), "ThisWorkbook.ExeSelf"
- Else
- ' 系統剛連上 DDE 至資料匯入Excel工作表單,須有一個緩衝時段,這時如果馬上去抓取DDE資料,會有型態不符的錯誤訊息產生,並中斷執行序的作業。
- Application.OnTime (Now + TimeValue("00:00:05")), "ThisWorkbook.ExeSelf"
- End If
- End Sub
複製代碼 (4) 如果有了 O/H/L/C 後,你就照著我最先告訴你的股價圖製作方法,一切便大功告成了!
(5) 正如我在前面說過的:我沒試過股價圖能否處理此正負值的數列,你可以試試看。
這兒我只是教你怎麼處理人工產生之 O/H/L/C 的竅門而已! |
|