COCO研究院

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

xDdeSvr 操作使用說明 (請勿在此回應)

  [複製鏈接]
 樓主| 發表於 12-1-20 19:13 | 顯示全部樓層
本帖最後由 meimeichen 於 12-1-20 07:28 PM 編輯

如果 DDE 一直無法設定成功 請下載這個檔案  


試試看 怎樣才能 引用 DDE的資料
1.png
2.png
DDETest.rar (42.18 KB, 下載次數: 824)
 樓主| 發表於 12-1-21 09:14 | 顯示全部樓層
如果  如果 您的券商DDE 真的很搞怪  在 Excel 可以正常運作 卻遲遲無法引入 xDdeSvr 您可以考慮
退而求其次 轉向讀取 Excel 的DDE資料(Ticks 會少一些,但是量價應該跟市場差異不會太大)

券商資料傳遞到Excel 有三種可行方式
1. Advise -> Peak 這是一般的做法 XDdeSvr 可以直接 從券商軟體讀取資料
2. 有人愛用 Poke 的方式來處理 把 Excel 當作 DDESvr 寫回 Excel (這時候只能 從 Excel 轉發)
3. 直接 呼叫 EXCEL 寫入 儲存格 (這時候只能 從 Excel 轉發)
 樓主| 發表於 12-1-21 12:00 | 顯示全部樓層
本帖最後由 meimeichen 於 12-1-21 12:03 PM 編輯

如果您真的搞不定 請下載 這個還算安全的遠端 連線軟體
現在 MC  內就有附加這一套軟體 叫做 QuickHelp.exe 提供遠端協助的服務
我直接 從遠端協助比較快啦
http://im88.tw/?p=2971   TeamView

下載完成後
執行後 把 準備上線時間  ID 跟 密碼    密我  我從遠端 登入 處理 這樣比較快
發表於 12-1-26 22:14 | 顯示全部樓層
謝謝大大的分享     
 樓主| 發表於 12-2-12 17:46 | 顯示全部樓層
本帖最後由 meimeichen 於 12-2-12 06:49 PM 編輯

xDDESvr萬用版 C# Project.rar (167.17 KB, 下載次數: 372, 售價: 1 金錢)

xDdeSvr 萬用版的原始碼,這是原來的程式碼


在這邊貼出來給有心自己實作 DDESVR朋友參考

請注意 DDE資料送出的方式採逐筆送出,跟所有說明的方式不一樣呦


記得先取得 Microsoft C# Express 2008 以上的 開發軟體 呦

您也可以搭配自己使用的 API 改寫成 專用的版本

評分

參與人數 3金錢 +8 收起 理由
learner + 1 太強了
altubers + 2 感謝無私的分享
kilroy + 5 大大真是太佛心了~

查看全部評分

 樓主| 發表於 12-2-12 18:10 | 顯示全部樓層
本帖最後由 meimeichen 於 12-2-12 06:23 PM 編輯

群益特用板.rar (271.92 KB, 下載次數: 561)

這是 搭配 群益 API 所做的版本

效率很差, 還有待解決 API的問題
用了 三個版本的 delphi  都沒有辦法讓他正常運作 只好 用 C#來處理

他的DLL 不支援 64 位元 而我一直都用 64位元環境 只好用 studio 2010 C# 來改寫

