Board logo

標題: 請問如何改成K棒顯示? [打印本頁]

作者: mead    時間: 2012-5-24 20:25     標題: 請問如何改成K棒顯示?

附件是我目前一分鐘紀錄量態並繪圖的EXCEL(使用元大DDE)
因無法體現量的強弱  想改成仿K棒的形式  秀出1分鐘的/開/高/低/收
盼望論壇高手指導改進

謝謝  感恩

[attach]11129[/attach]
作者: c_c_lai    時間: 2012-5-25 08:36

回復 1# mead
XlChartType 列舉
指定圖表類型。
-------------------------------------------------------------
名稱                         值         描述
xlStockOHLC         89         開盤-最高-最低-收盤股價圖
xlStockVHLC         90         成交量-最高-最低-收盤股價圖
xlStockVOHLC         91         成交量-開盤-最高-最低-收盤股價圖
-------------------------------------------------------------
此處的"描述"指的是你必須是上列的組合才能成立建置的條件,例如:
[attach]11134[/attach]
  1.     ActiveSheet.Shapes.AddChart.Select
  2.     With ActiveChart
  3.         .SetSourceData Source:=Range("工作表1!$B$1:工作表1!$B$" & totalRows & ", 工作表1!$C$1:工作表1!$F$" & totalRows)
  4.         .ChartType = xlStockOHLC
  5.         With .ChartGroups(1)
  6.              .AxisGroup = 1
  7.              .UpBars.Format.Fill.ForeColor.RGB = RGB(255, 69, 0)          ' 橘紅色
  8.              .DownBars.Format.Fill.ForeColor.RGB = RGB(0, 250, 170)     ' 淺洋綠色
  9.         End With
  10. . . . . . .
  11. End With
複製代碼

作者: mead    時間: 2012-5-25 17:24

回復  mead
XlChartType 列舉
指定圖表類型。
---------------------------------------------------- ...
c_c_lai 發表於 2012-5-25 08:36

感恩回覆  
這只是繪圖嗎?一分鐘的__開/高/低/收  要如何處理完成?

抱歉!程式能力很弱  有煩您費心指導!

感恩再感恩
作者: c_c_lai    時間: 2012-5-25 20:44

