返回列表 上一主題 發帖

[發問] DDE資料紀錄問題

回復 46# slip
"c_c_lai"大大好
今天開盤後
執行狀況跟上週未開盤的時候一樣
Book9.rar (14.62 KB)
請幫我看看
感恩
slip

TOP

本帖最後由 c_c_lai 於 2013-8-5 10:38 編輯

回復 49# slip
今早我實際跑了一下你的程式 (有點語病),我略微修正了一些語法,並加上 Rng 變數宣告。
大約觀察了一個多小時,因無法傳上圖示 (網頁圖片、附件均無法正常使用) 讓你分享,
故直接貼上程式碼,你再自行貼入你的 Module1 內,內容如下:
P.S.  你設定的五秒鐘寫入一筆資料,好像是在趕市集似的,看得我老人家眼發瞭亂的,
         我先將它改成一分鐘執行一次,你也可以使用 20 秒一筆做為參考 (較客觀)。
  1. Sub GetDDE()
  2.     Dim T As Date, Sh(1 To 2), i As Long, Rng As Range
  3.    
  4.     T = Now            '  取得現在時間
  5.     Set Sh(1) = ThisWorkbook.Sheets(1)
  6.     Set Sh(2) = ThisWorkbook.Sheets(2)
  7.    
  8.     If Not IsError(Sh(1).[B2]) Then
  9.         Set Rng = Sh(2).[A65536].End(xlUp).Offset(1)  '  物件
  10.         Rng.Resize(, 7) = Sh(1).[A2:G2].Value         '  將工作表1的DDE資料寫入工作表2
  11.         With Sh(2)
  12.             i = Rng.Row
  13.             
  14.             Rng.Offset(, 7) = Rng.Offset(, 3) - Rng.Offset(, 2)  '  H欗的公式=>D欗-C欗
  15.             Rng.Offset(, 8) = Rng.Offset(, 7) - Rng.Offset(, 7).Offset(-1)    '  I413=H413-H412......數列2
  16.             Rng.Offset(, 9) = Rng.Offset(, 4)                    '  J欗的公式=E欗
  17.             '  xMax = Application.Max(.[I:J])                    '  最大值
  18.             '  xMin = Application.Min(.[I:J])                    '  最小值
  19.             '  **  .Parent.ChartObjects(1): 物件 (工作表的第1個圖表)  *****
  20.             With .ChartObjects(1).Chart
  21.                 .SeriesCollection(1).Values = .Parent.Parent.Range("I2:I" & i)    '  指定數列資料的範圍
  22.                 .SeriesCollection(1).ChartType = 52                               '  指定數列圖表類型
  23.                 .SeriesCollection(2).Values = .Parent.Parent.Range("J2:J" & i)
  24.                 .SeriesCollection(2).ChartType = 65
  25.                 If .SeriesCollection(2).AxisGroup <> xlSecondary Then .SeriesCollection(2).AxisGroup = xlSecondary
  26.                 '  數列不在第 2 Y座標軸(副座標): 數列指定到第 2 Y座標軸(副座標)   '  .AxisGroup = 2 ->  副座標
  27.                                                                               
  28.                 .Parent.Top = .Parent.Parent.Range("L" & IIf(i <= 39, 1, i - 38)).Top     '  指定圖表頂端的位置
  29.                 With .Axes(xlValue)                '  Y (主) 座標軸
  30.                     .MinimumScale = Application.Min(.Parent.Parent.Parent.[I:I])          '  最小值
  31.                     .MaximumScale = Application.Max(.Parent.Parent.Parent.[I:I])          '  最大值
  32.                     .MajorUnitIsAuto = True        '  主要刻度間距=自動設定
  33.                     .MinorUnitIsAuto = True        '  次要刻度間距=自動設定
  34.                     .Crosses = xlAutomatic         '  座標軸與其他座標軸交叉的點=自動設定
  35.                     .ScaleType = xlLinear          '  數值座標軸的刻度類型=xlLinear
  36.                 End With
  37.                
  38.                 With .Axes(xlValue, xlSecondary)   '  Y (副) 座標軸
  39.                     .MinimumScale = Application.Min(.Parent.Parent.Parent.[J:J])           '  最小值
  40.                     .MaximumScale = Application.Max(.Parent.Parent.Parent.[J:J])           '  最大值
  41.                     .MaximumScaleIsAuto = True
  42.                     .MajorUnitIsAuto = True
  43.                     .MinorUnitIsAuto = True
  44.                     .Crosses = xlAutomatic
  45.                     .ScaleType = xlLinear
  46.                 End With
  47.             End With
  48.         End With
  49.     End If
  50.    
  51.     Application.ScreenUpdating = True
  52.     Application.OnTime T + TimeValue("00:01:00"), "GetDDE"      '  間隔 5 分鐘改成 TimeValue("00:05:00")
  53. End Sub
