COCO研究院

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

[API] 群益API 2.13.5 C#實作

  [複製鏈接]
發表於 18-4-15 20:23 | 顯示全部樓層
感謝Alex大的提點

報價已經可以顯示在datagridview上了,但是目前遇到無法下單成功的狀況,我是參考群益的excel 範例及C#的範例-StockOrderControl.cs的寫法而去修改的,程式碼如下,可否請Alex大大在幫忙看一下哪裡有錯,再次感謝!!

    Private Sub skO_OnAccount(bstrLogInID As String, bstrAccountData As String) Handles skO.OnAccount

        Dim strValues As String()
        Dim strAccount As String
        strValues = bstrAccountData.Split(","c)
        strAccount = bstrLogInID & " " & strValues(1) & strValues(3)
        If strValues(0) = "TS" Then
            boxStockAccount.Items.Add(strAccount)
        End If

    End Sub

    Private Function SendStockOrder(ByVal bAsyncOrder As Boolean)

        Dim strInfo As String = boxStockAccount.Text
        Dim strValues As String()

        strValues = strInfo.Split(" "c)
        UserAccount = strValues(1)
        lbxR.Items.Add(strValues(1))

        Dim strStockNo As String
        Dim nPrime As Integer
        Dim nBidAsk As Integer
        Dim nPeriod As Integer
        Dim nFlag As Integer
        Dim strPrice As String
        Dim nQty As Integer

        strStockNo = txtStockNo.Text.Trim()
        nBidAsk = boxBidAsk.SelectedIndex
        nFlag = boxFlag.SelectedIndex
        strPrice = txtPrice.Text.Trim()
        nQty = txtQty.Text
        nPrime = 0
        nPeriod = 0


        Dim pOrder As SKCOMLib.STOCKORDER = New SKCOMLib.STOCKORDER()

        pOrder.bstrFullAccount = UserAccount
        pOrder.bstrStockNo = strStockNo
        pOrder.sBuySell = CShort(nBidAsk)
        pOrder.sFlag = CShort(nFlag)
        pOrder.sPrime = nPrime
        pOrder.sPeriod = nPeriod
        pOrder.bstrPrice = strPrice
        pOrder.nQty = nQty

    End Function

    Private Sub btnSendStockOrderAsync_Click(sender As Object, e As EventArgs) Handles btnSendStockOrderAsync.Click

        SendStockOrder(True)

    End Sub
回復 支持 1 反對 0

使用道具 舉報

 樓主| 發表於 18-4-15 21:27 | 顯示全部樓層
lawlu 發表於 18-4-15 20:23
感謝Alex大的提點

報價已經可以顯示在datagridview上了,但是目前遇到無法下單成功的狀況,我是參考群益的 ...

Function SendStockOrder 中
只看到把Order的基本資料準備好
並沒有看到真正send 出的動作

發表於 18-4-15 22:30 | 顯示全部樓層
謝謝Alex大的回覆,在Function SendStockOrder 結束,END FUNCTION後面有皆一副程式btnSendStockOrderAsync_Click下單的動作如下圖顯示
0415.jpg
 樓主| 發表於 18-4-15 23:05 | 顯示全部樓層
lawlu 發表於 18-4-15 22:30
謝謝Alex大的回覆,在Function SendStockOrder 結束,END FUNCTION後面有皆一副程式btnSendStockOrderAsync ...

按下button 後執行 SendStockOrder
但SendStockOrder中 無實際執行API下單的指令
發表於 18-4-18 14:42 | 顯示全部樓層
謝謝Alex大的回覆與指導

這次遇到的問題是在我的datagridview屬性已經設定資料靠右對齊,但是當執行
DataGridView_CellPainting事件時,整個資料又全部靠左對齊了,想請教Alex大大,這樣該如何修改才好呢?

謝謝您!
 樓主| 發表於 18-4-18 18:20 | 顯示全部樓層
lawlu 發表於 18-4-18 14:42
謝謝Alex大的回覆與指導

這次遇到的問題是在我的datagridview屬性已經設定資料靠右對齊,但是當執行

我猜測是因為cellpainting event 中
e.Graphics.DrawString
描繪文字時, 是用 graphics 的設定,
而不理會 datagridview 中cell 的文字對齊設定
建議擬改用 cellFormatting event 來顯示 datagridview 中儲存格的文字

如果非要用cellpainting 的話
可能要用到有 StringFormat 參數 的 DrawString overload
並設定 StringFormat 的 Alignment property
https://msdn.microsoft.com/en-us ... rawing.stringformat(v=vs.110).aspx

