RR_RealReportMerge

彙整的即時回報訂閱

回傳:

登入即訂閱,結果請從回應事件OnResponse接收


Output Parameters

RealReportMerge 即時回報彙總物件

Name Type Description Memo
Account string 帳號
RptType byte 回報標記 1:股票
2:期貨
3:選擇權
4:海外期貨
5:海外股票
OrderNo string 委託單號
MarketNo enumMarketType 市場代碼 參考列舉物件-市場類別
CompanyNo string 商品代碼 2854,
0531,
FITX 200709,
URO200709,
FIGTL7/C8,
TXO09000T7,
TXO08000/08100U7
OrderDate TYuantaDate 交易日 參考物件-日期物件
OrderTime TYuantaTime 委託時間 參考物件-時間物件
OrderType string 委託種類 現貨
0:普通
1,3:資
2,4:券
5,6:借券(賣出)

期權
1:市價
2:限價
3:範圍市價

海外期
LMT:限價單
MKT:市價單
STP:停損單
SWL:停損限價單
CXL:取消單

海外股票
1:Market
2:Limit 限價單
BS string 買賣別 S:賣
B:買
Price double 價格 Ex. 23.50,1.0585 0000125’23.5(海外期)
TouchPrice double 停損執行價
LastDealPrice double 最新成交價 Ex. 23.50,1.0585
0000125’23.5(海外期)
AvgDealPrice double 成交均價 Ex. 23.50,1.0585
0000125’23.5(海外期)
BeforeQty Int 改量前數量
OrderQty Int 委託股數 股數/口數 
(有效數量含成交)
OkQty Int 成交股數 股數/口數
OpenOffsetKind string 新增/沖銷別
0:新增 
1:沖銷 
2:新倉且當日沖銷單


0: 新增 
1: 沖銷

海外股票 (SettleType) 
0:外幣 
1:台幣
DayTrade string 當沖記號 證券:' ' OR 'X'
期權:' ' OR 'Y'
OrderCond string 委託條件 證券
3:IOC  
4:FOK  
0:ROD

期權
F:FOK  
I:IOC  
R:ROD

海外期
0:DAY
2:IOC
1:FOK
N:非GTC單

海外股票
0:DAY 
3:IOC  
4:FOK
OrderErrorNo string 錯誤碼 P201
APCode byte 委託類別 現貨
0:現股
2:零股
4:盤中零股
7:盤後
99:興櫃
OrderStatus short 狀態碼 0:傳輸中
5:預約單
10:委託失敗
20:委託成功
24:委託失效 
25:價穩失效
30:取消
LastOrderStatus Byte 最新一筆即回資料狀態 0:委託成功
1:委託失敗
2:取消成功
3:取消失敗
4:減量成功
5:減量失敗
6:查詢成功
7:查詢失敗
8:已成交
10:組合成功
11:拆解成功
12:平轉新
13:新轉平
18:委託收到 
19:取消收到(國外股票)
20:改價成功
21:改價失敗
23:取消成交 (國外股票)
24:委託失效 
25:價穩失效
StkCName string 商品名稱 此欄位代表股票名稱;但是在期貨價差的CASE下,此欄位代表第二個商品的tradecode
TradeCode string 實體交易代號 當期貨價差時,此欄位代表第一個商品的tradecode
StrikePrice double 履約價
BasketNo string 一籃子下單編號
StkType1 Byte 屬性1 Bit 1: 管理商品
Bit 2: 交易記號
Bit 3: 受益憑證
Bit 4: ETF商品
Bit 5: 權證記號
Bit 6: 特別股
Bit 7: 存託憑證
Bit 8: 外國股票
StkType2 Byte 屬性2 Bit 1: 可轉換公司債
Bit 2: 附認股權公司債
Bit 3: 警示股
Bit 4: 指數記號
Bit 5: 期貨
Bit 6: 個股選擇權
Bit 7: 指數選擇權
Bit 8: 保留
BelongMarketNo Byte 所屬市場代碼
BelongStkCode string 所屬股票代碼
StkType string 價格型態 證券使用
1:市價 
2:限價
H:漲停 
L:跌停
-:平盤
StkErrorNo string 證券回報錯誤碼 證券回報錯誤碼

範例

引用元件

import os, time, datetime, struct, pathlib, sys
from datetime import datetime
from pathlib import Path
from pythonnet import load

load("coreclr")
import clr, System

##透過Clr引用系統標準函式
clr.AddReference('System.Collections')
from System.Collections.Generic import List