接收到的資料 以RequestQuote 來說
public static void AttachQuote(short sMarketNo, short sStockidx)
        {           
int status = SKQuoteLib_GetStockByIndex(sMarketNo, sStockidx, ref Stock);
            if (qttl[sStockidx] == Stock.m_nTQty) return; else qttl[sStockidx] = Stock.m_nTQty;

收到的資料精確度有很大的落差,我猜是因為期交所送出來時間關係,沒有經過整理就送給API,結果同一個Total Vol 會有很多個  Tick 資料但是 加起來不一定會相等

用Tick 的方式來處理 問題更大 Tick 少了跟筋 永遠摸不清到底是 哪個資料來的,還得呼叫  GetStockByIndex 來取得 資料
結果 這樣又等於是 呼叫   AttachQuote 沒兩樣 只有拖累 Cpu 的份

   public static void AttachTicks(short sMarketNo, short sStockidx, Int32 nPtr)
        {
            
            /*
            public Int32 m_nPtr; // 資料所在的位置(Key)
            public Int32 m_nTime; // 時間
            public Int32 m_nBid; // 買價
            public Int32 m_nAsk; // 賣價
            public Int32 m_nClose; // 成交價
            public Int32 m_nQty; // 成交量
             */
            int status = SKQuoteLib_GetStockByIndex(sMarketNo, sStockidx, ref Stock);
            status += SKQuoteLib_GetTick(sMarketNo,sStockidx,nPtr, ref Tick);      

***************
也許等我找到用 m_nPtr 可以分辨出到底是 哪一個 Item 的時候 可以得到想要的 資料來
XD  參考開發文件 這個  m_nPtr 好像 系統自己決定的數字,不會每次都一樣  真是 高竿的 API

評分

參與人數 2金錢 +7 收起 理由
lwhuang + 2 群益現在有64-bit的了
kilroy + 5 版大人真是太好了!

查看全部評分

發表於 12-2-12 18:26 | 顯示全部樓層
會寫程式真好
 樓主| 發表於 12-2-12 18:30 | 顯示全部樓層
/*
以下是群益API 在C# 當中開發所需要的重要參考資料  
有了它您就可以自己開發使用群益API的版本
不在受到 DLL 引用困擾了
*/

Thread TickReceive;        

        // 0.初始使用者相關資訊
        [DllImport("SKQuoteLib.dll", CallingConvention = CallingConvention.StdCall)]
        extern static int SKQuoteLib_Initialize([MarshalAs(UnmanagedType.LPStr)] String lpszLoginID, [MarshalAs(UnmanagedType.LPStr)] String lpszPassword);

        // 1.0.向報價函式庫註冊接收連線狀態的 Call back 函式位址
        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        delegate void FOnNotifyConnection(Int32 nKind, Int32 nCode);
        static FOnNotifyConnection Delegate_AttachConnection = new FOnNotifyConnection(CBFunc_AttachConnection);

        [DllImport("SKQuoteLib.dll", CallingConvention = CallingConvention.StdCall)]
        extern static int SKQuoteLib_AttachConnectionCallBack(FOnNotifyConnection Delegate_AttachConnection);

        // 1.1.當有索取的個股報價異動時,將透過此註冊的函式通知應用程式處理
        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        delegate void FOnNotifyQuote(Int16 sMarketNo, Int16 sStockidx);
        static FOnNotifyQuote Delegate_AttachQuote = new FOnNotifyQuote(CBFunc_AttachQuote);

        [DllImport("SKQuoteLib.dll", CallingConvention = CallingConvention.StdCall)]

        extern static int SKQuoteLib_AttachQuoteCallBack(FOnNotifyQuote Delegate_AttachQuote);
        
        // 1.2.當有索取的個股成交明細有所異動,即透過向此註冊的 Call back 函式進行處理
        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        delegate void FOnNotifyTicks(Int16 sMarketNo, Int16 sStockidx, Int32 nPtr);
        static FOnNotifyTicks Delegate_AttachTicks = new FOnNotifyTicks(CBFunc_AttachTicks);

      
        [DllImport("SKQuoteLib.dll", CallingConvention = CallingConvention.StdCall)]
        extern static int SKQuoteLib_AttachTicksCallBack(FOnNotifyTicks Delegate_AttachTicks);
        


        // 2.建立與報價伺服器的連線
        [DllImport("SKQuoteLib.dll", CallingConvention = CallingConvention.StdCall)]

        extern static int SKQuoteLib_EnterMonitor();

        // 3.根據股票代號取得報價資訊
        [DllImport("SKQuoteLib.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]

        extern static int SKQuoteLib_GetStockByNo(String lpszStockNo, ref TStock pStock);



        // 4.要求傳送成交明細以及五檔

        [DllImport("SKQuoteLib.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
        extern static int SKQuoteLib_RequestStocks(ref Int16 psPageNo, String pStockNo);


        [DllImport("SKQuoteLib.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]

        extern static int SKQuoteLib_RequestTicks(ref Int16 psPageNo, String pStockNo);

        // 5.取得成交明細資訊
        [DllImport("SKQuoteLib.dll", CallingConvention = CallingConvention.StdCall)]
        extern static int SKQuoteLib_GetTick(Int16 sMarketNo, Int16 sStockidx, Int32 nPtr, ref TTick pTick);

        [DllImport("SKQuoteLib.dll", CallingConvention = CallingConvention.StdCall)]
        extern static int SKQuoteLib_GetStockByIndex(Int16 sMarketNo, Int16 sStockidx, ref TStock pStock);


        // END.中斷與報價伺服器的連線
        [DllImport("SKQuoteLib.dll", CallingConvention = CallingConvention.StdCall)]

        extern static int SKQuoteLib_LeaveMonitor();   
        static string[] tick = new string[256];
        static int [] qttl = new int [50];
        static bool APIConnectStatus = false;
        static bool KeepTickInfo = false;
        static bool LastAPIStatus = true;
        static bool APIRequestStatus = false;
        static int dataPtr = 0;
        static int ProcPtr = 0;      

      
        static int SK_SUBJECT_CONNECTION_CONNECTED = 100;
        // static int SK_SUBJECT_CONNECTION_DISCONNECT = 101;

        [StructLayout(LayoutKind.Sequential)]
        // [struct] TStock
        public struct TStock
        {
            public Int16 m_sStockidx;    // 系統自行定義的股票代碼
            public Int16 m_sDecimal;    // 報價小數位數
            public Int16 m_sTypeNo;    // 類股分類
            public byte m_cMarketNo;    // 市場代號0x00上市;0x01上櫃;0x02期貨;0x03選擇權;0x04興櫃
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
            public String m_caStockNo;    // 股票代號
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
            public String m_caName;     // 股票名稱
            public Int32 m_nOpen;     // 開盤價
            public Int32 m_nHigh;     // 最高價
            public Int32 m_nLow;     // 最低價
            public Int32 m_nClose;     // 成交價
            public Int32 m_nTickQty;    // 單量
            public Int32 m_nRef;     // 昨收、參考價
            public Int32 m_nBid;     // 買價
            public Int32 m_nBc;     // 買量
            public Int32 m_nAsk;     // 賣價
            public Int32 m_nAc;      // 賣量
            public Int32 m_nTBc;     // 買盤量
            public Int32 m_nTAc;     // 賣盤量
            public Int32 m_nFutureOI;    // 期貨未平倉 OI
            public Int32 m_nTQty;     // 總量
            public Int32 m_nYQty;     // 昨量
            public Int32 m_nUp;      // 漲停價
            public Int32 m_nDown;     // 跌停價
        }

        // [struct] TTick
        [StructLayout(LayoutKind.Sequential)]
        public struct TTick
        {
            public Int32 m_nPtr; // 資料所在的位置(Key)
            public Int32 m_nTime; // 時間
            public Int32 m_nBid; // 買價
            public Int32 m_nAsk; // 賣價
            public Int32 m_nClose; // 成交價
            public Int32 m_nQty; // 成交量
        }


        /*
        * [In,Out] ref Variable
        */

        // PageNo
        static short PageNo = -1;

        // TStock
        public static TStock Stock = new TStock();

        // Tick
        public static TTick Tick = new TTick();
 樓主| 發表於 12-2-14 08:56 | 顯示全部樓層
群益特用板.rar (272.88 KB, 下載次數: 706)
終於搞定 群益的 API  拿到比較可以接受的 Tick 資料
原來.....

評分

參與人數 1金錢 +5 收起 理由
kilroy + 5 會寫程式真好~~

查看全部評分

發表於 12-2-14 11:00 | 顯示全部樓層
感謝分享
寫如此詳盡的資料讓大家學習
發表於 12-2-14 16:51 | 顯示全部樓層
本帖最後由 Android 於 12-2-14 04:58 PM 編輯

回復 24# meimeichen


   可以向妳請教用 Delphi 寫 DDE Server嗎(沒寫過DDE的程式)?
或是有Demo程式可以參考,我只會寫 Delphi 有段時間沒寫了,
看了群益API有Delphi的Demo程式是用Delphi開發的
想試試看,謝謝。
 樓主| 發表於 12-2-15 15:38 | 顯示全部樓層
軟體開發時 選擇 x86 或是 x64的畫面
2.png
1.png
發表於 12-2-15 16:22 | 顯示全部樓層
回復 24# meimeichen

meimei 大,群益特用版  輸入使用者密碼的欄位,可以用 *  遮蔽字元嗎?

不然在辦公室打密碼時,都要回頭 看背後有沒有人 Orz..
 樓主| 發表於 12-2-16 11:27 | 顯示全部樓層
目前還沒有設定 廣播的功能

增加一個 簡易報價的選項,
建立緩衝區方式處理收到的資料 降低 CPU 衝擊
勾選之後 DDE廣播只提供 Price,Volume,Ask,Bid 資料
登入密碼採密碼字元 請小心輸入 免得還要打電話解鎖

這個版本在 斷線之後 會自動重新連線


點選 TickRecord 資料頁裏頭的 API Info Log 可以監看 收到的資料
群益特用板.rar (272.42 KB, 下載次數: 706)
發表於 12-2-16 13:36 | 顯示全部樓層
感謝meimei 大...

功能越來越完整了
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

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

GMT+8, 24-12-23 00:31

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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