COCO研究院

 找回密碼
 註冊
搜索
查看: 47926|回復: 64

[API] 群益API 2.13.7 C#實作

  [複製鏈接]
發表於 17-9-28 18:51 | 顯示全部樓層 |閱讀模式
本帖最後由 alexliou 於 17-9-28 20:46 編輯

群益最近更新了API元件至 2.13.7版, 我也將原先的C#實作 更新到2.13.7版
擷取.PNG

與”2.13.5 C#實作” 相較, ”2.13.7 C#實作” 有以下一些主要不同的features :
  • “2.13.7 實作” 把下單與報價功能放在同一個表單裡,使用者不用在兩個畫面間切換,這符合一邊看報價一邊下單的習慣。這也使得自動登入啟動的邏輯變得清楚簡單
  • 增加了一分鐘K線圖,且可讓User選擇是否只顯示T盤資料或全盤資料
  • 表單右方增加了一個閃電下單介面(亦可下停損單)
  • 台指期五個掛牌契約的編碼分別是TX00(近月),TX0N(遠月), TX0X(近季), TX0Y(次季),TX0Z(遠季), 實際的契約月份程式會自行對照。換月時會自動更新契約月份,User亦可自行maintain設定檔中的近月月份參數,小台編碼比照大台。若要增加電子期與金融期,需修改LoadFutureContract() Method。
  • 停損單的下單、刪單、與回報均與限價單共用相同的介面。
  • 可交易商品加入股票和台指選擇權,但我沒有群益股票戶,股票下單功能未經測試,個股代碼與選擇權契約的輸入需User 自行Maintain文字檔
  • 原先表單右方顯示訊息的ListBox被移到下方,這些訊息對下單或看盤沒有效用,但學習了解API元件的反應也是本程式目的之一,所以仍保留這個ListBox

PreRequisite:
  • 使用者需安裝(註冊)群益 API 2.13.7 元件(64位元版),方可執行<bin\debug> folder內的執行檔,如何安裝該元件請參考”群益策略王COM元件使用說明”
  • 如需檢視或修改原始檔,建議使用Visual Studio 2017,因為我使用了一些C# 6.0的語法,用較早版本的VS將會出現一些文法錯誤,修改時要改為適用早期版本的指令

免責聲明:
附件所附程式碼係為學習程式設計而製作,使用該程式碼於交易時,因程式錯誤所導致之損失,本人概不負責

附件為附原始碼的Visual Studio Solution 壓縮檔

MyOrderMaster 2.13.7.zip

4.95 MB, 下載次數: 78

售價: 150 金錢  [記錄]

評分

參與人數 3金錢 +9 收起 理由
TrendRover + 5 感謝分享
cukie + 2 感謝分享
神乎其技 + 2 太強了

查看全部評分

 樓主| 發表於 17-9-29 05:11 | 顯示全部樓層
簡易程式Module說明如附件
簡易程式說明.zip (43.4 KB, 下載次數: 522)
回復 支持 1 反對 0

使用道具 舉報

 樓主| 發表於 17-9-29 15:46 | 顯示全部樓層
本帖最後由 alexliou 於 17-9-29 15:55 編輯

已download或要download的版友請在OnReceiveTicks() Method
if (nPtr >= firstSpecificLiveTick)
TicksGrid.RowCount = ticks.Count;
TicksGrid.FirstDisplayedScrollingRowIndex = TicksGrid.RowCount - 1;