但這方法我也沒試過
發表於 18-4-22 13:49 | 顯示全部樓層
本帖最後由 lawlu 於 18-4-22 13:53 編輯

謝謝Alex大大不吝說明

現在有另一個問題想請教Alex大大如下說明:
我想將開盤後的第一分K棒的高低點(右表listbox上的資料,是取自onNotifyKLineData),更新到資料表上,但是底下的程式碼好像無法做到


    Private Sub skQ_OnNotifyQuote(sMarketNo As Short, sStockIdx As Short) Handles skQ.OnNotifyQuote

        skQ.SKQuoteLib_GetStockByIndex(sMarketNo, sStockIdx, pSKStock)
        OnUpDateDataRow(pSKStock)

    End Sub

    Private Sub skQ_OnNotifyKLineData(bstrStockNo As String, bstrData As String) Handles skQ.OnNotifyKLineData

        Dim strStockNo As String = bstrStockNo
        Dim dtFind As DataRow = m_dtStocks.Rows.Find(strStockNo)

        Dim strValues As String()
        Dim strKLine_H As String
        Dim strKLine_L As String


        strValues = bstrData.Split(","c)
        strKLine_H = strValues(2)
        strKLine_L = strValues(3)

        If strValues(0) = "2018/04/20" & " " & "09:01" Then

            listKLine.Items.Add(strStockNo)
            listKLine.Items.Add(strKLine_H)
            listKLine.Items.Add(strKLine_L)

            If dtFind Is Nothing Then
                Try
                    Dim myDataRow As DataRow = m_dtStocks.NewRow()

                    myDataRow("m_caStockNo") = pSKStock.bstrStockNo
                    myDataRow("m_nHigh_1K") = 0
                    myDataRow("m_nLow_1K") = 0

                    m_dtStocks.Rows.Add(myDataRow)

                Catch ex As Exception

                    Dim msg As String = ex.Message

                End Try

            Else
                dtFind("m_caStockNo") = pSKStock.bstrStockNo
                dtFind("m_nHigh_1K") = 46
                dtFind("m_nLow_1K") = 45.2

            End If

        End If

    End Sub
2337.jpg
 樓主| 發表於 18-4-22 17:59 | 顯示全部樓層
本帖最後由 alexliou 於 18-4-22 18:03 編輯
lawlu 發表於 18-4-22 13:49
謝謝Alex大大不吝說明

現在有另一個問題想請教Alex大大如下說明:

邏輯看起來OK

但VB語法我不熟

如不能work,  我直覺判斷是Update Datagridview row 的那段程式碼有問題
在C#, cell index 是用[] 框起來
網上查詢到的 VB update row 語法為 :
myDataRow.Cells("m_caStockNo").Value =
不曉得 .Value 是否可省略?

另外, 我猜   assign 常數只是為了debug 方便

不然, 設個Break Point,  Debug Step by Step 應該可以找出問題出在哪
發表於 18-4-23 13:23 | 顯示全部樓層
OnNotifyKLineData取得的是歷史資料,盤中不會有資料的,要盤後才更新.....盤中要資料,要從tick裡面自己去取得並計算...
發表於 18-5-2 10:44 | 顯示全部樓層
       感謝Alex大大及Clif大的解惑

關於這個第一根1分K棒價格的取得,小弟想破頭後採用了底下的程式碼,但今天開盤後測試發現,價格並非是第一根K棒產生後的固定值,而是隨著最高,及最低價的變動而跳動的,想請問怎麼修改才能正確取得,  謝謝大家
1525228043962.jpg
程式碼.jpg
 樓主| 發表於 18-5-4 11:45 | 顯示全部樓層
lawlu 發表於 18-5-2 10:44
感謝Alex大大及Clif大的解惑

關於這個第一根1分K棒價格的取得,小弟想破頭後採用了底下的程式碼, ...

應該不需要用到Timer

既然你的PortfolioQuoteTable中的資料會在skQ_OnNotifyQuote 內的 OnUpDateDataRow  更新
你可以在 OnUpDateDataRow 內
0. 判斷傳入的資料是哪一支股票的
1. check 時間是否在 9:01 這根Bar 的範圍內
2. 如果成交價格比 nHigh_1K 高, 則更新nHigh_1K價格
3. 如果成交價格比 nLow_1K低, 則取代 nLow_1K價格

要注意如何設定nHigh_1K, 與nLow_1K的初始值