##宣告增加模組、DLL的路徑(windows可抓取當前路徑 Linux跟MAC需指定路徑)
sys.path.append(Path(pathlib.Path(__file__).parent.resolve()))
if sys.platform == "win32":
    os.add_dll_directory(Path(pathlib.Path(__file__).parent.resolve()))

##透過Clr引用YuantaSparkAPI.dll
##pythonnet引用元件不用加附檔名
try:
    clr.AddReference("YuantaSparkAPI")
except Exception as e:
    print(f"Error loading YuantaSparkAPI: {e}")
from YuantaOneAPI import YuantaSparkAPITrader, enumLogType, enumQuoteIndexType, enumMarketType, enumEnvironmentMode, enumQuoteFiveTickIndexType

# 建立 API 物件
objYuantaSparkAPI = YuantaSparkAPITrader()
objYuantaSparkAPI.SetLogType(enumLogType.COMMON)
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using YuantaOneAPI;

YuantaSparkAPITrader objYuantaSparkAPI = new YuantaSparkAPITrader();
string Account = "S98875005091";
string Password = "1234";
enumEnvironmentMode enumEvenMode = enumEnvironmentMode.UAT;

objYuantaSparkAPI.OnResponse += objApi_OnResponse;
objYuantaSparkAPI.SetLogType(enumLogType.ALL);

objYuantaSparkAPI.Open(enumEvenMode);
Thread.Sleep(1000);
objYuantaSparkAPI.Login(Account, Password);
Thread.Sleep(1000);

Onresponse

def on_response(intMark, dwIndex, strIndex, objHandle, objValue):
    try:
        result = ''
        match intMark:
            case 0:  # 系統回應資訊
                result = str(objValue)

            case 1:  # 查詢回應資訊
                match strIndex:
                    case 'Login':
                        loginResult = objValue
                        status = loginResult.LoginStatus
                        strMsgCode = status.MsgCode # 訊息代碼
                        strMsgContent = status.MsgContent # 訊息內容
                        intCount = status.Count # 筆數
                        result = '{0},{1},帳號筆數:{2}\r\n'.format(strMsgCode,strMsgContent, str(intCount))
                        if strMsgCode == '0001' or strMsgCode == '00001' or intCount > 0 :
                            for i in objValue.LoginList:
                                result += f"{i.Account},{i.Name},{i.InvestorID},{i.SellerNo}\n"

            case 2:  # 訂閱回應資訊
                match strIndex:
                    case 'RR_RealReportMerge':
                        # 即時回報彙總
                        realReport = objValue
                        result += '即時回報彙總:\r\n'

                        #yuantaDate = TYuantaDate()
                        yuantaDate = realReport.OrderDate
                        date= '{0}/{1}/{2}'.format(yuantaDate.ushtYear, yuantaDate.bytMon, yuantaDate.bytDay)
                        #yuantaTime = TYuantaTime()
                        yuantaTime = realReport.OrderTime
                        time= '{0}:{1}:{2}.{3}'.format(str(yuantaTime.bytHour), str(yuantaTime.bytMin), str(yuantaTime.bytSec), str(yuantaTime.ushtMSec))

                        result += '{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14},{15},{16},{17},{18},{19},{20},{21},{22},{23},{24},{25},{26},{27},{28},{29},{30},{31},{32}\r\n'.format(
                            realReport.Account,str(realReport.RptType),realReport.OrderNo,str(realReport.MarketNo),realReport.CompanyNo,date,time,realReport.OrderType,realReport.BS,str(realReport.Price),
                            str(realReport.TouchPrice),str(realReport.LastDealPrice),str(realReport.AvgDealPrice),str(realReport.BeforeQty),str(realReport.OrderQty),str(realReport.OkQty),realReport.OpenOffsetKind,
                            realReport.DayTrade,realReport.OrderCond,realReport.OrderErrorNo,str(realReport.APCode),str(realReport.OrderStatus),str(realReport.LastOrderStatus),realReport.StkCName,realReport.TradeCode,
                            str(realReport.StrikePrice),realReport.BasketNo,str(realReport.StkType1),str(realReport.StkType2),str(realReport.BelongMarketNo),realReport.BelongStkCode,str(realReport.StkType),str(realReport.StkErrorNo))        
        # 輸出結果
        if result:
            print('##================================================##\n')
            print(result)

    except Exception as error:
        print(f"處理回應時發生錯誤: {error}")

