COCO研究院

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

[API] 群益API 2.13.5 C#實作

  [複製鏈接]
發表於 17-7-16 10:03 | 顯示全部樓層
下載後解壓縮 不能用
 樓主| 發表於 17-7-16 10:30 | 顯示全部樓層
SmartQi586 發表於 17-7-16 10:03
下載後解壓縮 不能用

要"能用"您必須先要  
1. 下載 群益 API 2.13.5 (不過現在群益官網 只能下載 API 2.13.6, 不適合本程式使用)
2. 按照下載檔案中的"策略王COM元件使用說明" 2.1 <元件註冊>所描述的步驟
註冊  SKCOM.dll x64 元件

發表於 17-7-16 12:07 | 顯示全部樓層
alexliou 發表於 17-7-16 10:30
要"能用"您必須先要  
1. 下載 群益 API 2.13.5 (不過現在群益官網 只能下載 API 2.13.6, 不適合本程式使 ...

請問有 LINE ?想請教你。。
請問有嘗試寫 分 k 棒 ?

 樓主| 發表於 17-7-16 15:52 | 顯示全部樓層
SmartQi586 發表於 17-7-16 12:07
請問有 LINE ?想請教你。。
請問有嘗試寫 分 k 棒 ?

1. 群益API 2.13.5 C#實作內並未包括由Tick 轉分K這部份的Code

2. 如果要從Tick 轉分K, 批次處理的話, 使用 Linq 最快, 其語句如下:
var bars = from tick in ticks
                let timeStamp = CompositeBarTime(tick.tickTime)               
                group tick by timeStamp into tickGroup
                orderby tickGroup.Key
                let barPrices = tickGroup.Select(t => t.TickPrice)
                select new KBar()
                {                  
                    TimeStamp = tickGroup.Key,
                    Open = barPrices.First(),
                    Close = barPrices.Last(),
                    High = barPrices.Max(),
                    Low = barPrices.Min(),
                    Volume = tickGroup.Sum(t => t.TickQty)
                };


bars 是個 IEnumerable<KBar>, ticks 是按時間排序的 IEnumerable<Tick>  (可加入 orederby clause 確保它經過排序)
KBar 是自訂的class 或 struct, 其結構為 {TimeStamp, Open, High, Low, Close, Volumn}
Tick 是自訂的class 或 struct, 其結構為 {tickTime, tickPrice, tickQty}
CompositeBarTime() 是一個決定如何歸分的 method, 你在此寫入你如何Tick時間轉換為K棒時間的邏輯

3. 但上述語法不會產生K棒期間內無交易的K棒, 如果你要產生連續分K 的K棒
還要判斷是否有缺分, 如有缺分,  則Insert 一根開高收低都等於上根分K收盤價, 但成交量為0的KBar

評分

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

查看全部評分

 樓主| 發表於 17-7-16 16:11 | 顯示全部樓層
alexliou 發表於 17-7-16 15:52
1. 群益API 2.13.5 C#實作內並未包括由Tick 轉分K這部份的Code

2. 如果要從Tick 轉分K, 批次處理的話,  ...

如果是 Realtime的tick 轉分K, 批次處理可能無法完全適用
可以依照下列的步驟 來將tick轉分K
1. 判斷是否是目前K棒內的分K
2. 如果是
    a) 判斷是否為該K棒內的最低或最高價,如果是, 將kBar.High/Low做相應變更
    b) kBar.Close = tick.tickPrice
    c) kBar.Volume = kBar.Volume + tick.tickQty
3. 如果不是
    a) 新起一根kBar
    b) kBar.Time = CompositeBarTime(tick.tickTime)
    c) kBar.Open/High/Low/Close = tick.tickPrice
    d) kBar.Volume  = tick.tickQty


 樓主| 發表於 17-7-16 18:20 | 顯示全部樓層