這個方法的問題是, 如果你在9:00 後才啟動程式(或中途斷線), OnNotifyQuote 就收不到9:01的Quote 資料
發表於 18-5-4 20:30 | 顯示全部樓層
     感謝Alex大的回覆與建議

看起來要取得第一分K棒高低點的程式可能有點複雜及困難度,小弟要再多努力加強寫程式碼的能力了

再次感謝Alex大不吝指導
發表於 18-5-8 22:35 | 顯示全部樓層
Alex大大您好:      

關於取得第一分K棒高低點的程式,小弟暫以底下的程式碼來跑,同樣也是有一個缺點就是,如果早上09:01分之後才啟動程式,則無法取得第一分K棒的高低點

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

        lblTime.Text = Now

        Dim dnow As String = DateTime.Now.ToString("HH:mm:ss")
        Dim Stocks As String() = txtStocks.Text.Trim().Split(New Char() {","c})

        Select Case dnow

            Case "09:01:00"           
         
                For Each s As String In Stocks

                    Dim StockNo As String = s.Trim()
                    Dim rowFind As DataRow = portfolioQuoteTable.Rows.Find(StockNo)

                    rowFind("nHigh_1K") = rowFind("nHigh")
                    rowFind("nLow_1K") = rowFind("nLow")

                Next

            Case "09:05:00"

                For Each s As String In Stocks

                    Dim StockNo As String = s.Trim()
                    Dim rowFind As DataRow = portfolioQuoteTable.Rows.Find(StockNo)

                    rowFind("nHigh_5K") = rowFind("nHigh")
                    rowFind("nLow_5K") = rowFind("nLow")

                Next

        End Select

    End Sub



群益.jpg
發表於 18-5-8 23:08 | 顯示全部樓層
       Alex大大

       另外這幾天早上測試時,發現一個問題,就是您程式的單量顏色,有時候會有幾筆單量與嘉實資訊的單量顏色不同,我猜可能是因為您程式的判斷依據是根據報價中的買價,賣價,成交價與即時Tick事件的其他三個資料產生一些差異的關係而造成的;因此我就想說是否可能在報價表中,改用即時Tick事件的成交明細(也就是說show出買進,賣出,成交,單量,由內盤成交判斷單量為綠色,或外盤成交單量判斷為紅色,中間的顯示白色),但是寫出程式後,卻發現每一檔個股的即時Tick資料雖會更新,但有更新的資料又會將還沒更新的其他個股Tick資料覆蓋過去,可否幫忙看一下問題出在哪裡嗎?