回復 3# mead
XlChartType 列舉的圖表類型只是告訴你,如果要繪製出股票圖的話就必須要有上述的組合條件才能形成,
就你目前的三個標題: 多空力道、反向勢力、主力控盤,其本身數據都是單向數列,構不成股票圖的組合條件,
只能以一般常用的 xlLine (折線圖) 或者是其它圖型來應用。
如果你真想能以股票圖來表示,你就必須將多空力道、反向勢力、主力控盤等於資料匯入處理同時,分別將其各自的
多空力道、反向勢力、主力控盤等之多空力道開盤價、多空力道最高價、多空力道最低價、多空力道收盤價分別
紀錄並予以匯入至工作表單內(如 #2 的表單附件;成立的條件、以及VBA製作的方法),如此才能處理股票圖的方案。
如此的說明不知瞭解否?
作者: mead    時間: 2012-5-25 22:11

回復  mead
XlChartType 列舉的圖表類型只是告訴你,如果要繪製出股票圖的話就必須要有上述的組合條件才能 ...
c_c_lai 發表於 2012-5-25 20:44

謝謝回覆  感恩
這我了解 !但因我三個欄位都是DDE資料運算出來的  所以在一分鐘內也有O/H/L/C
所以我要請求協助的就是如何弄出三欄各別的一分O/H/L/C;然後存於紀錄欄以便畫出K棒?

謝謝熱心協助

感恩
作者: f3202    時間: 2012-5-25 22:46

回復 5# mead

參考
    http://forum.twbts.com/thread-5686-1-3.html
作者: mead    時間: 2012-5-26 01:36

回復  mead

參考
f3202 發表於 2012-5-25 22:46

謝謝您的幫忙!
但因權限不夠無法下載相關檔案參考研究
討論中的程式碼好像是有缺失的  因個人程式底子不好  無法了解那段程式問題而自行修正

不過還是感恩您的熱心協助

謝謝
作者: c_c_lai    時間: 2012-5-26 10:41

謝謝回覆  感恩
這我了解 !但因我三個欄位都是DDE資料運算出來的  所以在一分鐘內也有O/H/L/C
所以我要 ...
mead 發表於 2012-5-25 22:11

附上如何產生多空力道的 O/H/L/C 之方法,其餘兩項可以另外兩組變數來同時處理(如二之說明):
(一)
  1. Option Explicit

  2. Dim timerEnabled As Boolean  '
  3. Dim counter As Single        ' 示範用計數器
  4. Dim Ov As Single, Hv As Single, Lv As Single, Cv As Single           ' 開盤價、最高價、最高價、收盤價(成交價) 等設定之變數。
  5. Dim turnKey As Integer   ' 判斷每一輪迴上列變數初始值之設定。
  6. Dim nums As Integer      ' 將每隔 "多少時間" 處理時段,移到此處來處理。

  7. Private Sub Workbook_Open()
  8.     counter = 0

  9.     nums = 30            ' 設定每隔 30 秒處理時段,亦可更改成 10 (每隔 10 秒)、20 (每隔 20 秒)等等。
  10.                          ' 此處不建議使用 1 秒時段來處理,因為還要去求出開盤、最高、最低、成交價。
  11.     timerEnabled = False
  12.     Call timerStart      ' 程式一啟始,便去自動執行 timerStart      
  13. End Sub

  14. Sub timerStart()
  15.     turnKey = 0          ' 每一輪迴盤中初始值之設定。

  16.     If timerEnabled Then
  17.         Application.OnTime (Now), "ThisWorkbook.ExeSelf"
  18.     Else
  19.         ' 系統剛連上 DDE 至資料匯入Excel工作表單,須有一個緩衝時段,這時如果馬上去抓取DDE資料,會有型態不符的錯誤訊息產生,並中斷執行序的作業。
  20.         Application.OnTime (Now + TimeValue("00:00:05")), "ThisWorkbook.ExeSelf"
  21.     End If
  22. End Sub

  23. Sub ExeSelf()
  24.     timerEnabled = True

  25.     If IsError(Sheets("工作表1").Range("E5").Value) Then ' 假設 E5 欄位為多空力道
  26.         Cv = 0
  27.     Else
  28.         Cv = Sheets("工作表1").Range("E5").Value          ' 多空力道成交價
  29.     End If
  30.    
  31.     If (turnKey = 0 Or Ov = 0) Then                     ' 當 turnKey 值為0,表示其為初始值設定。為考量系統剛連上 DDE,
  32.                                                         ' 有時在第一根數值產生時 Ov = Cv 值可能為 0 (IsError()的狀態)。
  33.         Ov = Cv                                         ' 多空力道開盤價初始值設定
  34.         Hv = Cv                                         ' 多空力道最高價初始值設定
  35.         Lv = Cv                                         ' 多空力道最低價初始值設定
  36.     End If
  37.    
  38.     turnKey = turnKey + 1
  39.    
  40.     If (Cv > Hv) Then Hv = Cv                           ' 判斷多空力道最高價
  41.     If (Cv < Lv) Then Lv = Cv                           ' 判斷多空力道最低價

  42.     counter = counter + 1
  43.     [F1].Value = counter    ' 08:45 後每隔 30 秒,請觀察 F1 欄位數字是否會異動?
  44.    
  45.     If (turnKey < nums) Then
  46.         Application.OnTime (Now + TimeValue("00:00:01")), "ThisWorkbook.ExeSelf"
  47.     Else
  48.         If (Cv > 0) Then Call Timer
  49.         Call timerStart
  50.     End If
  51. End Sub

  52. Sub Timer()
  53.     Dim str As String
  54.    
  55.     If (TimeValue(Now) >= TimeValue("08:45:00") And TimeValue(Now) <= TimeValue("13:46:01")) Then    ' 開盤、收盤時段設定
  56.         ' 盤中處理,將資料匯入寫入工作表單內儲存。

  57.     End If
  58. End Sub
複製代碼
(二) 改以陣列處理。(1. 多空力道、2. 反向勢力、3. 主力控盤)
  1. Dim Ov(1 To 3), Hv(1 To 3), Lv(1 To 3), Cv(1 To 3) As Single  ' 開盤價、最高價、最高價、收盤價(成交價) 等設定之變數。
  2. .                                                             ' 改以陣列處理。(1. 多空力道、2. 反向勢力、3. 主力控盤)
  3. .
  4. .

  5. Sub ExeSelf()
  6.     timerEnabled = True

  7.     If IsError(Sheets("工作表1").Range("E5").Value) Then ' 假設 E5 欄位為多空力道
  8.         Cv(1) = 0
  9.         Cv(2) = 0
  10.         Cv(3) = 0
  11.     Else
  12.         Cv(1) = Sheets("工作表1").Range("E5").Value    ' 多空力道成交價
  13.         Cv(2) = Sheets("工作表1").Range("I5").Value    ' 反向勢力成交價
  14.         Cv(3) = Sheets("工作表1").Range("M5").Value    ' 主力控盤成交價
  15.     End If
  16.    
  17.     If (turnKey = 0 Or Ov(1) = 0) Then                 ' 當 turnKey 值為0,表示其為初始值設定。為考量系統剛連上 DDE,
  18.                                                        ' 有時在第一根數值產生時 Ov = Cv 值可能為 0 (IsError()的狀態)。
  19.         Ov(1) = Cv(1)                                  ' 多空力道開盤價初始值設定
  20.         Hv(1) = Cv(1)                                  ' 多空力道最高價初始值設定
  21.         Lv(1) = Cv(1)                                  ' 多空力道最低價初始值設定
  22.         Ov(2) = Cv(2)                                  ' 反向勢力開盤價初始值設定
  23.         Hv(2) = Cv(2)                                  ' 反向勢力最高價初始值設定
  24.         Lv(2) = Cv(2)                                  ' 反向勢力最低價初始值設定
  25.         Ov(3) = Cv(3)                                  ' 主力控盤開盤價初始值設定
  26.         Hv(3) = Cv(3)                                  ' 主力控盤最高價初始值設定
  27.         Lv(3) = Cv(3)                                  ' 主力控盤最低價初始值設定
  28.     End If
  29.    
  30.     turnKey = turnKey + 1
  31.    
  32.     If (Cv(1) > Hv(1)) Then Hv(1) = Cv(1)              ' 判斷多空力道最高價
  33.     If (Cv(2) > Hv(2)) Then Hv(2) = Cv(2)              ' 判斷反向勢力最高價
  34.     If (Cv(3) > Hv(3)) Then Hv(3) = Cv(3)              ' 判斷主力控盤最高價

  35.     If (Cv(1) < Lv(1)) Then Lv(1) = Cv(1)              ' 判斷多空力道最低價
  36.     If (Cv(2) < Lv(2)) Then Lv(1) = Cv(2)              ' 判斷反向勢力最低價
  37.     If (Cv(3) < Lv(3)) Then Lv(1) = Cv(3)              ' 判斷主力控盤最低價

  38.     If (turnKey < nums) Then
  39.         Application.OnTime (Now + TimeValue("00:00:01")), "ThisWorkbook.ExeSelf"
  40.     Else
  41.         If (Cv(1) > 0) Then Call Timer
  42.         Call timerStart
  43.     End If
  44. End Sub
複製代碼

作者: mead    時間: 2012-5-26 11:57

附上如何產生多空力道的 O/H/L/C 之方法,其餘兩項可以另外兩組變數來同時處理(如二之說明):
(一)(二)  ...
c_c_lai 發表於 2012-5-26 10:41

感謝c_c_lai大大的熱心詳細解說  學習了解些了
再請問 c_c_lai 大大  即時比對的O/H/L/C 要如何指定暫存於儲存格?
因是取ㄧ分K  則在一分內的O/H/L/C 要先暫存?

感恩協助  謝謝
作者: c_c_lai    時間: 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) 我之前附上的範例加以修改成你要的 (想了想還是幫你完成吧!):
  1. Option Explicit
  2. Dim timerEnabled As Boolean  '
  3. Dim counter As Single        ' 示範用計數器
  4. Dim Ov(1 To 3), Hv(1 To 3), Lv(1 To 3), Cv(1 To 3) As Single  ' 開盤價、最高價、最高價、收盤價(成交價) 等設定之變數。
  5.                                                               ' 改以陣列處理。(1. 多空力道、2. 反向勢力、3. 主力控盤)
  6. Dim turnKey As Integer   ' 判斷每一輪迴上列變數初始值之設定。
  7. Dim nums As Integer      ' 將每隔 "多少時間" 處理時段,移到此處來處理。

  8. Private Sub Workbook_Open()
  9.     counter = 0

  10.     nums = 30            ' 設定每隔 30 秒處理時段,亦可更改成 10 (每隔 10 秒)、20 (每隔 20 秒)等等。
  11.                          ' 此處不建議使用 1 秒時段來處理,因為還要去求出開盤、最高、最低、成交價。
  12.     timerEnabled = False
  13.     Call timerStart      ' 程式一啟始,便去自動執行 timerStart      
  14. End Sub

  15. Sub Timer()
  16.     Dim str As String
  17.    
  18.     If (TimeValue(Now) >= TimeValue("08:45:00") And TimeValue(Now) <= TimeValue("13:46:01")) Then    ' 開盤、收盤時段設定
  19.         ' 盤中處理,將資料匯入寫入工作表單內儲存。

  20.         With Sheets("策略記錄")
  21.             .Cells(4, 2) = .Cells(4, 2) + 1 '將變動行號加一行
  22.             Pos = .Cells(4, 2)
  23.             .Cells(Pos, 1) = Time
  24.             .Cells(Pos, 2) = Ov(1)    ' B 欄
  25.             .Cells(Pos, 3) = Hv(1)    ' C 欄
  26.             .Cells(Pos, 4) = Lv(1)    ' D 欄
  27.             .Cells(Pos, 5) = Cv(1)    ' E 欄
  28.             .Cells(Pos, 6) = Ov(2)    ' F 欄
  29.             .Cells(Pos, 7) = Hv(2)    ' G 欄
  30.             .Cells(Pos, 8) = Lv(2)    ' H 欄
  31.             .Cells(Pos, 9) = Cv(2)    ' I 欄
  32.             .Cells(Pos, 10) = Ov(3)   ' J 欄
  33.             .Cells(Pos, 11) = Hv(3)   ' K 欄
  34.             .Cells(Pos, 12) = Lv(3)   ' L 欄
  35.             .Cells(Pos, 13) = Cv(3)   ' M 欄
  36.         End With
  37.     End If
  38. End Sub

  39. Sub ExeSelf()
  40.     timerEnabled = True

  41.     If IsError(Sheets("策略記錄").Range("B2").Value) Then ' 假設 B2 欄位為多空力道
  42.         Cv(1) = 0
  43.         Cv(2) = 0
  44.         Cv(3) = 0
  45.     Else
  46.         Cv(1) = Sheets("策略記錄").Range("B2").Value   ' 多空力道成交價
  47.         Cv(2) = Sheets("策略記錄").Range("C2").Value   ' 反向勢力成交價
  48.         Cv(3) = Sheets("策略記錄").Range("D2").Value   ' 主力控盤成交價
  49.     End If
  50.    
  51.     If (turnKey = 0 Or Ov(1) = 0) Then                 ' 當 turnKey 值為0,表示其為初始值設定。為考量系統剛連上 DDE,
  52.                                                        ' 有時在第一根數值產生時 Ov = Cv 值可能為 0 (IsError()的狀態)。
  53.         Ov(1) = Cv(1)                                  ' 多空力道開盤價初始值設定
  54.         Hv(1) = Cv(1)                                  ' 多空力道最高價初始值設定
  55.         Lv(1) = Cv(1)                                  ' 多空力道最低價初始值設定
  56.         Ov(2) = Cv(2)                                  ' 反向勢力開盤價初始值設定
  57.         Hv(2) = Cv(2)                                  ' 反向勢力最高價初始值設定
  58.         Lv(2) = Cv(2)                                  ' 反向勢力最低價初始值設定
  59.         Ov(3) = Cv(3)                                  ' 主力控盤開盤價初始值設定
  60.         Hv(3) = Cv(3)                                  ' 主力控盤最高價初始值設定
  61.         Lv(3) = Cv(3)                                  ' 主力控盤最低價初始值設定
  62.     End If
  63.    
  64.     turnKey = turnKey + 1
  65.    
  66.     If (Cv(1) > Hv(1)) Then Hv(1) = Cv(1)              ' 判斷多空力道最高價
  67.     If (Cv(2) > Hv(2)) Then Hv(2) = Cv(2)              ' 判斷反向勢力最高價
  68.     If (Cv(3) > Hv(3)) Then Hv(3) = Cv(3)              ' 判斷主力控盤最高價

  69.     If (Cv(1) < Lv(1)) Then Lv(1) = Cv(1)              ' 判斷多空力道最低價
  70.     If (Cv(2) < Lv(2)) Then Lv(1) = Cv(2)              ' 判斷反向勢力最低價
  71.     If (Cv(3) < Lv(3)) Then Lv(1) = Cv(3)              ' 判斷主力控盤最低價

  72.     If (turnKey < nums) Then
  73.         Application.OnTime (Now + TimeValue("00:00:01")), "ThisWorkbook.ExeSelf"
  74.     Else
  75.         If (Cv(1) > 0) Then Call Timer
  76.         Call timerStart
  77.     End If
  78. End Sub

  79. Sub timerStart()
  80.     turnKey = 0          ' 每一輪迴盤中初始值之設定。

  81.     If timerEnabled Then
  82.         Application.OnTime (Now), "ThisWorkbook.ExeSelf"
  83.     Else
  84.         ' 系統剛連上 DDE 至資料匯入Excel工作表單,須有一個緩衝時段,這時如果馬上去抓取DDE資料,會有型態不符的錯誤訊息產生,並中斷執行序的作業。
  85.         Application.OnTime (Now + TimeValue("00:00:05")), "ThisWorkbook.ExeSelf"
  86.     End If
  87. End Sub