本帖最後由 alexliou 於 17-7-16 18:57 編輯
alexliou 發表於 17-7-13 23:29
3. 對我而言, 群益新版API (2.13.6)最大的問題可能在於它傳資料的速度, 尤其是回補Historical Ticks, 速度和舊版可達百倍,

我錯了, 兩個版本的傳輸速度差異未達百倍, 只有50倍
根據我昨日(7/15)下午的測試:
2.13.5 (無T+1盤資料, 所以OnNotifyHistoricalTicks 只會收到 7/14上午盤資料)
TX 共有 25563筆 Historical Ticks, 大約1.95秒收完

2.13.6(ˋ7/14 上午盤算前一個交易日, 所以OnNotifyHistoricalTicks 只會收到 T+1盤資料)
TX 共有 4590筆 Historical Ticks, 大約10.6秒收完

影響傳輸速度的有兩個因子:
1)每次接收時間的間隔: 新舊版都一樣, 大約是15毫秒
我不知道這個時間是否會因PC的等級或網路的快慢而有所改變
抑或ˊ這個時間就是主機端每次發送資料的間隔

2)每次接收 能收的Tick數
2.13.5 通常一次接收300-310個Tick (速度很穩定)
2.13.6 通常一次接收6-7個Tick (剛開始很快,大約100個Tick,但很快就衰敗到6-7個)
兩者差了50倍
但如果是在上午盤收盤後, T+1盤開盤前做測試
2.13.6 Historical Tisks 會從前一日的15:00的Tick開始起算, 要傳的Ticks更多
所以我原先會有速度差異達百倍的錯覺

審視群益的COM元件使用說明, 負責報價的solace主機,
在2.13.6版中多了一些workload, 可能因此而減少了每次發送資料的size
但這樣的傳輸速度絕對不足以應付上午盤的需求
如果非HistoricalTick也是這這種速度(這我還沒測試,但我猜結果接近), 快市一定會lag得很厲害(其間還有Best5的資料要收, Best5變動頻率比Tick高, 內容也比Tick多)



發表於 17-7-23 23:16 | 顯示全部樓層
又來請教版主了,不好意思,因為我是要下單海期,海期下單物件中有個"委託價分子","觸發價分子",不曉得是什麼?另外,因為所有單,都要巿價進出,不過好像群益API都要強迫輸入委託價和委託價分子,有什麼好方法?謝謝
 樓主| 發表於 17-7-24 13:22 | 顯示全部樓層
chang91348 發表於 17-7-23 23:16
又來請教版主了,不好意思,因為我是要下單海期,海期下單物件中有個"委託價分子","觸發價分子",不曉得是什麼? ...

海期下單 我沒用過
但看起來像是要配合分數型報價(如100 3/32)商品而設計的
如果是小數型商品  只要填入委託價及觸發價就可, 分子填0
如果是分數型商品 委託價和觸發價填入整數(100), 分子填3
發表於 17-7-24 22:48 | 顯示全部樓層
謝謝版大回覆,請教版主有下台指期貨巿價單嗎?看說明書,在委託價輸入M,就是巿價單,可是看程式碼 :  
            double dPrice = 0.0;
            if (double.TryParse(txtPrice.Text.Trim(), out dPrice) == false)
            {
                MessageBox.Show("委託價請輸入數字");
                return;
            }

輸入M,應該是不行的,應該要輸入數字才會過關吧,不好意思,目前還在程式建構階段,還没有實際入金去測試.
 樓主| 發表於 17-7-25 12:15 | 顯示全部樓層
chang91348 發表於 17-7-24 22:48
謝謝版大回覆,請教版主有下台指期貨巿價單嗎?看說明書,在委託價輸入M,就是巿價單,可是看程式碼 :  
        ...

