Board logo

標題: [發問] 有關於自動交易系統怎樣觸發發單的問題 [打印本頁]

作者: flyflyduck1    時間: 2014-4-24 15:17     標題: 有關於自動交易系統怎樣觸發發單的問題

本帖最後由 GBKEE 於 2014-4-24 16:56 編輯

小弟最近開始研究EXCEL的自動交易系統,使用touchance的DDE數據。
數據記錄方式:
[attach]18144[/attach],每一分鐘記錄依次計入一分鐘數據到一行單元格,下一分鐘記錄下一分鐘的數據,以此類推。
發單觸發方式:
參考了姜林杰祐老師的“離線交易EXCEL檔”,使用一個定時器每過一分鐘掃描執行一次計算,

            hTimer = SetTimer(0, 0, 60000, AddressOf Main)   '每過一分鐘進行一次計算,滿足條件則發單。
現在問題來了:
比如我想使用一個簡單的20高低點突破策略,我必須每過一分鐘掃描計算一次,這樣如果遇到網絡延時或者斷線后重連將沒有可靠保障。
我現在想的是能否利用“每一分鐘新數據進入觸發進行計算”,也就是說,只要有一分鐘的新數據收到(自動填入下一行),即觸發下一次計算,不知應該如何實現?

在其他論他請教過,得到如下回覆幫助:
1.“改用event driven,不要用迴圈”
2.“用一個vba工具就可以簡單處理_有變動才更新.快慢盤演算不會漏tick.”
3.“用迴圈的話整個excel 的events都會被凍住, 等到迴圈停止, 你如果試過應該就不會這樣問”
小弟還是不明白用什麽方式可以最優?請先輩們賜教。
PS:看到一種解決方案:
Worksheet_Change event, worksheet上有變化才執行動作, 像API tick 的cell 位置:
Private Sub Worksheet_Change(ByVal Target As Range)
'如果A1 cell資料有變動
If Target.Address = "$A$1" Then
'執行想做的事情
end if
但是小弟沒看懂。。。。是否能请大大们提示?
最后,先進們是如何實現這樣的觸發的?小弟VBA不熟練,能否請先進門在我上傳的資料上幫忙修改。
感恩~

[attach]18143[/attach]
作者: flyflyduck1    時間: 2014-4-24 21:27

http://itgroup.blueshop.com.tw/kenming/blog?n=convew&i=7699
看到这个帖子的内容,是利用setlinkondata写DDE變化event,正好符合我的要求,
但怎樣使用沒有看懂,請求大大們講解。。
作者: diabo    時間: 2014-4-24 21:35

小弟最近開始研究EXCEL的自動交易系統,使用touchance的DDE數據。
數據記錄方式:
,每一分鐘記錄依次計入 ...
flyflyduck1 發表於 2014-4-24 15:17
  1. Private Sub Worksheet_Calculate()
  2. ........
  3. .......
  4. End Sub
複製代碼

作者: flyflyduck1    時間: 2014-4-24 22:36

diabo 發表於 2014-4-24 21:35

請教什麽意思?用calculate事件是否需要用迴圈?
作者: flyflyduck1    時間: 2014-4-24 22:38

回復 3# diabo
请参考:
“這可是相當相當的麻煩了! 因為透過第一個程序內的參數 (Range Object),可以很方便地得知是哪一個 CELL 的資料變動,但第二個程式則否。 所以若要知道在某一個工作表是哪一個 CELL 的資料變動,就必須寫 FOR LOOP 迴圈,一個一個來判斷是哪一個 CELL 欄位的資料變動。 我幾乎看到許多寫判斷 Tick 資料變動的程式,都是以該事件程序 (Worksheet_Calculate) 來處理。 當然,欄位不多還 OK,但是若是像我這樣,一個工作表是撈約 100 檔的權值成份股、約有 500 ~ 800 個 DDE 欄位的話,那肯定效能會大出問題,連動當然會影響到 Tick 資料的正確性了。 整整爬文了一整個早上,總算才找到真正正確處理 DDE CELL 型態的事件程序了。 不應該使用 "WorkSheet_Calculate()"、而是採用 "SetLinkOnData()" 程序才是。”
不知道您的解决方案是否是这样呢?
作者: bobomi    時間: 2014-4-24 23:31

SetLinkOnData() 也不是好方法
作者: flyflyduck1    時間: 2014-4-25 09:47

回復 6# bobomi
請問好方法是什麽樣的呢?:'( :'( :'(
作者: flyflyduck1    時間: 2014-4-25 23:19

有沒有大神指點小弟一下啊?
等著用好著急啊。。。。
作者: GBKEE    時間: 2014-4-26 12:43

本帖最後由 GBKEE 於 2014-4-27 10:38 編輯

回復 8# flyflyduck1
一般的接收DEE的資料 時間,開盤價,最高價,最低價,收盤價,成交量,成交筆數
在固定的儲存格接收數值,使用者在1分鐘,或 5分鐘將資料導入指定的位置
可參考下面Sheet1模組程式 執行Ex()試試看
  1. Option Explicit '接收DEE的資料可使用 Worksheet_Calculate
  2. Private Sub Worksheet_Calculate()
  3.     Static DataLoad_Time As Single    'Static 關鍵字儲存變數
  4.     Static Ar()
  5.     'Static 陳述式  在程序層次中用來宣告變數並配置儲存空間。
  6.     '以 Static 陳述式宣告的變數,在程式執行期間,會一直保留內容

  7.     '這工作表: 假設Dee公式在[B2:I2],且他儲存格無公式存在
  8.     '意味任一個 Dee公式有變動會啟動這Calculate事件
  9.     If DataLoad_Time <> 0 And [b2] - DataLoad_Time > #12:00:59 AM# Then '在下一分鐘出現後
  10.         Range("B" & Rows.Count).End(xlUp).Offset(1).Resize(1, 8) = Ar '導入上一分鐘的資料
  11.         '可接下作你要的工作
  12.         '可接下作你要的工作
  13.     End If
  14.     Ar = [B2:I2].Value           '紀錄資料
  15.     DataLoad_Time = [b2]   '紀錄時間
  16. End Sub
  17. Sub Ex()  '這程序模擬Dee公式在Sheet2上的儲存格,進而觸發Worksheet_Calculate事件
  18.     Dim h, L
  19.     h = 50
  20.     L = 40
  21.     With Sheet2.[B2:I2]
  22.         .Cells(1) = Time                       '只有資料變動,才會觸發Worksheet_Calculate事件
  23.         .Cells(2) = Int((h - L + 1) * Rnd + L)  '50 - 40的亂數
  24.         .Cells(3) = Int((h - L + 1) * Rnd + L)
  25.         .Cells(4) = Int((h - L + 1) * Rnd + L)
  26.         .Cells(5) = Int((h - L + 1) * Rnd + L)
  27.         .Cells(6) = Int((h - L + 1) * Rnd + L)
  28.         .Cells(7) = Int((h - L + 1) * Rnd + L)
  29.         .Cells(8) = Int((h - L + 1) * Rnd + L)  '如變動8次就觸發8次的Worksheet_Calculate事件
  30.     End With
  31.     Application.OnTime Time + #12:01:00 AM#, "Sheet1.ex"
  32.     Debug.Print Time
  33. End Sub
複製代碼
[attach]18171[/attach]




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