複製代碼
(4) 如果有了 O/H/L/C 後,你就照著我最先告訴你的股價圖製作方法,一切便大功告成了!
(5) 正如我在前面說過的:我沒試過股價圖能否處理此正負值的數列,你可以試試看。
     這兒我只是教你怎麼處理人工產生之 O/H/L/C 的竅門而已!
作者: mead    時間: 2012-5-26 19:53

依你目前的需求來說,要以多空力道、反向勢力、主力控盤的資料列來處理的話,
是有難度,而且我本身是不 ...
c_c_lai 發表於 2012-5-26 15:59

感謝c_c_lai 大大這麼熱心的幫忙
我自行測試看看
謝謝
感恩再感恩
作者: mead    時間: 2012-5-26 22:31

依你目前的需求來說,要以多空力道、反向勢力、主力控盤的資料列來處理的話,
是有難度,而且我本身是不 ...
c_c_lai 發表於 2012-5-26 15:59

c_c_lai 大大我如附件整合一下
好像不行ㄋㄟ  都是1秒紀錄  無法1分判斷!
抱歉!因程式底子不好  只能依樣畫葫蘆
麻煩指正

謝謝  感恩

[attach]11155[/attach]
作者: f3202    時間: 2012-5-27 08:54

回復 7# mead
[attach]11156[/attach]參考一下30秒+K線圖text
作者: mead    時間: 2012-5-27 10:43

