C++

使用說明

C API wrapper: spdOrderAPI.h/.cpp and spdQuoteAPI.h/.cpp

32位元版本的 megaSpeedyAPI.dll 跟 64位元版本的 megaSpeedyAPI_64.dll 提供的都是 C 語言的程式介面,為簡化 C 語言程式介面繁瑣的使用程序 請使用壓縮檔解開後 cpp 目錄下的 spdOrderAPI.cpp/.h (for 交易) 跟 spdQuoteAPI.cpp/.h (for 行情)來加速程式的開發。以下將針對 spdOrderAPI 跟 spdQuoteAPI 的使用加以說明。

交易 API

步驟1, 新增一個 class。假設 class 名稱是 testSpdOrderCPPAPI,類別宣告檔為 testSpdOrderCPPAPI.h 、類別實作檔為 testSpdOrderCPPAPI.cpp
步驟2, 在 testSpdOrderCPPAPI.h 加上 #include spdOrderAPI.h
#pragma
#include "spdOrderAPI.h"
步驟3, 修改 testSpdOrderCPPAPI.h 讓 testSpdOrderCPPAPI 繼承 spdOrderAPI
class testSpdOrderAPI : public spdOrderAPI
步驟4, 修改 testSpdOrderCPPAPI.h 讓 testSpdOrderCPPAPI override 繼承 spdOrderAPI 的 virtual function
class testSpdOrderAPI : public spdOrderAPI
{
  protected:
      void OnSpeedyConnected() override;
      void OnSpeedyDisconnected() override;
      void OnSpeedyLogonResponse(bool isLoginOK, const char* ReplyMsg) override;
      void OnNewOrderReport(long long nid, const char* UDD, const char* Symbol, double Price, const char* Side, long OrderQty, const char* OrderType, const char* TimeinForce, const char* OrderID) override;
      void OnCancelOrderReport(long long nid, const char* UDD, const char* Symbol, double Price, const char* Side, const char* OrderID) override;
      void OnReplaceOrderReport(long long nid, const char* UDD, const char* Symbol, double Price, const char* Side, long OrderQty, const char* OrderType, const char* TimeinForce, const char* OrderID) override;
      void OnOrderRejectedReport(long long nid, const char* UDD, const char* ActionFrom, const char* ErrCode, const char* ErrMsg) override;
      void OnOrderMatchReport(long long nid, const char* UDD, const char* OrderID, long ReportSeq, double MatchPrice, long MatchQty, const char* MatchTime) override;
};
步驟5, 修改 testSpdOrderCPPAPI.cpp 加上步驟 4 繼承的 member function
void testSpdOrderAPI::OnSpeedyConnected()
{
    // 在這裡處理交易主機連線成功的事件
}
  
void testSpdOrderAPI::OnSpeedyDisconnected()
{
    // 在這裡處理交易主機連線斷線的事件
}
  
void testSpdOrderAPI::OnSpeedyLogonResponse(bool isLoginOK,
                                            const char* ReplyMsg)
{
    // 交易主機登入成功或失敗的處理
}
  
void testSpdOrderAPI::OnNewOrderReport(long long nid,
                                        const char* UDD,
                                        const char* Symbol,
                                        double Price,
                                        const char* Side,
                                        long OrderQty,
                                        const char* OrderType,
                                        const char* TimeInForce,
                                        const char* OrderID)
{
    // 在這裡處理新單委託回報
}
  
void testSpdOrderAPI::OnCancelOrderReport(long long nid,
                                          const char* UDD,
                                          const char* Symbol,
                                          double Price,
                                          const char* Side,
                                          const char* OrderID)
{
    // 在這裡處理刪單委託回報
}
  
void testSpdOrderAPI::OnReplaceOrderReport(long long nid,
                                            const char* UDD,
                                            const char* Symbol,
                                            double Price,
                                            const char* Side,
                                            long OrderQty,
                                            const char* OrderType,
                                            const char* TimeInForce,
                                            const char* OrderID)
{
    // 在這裡處理改單委託回報
}
  
void testSpdOrderAPI::OnOrderRejectedReport(long long nid,
                                            const char* UDD,
                                            const char* ActionFrom,
                                            const char* ErrCode,
                                            const char* ErrMsg)
{
    // 在這裡處理委託失敗回報
}
  
