- 帖子
- 2035
- 主題
- 24
- 精華
- 0
- 積分
- 2031
- 點名
- 0
- 作業系統
- Win7
- 軟體版本
- Office2010
- 閱讀權限
- 100
- 性別
- 男
- 註冊時間
- 2012-3-22
- 最後登錄
- 2024-2-1
|
8#
發表於 2012-5-26 10:41
| 只看該作者
謝謝回覆 感恩
這我了解 !但因我三個欄位都是DDE資料運算出來的 所以在一分鐘內也有O/H/L/C
所以我要 ...
mead 發表於 2012-5-25 22:11 
附上如何產生多空力道的 O/H/L/C 之方法,其餘兩項可以另外兩組變數來同時處理(如二之說明):
(一)- Option Explicit
- Dim timerEnabled As Boolean '
- Dim counter As Single ' 示範用計數器
- Dim Ov As Single, Hv As Single, Lv As Single, Cv As Single ' 開盤價、最高價、最高價、收盤價(成交價) 等設定之變數。
- 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 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
- Sub ExeSelf()
- timerEnabled = True
- If IsError(Sheets("工作表1").Range("E5").Value) Then ' 假設 E5 欄位為多空力道
- Cv = 0
- Else
- Cv = Sheets("工作表1").Range("E5").Value ' 多空力道成交價
- End If
-
- If (turnKey = 0 Or Ov = 0) Then ' 當 turnKey 值為0,表示其為初始值設定。為考量系統剛連上 DDE,
- ' 有時在第一根數值產生時 Ov = Cv 值可能為 0 (IsError()的狀態)。
- Ov = Cv ' 多空力道開盤價初始值設定
- Hv = Cv ' 多空力道最高價初始值設定
- Lv = Cv ' 多空力道最低價初始值設定
- End If
-
- turnKey = turnKey + 1
-
- If (Cv > Hv) Then Hv = Cv ' 判斷多空力道最高價
- If (Cv < Lv) Then Lv = Cv ' 判斷多空力道最低價
- counter = counter + 1
- [F1].Value = counter ' 08:45 後每隔 30 秒,請觀察 F1 欄位數字是否會異動?
-
- If (turnKey < nums) Then
- Application.OnTime (Now + TimeValue("00:00:01")), "ThisWorkbook.ExeSelf"
- Else
- If (Cv > 0) Then Call Timer
- Call timerStart
- End If
- End Sub
- Sub Timer()
- Dim str As String
-
- If (TimeValue(Now) >= TimeValue("08:45:00") And TimeValue(Now) <= TimeValue("13:46:01")) Then ' 開盤、收盤時段設定
- ' 盤中處理,將資料匯入寫入工作表單內儲存。
- End If
- End Sub
複製代碼 (二) 改以陣列處理。(1. 多空力道、2. 反向勢力、3. 主力控盤)- Dim Ov(1 To 3), Hv(1 To 3), Lv(1 To 3), Cv(1 To 3) As Single ' 開盤價、最高價、最高價、收盤價(成交價) 等設定之變數。
- . ' 改以陣列處理。(1. 多空力道、2. 反向勢力、3. 主力控盤)
- .
- .
- Sub ExeSelf()
- timerEnabled = True
- If IsError(Sheets("工作表1").Range("E5").Value) Then ' 假設 E5 欄位為多空力道
- Cv(1) = 0
- Cv(2) = 0
- Cv(3) = 0
- Else
- Cv(1) = Sheets("工作表1").Range("E5").Value ' 多空力道成交價
- Cv(2) = Sheets("工作表1").Range("I5").Value ' 反向勢力成交價
- Cv(3) = Sheets("工作表1").Range("M5").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
複製代碼 |
|