回復  mead
參考一下30秒+K線圖text
f3202 發表於 2012-5-27 08:54

謝謝f3202大大熱心幫忙
但因權限不夠  是否麻煩寄到我的mail:
[email protected]

感恩再感恩
作者: c_c_lai    時間: 2012-5-27 12:16

本帖最後由 c_c_lai 於 2012-5-28 08:01 編輯

回復 14# mead
看了一下你那三合一的程式,我將它整理了一下 (你直接貼上就 OK 了,另外我也會將檔案E-Mail給你):
  1. ' 以多空力道、反向勢力、主力控盤的資料列來處理
  2. Option Explicit
  3. Dim timerEnabled As Boolean  '
  4. Dim Ov(1 To 3), Hv(1 To 3), Lv(1 To 3), Cv(1 To 3) As Single  ' 開盤價、最高價、最高價、收盤價(成交價) 等設定之變數。
  5.                                                               ' 改以陣列處理。(1. 多空力道、2. 反向勢力、3. 主力控盤)
  6. Dim turnKey As Integer   ' 判斷每一輪迴上列變數初始值之設定。
  7. Dim nums As Integer      ' 將每隔 "多少時間" 處理時段,移到此處來處理。

  8. Private Sub Workbook_Open()
  9.     Sheets("策略記錄").Cells(4, 2) = 10
  10.    
  11.     nums = 30            ' 設定每隔 30 秒處理時段,亦可更改成 30 (每隔 30 秒)、 10 (每隔 10 秒)、20 (每隔 20 秒)等等。
  12.     timerEnabled = False ' 此處不建議使用 1 秒時段來處理,因為還要去求出開盤、最高、最低、成交價。

  13.     Call timerStart      ' 程式一啟始,便去自動執行 timerStart
  14. End Sub

  15. Private Sub Workbook_BeforeClose(Cancel As Boolean)
  16.     On Error Resume Next
  17.     Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkbook.Timer", , False
  18. End Sub

  19. Public Sub Timer()
  20.     Dim Pos As Integer
  21.    
  22.     On Error Resume Next
  23.     ' Sheets("策略記錄").Cells(2, 1) = Time '將時間show至策略的a2欄位
  24.    
  25.      If (TimeValue(Now) >= TimeValue("08:45:00") And TimeValue(Now) <= TimeValue("13:46:01")) Then    ' 開盤、收盤時段設定
  26.         ' 盤中處理,將資料匯入寫入工作表單內儲存。

  27.         With Sheets("策略記錄")
  28.             Cells(4, 2).Value = Cells(4, 2).Value + 1 '將變動行號加一行

  29.             Pos = Cells(4, 2).Value
  30.             
  31.             Cells(Pos, 1).Value = Time
  32.             Cells(Pos, 2).Value = Ov(1)    ' B 欄
  33.             Cells(Pos, 3).Value = Hv(1)    ' C 欄
  34.             Cells(Pos, 4).Value = Lv(1)    ' D 欄
  35.             Cells(Pos, 5).Value = Cv(1)    ' E 欄

  36.             Cells(Pos, 6).Value = Ov(2)    ' F 欄
  37.             Cells(Pos, 7).Value = Hv(2)    ' G 欄
  38.             Cells(Pos, 8).Value = Lv(2)    ' H 欄
  39.             Cells(Pos, 9).Value = Cv(2)    ' I 欄

  40.             Cells(Pos, 10).Value = Ov(3)   ' J 欄
  41.             Cells(Pos, 11).Value = Hv(3)   ' K 欄
  42.             Cells(Pos, 12).Value = Lv(3)   ' L 欄
  43.             Cells(Pos, 13).Value = Cv(3)   ' M 欄
  44.         End With
  45.     End If
  46. End Sub

  47. Sub ExeSelf()
  48.     timerEnabled = True

  49.     If IsError(Sheets("策略記錄").Range("B2").Value) Then ' 假設 B2 欄位為多空力道
  50.         Cv(1) = 0
  51.         Cv(2) = 0
  52.         Cv(3) = 0
  53.     Else
  54.         Cv(1) = Sheets("策略記錄").Range("B2").Value   ' 多空力道成交價
  55.         Cv(2) = Sheets("策略記錄").Range("C2").Value   ' 反向勢力成交價
  56.         Cv(3) = Sheets("策略記錄").Range("D2").Value   ' 主力控盤成交價
  57.     End If

  58.     If (turnKey = 0 Or Ov(1) = 0) Then                 ' 當 turnKey 值為0,表示其為初始值設定。為考量系統剛連上 DDE,
  59.                                                        ' 有時在第一根數值產生時 Ov = Cv 值可能為 0 (IsError()的狀態)。
  60.         Ov(1) = Cv(1)                                  ' 多空力道開盤價初始值設定
  61.         Hv(1) = Cv(1)                                  ' 多空力道最高價初始值設定
  62.         Lv(1) = Cv(1)                                  ' 多空力道最低價初始值設定

  63.         Ov(2) = Cv(2)                                  ' 反向勢力開盤價初始值設定
  64.         Hv(2) = Cv(2)                                  ' 反向勢力最高價初始值設定
  65.         Lv(2) = Cv(2)                                  ' 反向勢力最低價初始值設定

  66.         Ov(3) = Cv(3)                                  ' 主力控盤開盤價初始值設定
  67.         Hv(3) = Cv(3)                                  ' 主力控盤最高價初始值設定
  68.         Lv(3) = Cv(3)                                  ' 主力控盤最低價初始值設定
  69.     End If

  70.     turnKey = turnKey + 1

  71.     If (Cv(1) > Hv(1)) Then Hv(1) = Cv(1)              ' 判斷多空力道最高價
  72.     If (Cv(2) > Hv(2)) Then Hv(2) = Cv(2)              ' 判斷反向勢力最高價
  73.     If (Cv(3) > Hv(3)) Then Hv(3) = Cv(3)              ' 判斷主力控盤最高價

  74.     If (Cv(1) < Lv(1)) Then Lv(1) = Cv(1)              ' 判斷多空力道最低價
  75.     If (Cv(2) < Lv(2)) Then Lv(1) = Cv(2)              ' 判斷反向勢力最低價
  76.     If (Cv(3) < Lv(3)) Then Lv(1) = Cv(3)              ' 判斷主力控盤最低價

  77.     If (turnKey < nums) Then
  78.         Application.OnTime (Now + TimeValue("00:00:01")), "ThisWorkbook.ExeSelf"
  79.     Else
  80.         If (Cv(1) <> 0) Then Call Timer
  81.         ' Call Timer
  82.         Call timerStart
  83.     End If
  84. End Sub

  85. Sub timerStart()
  86.     turnKey = 0          ' 每一輪迴盤中初始值之設定。

  87.     If timerEnabled Then
  88.         ' Application.OnTime (Now), "ThisWorkbook.ExeSelf"      
  89.        [color=Red]Application.OnTime (Now + TimeValue("00:00:01")), "ThisWorkbook.timerOnTimer"[/color]
  90.     Else
  91.         ' 系統剛連上 DDE 至資料匯入Excel工作表單,須有一個緩衝時段,這時如果馬上去抓取DDE資料,會有型態不符的錯誤訊息產生,並中斷執行序的作業。
  92.         Application.OnTime (Now + TimeValue("00:00:05")), "ThisWorkbook.ExeSelf"
  93.     End If
  94. 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 項程式碼在處理上會無謂的增大
       (如加上多少時間再去判對比較,然後又再求得目前時間等)。
