COCO研究院

 找回密碼
 註冊
搜索
樓主: alexliou

[API] 群益API 2.13.5 C#實作

  [複製鏈接]
 樓主| 發表於 17-5-3 21:30 | 顯示全部樓層
ethanliang 發表於 17-5-3 19:31
樓主您好:
我已經把在Module 中定義的
   Public Type SKTICK     .......   End Type  刪除

Dim Tick As SKCOMLIB.SKTICK 這段程式碼應該是OK
或是宣告為 Dim Tick As SKTICK 也行

依現有資料    無法判斷 為何"VB6停止運作"
建議可以插入一些中斷點
看看問題是出在哪裡

發表於 17-5-3 22:12 | 顯示全部樓層
請教版主,如果要每天固定時間開始和結束交易,VBA有 Application.OnTime的方法可用, C#似乎没有,查詢網路的方法,一般是建議是以Timer,然後去算從現在到要開始交易需要多少時間,把它設為Timer.Interval,這樣好像有點麻煩,有没有簡單一點的函數可用?如果設Timer,會影響程式的效能嗎?需不需要設多執行緒,如Task?
 樓主| 發表於 17-5-4 07:39 | 顯示全部樓層
本帖最後由 alexliou 於 17-5-4 07:52 編輯
chang91348 發表於 17-5-3 22:12
請教版主,如果要每天固定時間開始和結束交易,VBA有 Application.OnTime的方法可用, C#似乎没有,查詢網路的 ...


Windows Form 裡的Timer,  沒有類似  Excel裡 的Application.OnTime 那麼簡潔的語法可用
你所提的方法 : 1.) 計算預定時間和目前時間的差異, 2.) 把Timer的Interval 設為時間差異
3.) 再把Timer.Tick事件的EventHandler 和預定要執行的工作 attatch 在一起
已經是很有效率地實現了Application.OnTime(雖然要多寫好幾行Code )
但要注意如果過了預定時間怎麼處理

這樣的一個Timer, 對 系統performance應該影響很小,  不需使用多執行緒
此外,  Windows Form裡的Timer, 要在另一個Thread 執行似乎有些限制

也有人會建議 直接利用Windows 的Task Scheduler來處理
發表於 17-5-4 21:42 | 顯示全部樓層
版主您好:
Dim Tick As SKCOMLIB.SKTICK ,VB6會停止運作而跳出VB6
或 Dim Tick As SKTICK ,VB6也會停止運作而跳出VB6,
嗯,我再蒐集其他方法試試,
感謝版主的指導與大力幫忙,
謝謝。
 樓主| 發表於 17-5-5 04:32 | 顯示全部樓層
ethanliang 發表於 17-5-4 21:42
版主您好:
Dim Tick As SKCOMLIB.SKTICK ,VB6會停止運作而跳出VB6
或 Dim Tick As SKTICK ,VB6也會停止 ...

問題可能不在那一行
這兩種寫法應該都可以
發表於 17-5-5 12:54 | 顯示全部樓層
謝謝版主回覆,Window 的Task schedular 可能不適合我的需求,看來只有多打幾行字了,另有一個問題請教,每次查詢報價都需自行輸入代碼,原本是直接在TextBox上的程式碼直接輸入代碼, 一開啓Page,就會顯示出來,可是期指會換月,如果程式編繹後,有什麼方法可以更改代碼再儲存,下次就不用重打,也不用重新編繹程式,謝謝
 樓主| 發表於 17-5-5 14:24 | 顯示全部樓層
chang91348 發表於 17-5-5 12:54
謝謝版主回覆,Window 的Task schedular 可能不適合我的需求,看來只有多打幾行字了,另有一個問題請教,每次查 ...

近月有通用碼 "TX00", 所以應該沒問題
遠月雖然沒有通用碼, 但它編碼有規則性
可以用今天的月份來判斷次月合約的代碼  是"TX"+"次月月份"
要準確的話 需要自行maintain 一個換倉日期表
但RequestStocks() 對帶入的股票代號不存在的處理是直接略過  不會產生錯誤
所以不準確也沒關係
比如說現在是四月  你可以request "TX04", "TX05", "TX06"
如果沒過換倉日  就會傳四月.五月, 六月合約的報價
如果過了換倉日  就只會傳五月及六月合約的報價
發表於 17-5-6 10:21 | 顯示全部樓層
版主您好,我把VB6的程式碼貼上來,
'** 在Module 的程式碼如下