objYuantaSparkAPI.OnResponse += on_response
#測試環境帳號:UAT 正式環境:PROD
objYuantaSparkAPI.Open(enumEnvironmentMode.UAT)
time.sleep(2)
objYuantaSparkAPI.Login('S98875005091', '1234')
time.sleep(2)

# 保持程式運行
while True:
    time.sleep(1)
void objApi_OnResponse(int intMark, uint dwIndex, string strIndex, object objHandle, object objValue)
{
    try
    {
        string strResult = "";
        if (intMark == 0)
        {
            Console.WriteLine(Convert.ToString(objValue));
            return;
        }

        if (intMark == 1)
        {
            if (strIndex == "Login")
            {
                var result = (LoginResult)objValue;

                string strMsgCode = result.LoginStatus.MsgCode;
                string strMsgContent = result.LoginStatus.MsgContent;
                int intCount = result.LoginStatus.Count;

                strResult += $"{strMsgCode}, {strMsgContent}{Environment.NewLine}";
                if (strMsgCode == "0001" || strMsgCode == "00001")
                {
                    strResult += $"帳號筆數: {intCount.ToString()}{Environment.NewLine}";
                    result.LoginList.ForEach(r => strResult += $"{r.Account},{r.Name},{r.InvestorID},{r.SellerNo}\r\n");

                }
                else
                {
                Account = "";
                }

                Console.WriteLine("\n======================");
                Console.WriteLine(strResult.ToString());
                Console.WriteLine("======================\n");
                return;
            }
        }

        if (intMark == 2)
        {
            if (strIndex == "RR_RealReportMerge")
            {
                var report = (YuantaOneAPI.RealReportMerge)objValue;
                try
                {
                    strResult += "===============\r\n即時回報彙總(訂閱結果)\r\n===============\r\n";
                    strResult += $"{report.Account},{report.RptType},{report.OrderNo},{report.MarketNo},{report.CompanyNo},";
                    TYuantaDate yuantaDate = report.OrderDate;
                    strResult += $"{yuantaDate.ushtYear}/{yuantaDate.bytMon}/{yuantaDate.bytDay},";
                    TYuantaTime yuantaTime = report.OrderTime;
                    strResult += $"{yuantaTime.bytHour}:{yuantaTime.bytMin}:{yuantaTime.bytSec}.{yuantaTime.ushtMSec},";
                    strResult += $"{report.OrderType},{report.BS},{report.Price},{report.TouchPrice},{report.LastDealPrice},{report.AvgDealPrice},{report.BeforeQty}," +
                                $"{report.OrderQty},{report.OkQty},{report.OpenOffsetKind},{report.DayTrade},{report.OrderCond},{report.OrderErrorNo},{report.APCode}," +
                                $"{report.OrderStatus},{report.LastOrderStatus},{report.StkCName},{report.TradeCode},{report.StrikePrice},{report.BasketNo},{report.StkType1}," +
                                $"{report.StkType2},{report.BelongMarketNo},{report.BelongStkCode},{report.StkType},{report.StkErrorNo}\r\n";
                }
                catch
                {
                    strResult = "";
                }

                Console.WriteLine("\n======================");
                Console.WriteLine(strResult);
                Console.WriteLine("======================\n");
                return;
            }

            Console.WriteLine($"[{strIndex}] {Convert.ToString(objValue)}");
        }
    }
    catch (Exception exc)
    {
        Console.WriteLine("OnResponse Error: " + exc.Message);
    }
}

Response Body


{
  "Result": {
    "RealReportMergeList": [
      {
        "Account": "S98875400007",
        "RptType": "1",
        "OrderNo": "f0440",
        "MarketNo": "TWSE",
        "CompanyNo": "2330",
        "OrderDate": "2025/12/1",
        "OrderTime": "13:8:7.0",
        "OrderType": "0",
        "BS": "B",
        "Price": "0.0",
        "TouchPrice": "0.0",
        "LastDealPrice": "0.0",
        "AvgDealPrice": "0.0",
        "BeforeQty": "0",
        "OrderQty": "2000",
        "OkQty": "0",
        "OpenOffsetKind": "",
        "DayTrade": "",
        "OrderCond": "0",
        "OrderErrorNo": "",
        "APCode": "0",
        "OrderStatus": "20",
        "LastOrderStatus": "0",
        "StkCName": "台積電",
        "TradeCode": "2330",
        "StrikePrice": "0.0",
        "BasketNo": "",
        "StkType1": "0",
        "StkType2": "0",
        "BelongMarketNo": "1",
        "BelongStkCode": "100026",
        "StkType": "1",
        "StkErrorNo": ""
      }
    ]
  }
}