附上程式執行畫面共擬參考:
[attach]11157[/attach]
[attach]11158[/attach]
作者: mead    時間: 2012-5-27 17:39

回復  mead
看了一下你那三合一的程式,我將它整理了一下 (你直接貼上就 OK 了,另外我也會將檔案E-Mail給 ...
c_c_lai 發表於 2012-5-27 12:16

了解  感謝c_c_lai 大大的熱心協助

我測試一下

謝謝

感恩再感恩
作者: f3202    時間: 2012-5-27 17:42

  1. Sub Timer()
  2. Dim HHMM As Integer
  3. On Error Resume Next
  4. ' Sheets("策略記錄").Select
  5. Sheets(2).Cells(2, 1) = Time '將時間show至策略的b3欄位
  6. HHMM = Hour(Time) * 100 + Minute(Time)
  7.   If (HHMM < 845 Or HHMM > 1345) Then Exit Sub '營業時間才執行
  8.   If Minute(Time) <> LastMin Then '開始後做
  9.     i = i + 1
  10.     If i = 60 Then

  11. Sheets(2).Range("a10000").End(xlUp).Offset(1, 0) = Time
  12. Sheets(2).Range("a10000").End(xlUp).Offset(0, 1) = O
  13. Sheets(2).Range("a10000").End(xlUp).Offset(0, 2) = H
  14. Sheets(2).Range("a10000").End(xlUp).Offset(0, 3) = L
  15. Sheets(2).Range("a10000").End(xlUp).Offset(0, 4) = C
  16.   
  17. Sheets(2).Range("a10000").End(xlUp).Offset(0, 5) = O1
  18. Sheets(2).Range("a10000").End(xlUp).Offset(0, 6) = H1
  19. Sheets(2).Range("a10000").End(xlUp).Offset(0, 7) = L1
  20. Sheets(2).Range("a10000").End(xlUp).Offset(0, 8) = C1

  21. Sheets(2).Range("a10000").End(xlUp).Offset(0, 9) = O2
  22. Sheets(2).Range("a10000").End(xlUp).Offset(0, 10) = H2
  23. Sheets(2).Range("a10000").End(xlUp).Offset(0, 11) = L2
  24. Sheets(2).Range("a10000").End(xlUp).Offset(0, 12) = C2
  25.      i = 0
  26.       O = Sheets(2).Cells(2, 2)
  27.       H = Sheets(2).Cells(2, 2)
  28.       L = Sheets(2).Cells(2, 2)
  29.       C = Sheets(2).Cells(2, 2)
  30.         
  31.      O1 = Sheets(2).Cells(2, 3)
  32.      H1 = Sheets(2).Cells(2, 3)
  33.      L1 = Sheets(2).Cells(2, 3)
  34.      C1 = Sheets(2).Cells(2, 3)
  35.      
  36.      O2 = Sheets(2).Cells(2, 4)
  37.      H2 = Sheets(2).Cells(2, 4)
  38.      L2 = Sheets(2).Cells(2, 4)
  39.      C2 = Sheets(2).Cells(2, 4)
  40. Else
  41.      C = Sheets(2).Cells(2, 2)
  42.      If H = "" Then H = Sheets(2).Cells(2, 2)
  43.      If C >= H Then H = C
  44.      If C < L Then L = C
  45.      If O = 0 Then O = Sheets(2).Cells(2, 2) Else O = O
  46.      If L = 0 Then L = Sheets(2).Cells(2, 2) Else L = L
  47.    
  48.      C1 = Sheets(2).Cells(2, 3)
  49.      If H1 = "" Then H1 = Sheets(2).Cells(2, 3)
  50.      If C1 >= H1 Then H1 = C1
  51.      If C1 < L1 Then L1 = C1
  52.      If O1 = 0 Then O1 = Sheets(2).Cells(2, 3) Else O1 = O1
  53.      If L1 = 0 Then L1 = Sheets(2).Cells(2, 3) Else L1 = L1
  54.    
  55.      C2 = Sheets(2).Cells(2, 4)
  56.      If H2 = "" Then H2 = Sheets(2).Cells(2, 4)
  57.      If C2 >= H2 Then H2 = C2
  58.      If C2 < L2 Then L2 = C2
  59.      If O2 = 0 Then O2 = Sheets(2).Cells(2, 4) Else O1 = O1
  60.      If L2 = 0 Then L2 = Sheets(2).Cells(2, 4) Else L2 = L2
  61.   End If
  62.         LastMin = Minute(Time)
  63.   End If
  64. Application.OnTime Now + TimeValue("00:00:01"), "Timer" '每秒顯示
  65. End Sub
複製代碼
回復 14# mead
試看看
作者: mead    時間: 2012-5-27 18:08

回復  mead
試看看
f3202 發表於 2012-5-27 17:42

可以了  明天開盤來試試

謝謝f3202大大的熱心協助

感恩再感恩




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)