Option Explicit
Public SKCenter As SKCenterLib
Public SKQuote As SKQuoteLib

'**  Login
Public Function Login(ByVal AcNo As String, ByVal Pwd As String) As Integer
   'Center 物件初始
  Dim nCode As Integer
  Set SKCenter = New SKCenterLib
      nCode = SKCenter.SKCenterLib_Login(AcNo, Pwd)
    Login = nCode
   If nCode = 0 Then
  Form1.Text4.Text = "群益帳號密碼登入 成功 ! "
    Else
Form1.Text4.Text = "群益帳號密碼登入 失敗 ! "
   End If
End Function

'*** 群益新版API_1060429 Onconnect
Sub SKQuoteEvents_OnConnection(ByVal nKind As Long, ByVal nCode As Long)
    On Error Resume Next
    Dim nCode As Long
    If nCode = 0 And nKind = 3003 Then
Form1.Text4.Text =  "群益報價伺服器登入成功 ! "
    Else
Form1.Text4.Text = "群益報價伺服器登入失敗 ! "
   End If
End Sub

'** 接收 Tick報價*** 群益
  Sub SKQuoteEvents_OnNotifyTicks(ByVal MarketNo As Integer, ByVal Index As Integer, ByVal Ptr As Long, ByVal Timehms As Long, ByVal Timemillismicros As Long, ByVal Bid As Long, ByVal Ask As Long, ByVal nClose As Long, ByVal Qty As Long, ByVal Simulate As Long)

    On Error Resume Next
    Dim nCode As Integer
     Form1.txtPtr.Text = Tick.Ptr
     Form1.txtTime.Text = Tick.Time
     Form1.txtBid.Text = Tick.Bid / 100
     Form1.txtAsk.Text = Tick.Ask / 100
     Form1.txtClose.Text = Tick.Close / 100
     Form1.txtQty.Text = Tick.Qty
End Sub

'**** 在 Form 的程式碼如下 ***
'物件類別模組 CenterObj
Public WithEvents SKCenterEvents As SKCenterLib
Public WithEvents SKQuoteEvents As SKQuoteLib

'群益手動登入帳密
Private Sub Command5_Click()
  Dim Rn As Integer
  Rn = Login("ID", "Password")
Text4.Text = Text4.Text + "Rn值為: " & Rn
End Sub

'群益 連線
Private Sub Command6_Click()
Dim nCode As Integer
Set SKQuote = New SKQuoteLib
nCode = SKQuote.SKQuoteLib_EnterMonitor()
If nCode = 0 Then
  Form1.Text4.Text = "群益報價連線  成功 ! "
Else
Form1.Text4.Text = "群益報價連線   失敗 ! "
End If
End Sub

'群益手動訂閱報價
Private Sub Command8_Click()
Dim nCode As Long
  nCode = SKQuote.SKQuoteLib_RequestTicks(-1, "TX05")   
If nCode = 0 Then
   Form1.Text4.Text = "群益訂閱報價 SKQuote.SKQuoteLib_RequestTick成功 ! "
  Else
  Form1.Text4.Text = "群益訂閱報價 SKQuote.SKQuoteLib_RequestTick失敗 ! "
  End If
End Sub

'群益 GetTick
Private Sub Command9_Click()
  On Error Resume Next
  Dim nCode As Integer
  Dim Tick As SKTICK
'  Dim Tick As SKCOMLIB.SKTICK
  Set SKQuote = New SKQuoteLib
  nCode = SKQuote.SKQuoteLib_GetTick(MarketNo, Index, Ptr, Tick)
  If nCode = 0 Then
    Form1.Text4.Text = "群益SKQuoteLib.SKQuoteLib_GetTick成功 ! "
    Else
   Form1.Text4.Text = "群益SKQuoteLib.SKQuoteLib_GetTick 失敗 ! "
   End If
End Sub

執行後,
Login、 EnterMonitor、RequestTick都成功
但是OnConnection與OnNotifyTicks都沒反應,
然後 GetTick是直接掛掉,

請版主幫幫忙,看看是哪邊出問題,謝謝。
 樓主| 發表於 17-5-6 16:29 | 顯示全部樓層
本帖最後由 alexliou 於 17-5-6 16:31 編輯
ethanliang 發表於 17-5-6 10:21
版主您好,我把VB6的程式碼貼上來,
'** 在Module 的程式碼如下
OnConnection與OnNotifyTicks都沒反應原因如下 :
1. 宣告 COM Event時  沒加 New, 更改下列兩行Code
    Public WithEvents SKCenterEvents As New SKCenterLib
    Public WithEvents SKQuoteEvents As New SKQuoteLib

