在下想用VBA求算DDE期货指数的30分K线的即时移动平均价 說明: (a) sheet2工作表的資料是連結期貨商指數期貨dde的資訊記錄下的表格, (資料紀錄欄從A2到Y2)因為表格中的資料隨時都在變化,所以運用VBA程式將其自開盤後每間隔10秒紀錄於sheet1,每日自第271列由上往下紀錄, (b) D欄每日自第271列以下紀錄08:45開盤後每10秒紀錄一次成交價至13:45收盤 (c) Q欄係10秒k線的270移動平均價 (d) U261至U270係每日收盤後將倒數10根的30分k收盤價以手動輸入之欄位, (e) U欄每日自第271列以下紀錄08:45開盤後每30分鐘紀錄一次成交價至13:45收盤,即09:15、09:45、10:15、10:45…13:45 ,或謂30 分k收盤價。
今若欲在每日開盤後求算30 分k線的5根即時移動平均價(即5MA),若對應SHEET1中的欄位資料,係指當根K棒即時價(即D儲存格值)加上U欄往上數倒數4個非空白價位之平均值:此處時間以10:02:10為例解為D714、U613、U445、U270、U269之平均值,不知其VBA程式語法應如何撰寫?
感謝諸位大德協助
附現行運作之程式碼如下及excel檔案附件: Public uMode&, StartTime, EndTime, BeepChk% Public MyBook As Workbook, Sht1 As Worksheet, Sht2 As Worksheet, xRow& Private Declare Function sndPlaySound32 Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long Sub 共用參照() Set MyBook = ThisWorkbook Set Sht1 = MyBook.Sheets("Sheet1") Set Sht2 = MyBook.Sheets("Sheet2") StartTime = "08:45:05" '開盤時間(提早十秒開始,才可記錄開盤量價) EndTime = "13:45:05" '收盤時間(延後十秒停止記錄) End Sub (....中間省略) Sht2.Range("W2") = Time '當前時間(時間碼表) '---------------------------------------------------------- If Second(Time) Mod 10 = 0 Then '↓從第一列開始記錄 xRow = Sht1.Range("E65536").End(xlUp).Row If Sht1.Range("D" & xRow) <> "" Then xRow = xRow + 1 Sht1.Range("A" & xRow & ":Y" & xRow).Value = Sht2.Range("A2:Y2").Value Sht1.Range("W" & xRow).Value = Time '↓第2筆開始計算與上一筆的差值 If xRow > 1 Then With Sht1 .Range("J" & xRow) = .Range("I" & xRow).Value - .Range("I" & xRow - 1).Value .Range("Q" & xRow) = Format(Application.Sum(Range("D" & xRow - 269 & ":D" & xRow)) / 270, "0.00") '指數1個tick的270ma End With End If If Hour(Time) > 9 And Second(Time) = 0 And Minute(Time) Mod 15 = 0 And Minute(Time) Mod 30 <> 0 Then Sht1.Range("U" & xRow).Value = Sht1.Range("D" & xRow).Value '08:45開盤後每30分鐘紀錄一次成交價至13:45收盤,即09:15、09:45、10:15、10:45…13:45 / 或謂30 分k收盤價 '------------------------------------------------ Sht1.ChartObjects("圖表 1").Top = Cells(xRow - 7, 1).Top '圖表自動往下移動(與資料保持一列空白) Sht1.ChartObjects("圖表 2").Top = Cells(xRow + 12, 1).Top '圖表自動往下移動(與資料保持一列空白) If ActiveSheet.Name = Sht1.Name And xRow > 4 Then ActiveWindow.ScrollRow = xRow - 3 '讓最新資料保持在可見視窗中 End If ThisWorkbook.Save '存檔 Beep End If Application.OnTime Now + TimeValue("00:00:01"), "自動記錄" '每一秒遞迴一次 End Sub (....中間省略) If ActiveSheet.Name = Sht1.Name Then ActiveWindow.ScrollRow = 1 Beep End Sub
|