void testSpdOrderAPI::OnOrderMatchReport(long long nid,
                                          const char* UDD,
                                          const char* OrderID,
                                          long ReportSeq,
                                          double MatchPrice,
                                          long MatchQty,
                                          const char* MatchTime)
{
    // 在這裡處理收到成交回報
}  
步驟6, 假設你的程式是像範例一樣把主要程式邏輯放在 testSpdOrderCPPAPI::mainLoop() 裡來完成的話,那你可以在 mainLoop 裡直接呼叫 EnableMEGACA() 來在連線前先設定簽章所需要用憑證。
from pySpeedy.spdQuoteAPI import spdQuoteAPIEnableMegaCA("xxxxxx.pfx","id","password");
步驟7, 在 mainLoop 裡直接呼叫 ConnectSpeedy() 來連線交易主機
ConnectSpeedy("交易主機IP", 交易主機_ListenPort, 視為逾時的秒數);
步驟8, 使用 spdOrderAPI 其他的 member function 來下單或查詢帳務,可用函式列表請參閱「class spdOrderAPI」。

行情 API

步驟1, 新增一個 class。假設 class 名稱是 testSpdQuoteCPPAPI,類別宣告檔為 testSpdQuoteCPPAPI.h 、類別實作檔為 testSpdQuoteCPPAPI.cpp
步驟2, 在 testSpdQuoteCPPAPI.h 加上 #include spdQuoteAPI.h
#pragma
 
    #include "spdQuoteAPI.h"
步驟3, 修改 testSpdQuoteCPPAPI.h 讓 testSpdQuoteCPPAPI 繼承 spdQuoteAPI
class testSpdQuoteAPI : public spdQuoteAPI
步驟4, 修改 testSpdQuoteCPPAPI.h 讓 testSpdQuoteCPPAPI override 繼承 spdQuoteAPI 的 virtual function
class testSpdQuoteAPI : public spdQuoteAPI
{
  protected:
      void OnStarwaveConnected() override;
      void OnStarwaveDisconnected() override;
      void OnOrderBook(const char* Exchange, const char* Symbol, const char* MsgTime, spdMsgOrderBook* OrderBook) override;
      void OnTrade(const char* Exchange, const char* Symbol, const char* MatchTime, double MatchPrice, int MatchQty, bool isTestMatch) override;
      void OnStarwaveLogonResponse(bool isLoginOK, const char* ReplyMsg) override;
      void OnContract(const char* Exchange, const char* Symbol, const char* Name, const char* MaturityDate, const char* Category, spdContract* Contract) override;
      void OnContractDownloadComplete(int TotalContracts) override;
};
步驟5, 修改 testSpdQuoteCPPAPI.cpp 加上步驟 4 繼承的 member function
void testSpdQuoteAPI::OnStarwaveConnected()
  {
      // 在這裡處理行情主機連線成功的事件
  }
  
  void testSpdQuoteAPI::OnStarwaveDisconnected()
  {
      // 在這裡處理行情主機連線中斷的事件
  }
  
  void testSpdQuoteAPI::OnStarwaveLogonResponse(bool isLoginOK,
                                                const char* ReplyMsg)
  {
      // 行情主機登入成功或失敗的處理
  }
  
  void testSpdQuoteAPI::OnOrderBook(const char* Exchange,
                                    const char* Symbol,
                                    const char* MsgTime,
                                    spdMsgOrderBook* OrderBook)
  {
      // 在這裡處理收到的委託簿
  }
  
  void testSpdQuoteAPI::OnTrade(const char* Exchange,
                                const char* Symbol,
                                const char* MatchTime,
                                double MatchPrice,
                                int MatchQty,
                                bool isTestMatch)
  {
      // 在這裡處理成交的訊息
  }
  
  void testSpdQuoteAPI::OnContract(const char* Exchange,
                                    const char* Symbol,
                                    const char* Name,
                                    const char* MaturityDate,
                                    const char* Category,
                                    spdContract* Contract)
  {
      // 在這裡處理下載的商品基本資料
  }
  
  void testSpdQuoteAPI::OnContractDownloadComplete(int TotalContracts)
  {
      // 在這裡處理商品檔下載完成的通知
  }
步驟6, 假設你的程式是像範例一樣把主要程式邏輯放在 testSpdQuoteCPPAPI::mainLoop() 裡來完成的話,那你可以在 mainLoop 裡直接呼叫 LogonStarwave 來在連線行情主機。
LogonStarwave("行情主機IP", 行情主機_ListenPort, "your_id", "your_password", true);
步驟7, 登入成功後用 Subscribe 來訂閱行情。其他可用功能列表請參閱「class spdQuoteAPI」