複製代碼

TOP

本帖最後由 c_c_lai 於 2013-8-5 10:55 編輯

回復 51# slip
另外、我在我這端 ThisWorkbook 程式碼加入了以下程式碼,
方便 Excel 一開啟便會自動處理程式之執行,而不需再以人工點按 GetDDE(),
這是我處理 DDE 的習慣,提供你參考:
  1. Option Explicit

  2. Private Sub Workbook_Open()
  3.     If (Weekday(Date, 2) > 5 Or TimeValue(Now) > TimeValue("13:45:00")) Then
  4.         Exit Sub
  5.     Else
  6.         '  認真來看盤吧!
  7.        If TimeValue(Now) < TimeValue("08:45:00") Then
  8.             Application.OnTime TimeValue("08:45:00"), "Module1.GetDDE"
  9.         Else
  10.             Application.OnTime (Now + TimeValue("00:00:01")), "Module1.GetDDE"
  11.         End If
  12.     End If
  13. End Sub
複製代碼
加上後, Module1 程式最好再修改成如下,如此整體程式才有頭有尾。
  1. Sub GetDDE()
  2.     Dim T As Date, Sh(1 To 2), i As Long, Rng As Range
  3.    
  4.     T = Now            '  取得現在時間
  5.     If TimeValue(Now) > TimeValue("13:45:00") Then Exit Sub
  6.    
  7.     Set Sh(1) = ThisWorkbook.Sheets(1)
  8.     Set Sh(2) = ThisWorkbook.Sheets(2)
  9.    
  10.     If Not IsError(Sh(1).[B2]) Then
  11.          .
  12.         .
  13.     End If
  14.          .
  15.         .
  16. End Sub
複製代碼

TOP

回復 52# c_c_lai
謝謝大大
不知以下所寫是否合宜
不適合請版主大大刪除,並說聲對不起

c_c_lai大大
你教導回信中
有提到你也有在測試
那在此小小報告
不知這樣您是否有用

要抓5秒的原因
是在期貨時
這個時間最靠近"tick"
不是看每根圖
是搭配最高點or最低點(要搭配我有上傳的"T"檔案)
要看出主要做手,是否有轉向的意圖

這邏輯如果正確
可套在個股上
以上都還在模擬測試中

感謝大大的幫忙
目前執行順利中
slip

TOP

回復 54# slip
模擬測試之準確度能須待 "時日"、"型態"、"市場走向" 的考驗,
市場上一 TOLAKU 的人日日一直在追尋著美夢與願景,
也願你能一帆風順!

TOP

回復 55# c_c_lai
感謝,感謝
這樣看來,
大大是期選高手
大大有專門的網站(or部落格)
可讓我多多向您請教
感謝,感謝
slip

TOP

回復 56# slip
之前我只是幫一位通稱 "朋友" 的忙,處裡一些相關統計圖表的解析
(Easy Language、Power Language、HTS 等程式語言應用),至於
Excel 方面仍稱新手,在此期間隨同 Hsieh版大、GBKEE版大、以及
一些無法一一列名的前輩先進們請益學習,著實談不上經驗。
如有任何賜教之處,可以 E-Mail 到:  c_c_lai@yahoo.com

TOP

        靜思自在 : 改變自己是自救,影響別人是救人。
返回列表 上一主題