SmartQi586
發表於 17-7-16 10:03
下載後解壓縮 不能用
alexliou
發表於 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 元件
SmartQi586
發表於 17-7-16 12:07
alexliou 發表於 17-7-16 10:30
要"能用"您必須先要
1. 下載 群益 API 2.13.5 (不過現在群益官網 只能下載 API 2.13.6, 不適合本程式使 ...
請問有 LINE ?想請教你。。
請問有嘗試寫 分 k 棒 ?
alexliou
發表於 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
alexliou
發表於 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
alexliou
發表於 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多)
chang91348
發表於 17-7-23 23:16
又來請教版主了,不好意思,因為我是要下單海期,海期下單物件中有個"委託價分子","觸發價分子",不曉得是什麼?另外,因為所有單,都要巿價進出,不過好像群益API都要強迫輸入委託價和委託價分子,有什麼好方法?謝謝
alexliou
發表於 17-7-24 13:22
chang91348 發表於 17-7-23 23:16
又來請教版主了,不好意思,因為我是要下單海期,海期下單物件中有個"委託價分子","觸發價分子",不曉得是什麼? ...
海期下單 我沒用過
但看起來像是要配合分數型報價(如100 3/32)商品而設計的
如果是小數型商品只要填入委託價及觸發價就可, 分子填0
如果是分數型商品 委託價和觸發價填入整數(100), 分子填3
chang91348
發表於 17-7-24 22:48
謝謝版大回覆,請教版主有下台指期貨巿價單嗎?看說明書,在委託價輸入M,就是巿價單,可是看程式碼 :
double dPrice = 0.0;
if (double.TryParse(txtPrice.Text.Trim(), out dPrice) == false)
{
MessageBox.Show("委託價請輸入數字");
return;
}
輸入M,應該是不行的,應該要輸入數字才會過關吧,不好意思,目前還在程式建構階段,還没有實際入金去測試.
alexliou
發表於 17-7-25 12:15
chang91348 發表於 17-7-24 22:48
謝謝版大回覆,請教版主有下台指期貨巿價單嗎?看說明書,在委託價輸入M,就是巿價單,可是看程式碼 :
...
我也沒用過市價單( 除非是StopOrder)
但我判斷 API本身是可接受以"M"來代表市價的
只是程式這樣寫就排除了這個option
chang91348
發表於 17-7-26 09:59
謝謝版主,再請教版主是否有下期貨單?FUTUREORDER內的每個項目都要填嗎?像 bstrTrigger 和 bstrMovingPoint 這二個移動停損才需要用到的項目,一般下單時,是不管它?還是輸入 0 或 "" ?因為海期有MKT(巿價單)的選項,也許選了MKT,就不用輸入委託價,故想請教一般國內期貨下單時,上述二個項目是如何填寫的,謝謝
alexliou
發表於 17-7-26 11:15
chang91348 發表於 17-7-26 09:59
謝謝版主,再請教版主是否有下期貨單?FUTUREORDER內的每個項目都要填嗎?像 bstrTrigger 和 bstrMovingPoint...
空白或不填都可以
chang91348
發表於 17-7-26 18:17
謝謝版主回覆,另外上次有向版主請教,每次換月後,期指年月代碼更動的問題,原本版主是建議,將每月換倉日建檔,時間到自動會轉換,因為覺得缺少彈性,經 Google後,發現使用Usersettings 可在程式執行時,再更改設定,同時也可存檔,一併與版主分享,謝謝
chang91348
發表於 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?
不好意思,問題有點長,謝謝
alexliou
發表於 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區分下單和報價)
頁:
1
2
3
4
[5]
6
7
8
9
10
11
12