我也沒用過市價單( 除非是StopOrder)
但我判斷 API本身是可接受以"M"來代表市價的
只是程式這樣寫就排除了這個option
發表於 17-7-26 09:59 | 顯示全部樓層
謝謝版主,再請教版主是否有下期貨單?FUTUREORDER內的每個項目都要填嗎?像 bstrTrigger 和 bstrMovingPoint 這二個移動停損才需要用到的項目,一般下單時,是不管它?還是輸入 0 或 "" ?因為海期有MKT(巿價單)的選項,也許選了MKT,就不用輸入委託價,故想請教一般國內期貨下單時,上述二個項目是如何填寫的,謝謝
 樓主| 發表於 17-7-26 11:15 | 顯示全部樓層
chang91348 發表於 17-7-26 09:59
謝謝版主,再請教版主是否有下期貨單?FUTUREORDER內的每個項目都要填嗎?像 bstrTrigger 和 bstrMovingPoint  ...

空白或不填都可以

發表於 17-7-26 18:17 | 顯示全部樓層
謝謝版主回覆,另外上次有向版主請教,每次換月後,期指年月代碼更動的問題,原本版主是建議,將每月換倉日建檔,時間到自動會轉換,因為覺得缺少彈性,經 Google後,發現使用Usersettings 可在程式執行時,再更改設定,同時也可存檔,一併與版主分享,謝謝
發表於 17-8-2 18:36 | 顯示全部樓層
本帖最後由 chang91348 於 17-8-2 18:39 編輯

        又來麻煩版主了,不好意思,因為學C#才幾個月的時間,對於物件導向訊息傳遞還不太清楚,我先說明我對於群益API的認知,首先Form1 內建TabControl1 (內有skOrder1,skReply1,skQuote1, skosQuot1,skooQuote1五個Page),而下單(skOrder)頁內又內建五個單頁面包括(overseaFutureOrderControl 1).
        我是操作海期,從下單程式嗎看來,是在overseaFutureOrderControl1 中,利用下列程式碼
            if (OnOverseaFutureOrderSignal != null)
            {
                OnOverseaFutureOrderSignal(m_UserID, true, pOSOrder);
            }

送出委託單,而在skOrder1內偵測到此一事件,引發下列程式碼
        private void overseaFutureOrderControl1_OnOverseaFutureOrderSignal(string strLogInID, bool bAsyncOrder, OVERSEAFUTUREORDER pStock)
        {
            string strMessage = "";
            m_nCode = m_pSKOrder.SendOverseaFutureOrder(strLogInID, bAsyncOrder, pStock, out strMessage);

            WriteMessage("海期委託:" + strMessage);
            SendReturnMessage("Order", m_nCode, "SendOverseaFutureOrder");
        }

   我的問題是,我是在skosQuote1內的 OnNotifyTick搜集資訊,達到下單條件,再送訊息下單,這時有二個問題,1。我可以直接用 m_pSKOrder.SendOverseaFutureOrder(strLogInID, bAsyncOrder, pStock, out strMessage) 這個程式下單,而不用經由 OverseaFutureOrderControl1下單嗎?  2。應該是我還不清楚物件導向,從skosQuote1 如何把下單物件傳到 overseaFutureOrderControl 1 或 skOrder1?

  不好意思,問題有點長,謝謝
 樓主| 發表於 17-8-4 09:50 | 顯示全部樓層
chang91348 發表於 17-8-2 18:36
又來麻煩版主了,不好意思,因為學C#才幾個月的時間,對於物件導向訊息傳遞還不太清楚,我先說明我對於 ...

在群益API範例的架構下, 下單和報價是兩件獨立的工作
所以它把下單(Order)與報價(Quote)區分為不同的UserControl(也是不同的Class), 且彼此是平行的關係
你在Quote中無法調用Order的方法(不過應該可以從Quote 中引發事件 通知Form1, 再由Form1 取用Order的方法)

如果想從Quote中直接下單, 就得打破這架構, 在Quote Class 中直接Create SKOrderLib 物件
由這個物件負責下單
(打破原有架構後, 也許Quote Class也沒有了, 直接是Form1, 因為可能已不再用User Control區分下單和報價)

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

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

GMT+8, 24-11-20 15:19

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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