meimeichen
發表於 12-1-20 19:13
本帖最後由 meimeichen 於 12-1-20 07:28 PM 編輯
如果 DDE 一直無法設定成功 請下載這個檔案
試試看 怎樣才能 引用 DDE的資料
meimeichen
發表於 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 轉發)
meimeichen
發表於 12-1-21 12:00
本帖最後由 meimeichen 於 12-1-21 12:03 PM 編輯
如果您真的搞不定 請下載 這個還算安全的遠端 連線軟體
現在 MC內就有附加這一套軟體 叫做 QuickHelp.exe 提供遠端協助的服務
我直接 從遠端協助比較快啦
http://im88.tw/?p=2971 TeamView
下載完成後
執行後 把 準備上線時間ID 跟 密碼 密我我從遠端 登入 處理 這樣比較快{:7_420:}
READ5623
發表於 12-1-26 22:14
謝謝大大的分享 {:4_82:}
meimeichen
發表於 12-2-12 17:46
本帖最後由 meimeichen 於 12-2-12 06:49 PM 編輯
xDdeSvr 萬用版的原始碼,這是原來的程式碼
在這邊貼出來給有心自己實作 DDESVR朋友參考
請注意 DDE資料送出的方式採逐筆送出,跟所有說明的方式不一樣呦
記得先取得 Microsoft C# Express 2008 以上的 開發軟體 呦
您也可以搭配自己使用的 API 改寫成 專用的版本{:7_420:}
meimeichen
發表於 12-2-12 18:10
本帖最後由 meimeichen 於 12-2-12 06:23 PM 編輯
這是 搭配 群益 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 == Stock.m_nTQty) return; else qttl = 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 {:7_484:} 。
kilroy
發表於 12-2-12 18:26
會寫程式真好 {:5_260:}
meimeichen
發表於 12-2-12 18:30
/*
以下是群益API 在C# 當中開發所需要的重要參考資料
有了它您就可以自己開發使用群益API的版本
不在受到 DLL 引用困擾了
*/
Thread TickReceive;
// 0.初始使用者相關資訊
extern static int SKQuoteLib_Initialize( String lpszLoginID, String lpszPassword);
// 1.0.向報價函式庫註冊接收連線狀態的 Call back 函式位址
delegate void FOnNotifyConnection(Int32 nKind, Int32 nCode);
static FOnNotifyConnection Delegate_AttachConnection = new FOnNotifyConnection(CBFunc_AttachConnection);
extern static int SKQuoteLib_AttachConnectionCallBack(FOnNotifyConnection Delegate_AttachConnection);
// 1.1.當有索取的個股報價異動時,將透過此註冊的函式通知應用程式處理
delegate void FOnNotifyQuote(Int16 sMarketNo, Int16 sStockidx);
static FOnNotifyQuote Delegate_AttachQuote = new FOnNotifyQuote(CBFunc_AttachQuote);
extern static int SKQuoteLib_AttachQuoteCallBack(FOnNotifyQuote Delegate_AttachQuote);
// 1.2.當有索取的個股成交明細有所異動,即透過向此註冊的 Call back 函式進行處理
delegate void FOnNotifyTicks(Int16 sMarketNo, Int16 sStockidx, Int32 nPtr);
static FOnNotifyTicks Delegate_AttachTicks = new FOnNotifyTicks(CBFunc_AttachTicks);
extern static int SKQuoteLib_AttachTicksCallBack(FOnNotifyTicks Delegate_AttachTicks);
// 2.建立與報價伺服器的連線
extern static int SKQuoteLib_EnterMonitor();
// 3.根據股票代號取得報價資訊
extern static int SKQuoteLib_GetStockByNo(String lpszStockNo, ref TStock pStock);
// 4.要求傳送成交明細以及五檔
extern static int SKQuoteLib_RequestStocks(ref Int16 psPageNo, String pStockNo);
extern static int SKQuoteLib_RequestTicks(ref Int16 psPageNo, String pStockNo);
// 5.取得成交明細資訊
extern static int SKQuoteLib_GetTick(Int16 sMarketNo, Int16 sStockidx, Int32 nPtr, ref TTick pTick);
extern static int SKQuoteLib_GetStockByIndex(Int16 sMarketNo, Int16 sStockidx, ref TStock pStock);
// END.中斷與報價伺服器的連線
extern static int SKQuoteLib_LeaveMonitor();
static string[] tick = new string;
static int [] qttl = new int ;
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;
// 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興櫃
public String m_caStockNo; // 股票代號
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; // 跌停價
}
// TTick
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; // 成交量
}
/*
* ref Variable
*/
// PageNo
static short PageNo = -1;
// TStock
public static TStock Stock = new TStock();
// Tick
public static TTick Tick = new TTick();
meimeichen
發表於 12-2-14 08:56
終於搞定 群益的 API拿到比較可以接受的 Tick 資料
原來.....
stupidkuei
發表於 12-2-14 11:00
感謝分享
寫如此詳盡的資料讓大家學習
Android
發表於 12-2-14 16:51
本帖最後由 Android 於 12-2-14 04:58 PM 編輯
回復 24# meimeichen
可以向妳請教用 Delphi 寫 DDE Server嗎(沒寫過DDE的程式)?
或是有Demo程式可以參考,我只會寫 Delphi 有段時間沒寫了,
看了群益API有Delphi的Demo程式是用Delphi開發的
想試試看,謝謝。
meimeichen
發表於 12-2-15 15:38
軟體開發時 選擇 x86 或是 x64的畫面
sangi
發表於 12-2-15 16:22
回復 24# meimeichen
meimei 大,群益特用版輸入使用者密碼的欄位,可以用 *遮蔽字元嗎?
不然在辦公室打密碼時,都要回頭 看背後有沒有人 Orz..
meimeichen
發表於 12-2-16 11:27
目前還沒有設定 廣播的功能
增加一個 簡易報價的選項,
建立緩衝區方式處理收到的資料 降低 CPU 衝擊
勾選之後 DDE廣播只提供 Price,Volume,Ask,Bid 資料
登入密碼採密碼字元 請小心輸入 免得還要打電話解鎖
這個版本在 斷線之後 會自動重新連線
點選 TickRecord 資料頁裏頭的 API Info Log 可以監看 收到的資料
sangi
發表於 12-2-16 13:36
感謝meimei 大...
功能越來越完整了