群益API 2.13.7 C#實作
本帖最後由 alexliou 於 17-9-28 20:46 編輯群益最近更新了API元件至 2.13.7版, 我也將原先的C#實作 更新到2.13.7版
與”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 壓縮檔
簡易程式Module說明如附件
本帖最後由 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);
}
更新版來了(加入前述修訂、簡化補缺分部分code、格式美化、處理不儲存帳密情況)
在此之前已下載原始版本者如下載更新版
我會把原先之150 CoCo refund 給您
ps. 這版可能還有個清盤的動作需要處理
但未來即使要更新
會用文字說明來附加
alexliou 發表於 17-10-2 00:20
更新版來了(加入前述修訂、簡化補缺分部分code、格式美化、處理不儲存帳密情況)
在此之前已下載原始版本者...
下載更新版者
請在變數宣告區
將List<Position> openPositions = new List<Position>();
修正為
BindingList<Position> openPositions = new BindingList<Position>();
本帖最後由 alexliou 於 17-10-11 13:17 編輯
今天發現一個程式會爆掉的狀況
當成交回報時卻找不到原先的委託資料時
會出null reference error
理論上這種有成交回報卻沒有委託回報的狀況不應該發生
但今早我發現有一筆在T+1盤(10/6)下單且成交的Order
在回報回補時
只回補了成交資料卻沒有回補下單的資料
不曉得 這種情形所有T+1盤的交易回報都會發生
還是因為長假的關係
最簡單的Remedy 是在 OnReceiveReplyData()的委託成交部分
加入一個 null check, 直接忽視這種少了委託回報的成交資料
if (order == null) return; 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 設定是正確的)
程式還有一個會出錯的地方 : 取消停損單(單子會取消, 但委託簿卻沒有反應最新的狀況)
這是因為停損單取消成功後,程式會立即向主機查詢最新停損單狀態
但因為時間間隔太短, 主機還在處理停損單的狀態, 所以回復一個 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.解析傳回的錯誤訊息, 如果內容包刮"取消" 及委託書號, 則解讀為停損刪單成功
這兩個做法, 程式要怎麼修改, 就留給客倌您自己了
jepaty 發表於 17-10-20 16:08
bstrData 那時候的值是"M003 NO DATA"
果然跟我猜的一樣
沒有Position
因為我 always有部位
所以這種case我沒測到
請增加 if statement的 測試條件
將if (elements != "##")
修改為
if (elements != "##" && elements.Length >= 3)
或
if (elements != "##" && bstrData != "M003 NO DATA")
程式碼修正
=========================================
請將 OnReceiveStopLossReport() Method 中的
OrderStatus = status == "5" ? "尚未觸發" : "全部取消",
修改為
OrderStatus = status == "8" ? "全部取消" : "尚未觸發",
感謝大大分享 可惜金錢不足 不知道可否有另外付費方式購買此程式呢? jepaty 發表於 17-10-12 16:03
感謝大大分享 可惜金錢不足 不知道可否有另外付費方式購買此程式呢?
只能等是否有善心人士願意轉CoCo幣給你了
OMG 太強了{:11_746:} 表單中央K線圖最近這一分鐘的KBar
要等到下一根KBar開始時 才會正確呈現
為了不影響報價接收的效率
並未implement成即時更新
感謝版大的分享。 好厲害!!先收藏下來
剛好想研究,版大就分享了,謝謝 kuolung 發表於 17-9-30 11:32
請問確定,帳密正確,也一直出現"帳密無法連線" 請問如何處理
在設定帳號時
請先按儲存在離開
(這應該算是我沒考慮周全的地方, 也許會有人不想儲存帳密, 不儲存時應該也可以用已輸入的帳密登入才對)
感謝分享,可惜金錢不夠,無法一窺其中奧妙....>< 你好,請問一下不知道您曉不曉得在OnNotifyBest5的參數有"延伸一檔賣價"是有甚麼作用在呢? 因為我發覺有時候這會有帶數值進來,但大部分時候是0,所以想請教您一下知不知道這延伸一擋有何作用?謝謝 simoncc 發表於 17-10-6 14:47
你好,請問一下不知道您曉不曉得在OnNotifyBest5的參數有"延伸一檔賣價"是有甚麼作用在呢? 因為我發覺有時候 ...
不知道 有甚麼作用
會寫程式真好…{:4_155:} simoncc 發表於 17-10-6 14:47
你好,請問一下不知道您曉不曉得在OnNotifyBest5的參數有"延伸一檔賣價"是有甚麼作用在呢? 因為我發覺有時候 ...
我記得好像是價差交易用的
很久以前念書念過
還老輸了
股票也會有價差交易狀況發生的時候嗎?這……研究看看