謝謝您,感恩!


        Dim sPage As Short
        Dim intPage As Integer = -1

        If Short.TryParse(txtPageNo.Text, sPage) = False Then Return

        Dim Stocks As String() = txtStocks.Text.Trim().Split(New Char() {","c})

        For Each s As String In Stocks

            Dim nCode As Integer = skQ.SKQuoteLib_GetStockByNo(s.Trim(), pSKStock)
            Dim mCode As Integer = skQ.SKQuoteLib_RequestTicks(intPage, s.Trim())

            If nCode = 0 AndAlso mCode = 0 Then

                OnUpDateDataRow(pSKStock, pSKTick)

            End If

            intPage = intPage + 1

        Next

        skQ.SKQuoteLib_RequestStocks(sPage, txtStocks.Text.Trim())
        skQ.SKQuoteLib_RequestTicks(intPage, txtStocks.Text.Trim())
        txtPageNo.Text = sPage.ToString()

    End Sub

    Private Sub skQ_OnNotifyQuote(sMarketNo As Short, sStockIdx As Short) Handles skQ.OnNotifyQuote

        skQ.SKQuoteLib_GetStockByIndex(sMarketNo, sStockIdx, pSKStock)
        OnUpDateDataRow(pSKStock, pSKTick)

    End Sub

    Private Sub skQ_OnNotifyTicks(sMarketNo As Short, sIndex As Short, nPtr As Integer, nTimehms As Integer, nTimemillismicros As Integer, nBid As Integer, nAsk As Integer, nClose As Integer, nQty As Integer, nSimulate As Integer) Handles skQ.OnNotifyTicks

        skQ.SKQuoteLib_GetTick(sMarketNo, sIndex, nPtr, pSKTick)

    End Sub

    Private Sub OnUpDateDataRow(ByVal pStock As SKCOMLib.SKSTOCK, ByVal pTick As SKCOMLib.SKTICK)
        Dim strStockNo As String = pStock.bstrStockNo
        Dim drFind As DataRow = portfolioQuoteTable.Rows.Find(strStockNo)

        If drFind Is Nothing Then
            Try
                Dim myDataRow As DataRow = portfolioQuoteTable.NewRow()

                myDataRow("sStockidx") = pStock.sStockIdx
                myDataRow("sDecimal") = pStock.sDecimal
                myDataRow("sTypeNo") = pStock.sTypeNo
                myDataRow("cMarketNo") = pStock.bstrMarketNo
                myDataRow("caStockNo") = pStock.bstrStockNo
                myDataRow("caName") = pStock.bstrStockName
                myDataRow("nTickQty") = pStock.nTickQty
                myDataRow("nCloseOpen") = (pStock.nClose - pSKStock.nOpen) / (Math.Pow(10, pStock.sDecimal))
                myDataRow("nUpDown") = (pStock.nClose - pStock.nRef) / (Math.Pow(10, pStock.sDecimal))

                myDataRow("nBid") = pStock.nBid / (Math.Pow(10, pStock.sDecimal))
                myDataRow("nAsk") = pStock.nAsk / (Math.Pow(10, pStock.sDecimal))
                myDataRow("nClose") = pStock.nClose / (Math.Pow(10, pStock.sDecimal))
                myDataRow("nOpen") = pStock.nOpen / (Math.Pow(10, pStock.sDecimal))
                myDataRow("nHigh") = pStock.nHigh / (Math.Pow(10, pStock.sDecimal))
                myDataRow("nLow") = pStock.nLow / (Math.Pow(10, pStock.sDecimal))
                myDataRow("nRef") = pStock.nRef / (Math.Pow(10, pStock.sDecimal))

                myDataRow("nHigh_1K") = 0
                myDataRow("nLow_1K") = 0
                myDataRow("Long1") = 0
                myDataRow("Short1") = 0
                myDataRow("LongShort1") = 0

                myDataRow("nHigh_5K") = 0
                myDataRow("nLow_5K") = 0
                myDataRow("Long5") = 0
                myDataRow("Short5") = 0
                myDataRow("LongShort5") = 0

                myDataRow("nLastClose") = myDataRow("nClose")
                myDataRow("nLastBid") = myDataRow("nBid")
                myDataRow("nLastAsk") = myDataRow("nAsk")

                myDataRow("nPtr") = pTick.nPtr
                myDataRow("nTimehms") = pTick.nTimehms

                m_nSimulateStock = pStock.nSimulate
                portfolioQuoteTable.Rows.Add(myDataRow)

            Catch ex As Exception

                Dim msg As String = ex.Message

            End Try

        Else

            drFind("nLastClose") = drFind("nClose")
            drFind("nLastBid") = drFind("nBid")
            drFind("nLastAsk") = drFind("nAsk")

            'drFind("sStockidx") = pStock.sStockIdx
            'drFind("sDecimal") = pStock.sDecimal
            'drFind("sTypeNo") = pStock.sTypeNo
            'drFind("cMarketNo") = pStock.bstrMarketNo
            'drFind("caStockNo") = pStock.bstrStockNo
            'drFind("caName") = pStock.bstrStockName

            drFind("nTickQty") = pStock.nTickQty
            drFind("nCloseOpen") = (pStock.nClose - pSKStock.nOpen) / (Math.Pow(10, pStock.sDecimal))
            drFind("nUpDown") = (pStock.nClose - pStock.nRef) / (Math.Pow(10, pStock.sDecimal))

            drFind("nBid") = pStock.nBid / (Math.Pow(10, pStock.sDecimal))
            drFind("nAsk") = pStock.nAsk / (Math.Pow(10, pStock.sDecimal))
            drFind("nClose") = pStock.nClose / (Math.Pow(10, pStock.sDecimal))
            drFind("nOpen") = pStock.nOpen / (Math.Pow(10, pStock.sDecimal))
            drFind("nHigh") = pStock.nHigh / (Math.Pow(10, pStock.sDecimal))
            drFind("nLow") = pStock.nLow / (Math.Pow(10, pStock.sDecimal))
            drFind("nRef") = pStock.nRef / (Math.Pow(10, pStock.sDecimal))

            drFind("nPtr") = pTick.nPtr
            drFind("nTimehms") = pTick.nTimehms

            m_nSimulateStock = pStock.nSimulate

        End If
    End Sub

大大.jpg
大大-1.jpg
發表於 18-5-8 23:15 | 顯示全部樓層
     Alex大大您好

出現不同的nPtr位址的資料如下兩圖
群益-1.jpg
群益-2.jpg
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

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

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

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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