和之後更新K線圖那段指令
if (ticks.Count > 1)
{
     int barTime = GetBarTime(nTimehms);
     if ((!TBarsOnlyCheckBox.Checked .......
     {
         UpdateChart(nPtr, nTimehms, nClose, nQty, nSimulate);
     }
}  


包起來(中間的指令不要包進來), 修改為
if (nPtr >= firstSpecificLiveTick)
{
     TicksGrid.RowCount = ticks.Count;
     TicksGrid.FirstDisplayedScrollingRowIndex = TicksGrid.RowCount - 1;

     if (ticks.Count > 1)
     {
          int barTime = GetBarTime(nTimehms);
          if ((!TBarsOnlyCheckBox.Checked && !(barTime >= 1446 && barTime <= 1500)) || (TBarsOnlyCheckBox.Checked && barTime >= session2BeginTime && barTime <= session2EndTime))
          {
               UpdateChart(nPtr, nTimehms, nClose, nQty, nSimulate);
          }
     }
}

修改過後
更換特定商品報價
就不會隨著時間經過 需要的時間就越久了

另外還請將 DOMComboBox_SelectedIndexChanged() Method  中最後一段
if (code != 0)
  {
        UpdateDOMWithBest5(best5);
        pdateDOMWithTick((int)(ticks[0].TickPrice * specificDenom), ticks[0].TickQty, ticks[0].TickSimulate);
  }

修改為

if (code == 0)
  {
        UpdateDOMWithBest5(best5);
        UpdateDOMWithTick((int)(ticks[ticks.Count-1].TickPrice * specificDenom), ticks[ticks.Count-1].TickQty, ticks[ticks.Count-1].TickSimulate);
  }





 樓主| 發表於 17-10-2 00:20 | 顯示全部樓層
更新版來了(加入前述修訂、簡化補缺分部分code、格式美化、處理不儲存帳密情況)
在此之前已下載原始版本者  如下載更新版
我會把原先之150 CoCo refund 給您
MyOrderMaster 2.13.7.zip (1.11 MB, 下載次數: 53, 售價: 150 金錢)

ps. 這版可能還有個清盤的動作需要處理
但未來即使要更新
會用文字說明來附加

評分

參與人數 2金錢 +4 收起 理由
takashi888 + 2 太強了
cukie + 2 按一個讚

查看全部評分

 樓主| 發表於 17-10-10 07:02 | 顯示全部樓層
alexliou 發表於 17-10-2 00:20
更新版來了(加入前述修訂、簡化補缺分部分code、格式美化、處理不儲存帳密情況)
在此之前已下載原始版本者  ...

下載更新版者
請在變數宣告區
將  List<Position> openPositions = new List<Position>();
修正為
BindingList<Position> openPositions = new BindingList<Position>();

評分

參與人數 2金錢 +4 收起 理由
solo + 2 感謝分享
cukie + 2 感謝分享

查看全部評分

 樓主| 發表於 17-10-11 13:03 | 顯示全部樓層
本帖最後由 alexliou 於 17-10-11 13:17 編輯

今天發現一個程式會爆掉的狀況
當成交回報時卻找不到原先的委託資料時
會出null reference error

理論上這種有成交回報卻沒有委託回報的狀況不應該發生
但今早我發現有一筆在T+1盤(10/6)下單且成交的Order
在回報回補時
只回補了成交資料卻沒有回補下單的資料
不曉得 這種情形所有T+1盤的交易回報都會發生
還是因為長假的關係

最簡單的Remedy 是在 OnReceiveReplyData()的委託成交部分
加入一個 null check, 直接忽視這種少了委託回報的成交資料

if (order == null) return;
 樓主| 發表於 17-10-13 10:18 | 顯示全部樓層
alexliou 發表於 17-10-11 13:03
今天發現一個程式會爆掉的狀況
當成交回報時卻找不到原先的委託資料時
會出null reference error

確定所有 T+1盤的成交
在T盤回報回補時,都不會有委託資訊, 只有成交資訊
(群益自己的策略王也是相同狀況,它會顯示成交資訊,但委託價與委託量都付之闕如)

除了上述情形之外,  群益 API 2.13.7 還有以下兩個小bug:
1. RequestStocks()即使以相同頁碼要求(新的)股票報價, 原先的股票報價並不會取消, 還會繼續傳.
即使explicitly用頁碼50取消, 仍然無法取消, 這與說明書的描述不同

2. 回傳的股價報價資訊, 並沒有辦法區分是否為試撮.  SKSTOCK物件 的nSimulate 屬性均為0.
(但SKTICK 物件的nSimulate 設定是正確的)



 樓主| 發表於 17-10-13 19:25 | 顯示全部樓層
程式還有一個會出錯的地方 : 取消停損單(單子會取消, 但委託簿卻沒有反應最新的狀況)
這是因為停損單取消成功後,  程式會立即向主機查詢最新停損單狀態
但因為時間間隔太短, 主機還在處理停損單的狀態, 所以回復一個 QUERY_IN_PRPCESSING的錯誤訊息,
導致程式無法更新停損單狀態.
Remedy是 在取消停損單後, 讓執行緒暫停個一小段時間(say 1.5秒鐘, 時間長點比較保險)再去更新停損狀態

最簡單的修改是在 CancelOrder() Method 加入以下紅字修正:
    .    .
    .
else if (orderType == "停損單")
            {
                code = SKOrder.CancelFutureStopLoss(User.ID, false, User.FutureAccount, seqNo, "STP", out string message);
                WriteMessage("Order", "CancelFutueStopLoss", code);
                if (code == 0)
                {
                   Thread.Sleep(1500);
                    UpdateStopOrders();                  
                }            
            }

老實說, 讓執行緒pending 個一秒半 , 對一個分秒必爭 的 Trader 而言, 並不是個太理想的辦法

另外兩個做法是:
1. 設定一個Timer, 使得要求更新停損單(UpdateStopOrder)的Call在取消停損單後一段時間再執行
2.解析傳回的錯誤訊息, 如果內容包刮"取消" 及委託書號, 則解讀為停損刪單成功
這兩個做法, 程式要怎麼修改, 就留給客倌您自己了


 樓主| 發表於 17-10-20 18:14 | 顯示全部樓層
jepaty 發表於 17-10-20 16:08
bstrData 那時候的值是  "M003 NO DATA"

果然跟我猜的一樣
沒有Position
因為我 always有部位
所以這種case我沒測到
請增加 if statement的 測試條件
將  if (elements[0] != "##")
修改為
if (elements[0] != "##" && elements.Length >= 3)

if (elements[0] != "##" && bstrData != "M003 NO DATA")
 樓主| 發表於 17-10-25 08:27 | 顯示全部樓層
程式碼修正
=========================================
請將 OnReceiveStopLossReport() Method 中的
  OrderStatus = status == "5" ? "尚未觸發" : "全部取消",
修改為
  OrderStatus = status == "8" ? "全部取消" : "尚未觸發",

回復 支持 1 反對 0

使用道具 舉報

發表於 17-10-12 16:03 | 顯示全部樓層
感謝大大分享 可惜金錢不足 不知道可否有另外付費方式購買此程式呢?
回復 支持 2 反對 0

使用道具 舉報

 樓主| 發表於 17-10-13 10:20 | 顯示全部樓層
jepaty 發表於 17-10-12 16:03
感謝大大分享 可惜金錢不足 不知道可否有另外付費方式購買此程式呢?

只能等是否有善心人士願意轉CoCo幣給你了
回復 支持 1 反對 0

使用道具 舉報

發表於 17-9-28 18:55 | 顯示全部樓層
OMG 太強了   
 樓主| 發表於 17-9-28 21:10 | 顯示全部樓層
表單中央K線圖最近這一分鐘的KBar
要等到下一根KBar開始時 才會正確呈現
為了不影響報價接收的效率
並未implement成即時更新
發表於 17-9-28 22:27 | 顯示全部樓層
感謝版大的分享。
發表於 17-9-29 09:27 | 顯示全部樓層
好厲害!!先收藏下來
剛好想研究,版大就分享了,謝謝
 樓主| 發表於 17-9-30 12:32 | 顯示全部樓層
kuolung 發表於 17-9-30 11:32
請問確定,帳密正確,也一直出現"帳密無法連線" 請問如何處理

在設定帳號時
請先按儲存在離開
(這應該算是我沒考慮周全的地方, 也許會有人不想儲存帳密, 不儲存時應該也可以用已輸入的帳密登入才對)
發表於 17-10-2 16:45 | 顯示全部樓層
感謝分享,可惜金錢不夠,無法一窺其中奧妙....><
發表於 17-10-6 14:47 | 顯示全部樓層
你好,請問一下不知道您曉不曉得在OnNotifyBest5的參數有"延伸一檔賣價"是有甚麼作用在呢? 因為我發覺有時候這會有帶數值進來,但大部分時候是0,所以想請教您一下知不知道這延伸一擋有何作用?謝謝
 樓主| 發表於 17-10-6 15:09 | 顯示全部樓層
simoncc 發表於 17-10-6 14:47
你好,請問一下不知道您曉不曉得在OnNotifyBest5的參數有"延伸一檔賣價"是有甚麼作用在呢? 因為我發覺有時候 ...

不知道 有甚麼作用
發表於 17-10-6 18:13 | 顯示全部樓層
會寫程式真好…
發表於 17-10-6 22:29 | 顯示全部樓層
simoncc 發表於 17-10-6 14:47
你好,請問一下不知道您曉不曉得在OnNotifyBest5的參數有"延伸一檔賣價"是有甚麼作用在呢? 因為我發覺有時候 ...

我記得好像是價差交易用的
很久以前念書念過
還老輸了
發表於 17-10-7 17:05 來自手機 | 顯示全部樓層
股票也會有價差交易狀況發生的時候嗎?這……研究看看
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

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

GMT+8, 24-4-20 09:07

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回復 返回頂部 返回列表
理財討論網站 | AI繪圖AI超擬真美女AI beauty AI Stable DiffusionAI正妹AI Lookbook