2. Event Handler 和 Event 沒有hook在一起, 更改 Sub宣告
    Sub SKQuoteEvents_OnConnection(ByVal nKind As Long, ByVal nCode As Long) Handles SKQuoteEvents.OnConnection
Sub SKQuoteEvents_OnNotifyTicks(ByVal MarketNo As Integer, ByVal Index As Integer, ByVal Ptr As Long, ByVal Timehms As Long, ByVal Timemillismicros As Long, ByVal Bid As Long, ByVal Ask As Long, ByVal nClose As Long, ByVal Qty As Long, ByVal Simulate As Long) Handles SKQuoteEvents.OnNotifyTicks

3.  Sub SKQuoteEvents_OnConnection()中, 宣告了一個與Sub 參數同名的Local variable : nCode
把Dim nCode As Long 這行刪掉

此外, 由於新版的VS已不支援 Set 指令, 我建議把 所有的Set拿掉, 直接宣告
Dim SKCenter As SKCenterLib = New SKCenterLib()
Dim SKQuote As SKQuoteLib = New SKQuoteLib()

VB中要處理來自COM Component Event 的程序(就像目前這種狀況) 可參考
https://msdn.microsoft.com/en-us/library/ms973905.aspx
Handling Events from COM Sources  那段

GetTick是直接掛掉
原因應該是參數不正確(參數不正確有的狀況會出現Exception, 有的狀況會出現錯誤訊息)
我嘗試用  SKQuote.SKQuoteLib_GetTick(2, 0, 0, Tick)來 Call 是OK的
問題是 : 要使用到這個函數的情況是很少見的
甚麼時候 User已經知道某個Tick的Ptr 還需這個Tick 的資料呢?
如果他不知道某個Tick是否存在, 那為何要access 這個Ticks呢?
如果連StockIndex都不存在 , 就會發生程式掛掉的狀況

評分

參與人數 1金錢 +2 收起 理由
cukie + 2 很棒的文章,感恩

查看全部評分

發表於 17-5-7 12:03 | 顯示全部樓層
請問大大可以與你討論自製的看盤介面跟下單介面?
是否ˇ可以請教你
發表於 17-5-7 14:28 | 顯示全部樓層
版主您好:

謝謝您的指點,我再努力一下,

謝謝。
發表於 17-5-7 21:18 | 顯示全部樓層
謝謝版主指教,先把換倉日輸入好,也許是個好選擇,可是這麼一來,也失去了彈性,google了一下,好像可以以修改app.config的方法,達到我的目標,不過因為現在百廢待舉,這個東西可能要等一陣子再來測試,到時再向版主報告
 樓主| 發表於 17-5-8 09:34 | 顯示全部樓層
chang91348 發表於 17-5-7 21:18
謝謝版主指教,先把換倉日輸入好,也許是個好選擇,可是這麼一來,也失去了彈性,google了一下,好像可以以修改ap ...

如果可以忍受頻率很低的人工輸入
程式中有提供了自選股組合的設定
自選股清單ComboBox 旁邊有個設定按鈕  可讓User 設定自選股
每個月在換倉日後變更自選股組合
把舊的次月合約刪除  加入新的次月合約
這樣只要每個月變更一次即可

但我並未把次月合約加入可選擇清單內
User 需要先去修改Symbols.Txt
加入各個月份的期指合約

 樓主| 發表於 17-5-8 09:57 | 顯示全部樓層
stock1586 發表於 17-5-7 12:03
請問大大可以與你討論自製的看盤介面跟下單介面?
是否ˇ可以請教你

no problem, 請隨便問

回復 支持 1 反對 0

使用道具 舉報

發表於 17-5-8 23:20 | 顯示全部樓層
再來請教版大,之前想在OnNotifyTick內,接收二檔(道瓊指數和小道瓊期指),經過多設個按鈕,使用事件 +=, 已可達成,也可以取得二檔的sStockidx,可是要靠sStockidx來區分資料時,由於期指的Tick相當快,我要收錄道瓊指數去做運算時,nClose常常變成小道瓊指數的nClose,有什麼好辦法嗎?
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

手機版|Archiver|站長信箱|廣告洽詢|COCO研究院

GMT+8, 24-12-22 09:37

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回復 返回頂部 返回列表
理財討論網站 |