返回列表 上一主題 發帖

請問如何改成K棒顯示?

請問如何改成K棒顯示?

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

謝謝  感恩

即時量態.rar (24.48 KB)

回復 1# mead
XlChartType 列舉
指定圖表類型。
-------------------------------------------------------------
名稱                         值         描述
xlStockOHLC         89         開盤-最高-最低-收盤股價圖
xlStockVHLC         90         成交量-最高-最低-收盤股價圖
xlStockVOHLC         91         成交量-開盤-最高-最低-收盤股價圖
-------------------------------------------------------------
此處的"描述"指的是你必須是上列的組合才能成立建置的條件,例如:
  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
複製代碼

TOP

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

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

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

感恩再感恩

TOP

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

TOP

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

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

謝謝熱心協助

感恩

TOP

TOP

回復  mead

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

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

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

謝謝

TOP

謝謝回覆  感恩
這我了解 !但因我三個欄位都是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
複製代碼

TOP

附上如何產生多空力道的 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 要先暫存?

感恩協助  謝謝

TOP

感謝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 的竅門而已!

TOP

        靜思自在 : 一句溫暖的話,就像往別人身上灑香水,自己會沾到兩三滴。
返回列表 上一主題