PyNetstockQuoteLib 1.0.9__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pynetstockquotelib-1.0.9/LICENSE.txt +21 -0
- pynetstockquotelib-1.0.9/PKG-INFO +151 -0
- pynetstockquotelib-1.0.9/PyNetstockQuoteLib/PyNetstockQuoteLib.pyd +0 -0
- pynetstockquotelib-1.0.9/PyNetstockQuoteLib/PyNetstockQuoteLib.pyi +18 -0
- pynetstockquotelib-1.0.9/PyNetstockQuoteLib/README.md +135 -0
- pynetstockquotelib-1.0.9/PyNetstockQuoteLib/__init__.py +2 -0
- pynetstockquotelib-1.0.9/PyNetstockQuoteLib/define.py +515 -0
- pynetstockquotelib-1.0.9/PyNetstockQuoteLib.egg-info/PKG-INFO +151 -0
- pynetstockquotelib-1.0.9/PyNetstockQuoteLib.egg-info/SOURCES.txt +13 -0
- pynetstockquotelib-1.0.9/PyNetstockQuoteLib.egg-info/dependency_links.txt +1 -0
- pynetstockquotelib-1.0.9/PyNetstockQuoteLib.egg-info/top_level.txt +1 -0
- pynetstockquotelib-1.0.9/README.md +135 -0
- pynetstockquotelib-1.0.9/pyproject.toml +24 -0
- pynetstockquotelib-1.0.9/setup.cfg +4 -0
- pynetstockquotelib-1.0.9/setup.py +21 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 WeiTian/Netstock
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: PyNetstockQuoteLib
|
|
3
|
+
Version: 1.0.9
|
|
4
|
+
Summary: 兆源股份有限公司(FISTEK)提供台股報價API
|
|
5
|
+
Author-email: WeiTian <twccad@163.com>
|
|
6
|
+
Classifier: Operating System :: Microsoft :: Windows :: Windows 7
|
|
7
|
+
Classifier: Operating System :: Microsoft :: Windows :: Windows 8
|
|
8
|
+
Classifier: Operating System :: Microsoft :: Windows :: Windows 8.1
|
|
9
|
+
Classifier: Operating System :: Microsoft :: Windows :: Windows 10
|
|
10
|
+
Classifier: Operating System :: Microsoft :: Windows :: Windows 11
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Requires-Python: >=3.8
|
|
13
|
+
Description-Content-Type: text/markdown
|
|
14
|
+
License-File: LICENSE.txt
|
|
15
|
+
Dynamic: license-file
|
|
16
|
+
|
|
17
|
+
# PyNetstockQuoteLib簡介<br>
|
|
18
|
+
|
|
19
|
+
針對臺灣股期交易市場,兆源公司提供輕量級報價API模組<br>
|
|
20
|
+
## 功能:<br>
|
|
21
|
+
即時提供證券、期貨與期權市場報價,多合一接口<br>
|
|
22
|
+
## 特點:<br>
|
|
23
|
+
1. 極致化 高效,快速響應市場行情<br>
|
|
24
|
+
2. 輕量級,整包大小不到 200 KB<br>
|
|
25
|
+
適合需要高速數據獲取且對資源占用敏感的應用場景<br>
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
**安裝方法:pip install PyNetstockQuoteLib**<br>
|
|
29
|
+
申請帳號請洽公司網站:https://www.fistek.com/<br>
|
|
30
|
+
電話:+886-2-87717385<br>
|
|
31
|
+
地址:臺灣臺北市大安區106光復南路72巷73號3樓<br>
|
|
32
|
+
|
|
33
|
+
## 函數列表:<br>
|
|
34
|
+
**1,連接**<br>
|
|
35
|
+
`def Connect(Address: str, nPort: unsigned short)-> bool: ...`<br>
|
|
36
|
+
**2,斷開連接**<br>
|
|
37
|
+
`def Disconnect() -> None: ...`<br>
|
|
38
|
+
**3,登錄**<br>
|
|
39
|
+
`def Login(UserName: str, Password: str, Software: str, Version: str, Company: str, Branch: str) -> None: ...`<br>
|
|
40
|
+
**4,運行阻塞函數**<br>
|
|
41
|
+
`def Go() -> None: ...`<br>
|
|
42
|
+
**5,注冊報價函數**<br>
|
|
43
|
+
`def SubscribeToQuote(Symbol: str, Exc: int, sExc: int = -1, rlot:bool = False) -> int: ...`<br>
|
|
44
|
+
**6,關閉注冊報價**<br>
|
|
45
|
+
`def CloseSubscribe(Index: int) -> bool: ...`<br>
|
|
46
|
+
**7,注冊Tick函數**<br>
|
|
47
|
+
`def SubscribeToTick(Symbol: str, Exc: int, sExc: int = -1, rlot:bool = False) -> int: ...`<br>
|
|
48
|
+
**8,獲得報價**<br>
|
|
49
|
+
`def GetQuote(Index: int, Field: int) -> int | float: ...`<br>
|
|
50
|
+
**9,獲得Tick數據**<br>
|
|
51
|
+
`def GetTick(Index:int)-> List[Dict[str, Union[int, float]]]: ...`<br>
|
|
52
|
+
**10,獲得基本資料(9-16)**<br>
|
|
53
|
+
`def GetInfo(Exc:int, Symbol:str, Field:str, sExc:int)-> str: ...`<br>
|
|
54
|
+
**11,設置主動回報callback**<br>
|
|
55
|
+
`def SetNoticeCallback(callback: Callable[[int, int, object, int], None]) -> None: ...`<br>
|
|
56
|
+
**12,設置登錄回報函數**<br>
|
|
57
|
+
`def SetLoginCallback(callback: Callable[[int, str, int], None]) -> None: ...`<br>
|
|
58
|
+
**13,設置交易日資訊回報函數**<br>
|
|
59
|
+
`def SetExcInfoCallback(callback: Callable[[int, int], None]) -> None: ...`<br>
|
|
60
|
+
**14,設置基本資料更新回報函數**<br>
|
|
61
|
+
`def SetStkiCallback(callback: Callable[[int, int, int], None]) -> None: ...`<br>
|
|
62
|
+
**15,設置報價回報callback**<br>
|
|
63
|
+
`def SetQuoteCallback(callback: Callable[[int, int], None]) -> None: ...`<br>
|
|
64
|
+
**16,設置Tick回報函數**<br>
|
|
65
|
+
`def SetTickCallback(callback: Callable[[int], None]) -> None: ...`<br>
|
|
66
|
+
|
|
67
|
+
## 示例1:Quote.py<br>
|
|
68
|
+
```python
|
|
69
|
+
import PyNetstockQuoteLib as NsQuote
|
|
70
|
+
|
|
71
|
+
Ind = 0
|
|
72
|
+
Ind1 = 0
|
|
73
|
+
#登錄回報
|
|
74
|
+
def OnLogin(Type,pInfo,InfoSize):
|
|
75
|
+
if(Type == NsQuote.SMSGL_LOGIN_OKAY):
|
|
76
|
+
global Ind,Ind1
|
|
77
|
+
print("登錄成功!")
|
|
78
|
+
#登錄成功后對商品進行報價訂閱
|
|
79
|
+
Ind = NsQuote.SubscribeToQuote("FITX",NsQuote.EXC_FITXN,NsQuote.EXC_FITX_T2)
|
|
80
|
+
Ind1 = NsQuote.SubscribeToQuote("2330",NsQuote.EXC_STOCK)
|
|
81
|
+
else:
|
|
82
|
+
print("登錄失敗")
|
|
83
|
+
#報價回報
|
|
84
|
+
def OnQuote(Index,Type):
|
|
85
|
+
if(Type == 1):
|
|
86
|
+
global Ind,Ind1
|
|
87
|
+
if(Index == Ind):
|
|
88
|
+
print("Sym:FITX,Name:" + NsQuote.GetInfo(NsQuote.EXC_FITXN,"FITX","name") +
|
|
89
|
+
"," + NsQuote.SYM_GLOBAL_DESC[NsQuote.SYM_LAST] +":" +
|
|
90
|
+
str(NsQuote.GetQuote(Index,NsQuote.SYM_LAST)) +
|
|
91
|
+
"," + NsQuote.SYM_GLOBAL_DESC[NsQuote.SYM_VOLUME] +":" +
|
|
92
|
+
str(NsQuote.GetQuote(Index,NsQuote.SYM_VOLUME)))
|
|
93
|
+
if(Index == Ind1):
|
|
94
|
+
print("Sym:2330,Last:" + str(NsQuote.GetQuote(Index,NsQuote.SYM_LAST)) +
|
|
95
|
+
",Vol:" + str(NsQuote.GetQuote(Index,NsQuote.SYM_VOLUME)))
|
|
96
|
+
|
|
97
|
+
#啟動入口
|
|
98
|
+
if NsQuote.Connect():
|
|
99
|
+
print("連接成功")
|
|
100
|
+
NsQuote.SetLoginCallback(OnLogin)
|
|
101
|
+
NsQuote.SetQuoteCallback(OnQuote)
|
|
102
|
+
NsQuote.Login("xxxxx", "xxxxx")
|
|
103
|
+
NsQuote.Go()
|
|
104
|
+
else:
|
|
105
|
+
print("連接失敗")
|
|
106
|
+
print("Over")
|
|
107
|
+
```
|
|
108
|
+
## 示例2:Tick.py<br>
|
|
109
|
+
```python
|
|
110
|
+
import PyNetstockQuoteLib as NsQuote
|
|
111
|
+
|
|
112
|
+
indTick = 0
|
|
113
|
+
#登錄回報
|
|
114
|
+
def OnLogin(Type,pInfo,InfoSize):
|
|
115
|
+
if(Type == NsQuote.SMSGL_LOGIN_OKAY):
|
|
116
|
+
print("登錄成功!")
|
|
117
|
+
else:
|
|
118
|
+
print("登錄失敗")
|
|
119
|
+
#Tick回報
|
|
120
|
+
def OnTick(Index):
|
|
121
|
+
#獲得Tick數據,返回字典列表迭代器
|
|
122
|
+
TickList = NsQuote.GetTick(Index)
|
|
123
|
+
#獲得Tick總數
|
|
124
|
+
Ticklen = len(TickList)
|
|
125
|
+
count = 0
|
|
126
|
+
#用基本資料獲取商品名稱
|
|
127
|
+
print(NsQuote.GetInfo(NsQuote.EXC_FITXN,"FITX","name"))
|
|
128
|
+
#顯示本次Tick信息
|
|
129
|
+
print("Index:" + str(Index) + " TickCount:",str(Ticklen))
|
|
130
|
+
#顯示10條數據用于測試
|
|
131
|
+
for Item in TickList:
|
|
132
|
+
print(Item)#Item是字典對象,實際使用時可以用Key取單元數據例如:Item["Last"]
|
|
133
|
+
count = count + 1
|
|
134
|
+
if (count >=10): break
|
|
135
|
+
#交易日資訊回報
|
|
136
|
+
def OnExcInfo(Type,Exc):
|
|
137
|
+
if(Exc == NsQuote.EXC_FITXN):#收到對應市場交易日資訊后注冊(較為單純)
|
|
138
|
+
global indTick
|
|
139
|
+
indTick = NsQuote.SubscribeToTick("FITX",NsQuote.EXC_FITXN,NsQuote.EXC_FITX_T2)
|
|
140
|
+
#程序入口
|
|
141
|
+
if NsQuote.Connect():
|
|
142
|
+
print("連接成功")
|
|
143
|
+
NsQuote.SetLoginCallback(OnLogin)
|
|
144
|
+
NsQuote.SetExcInfoCallback(OnExcInfo)
|
|
145
|
+
NsQuote.SetTickCallback(OnTick)
|
|
146
|
+
NsQuote.Login("xxxxx", "xxxxx")
|
|
147
|
+
NsQuote.Go()
|
|
148
|
+
else:
|
|
149
|
+
print("連接失敗")
|
|
150
|
+
print("Over")
|
|
151
|
+
```
|
|
Binary file
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from typing import Callable
|
|
2
|
+
|
|
3
|
+
def Connect(Address: str = "", nPort: unsigned short = 0)-> bool: ...
|
|
4
|
+
def Disconnect() -> None: ...
|
|
5
|
+
def Login(UserName: str, Password: str, Software: str = "", Version: str = "", Company: str = "", Branch: str = "") -> None: ...
|
|
6
|
+
def Go() -> None: ...
|
|
7
|
+
def SubscribeToQuote(Symbol: str, Exc: int, sExc: int = -1, rlot:bool = False) -> int: ...
|
|
8
|
+
def CloseSubscribe(Index: int) -> bool: ...
|
|
9
|
+
def SubscribeToTick(Symbol: str, Exc: int, sExc: int = -1, rlot:bool = False) -> int: ...
|
|
10
|
+
def GetQuote(Index: int, Field: int) -> int | float: ...
|
|
11
|
+
def GetTick(Index:int)-> List[Dict[str, Union[int, float]]]: ...
|
|
12
|
+
def GetInfo(Exc:int, Symbol:str, Field:str, sExc:int)-> str: ...
|
|
13
|
+
def SetNoticeCallback(callback: Callable[[int, int, object, int], None]) -> None: ...
|
|
14
|
+
def SetLoginCallback(callback: Callable[[int, str, int], None]) -> None: ...
|
|
15
|
+
def SetExcInfoCallback(callback: Callable[[int, int], None]) -> None: ...
|
|
16
|
+
def SetStkiCallback(callback: Callable[[int, int, int], None]) -> None: ...
|
|
17
|
+
def SetQuoteCallback(callback: Callable[[int, int], None]) -> None: ...
|
|
18
|
+
def SetTickCallback(callback: Callable[[int], None]) -> None: ...
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# PyNetstockQuoteLib簡介<br>
|
|
2
|
+
|
|
3
|
+
針對臺灣股期交易市場,兆源公司提供輕量級報價API模組<br>
|
|
4
|
+
## 功能:<br>
|
|
5
|
+
即時提供證券、期貨與期權市場報價,多合一接口<br>
|
|
6
|
+
## 特點:<br>
|
|
7
|
+
1. 極致化 高效,快速響應市場行情<br>
|
|
8
|
+
2. 輕量級,整包大小不到 200 KB<br>
|
|
9
|
+
適合需要高速數據獲取且對資源占用敏感的應用場景<br>
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
**安裝方法:pip install PyNetstockQuoteLib**<br>
|
|
13
|
+
申請帳號請洽公司網站:https://www.fistek.com/<br>
|
|
14
|
+
電話:+886-2-87717385<br>
|
|
15
|
+
地址:臺灣臺北市大安區106光復南路72巷73號3樓<br>
|
|
16
|
+
|
|
17
|
+
## 函數列表:<br>
|
|
18
|
+
**1,連接**<br>
|
|
19
|
+
`def Connect(Address: str, nPort: unsigned short)-> bool: ...`<br>
|
|
20
|
+
**2,斷開連接**<br>
|
|
21
|
+
`def Disconnect() -> None: ...`<br>
|
|
22
|
+
**3,登錄**<br>
|
|
23
|
+
`def Login(UserName: str, Password: str, Software: str, Version: str, Company: str, Branch: str) -> None: ...`<br>
|
|
24
|
+
**4,運行阻塞函數**<br>
|
|
25
|
+
`def Go() -> None: ...`<br>
|
|
26
|
+
**5,注冊報價函數**<br>
|
|
27
|
+
`def SubscribeToQuote(Symbol: str, Exc: int, sExc: int = -1, rlot:bool = False) -> int: ...`<br>
|
|
28
|
+
**6,關閉注冊報價**<br>
|
|
29
|
+
`def CloseSubscribe(Index: int) -> bool: ...`<br>
|
|
30
|
+
**7,注冊Tick函數**<br>
|
|
31
|
+
`def SubscribeToTick(Symbol: str, Exc: int, sExc: int = -1, rlot:bool = False) -> int: ...`<br>
|
|
32
|
+
**8,獲得報價**<br>
|
|
33
|
+
`def GetQuote(Index: int, Field: int) -> int | float: ...`<br>
|
|
34
|
+
**9,獲得Tick數據**<br>
|
|
35
|
+
`def GetTick(Index:int)-> List[Dict[str, Union[int, float]]]: ...`<br>
|
|
36
|
+
**10,獲得基本資料(9-16)**<br>
|
|
37
|
+
`def GetInfo(Exc:int, Symbol:str, Field:str, sExc:int)-> str: ...`<br>
|
|
38
|
+
**11,設置主動回報callback**<br>
|
|
39
|
+
`def SetNoticeCallback(callback: Callable[[int, int, object, int], None]) -> None: ...`<br>
|
|
40
|
+
**12,設置登錄回報函數**<br>
|
|
41
|
+
`def SetLoginCallback(callback: Callable[[int, str, int], None]) -> None: ...`<br>
|
|
42
|
+
**13,設置交易日資訊回報函數**<br>
|
|
43
|
+
`def SetExcInfoCallback(callback: Callable[[int, int], None]) -> None: ...`<br>
|
|
44
|
+
**14,設置基本資料更新回報函數**<br>
|
|
45
|
+
`def SetStkiCallback(callback: Callable[[int, int, int], None]) -> None: ...`<br>
|
|
46
|
+
**15,設置報價回報callback**<br>
|
|
47
|
+
`def SetQuoteCallback(callback: Callable[[int, int], None]) -> None: ...`<br>
|
|
48
|
+
**16,設置Tick回報函數**<br>
|
|
49
|
+
`def SetTickCallback(callback: Callable[[int], None]) -> None: ...`<br>
|
|
50
|
+
|
|
51
|
+
## 示例1:Quote.py<br>
|
|
52
|
+
```python
|
|
53
|
+
import PyNetstockQuoteLib as NsQuote
|
|
54
|
+
|
|
55
|
+
Ind = 0
|
|
56
|
+
Ind1 = 0
|
|
57
|
+
#登錄回報
|
|
58
|
+
def OnLogin(Type,pInfo,InfoSize):
|
|
59
|
+
if(Type == NsQuote.SMSGL_LOGIN_OKAY):
|
|
60
|
+
global Ind,Ind1
|
|
61
|
+
print("登錄成功!")
|
|
62
|
+
#登錄成功后對商品進行報價訂閱
|
|
63
|
+
Ind = NsQuote.SubscribeToQuote("FITX",NsQuote.EXC_FITXN,NsQuote.EXC_FITX_T2)
|
|
64
|
+
Ind1 = NsQuote.SubscribeToQuote("2330",NsQuote.EXC_STOCK)
|
|
65
|
+
else:
|
|
66
|
+
print("登錄失敗")
|
|
67
|
+
#報價回報
|
|
68
|
+
def OnQuote(Index,Type):
|
|
69
|
+
if(Type == 1):
|
|
70
|
+
global Ind,Ind1
|
|
71
|
+
if(Index == Ind):
|
|
72
|
+
print("Sym:FITX,Name:" + NsQuote.GetInfo(NsQuote.EXC_FITXN,"FITX","name") +
|
|
73
|
+
"," + NsQuote.SYM_GLOBAL_DESC[NsQuote.SYM_LAST] +":" +
|
|
74
|
+
str(NsQuote.GetQuote(Index,NsQuote.SYM_LAST)) +
|
|
75
|
+
"," + NsQuote.SYM_GLOBAL_DESC[NsQuote.SYM_VOLUME] +":" +
|
|
76
|
+
str(NsQuote.GetQuote(Index,NsQuote.SYM_VOLUME)))
|
|
77
|
+
if(Index == Ind1):
|
|
78
|
+
print("Sym:2330,Last:" + str(NsQuote.GetQuote(Index,NsQuote.SYM_LAST)) +
|
|
79
|
+
",Vol:" + str(NsQuote.GetQuote(Index,NsQuote.SYM_VOLUME)))
|
|
80
|
+
|
|
81
|
+
#啟動入口
|
|
82
|
+
if NsQuote.Connect():
|
|
83
|
+
print("連接成功")
|
|
84
|
+
NsQuote.SetLoginCallback(OnLogin)
|
|
85
|
+
NsQuote.SetQuoteCallback(OnQuote)
|
|
86
|
+
NsQuote.Login("xxxxx", "xxxxx")
|
|
87
|
+
NsQuote.Go()
|
|
88
|
+
else:
|
|
89
|
+
print("連接失敗")
|
|
90
|
+
print("Over")
|
|
91
|
+
```
|
|
92
|
+
## 示例2:Tick.py<br>
|
|
93
|
+
```python
|
|
94
|
+
import PyNetstockQuoteLib as NsQuote
|
|
95
|
+
|
|
96
|
+
indTick = 0
|
|
97
|
+
#登錄回報
|
|
98
|
+
def OnLogin(Type,pInfo,InfoSize):
|
|
99
|
+
if(Type == NsQuote.SMSGL_LOGIN_OKAY):
|
|
100
|
+
print("登錄成功!")
|
|
101
|
+
else:
|
|
102
|
+
print("登錄失敗")
|
|
103
|
+
#Tick回報
|
|
104
|
+
def OnTick(Index):
|
|
105
|
+
#獲得Tick數據,返回字典列表迭代器
|
|
106
|
+
TickList = NsQuote.GetTick(Index)
|
|
107
|
+
#獲得Tick總數
|
|
108
|
+
Ticklen = len(TickList)
|
|
109
|
+
count = 0
|
|
110
|
+
#用基本資料獲取商品名稱
|
|
111
|
+
print(NsQuote.GetInfo(NsQuote.EXC_FITXN,"FITX","name"))
|
|
112
|
+
#顯示本次Tick信息
|
|
113
|
+
print("Index:" + str(Index) + " TickCount:",str(Ticklen))
|
|
114
|
+
#顯示10條數據用于測試
|
|
115
|
+
for Item in TickList:
|
|
116
|
+
print(Item)#Item是字典對象,實際使用時可以用Key取單元數據例如:Item["Last"]
|
|
117
|
+
count = count + 1
|
|
118
|
+
if (count >=10): break
|
|
119
|
+
#交易日資訊回報
|
|
120
|
+
def OnExcInfo(Type,Exc):
|
|
121
|
+
if(Exc == NsQuote.EXC_FITXN):#收到對應市場交易日資訊后注冊(較為單純)
|
|
122
|
+
global indTick
|
|
123
|
+
indTick = NsQuote.SubscribeToTick("FITX",NsQuote.EXC_FITXN,NsQuote.EXC_FITX_T2)
|
|
124
|
+
#程序入口
|
|
125
|
+
if NsQuote.Connect():
|
|
126
|
+
print("連接成功")
|
|
127
|
+
NsQuote.SetLoginCallback(OnLogin)
|
|
128
|
+
NsQuote.SetExcInfoCallback(OnExcInfo)
|
|
129
|
+
NsQuote.SetTickCallback(OnTick)
|
|
130
|
+
NsQuote.Login("xxxxx", "xxxxx")
|
|
131
|
+
NsQuote.Go()
|
|
132
|
+
else:
|
|
133
|
+
print("連接失敗")
|
|
134
|
+
print("Over")
|
|
135
|
+
```
|
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
# //---------------------------------------------------------------------------
|
|
2
|
+
# // 即時資料
|
|
3
|
+
# //---------------------------------------------------------------------------
|
|
4
|
+
SMSG_RT = 0x01 # 即時資料主標識
|
|
5
|
+
|
|
6
|
+
# 即時資料描述映射(單主標識,無子類)
|
|
7
|
+
SMSG_RT_DESC = {
|
|
8
|
+
SMSG_RT: "即時資料"
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
# //---------------------------------------------------------------------------
|
|
12
|
+
# // 五檔資料
|
|
13
|
+
# //---------------------------------------------------------------------------
|
|
14
|
+
SMSG_TWFTC = 0x05 # 五檔資料主標識
|
|
15
|
+
|
|
16
|
+
# 五檔資料描述映射(單主標識,無子類)
|
|
17
|
+
SMSG_TWFTC_DESC = {
|
|
18
|
+
SMSG_TWFTC: "五檔資料"
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
# //---------------------------------------------------------------------------
|
|
22
|
+
# // 歷史資料頭尾
|
|
23
|
+
# //---------------------------------------------------------------------------
|
|
24
|
+
SMSG_NHIS = 0x07 # 歷史資料頭尾主標識
|
|
25
|
+
|
|
26
|
+
# 歷史資料頭尾描述映射(單主標識,無子類)
|
|
27
|
+
SMSG_NHIS_DESC = {
|
|
28
|
+
SMSG_NHIS: "歷史資料頭尾"
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
# //---------------------------------------------------------------------------
|
|
32
|
+
# // 歷史資料
|
|
33
|
+
# //---------------------------------------------------------------------------
|
|
34
|
+
SMSG_NHISD = 0x08 # 歷史資料主標識
|
|
35
|
+
|
|
36
|
+
# 歷史資料描述映射(單主標識,無子類)
|
|
37
|
+
SMSG_NHISD_DESC = {
|
|
38
|
+
SMSG_NHISD: "歷史資料"
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
# //---------------------------------------------------------------------------
|
|
42
|
+
# // 時間校正
|
|
43
|
+
# //---------------------------------------------------------------------------
|
|
44
|
+
SMSG_TS = 0x10 # 時間校正主標識
|
|
45
|
+
|
|
46
|
+
# 時間校正描述映射(單主標識,無子類)
|
|
47
|
+
SMSG_TS_DESC = {
|
|
48
|
+
SMSG_TS: "時間校正"
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
# //---------------------------------------------------------------------------
|
|
52
|
+
# // 股市清盤訊息
|
|
53
|
+
# //---------------------------------------------------------------------------
|
|
54
|
+
SMSG_RSTEXC = 0x0A # 股市清盤訊息主標識
|
|
55
|
+
|
|
56
|
+
# 股市清盤訊息描述映射(單主標識,無子類)
|
|
57
|
+
SMSG_RSTEXC_DESC = {
|
|
58
|
+
SMSG_RSTEXC: "股市清盤訊息"
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
# //---------------------------------------------------------------------------
|
|
62
|
+
# // 股市交易日資訊
|
|
63
|
+
# //---------------------------------------------------------------------------
|
|
64
|
+
SMSG_EXCINFO = 0x0B # 股市交易日資訊主標識
|
|
65
|
+
|
|
66
|
+
# 股市交易日資訊子類型
|
|
67
|
+
SMSG_EXCINFO_DATEI = 0x01 # 日期資訊
|
|
68
|
+
|
|
69
|
+
# 股市交易日資訊描述映射(含主標識和子類型)
|
|
70
|
+
SMSG_EXCINFO_DESC = {
|
|
71
|
+
SMSG_EXCINFO: "股市交易日資訊(主標識)",
|
|
72
|
+
SMSG_EXCINFO_DATEI: "日期資訊"
|
|
73
|
+
}
|
|
74
|
+
# //---------------------------------------------------------------------------
|
|
75
|
+
# // 登錄回復
|
|
76
|
+
# //---------------------------------------------------------------------------
|
|
77
|
+
SMSG_LOGIN_ECHO = 0x0E # 登錄回復主標識
|
|
78
|
+
|
|
79
|
+
# 登錄回復子狀態碼(SMSG_LOGIN_ECHO 下屬細分狀態)
|
|
80
|
+
SMSGL_ACCT_ERROR = 0x01 # 帳號不存在
|
|
81
|
+
SMSGL_PASS_ERROR = 0x02 # 密碼錯誤
|
|
82
|
+
SMSGL_ACCT_EXPRD = 0x03 # 帳號過期
|
|
83
|
+
SMSGL_ACCT_UNUSED = 0x04 # 帳號未開通
|
|
84
|
+
SMSGL_ACCT_MULLOG = 0x05 # 重復登入
|
|
85
|
+
SMSGL_LOGIN_ERROR = 0x06 # 登入錯誤
|
|
86
|
+
SMSGL_LEVEL_ERROR = 0x07 # 等級錯誤
|
|
87
|
+
SMSGL_VERSN_ERROR = 0x08 # 版本錯誤
|
|
88
|
+
SMSGL_ACCT_FORBID = 0x09 # 帳號禁用
|
|
89
|
+
SMSGL_ACCT_OVERHD = 0x0A # 人數過多
|
|
90
|
+
SMSGL_ECHO_STRING = 0x0B # 訊息傳送
|
|
91
|
+
SMSGL_LOGIN_OKAY = 0x19 # 登入成功
|
|
92
|
+
|
|
93
|
+
# 登錄狀態碼描述映射(用于快速獲取中文說明,支持日志/用戶提示)
|
|
94
|
+
SMSGL_STATUS_DESC = {
|
|
95
|
+
SMSGL_ACCT_ERROR: "帳號不存在",
|
|
96
|
+
SMSGL_PASS_ERROR: "密碼錯誤",
|
|
97
|
+
SMSGL_ACCT_EXPRD: "帳號過期",
|
|
98
|
+
SMSGL_ACCT_UNUSED: "帳號未開通",
|
|
99
|
+
SMSGL_ACCT_MULLOG: "重復登入",
|
|
100
|
+
SMSGL_LOGIN_ERROR: "登入錯誤",
|
|
101
|
+
SMSGL_LEVEL_ERROR: "等級錯誤",
|
|
102
|
+
SMSGL_VERSN_ERROR: "版本錯誤",
|
|
103
|
+
SMSGL_ACCT_FORBID: "帳號禁用",
|
|
104
|
+
SMSGL_ACCT_OVERHD: "人數過多",
|
|
105
|
+
SMSGL_ECHO_STRING: "訊息傳送",
|
|
106
|
+
SMSGL_LOGIN_OKAY: "登入成功"
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
# //---------------------------------------------------------------------------
|
|
110
|
+
# // 個股資訊傳送
|
|
111
|
+
# //---------------------------------------------------------------------------
|
|
112
|
+
SMSG_STKI = 0x09 # 個股資訊傳送主標識
|
|
113
|
+
|
|
114
|
+
# 個股資訊子類型(SMSG_STKI 下屬細分類型)
|
|
115
|
+
SMSG_STKI_DRD = 0x02 # 除權除息庫
|
|
116
|
+
SMSG_STKI_STKR = 0x08 # 期貨、選擇權對應
|
|
117
|
+
SMSG_STKI_EXCTS = 0x0B # 股市開收盤時間
|
|
118
|
+
SMSG_STKI_PRCTBL = 0x0C # 跳動檔位
|
|
119
|
+
SMSG_STKI_TOPREQ = 0x0D # 主機排名,盤中提示,潛力排行等
|
|
120
|
+
SMSG_STKI_QTEGRP = 0x0E # 分類看盤索引查詢
|
|
121
|
+
SMSG_STKI_EXCNAME = 0x0F # 交易所名稱
|
|
122
|
+
SMSG_STKI_SINFO = 0x10 # 商品基本資訊1
|
|
123
|
+
SMSG_STKI_SINFO2 = 0x11 # 商品基本資訊2
|
|
124
|
+
SMSG_STKI_D_QSID = 0x12 # 股票推薦券商資料[9-18]
|
|
125
|
+
|
|
126
|
+
# 可選:添加子類型描述映射(方便日志打印/用戶使用)
|
|
127
|
+
SMSG_STKI_SUBTYPE_DESC = {
|
|
128
|
+
SMSG_STKI_DRD: "除權除息庫",
|
|
129
|
+
SMSG_STKI_STKR: "期貨、選擇權對應",
|
|
130
|
+
SMSG_STKI_EXCTS: "股市開收盤時間",
|
|
131
|
+
SMSG_STKI_PRCTBL: "跳動檔位",
|
|
132
|
+
SMSG_STKI_TOPREQ: "主機排名,盤中提示,潛力排行等",
|
|
133
|
+
SMSG_STKI_QTEGRP: "分類看盤索引查詢",
|
|
134
|
+
SMSG_STKI_EXCNAME: "交易所名稱",
|
|
135
|
+
SMSG_STKI_SINFO: "商品基本資訊1",
|
|
136
|
+
SMSG_STKI_SINFO2: "商品基本資訊2",
|
|
137
|
+
SMSG_STKI_D_QSID: "股票推薦券商資料[9-18]"
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
# //---------------------------------------------------------------------------
|
|
141
|
+
# // 一般報價欄位 0 ~ 255 (SYM_FIRST ~ SYM_BASE_BEST)
|
|
142
|
+
# //---------------------------------------------------------------------------
|
|
143
|
+
# 基礎分界常量(原宏依賴的基準值,需先定義)
|
|
144
|
+
SYM_FIRST = 0 # 報價欄位起始索引
|
|
145
|
+
SYM_BASE_BEST = 255 # 一般報價欄位結束索引(分界點)
|
|
146
|
+
|
|
147
|
+
# 核心報價欄位(1~20)
|
|
148
|
+
SYM_OPEN = 1 # 開盤
|
|
149
|
+
SYM_HIGH = 2 # 最高
|
|
150
|
+
SYM_LOW = 3 # 最低
|
|
151
|
+
SYM_LAST = 4 # 成交價
|
|
152
|
+
SYM_PREV = 5 # 昨收
|
|
153
|
+
SYM_BID = 6 # 買價
|
|
154
|
+
SYM_ASK = 7 # 賣價
|
|
155
|
+
SYM_VOLUME = 8 # 成交總張數
|
|
156
|
+
SYM_OPENINT = 9 # 未平倉合約數
|
|
157
|
+
SYM_SIZE = 10 # 成交單量
|
|
158
|
+
SYM_BIDSIZE = 11 # 開出買價的量
|
|
159
|
+
SYM_ASKSIZE = 12 # 開出賣價的量
|
|
160
|
+
SYM_BIDEXCH = 13 # 出買價證交所
|
|
161
|
+
SYM_ASKEXCH = 14 # 出賣價證交所
|
|
162
|
+
SYM_TTIME = 15 # 撮合時間
|
|
163
|
+
SYM_YEARHIGH = 16 # 今年最高價
|
|
164
|
+
SYM_YEARLOW = 17 # 今年最低價
|
|
165
|
+
SYM_NET = 18 # 漲跌
|
|
166
|
+
SYM_NETPCT = 19 # 漲跌幅
|
|
167
|
+
SYM_SNOFLAG = 20 # 報價旗標
|
|
168
|
+
|
|
169
|
+
# 補充報價欄位(22~62)
|
|
170
|
+
SYM_SVOLUME = 22 # 日盤成交量
|
|
171
|
+
SYM_TRDSTS = 23 # 2^1=試撮, 2^2=禁刪, 2^3=暫停 (20140417) 2^4=收盤(20180625)
|
|
172
|
+
SYM_STRSTM = 25 # 暫停/恢復時間
|
|
173
|
+
SYM_AVGPRC2 = 27 # 成交均價
|
|
174
|
+
SYM_LDATE = 28 # 最後交易日,周月線結束日
|
|
175
|
+
SYM_AVGPRC = 29 # 成交均價
|
|
176
|
+
SYM_LOT = 30 # 成交總筆數
|
|
177
|
+
SYM_BIDLOT = 31 # 總買筆數
|
|
178
|
+
SYM_ASKLOT = 32 # 總賣筆數
|
|
179
|
+
SYM_TERMHIGH = 33 # 交易歷史最高
|
|
180
|
+
SYM_TERMLOW = 34 # 交易歷史最低
|
|
181
|
+
SYM_N_LAST = 35 # 大盤指數(不含金融)
|
|
182
|
+
SYM_N_PREV = 36 # 大盤昨收(不含金融)
|
|
183
|
+
SYM_PDATE = 37 # 交易日期
|
|
184
|
+
SYM_MATCHTYPE = 38 # 該筆成交是否是內外盤成交 0:外盤 1:內盤 (原名 SYM_VALUE, see SYM_SVAL)
|
|
185
|
+
SYM_UVALUE = 39 # 單位成交總值
|
|
186
|
+
SYM_BTRADE = 40 # 內盤張數
|
|
187
|
+
SYM_ATRADE = 41 # 外盤張數
|
|
188
|
+
SYM_NTRADE = 42 # 不知盤張數
|
|
189
|
+
SYM_CEIL = 43 # 漲停價
|
|
190
|
+
SYM_FLOOR = 44 # 跌停價
|
|
191
|
+
SYM_POPEN = 45 # 昨開
|
|
192
|
+
SYM_PHIGH = 46 # 昨高
|
|
193
|
+
SYM_PLOW = 47 # 昨低
|
|
194
|
+
SYM_PVOL = 48 # 昨量
|
|
195
|
+
SYM_ASSET = 49 # 權值比重
|
|
196
|
+
SYM_BTL = 50 # 總買成筆
|
|
197
|
+
SYM_ATL = 51 # 總賣成筆
|
|
198
|
+
SYM_WARN = 52 # 警示股與否
|
|
199
|
+
SYM_SETTP = 53 # 結算價
|
|
200
|
+
SYM_SVAL = 54 # 個股成交總值
|
|
201
|
+
SYM_BIDVOLUME = 55 # 總買量
|
|
202
|
+
SYM_ASKVOLUME = 56 # 總賣量
|
|
203
|
+
SYM_SERIAL = 57 # 傳輸序號
|
|
204
|
+
SYM_SEXCH = 58 # 子股市
|
|
205
|
+
SYM_DATAEND = 59 # 資料結束
|
|
206
|
+
SYM_SECDIFF = 60 # 秒差
|
|
207
|
+
SYM_VOLDIFF = 61 # 量差
|
|
208
|
+
SYM_VDATE = 62 # 有效日期
|
|
209
|
+
|
|
210
|
+
# 融資融券相關欄位(71~78)
|
|
211
|
+
SYM_K_TMB = 71 # 融資買進
|
|
212
|
+
SYM_K_TMA = 72 # 融資賣出
|
|
213
|
+
SYM_K_TML = 73 # 融資余額
|
|
214
|
+
SYM_K_TSA = 74 # 融券賣出
|
|
215
|
+
SYM_K_TSB = 75 # 融券買進
|
|
216
|
+
SYM_K_TSL = 76 # 融券余額
|
|
217
|
+
SYM_K_TCL = 77 # 融資限額
|
|
218
|
+
SYM_K_TMC = 78 # 資券當沖
|
|
219
|
+
|
|
220
|
+
# 機構交易相關欄位(81~86)
|
|
221
|
+
SYM_K_SBVOL = 81 # 自營買進
|
|
222
|
+
SYM_K_SSVOL = 82 # 自營賣出
|
|
223
|
+
SYM_K_CBVOL = 83 # 投信買進
|
|
224
|
+
SYM_K_CSVOL = 84 # 投信賣出
|
|
225
|
+
SYM_K_FBVOL = 85 # 法人買進
|
|
226
|
+
SYM_K_FSVOL = 86 # 法人賣出
|
|
227
|
+
|
|
228
|
+
# 股本相關欄位(90~92)
|
|
229
|
+
SYM_K_IQTY = 90 # 發行股數
|
|
230
|
+
SYM_K_BQTY = 91 # 可投資股數
|
|
231
|
+
SYM_K_HQTY = 92 # 持有持數
|
|
232
|
+
|
|
233
|
+
# //---------------------------------------------------------------------------
|
|
234
|
+
# // 最佳買賣價量
|
|
235
|
+
# //---------------------------------------------------------------------------
|
|
236
|
+
|
|
237
|
+
# 1~10檔最佳買賣價(256~316)
|
|
238
|
+
SYM_BESTBID1 = (SYM_BASE_BEST + 1) # 買價1檔
|
|
239
|
+
SYM_BESTBID2 = (SYM_BASE_BEST + 2) # 買價2檔
|
|
240
|
+
SYM_BESTBID3 = (SYM_BASE_BEST + 3) # 買價3檔
|
|
241
|
+
SYM_BESTBID4 = (SYM_BASE_BEST + 4) # 買價4檔
|
|
242
|
+
SYM_BESTBID5 = (SYM_BASE_BEST + 5) # 買價5檔
|
|
243
|
+
SYM_BESTBIDSIZE1 = (SYM_BASE_BEST + 6)# 買量1檔
|
|
244
|
+
SYM_BESTBIDSIZE2 = (SYM_BASE_BEST + 7)# 買量2檔
|
|
245
|
+
SYM_BESTBIDSIZE3 = (SYM_BASE_BEST + 8)# 買量3檔
|
|
246
|
+
SYM_BESTBIDSIZE4 = (SYM_BASE_BEST + 9)# 買量4檔
|
|
247
|
+
SYM_BESTBIDSIZE5 = (SYM_BASE_BEST + 10)# 買量5檔
|
|
248
|
+
SYM_BESTASK1 = (SYM_BASE_BEST + 11) # 賣價1檔
|
|
249
|
+
SYM_BESTASK2 = (SYM_BASE_BEST + 12) # 賣價2檔
|
|
250
|
+
SYM_BESTASK3 = (SYM_BASE_BEST + 13) # 賣價3檔
|
|
251
|
+
SYM_BESTASK4 = (SYM_BASE_BEST + 14) # 賣價4檔
|
|
252
|
+
SYM_BESTASK5 = (SYM_BASE_BEST + 15) # 賣價5檔
|
|
253
|
+
SYM_BESTASKSIZE1 = (SYM_BASE_BEST + 16)# 賣量1檔
|
|
254
|
+
SYM_BESTASKSIZE2 = (SYM_BASE_BEST + 17)# 賣量2檔
|
|
255
|
+
SYM_BESTASKSIZE3 = (SYM_BASE_BEST + 18)# 賣量3檔
|
|
256
|
+
SYM_BESTASKSIZE4 = (SYM_BASE_BEST + 19)# 賣量4檔
|
|
257
|
+
SYM_BESTASKSIZE5 = (SYM_BASE_BEST + 20)# 賣量5檔
|
|
258
|
+
SYM_BIDASKTIME = (SYM_BASE_BEST + 21) # 買賣價時間戳
|
|
259
|
+
SYM_BESTBID6 = (SYM_BASE_BEST + 22) # 買價6檔
|
|
260
|
+
SYM_BESTBID7 = (SYM_BASE_BEST + 23) # 買價7檔
|
|
261
|
+
SYM_BESTBID8 = (SYM_BASE_BEST + 24) # 買價8檔
|
|
262
|
+
SYM_BESTBID9 = (SYM_BASE_BEST + 25) # 買價9檔
|
|
263
|
+
SYM_BESTBID10 = (SYM_BASE_BEST + 26) # 買價10檔
|
|
264
|
+
SYM_BESTBIDSIZE6 = (SYM_BASE_BEST + 27)# 買量6檔
|
|
265
|
+
SYM_BESTBIDSIZE7 = (SYM_BASE_BEST + 28)# 買量7檔
|
|
266
|
+
SYM_BESTBIDSIZE8 = (SYM_BASE_BEST + 29)# 買量8檔
|
|
267
|
+
SYM_BESTBIDSIZE9 = (SYM_BASE_BEST + 30)# 買量9檔
|
|
268
|
+
SYM_BESTBIDSIZE10 = (SYM_BASE_BEST + 31)# 買量10檔
|
|
269
|
+
SYM_BESTASK6 = (SYM_BASE_BEST + 32) # 賣價6檔
|
|
270
|
+
SYM_BESTASK7 = (SYM_BASE_BEST + 33) # 賣價7檔
|
|
271
|
+
SYM_BESTASK8 = (SYM_BASE_BEST + 34) # 賣價8檔
|
|
272
|
+
SYM_BESTASK9 = (SYM_BASE_BEST + 35) # 賣價9檔
|
|
273
|
+
SYM_BESTASK10 = (SYM_BASE_BEST + 36) # 賣價10檔
|
|
274
|
+
SYM_BESTASKSIZE6 = (SYM_BASE_BEST + 37)# 賣量6檔
|
|
275
|
+
SYM_BESTASKSIZE7 = (SYM_BASE_BEST + 38)# 賣量7檔
|
|
276
|
+
SYM_BESTASKSIZE8 = (SYM_BASE_BEST + 39)# 賣量8檔
|
|
277
|
+
SYM_BESTASKSIZE9 = (SYM_BASE_BEST + 40)# 賣量9檔
|
|
278
|
+
SYM_BESTASKSIZE10 = (SYM_BASE_BEST + 41)# 賣量10檔
|
|
279
|
+
|
|
280
|
+
# //---------------------------------------------------------------------------
|
|
281
|
+
# 報價欄位描述映射(按功能分類,便于查詢和使用)
|
|
282
|
+
# //---------------------------------------------------------------------------
|
|
283
|
+
# 1. 核心報價欄位描述(常用基礎字段)
|
|
284
|
+
SYM_CORE_DESC = {
|
|
285
|
+
SYM_OPEN: "開盤",
|
|
286
|
+
SYM_HIGH: "最高",
|
|
287
|
+
SYM_LOW: "最低",
|
|
288
|
+
SYM_LAST: "成交價",
|
|
289
|
+
SYM_PREV: "昨收",
|
|
290
|
+
SYM_BID: "買價",
|
|
291
|
+
SYM_ASK: "賣價",
|
|
292
|
+
SYM_VOLUME: "成交總張數",
|
|
293
|
+
SYM_OPENINT: "未平倉合約數",
|
|
294
|
+
SYM_NET: "漲跌",
|
|
295
|
+
SYM_NETPCT: "漲跌幅",
|
|
296
|
+
SYM_YEARHIGH: "今年最高價",
|
|
297
|
+
SYM_YEARLOW: "今年最低價",
|
|
298
|
+
SYM_CEIL: "漲停價",
|
|
299
|
+
SYM_FLOOR: "跌停價",
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
# 2. 成交量/筆數相關描述
|
|
303
|
+
SYM_VOLUME_DESC = {
|
|
304
|
+
SYM_SIZE: "成交單量",
|
|
305
|
+
SYM_BIDSIZE: "開出買價的量",
|
|
306
|
+
SYM_ASKSIZE: "開出賣價的量",
|
|
307
|
+
SYM_SVOLUME: "日盤成交量",
|
|
308
|
+
SYM_LOT: "成交總筆數",
|
|
309
|
+
SYM_BIDLOT: "總買筆數",
|
|
310
|
+
SYM_ASKLOT: "總賣筆數",
|
|
311
|
+
SYM_BIDVOLUME: "總買量",
|
|
312
|
+
SYM_ASKVOLUME: "總賣量",
|
|
313
|
+
SYM_PVOL: "昨量",
|
|
314
|
+
SYM_BTRADE: "內盤張數",
|
|
315
|
+
SYM_ATRADE: "外盤張數",
|
|
316
|
+
SYM_NTRADE: "不知盤張數",
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
# 3. 時間/日期相關描述
|
|
320
|
+
SYM_TIME_DESC = {
|
|
321
|
+
SYM_TTIME: "撮合時間",
|
|
322
|
+
SYM_LDATE: "最後交易日/周月線結束日",
|
|
323
|
+
SYM_PDATE: "交易日期",
|
|
324
|
+
SYM_VDATE: "有效日期",
|
|
325
|
+
SYM_STRSTM: "暫停/恢復時間",
|
|
326
|
+
SYM_SECDIFF: "秒差",
|
|
327
|
+
SYM_BIDASKTIME: "買賣價時間戳",
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
# 4. 融資融券相關描述
|
|
331
|
+
SYM_MARGIN_DESC = {
|
|
332
|
+
SYM_K_TMB: "融資買進",
|
|
333
|
+
SYM_K_TMA: "融資賣出",
|
|
334
|
+
SYM_K_TML: "融資余額",
|
|
335
|
+
SYM_K_TSA: "融券賣出",
|
|
336
|
+
SYM_K_TSB: "融券買進",
|
|
337
|
+
SYM_K_TSL: "融券余額",
|
|
338
|
+
SYM_K_TCL: "融資限額",
|
|
339
|
+
SYM_K_TMC: "資券當沖",
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
# 5. 機構交易相關描述
|
|
343
|
+
SYM_INSTITUTION_DESC = {
|
|
344
|
+
SYM_K_SBVOL: "自營買進",
|
|
345
|
+
SYM_K_SSVOL: "自營賣出",
|
|
346
|
+
SYM_K_CBVOL: "投信買進",
|
|
347
|
+
SYM_K_CSVOL: "投信賣出",
|
|
348
|
+
SYM_K_FBVOL: "法人買進",
|
|
349
|
+
SYM_K_FSVOL: "法人賣出",
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
# 6. 股本相關描述
|
|
353
|
+
SYM_EQUITY_DESC = {
|
|
354
|
+
SYM_K_IQTY: "發行股數",
|
|
355
|
+
SYM_K_BQTY: "可投資股數",
|
|
356
|
+
SYM_K_HQTY: "持有持數",
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
# 7. 1~10檔最佳買賣價量描述
|
|
360
|
+
SYM_BEST_BIDASK_DESC = {
|
|
361
|
+
# 買價
|
|
362
|
+
SYM_BESTBID1: "買價1檔",
|
|
363
|
+
SYM_BESTBID2: "買價2檔",
|
|
364
|
+
SYM_BESTBID3: "買價3檔",
|
|
365
|
+
SYM_BESTBID4: "買價4檔",
|
|
366
|
+
SYM_BESTBID5: "買價5檔",
|
|
367
|
+
SYM_BESTBID6: "買價6檔",
|
|
368
|
+
SYM_BESTBID7: "買價7檔",
|
|
369
|
+
SYM_BESTBID8: "買價8檔",
|
|
370
|
+
SYM_BESTBID9: "買價9檔",
|
|
371
|
+
SYM_BESTBID10: "買價10檔",
|
|
372
|
+
# 買量
|
|
373
|
+
SYM_BESTBIDSIZE1: "買量1檔",
|
|
374
|
+
SYM_BESTBIDSIZE2: "買量2檔",
|
|
375
|
+
SYM_BESTBIDSIZE3: "買量3檔",
|
|
376
|
+
SYM_BESTBIDSIZE4: "買量4檔",
|
|
377
|
+
SYM_BESTBIDSIZE5: "買量5檔",
|
|
378
|
+
SYM_BESTBIDSIZE6: "買量6檔",
|
|
379
|
+
SYM_BESTBIDSIZE7: "買量7檔",
|
|
380
|
+
SYM_BESTBIDSIZE8: "買量8檔",
|
|
381
|
+
SYM_BESTBIDSIZE9: "買量9檔",
|
|
382
|
+
SYM_BESTBIDSIZE10: "買量10檔",
|
|
383
|
+
# 賣價
|
|
384
|
+
SYM_BESTASK1: "賣價1檔",
|
|
385
|
+
SYM_BESTASK2: "賣價2檔",
|
|
386
|
+
SYM_BESTASK3: "賣價3檔",
|
|
387
|
+
SYM_BESTASK4: "賣價4檔",
|
|
388
|
+
SYM_BESTASK5: "賣價5檔",
|
|
389
|
+
SYM_BESTASK6: "賣價6檔",
|
|
390
|
+
SYM_BESTASK7: "賣價7檔",
|
|
391
|
+
SYM_BESTASK8: "賣價8檔",
|
|
392
|
+
SYM_BESTASK9: "賣價9檔",
|
|
393
|
+
SYM_BESTASK10: "賣價10檔",
|
|
394
|
+
# 賣量
|
|
395
|
+
SYM_BESTASKSIZE1: "賣量1檔",
|
|
396
|
+
SYM_BESTASKSIZE2: "賣量2檔",
|
|
397
|
+
SYM_BESTASKSIZE3: "賣量3檔",
|
|
398
|
+
SYM_BESTASKSIZE4: "賣量4檔",
|
|
399
|
+
SYM_BESTASKSIZE5: "賣量5檔",
|
|
400
|
+
SYM_BESTASKSIZE6: "賣量6檔",
|
|
401
|
+
SYM_BESTASKSIZE7: "賣量7檔",
|
|
402
|
+
SYM_BESTASKSIZE8: "賣量8檔",
|
|
403
|
+
SYM_BESTASKSIZE9: "賣量9檔",
|
|
404
|
+
SYM_BESTASKSIZE10: "賣量10檔",
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
# 9. 其他補充欄位描述
|
|
408
|
+
SYM_OTHER_DESC = {
|
|
409
|
+
SYM_BIDEXCH: "出買價證交所",
|
|
410
|
+
SYM_ASKEXCH: "出賣價證交所",
|
|
411
|
+
SYM_SNOFLAG: "報價旗標",
|
|
412
|
+
SYM_TRDSTS: "交易狀態(2^1=試撮, 2^2=禁刪, 2^3=暫停, 2^4=收盤)",
|
|
413
|
+
SYM_AVGPRC2: "成交均價",
|
|
414
|
+
SYM_AVGPRC: "成交均價",
|
|
415
|
+
SYM_TERMHIGH: "交易歷史最高",
|
|
416
|
+
SYM_TERMLOW: "交易歷史最低",
|
|
417
|
+
SYM_N_LAST: "大盤指數(不含金融)",
|
|
418
|
+
SYM_N_PREV: "大盤昨收(不含金融)",
|
|
419
|
+
SYM_MATCHTYPE: "內外盤標識(0:外盤 1:內盤)",
|
|
420
|
+
SYM_UVALUE: "單位成交總值",
|
|
421
|
+
SYM_POPEN: "昨開",
|
|
422
|
+
SYM_PHIGH: "昨高",
|
|
423
|
+
SYM_PLOW: "昨低",
|
|
424
|
+
SYM_ASSET: "權值比重",
|
|
425
|
+
SYM_BTL: "總買成筆",
|
|
426
|
+
SYM_ATL: "總賣成筆",
|
|
427
|
+
SYM_WARN: "警示股與否",
|
|
428
|
+
SYM_SETTP: "結算價",
|
|
429
|
+
SYM_SVAL: "個股成交總值",
|
|
430
|
+
SYM_SERIAL: "傳輸序號",
|
|
431
|
+
SYM_SEXCH: "子股市",
|
|
432
|
+
SYM_DATAEND: "資料結束標識",
|
|
433
|
+
SYM_VOLDIFF: "量差",
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
# 10. 全局統一描述映射(整合所有分類,方便一次性查詢)
|
|
437
|
+
SYM_GLOBAL_DESC = {}
|
|
438
|
+
SYM_GLOBAL_DESC.update(SYM_CORE_DESC)
|
|
439
|
+
SYM_GLOBAL_DESC.update(SYM_VOLUME_DESC)
|
|
440
|
+
SYM_GLOBAL_DESC.update(SYM_TIME_DESC)
|
|
441
|
+
SYM_GLOBAL_DESC.update(SYM_MARGIN_DESC)
|
|
442
|
+
SYM_GLOBAL_DESC.update(SYM_INSTITUTION_DESC)
|
|
443
|
+
SYM_GLOBAL_DESC.update(SYM_EQUITY_DESC)
|
|
444
|
+
SYM_GLOBAL_DESC.update(SYM_BEST_BIDASK_DESC)
|
|
445
|
+
SYM_GLOBAL_DESC.update(SYM_OTHER_DESC)
|
|
446
|
+
|
|
447
|
+
# 證券
|
|
448
|
+
EXC_STOCK = 1
|
|
449
|
+
EXC_STOCK_T1 = 1 # 上柜
|
|
450
|
+
EXC_STOCK_T4 = 4 # 興柜
|
|
451
|
+
# 金融期貨
|
|
452
|
+
EXC_FITX = 2
|
|
453
|
+
EXC_FITX_T2 = 2 # 非個股期貨
|
|
454
|
+
EXC_FITX_T3 = 3 # 選擇權
|
|
455
|
+
EXC_FITX_T5 = 5 # 非個股期貨復式
|
|
456
|
+
EXC_FITX_T6 = 6 # 個股期貨
|
|
457
|
+
EXC_FITX_T7 = 7 # 個股期貨復式
|
|
458
|
+
# 金融期貨夜盤
|
|
459
|
+
EXC_FITXN = 12
|
|
460
|
+
EXC_FITXN_T2 = 2 # 非個股期貨夜盤
|
|
461
|
+
EXC_FITXN_T3 = 3 # 選擇權夜盤
|
|
462
|
+
EXC_FITXN_T5 = 5 # 非個股期貨復式夜盤
|
|
463
|
+
EXC_FITXN_T6 = 6 # 個股期貨夜盤
|
|
464
|
+
EXC_FITXN_T7 = 7 # 個股期貨復式夜盤
|
|
465
|
+
|
|
466
|
+
# //---------------------------------------------------------------------------
|
|
467
|
+
# // 市場類型(證券/金融期貨)常量定義
|
|
468
|
+
# //---------------------------------------------------------------------------
|
|
469
|
+
# 證券相關
|
|
470
|
+
EXC_STOCK = 1 # 證券主類型
|
|
471
|
+
EXC_STOCK_T1 = 1 # 上柜(證券細分類型)
|
|
472
|
+
EXC_STOCK_T4 = 4 # 興柜(證券細分類型)
|
|
473
|
+
|
|
474
|
+
# 金融期貨相關(日盤)
|
|
475
|
+
EXC_FITX = 2 # 金融期貨主類型(日盤)
|
|
476
|
+
EXC_FITX_T2 = 2 # 非個股期貨(金融期貨日盤細分)
|
|
477
|
+
EXC_FITX_T3 = 3 # 選擇權(金融期貨日盤細分)
|
|
478
|
+
EXC_FITX_T5 = 5 # 非個股期貨復式(金融期貨日盤細分)
|
|
479
|
+
EXC_FITX_T6 = 6 # 個股期貨(金融期貨日盤細分)
|
|
480
|
+
EXC_FITX_T7 = 7 # 個股期貨復式(金融期貨日盤細分)
|
|
481
|
+
|
|
482
|
+
# 金融期貨相關(夜盤)
|
|
483
|
+
EXC_FITXN = 12 # 金融期貨主類型(夜盤)
|
|
484
|
+
EXC_FITXN_T2 = 2 # 非個股期貨夜盤(金融期貨夜盤細分)
|
|
485
|
+
EXC_FITXN_T3 = 3 # 選擇權夜盤(金融期貨夜盤細分)
|
|
486
|
+
EXC_FITXN_T5 = 5 # 非個股期貨復式夜盤(金融期貨夜盤細分)
|
|
487
|
+
EXC_FITXN_T6 = 6 # 個股期貨夜盤(金融期貨夜盤細分)
|
|
488
|
+
EXC_FITXN_T7 = 7 # 個股期貨復式夜盤(金融期貨夜盤細分)
|
|
489
|
+
|
|
490
|
+
# //---------------------------------------------------------------------------
|
|
491
|
+
# // 市場類型統一描述映射(唯一字典:STOCK_EXC_DESC)
|
|
492
|
+
# // 格式:{代碼: "完整描述(含主類型+細分類型)"}
|
|
493
|
+
# //---------------------------------------------------------------------------
|
|
494
|
+
STOCK_EXC_DESC = {
|
|
495
|
+
# 證券主類型+細分類型
|
|
496
|
+
EXC_STOCK: "證券",
|
|
497
|
+
EXC_STOCK_T1: "上柜",
|
|
498
|
+
EXC_STOCK_T4: "興柜",
|
|
499
|
+
|
|
500
|
+
# 金融期貨(日盤)主類型+細分類型
|
|
501
|
+
EXC_FITX: "金融期貨(日盤)",
|
|
502
|
+
EXC_FITX_T2: "非個股期貨",
|
|
503
|
+
EXC_FITX_T3: "選擇權",
|
|
504
|
+
EXC_FITX_T5: "非個股期貨復式",
|
|
505
|
+
EXC_FITX_T6: "個股期貨",
|
|
506
|
+
EXC_FITX_T7: "個股期貨復式",
|
|
507
|
+
|
|
508
|
+
# 金融期貨(夜盤)主類型+細分類型
|
|
509
|
+
EXC_FITXN: "金融期貨(夜盤)",
|
|
510
|
+
EXC_FITXN_T2: "非個股期貨夜盤",
|
|
511
|
+
EXC_FITXN_T3: "選擇權夜盤",
|
|
512
|
+
EXC_FITXN_T5: "非個股期貨復式夜盤",
|
|
513
|
+
EXC_FITXN_T6: "個股期貨夜盤",
|
|
514
|
+
EXC_FITXN_T7: "個股期貨復式夜盤"
|
|
515
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: PyNetstockQuoteLib
|
|
3
|
+
Version: 1.0.9
|
|
4
|
+
Summary: 兆源股份有限公司(FISTEK)提供台股報價API
|
|
5
|
+
Author-email: WeiTian <twccad@163.com>
|
|
6
|
+
Classifier: Operating System :: Microsoft :: Windows :: Windows 7
|
|
7
|
+
Classifier: Operating System :: Microsoft :: Windows :: Windows 8
|
|
8
|
+
Classifier: Operating System :: Microsoft :: Windows :: Windows 8.1
|
|
9
|
+
Classifier: Operating System :: Microsoft :: Windows :: Windows 10
|
|
10
|
+
Classifier: Operating System :: Microsoft :: Windows :: Windows 11
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Requires-Python: >=3.8
|
|
13
|
+
Description-Content-Type: text/markdown
|
|
14
|
+
License-File: LICENSE.txt
|
|
15
|
+
Dynamic: license-file
|
|
16
|
+
|
|
17
|
+
# PyNetstockQuoteLib簡介<br>
|
|
18
|
+
|
|
19
|
+
針對臺灣股期交易市場,兆源公司提供輕量級報價API模組<br>
|
|
20
|
+
## 功能:<br>
|
|
21
|
+
即時提供證券、期貨與期權市場報價,多合一接口<br>
|
|
22
|
+
## 特點:<br>
|
|
23
|
+
1. 極致化 高效,快速響應市場行情<br>
|
|
24
|
+
2. 輕量級,整包大小不到 200 KB<br>
|
|
25
|
+
適合需要高速數據獲取且對資源占用敏感的應用場景<br>
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
**安裝方法:pip install PyNetstockQuoteLib**<br>
|
|
29
|
+
申請帳號請洽公司網站:https://www.fistek.com/<br>
|
|
30
|
+
電話:+886-2-87717385<br>
|
|
31
|
+
地址:臺灣臺北市大安區106光復南路72巷73號3樓<br>
|
|
32
|
+
|
|
33
|
+
## 函數列表:<br>
|
|
34
|
+
**1,連接**<br>
|
|
35
|
+
`def Connect(Address: str, nPort: unsigned short)-> bool: ...`<br>
|
|
36
|
+
**2,斷開連接**<br>
|
|
37
|
+
`def Disconnect() -> None: ...`<br>
|
|
38
|
+
**3,登錄**<br>
|
|
39
|
+
`def Login(UserName: str, Password: str, Software: str, Version: str, Company: str, Branch: str) -> None: ...`<br>
|
|
40
|
+
**4,運行阻塞函數**<br>
|
|
41
|
+
`def Go() -> None: ...`<br>
|
|
42
|
+
**5,注冊報價函數**<br>
|
|
43
|
+
`def SubscribeToQuote(Symbol: str, Exc: int, sExc: int = -1, rlot:bool = False) -> int: ...`<br>
|
|
44
|
+
**6,關閉注冊報價**<br>
|
|
45
|
+
`def CloseSubscribe(Index: int) -> bool: ...`<br>
|
|
46
|
+
**7,注冊Tick函數**<br>
|
|
47
|
+
`def SubscribeToTick(Symbol: str, Exc: int, sExc: int = -1, rlot:bool = False) -> int: ...`<br>
|
|
48
|
+
**8,獲得報價**<br>
|
|
49
|
+
`def GetQuote(Index: int, Field: int) -> int | float: ...`<br>
|
|
50
|
+
**9,獲得Tick數據**<br>
|
|
51
|
+
`def GetTick(Index:int)-> List[Dict[str, Union[int, float]]]: ...`<br>
|
|
52
|
+
**10,獲得基本資料(9-16)**<br>
|
|
53
|
+
`def GetInfo(Exc:int, Symbol:str, Field:str, sExc:int)-> str: ...`<br>
|
|
54
|
+
**11,設置主動回報callback**<br>
|
|
55
|
+
`def SetNoticeCallback(callback: Callable[[int, int, object, int], None]) -> None: ...`<br>
|
|
56
|
+
**12,設置登錄回報函數**<br>
|
|
57
|
+
`def SetLoginCallback(callback: Callable[[int, str, int], None]) -> None: ...`<br>
|
|
58
|
+
**13,設置交易日資訊回報函數**<br>
|
|
59
|
+
`def SetExcInfoCallback(callback: Callable[[int, int], None]) -> None: ...`<br>
|
|
60
|
+
**14,設置基本資料更新回報函數**<br>
|
|
61
|
+
`def SetStkiCallback(callback: Callable[[int, int, int], None]) -> None: ...`<br>
|
|
62
|
+
**15,設置報價回報callback**<br>
|
|
63
|
+
`def SetQuoteCallback(callback: Callable[[int, int], None]) -> None: ...`<br>
|
|
64
|
+
**16,設置Tick回報函數**<br>
|
|
65
|
+
`def SetTickCallback(callback: Callable[[int], None]) -> None: ...`<br>
|
|
66
|
+
|
|
67
|
+
## 示例1:Quote.py<br>
|
|
68
|
+
```python
|
|
69
|
+
import PyNetstockQuoteLib as NsQuote
|
|
70
|
+
|
|
71
|
+
Ind = 0
|
|
72
|
+
Ind1 = 0
|
|
73
|
+
#登錄回報
|
|
74
|
+
def OnLogin(Type,pInfo,InfoSize):
|
|
75
|
+
if(Type == NsQuote.SMSGL_LOGIN_OKAY):
|
|
76
|
+
global Ind,Ind1
|
|
77
|
+
print("登錄成功!")
|
|
78
|
+
#登錄成功后對商品進行報價訂閱
|
|
79
|
+
Ind = NsQuote.SubscribeToQuote("FITX",NsQuote.EXC_FITXN,NsQuote.EXC_FITX_T2)
|
|
80
|
+
Ind1 = NsQuote.SubscribeToQuote("2330",NsQuote.EXC_STOCK)
|
|
81
|
+
else:
|
|
82
|
+
print("登錄失敗")
|
|
83
|
+
#報價回報
|
|
84
|
+
def OnQuote(Index,Type):
|
|
85
|
+
if(Type == 1):
|
|
86
|
+
global Ind,Ind1
|
|
87
|
+
if(Index == Ind):
|
|
88
|
+
print("Sym:FITX,Name:" + NsQuote.GetInfo(NsQuote.EXC_FITXN,"FITX","name") +
|
|
89
|
+
"," + NsQuote.SYM_GLOBAL_DESC[NsQuote.SYM_LAST] +":" +
|
|
90
|
+
str(NsQuote.GetQuote(Index,NsQuote.SYM_LAST)) +
|
|
91
|
+
"," + NsQuote.SYM_GLOBAL_DESC[NsQuote.SYM_VOLUME] +":" +
|
|
92
|
+
str(NsQuote.GetQuote(Index,NsQuote.SYM_VOLUME)))
|
|
93
|
+
if(Index == Ind1):
|
|
94
|
+
print("Sym:2330,Last:" + str(NsQuote.GetQuote(Index,NsQuote.SYM_LAST)) +
|
|
95
|
+
",Vol:" + str(NsQuote.GetQuote(Index,NsQuote.SYM_VOLUME)))
|
|
96
|
+
|
|
97
|
+
#啟動入口
|
|
98
|
+
if NsQuote.Connect():
|
|
99
|
+
print("連接成功")
|
|
100
|
+
NsQuote.SetLoginCallback(OnLogin)
|
|
101
|
+
NsQuote.SetQuoteCallback(OnQuote)
|
|
102
|
+
NsQuote.Login("xxxxx", "xxxxx")
|
|
103
|
+
NsQuote.Go()
|
|
104
|
+
else:
|
|
105
|
+
print("連接失敗")
|
|
106
|
+
print("Over")
|
|
107
|
+
```
|
|
108
|
+
## 示例2:Tick.py<br>
|
|
109
|
+
```python
|
|
110
|
+
import PyNetstockQuoteLib as NsQuote
|
|
111
|
+
|
|
112
|
+
indTick = 0
|
|
113
|
+
#登錄回報
|
|
114
|
+
def OnLogin(Type,pInfo,InfoSize):
|
|
115
|
+
if(Type == NsQuote.SMSGL_LOGIN_OKAY):
|
|
116
|
+
print("登錄成功!")
|
|
117
|
+
else:
|
|
118
|
+
print("登錄失敗")
|
|
119
|
+
#Tick回報
|
|
120
|
+
def OnTick(Index):
|
|
121
|
+
#獲得Tick數據,返回字典列表迭代器
|
|
122
|
+
TickList = NsQuote.GetTick(Index)
|
|
123
|
+
#獲得Tick總數
|
|
124
|
+
Ticklen = len(TickList)
|
|
125
|
+
count = 0
|
|
126
|
+
#用基本資料獲取商品名稱
|
|
127
|
+
print(NsQuote.GetInfo(NsQuote.EXC_FITXN,"FITX","name"))
|
|
128
|
+
#顯示本次Tick信息
|
|
129
|
+
print("Index:" + str(Index) + " TickCount:",str(Ticklen))
|
|
130
|
+
#顯示10條數據用于測試
|
|
131
|
+
for Item in TickList:
|
|
132
|
+
print(Item)#Item是字典對象,實際使用時可以用Key取單元數據例如:Item["Last"]
|
|
133
|
+
count = count + 1
|
|
134
|
+
if (count >=10): break
|
|
135
|
+
#交易日資訊回報
|
|
136
|
+
def OnExcInfo(Type,Exc):
|
|
137
|
+
if(Exc == NsQuote.EXC_FITXN):#收到對應市場交易日資訊后注冊(較為單純)
|
|
138
|
+
global indTick
|
|
139
|
+
indTick = NsQuote.SubscribeToTick("FITX",NsQuote.EXC_FITXN,NsQuote.EXC_FITX_T2)
|
|
140
|
+
#程序入口
|
|
141
|
+
if NsQuote.Connect():
|
|
142
|
+
print("連接成功")
|
|
143
|
+
NsQuote.SetLoginCallback(OnLogin)
|
|
144
|
+
NsQuote.SetExcInfoCallback(OnExcInfo)
|
|
145
|
+
NsQuote.SetTickCallback(OnTick)
|
|
146
|
+
NsQuote.Login("xxxxx", "xxxxx")
|
|
147
|
+
NsQuote.Go()
|
|
148
|
+
else:
|
|
149
|
+
print("連接失敗")
|
|
150
|
+
print("Over")
|
|
151
|
+
```
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
LICENSE.txt
|
|
2
|
+
README.md
|
|
3
|
+
pyproject.toml
|
|
4
|
+
setup.py
|
|
5
|
+
PyNetstockQuoteLib/PyNetstockQuoteLib.pyd
|
|
6
|
+
PyNetstockQuoteLib/PyNetstockQuoteLib.pyi
|
|
7
|
+
PyNetstockQuoteLib/README.md
|
|
8
|
+
PyNetstockQuoteLib/__init__.py
|
|
9
|
+
PyNetstockQuoteLib/define.py
|
|
10
|
+
PyNetstockQuoteLib.egg-info/PKG-INFO
|
|
11
|
+
PyNetstockQuoteLib.egg-info/SOURCES.txt
|
|
12
|
+
PyNetstockQuoteLib.egg-info/dependency_links.txt
|
|
13
|
+
PyNetstockQuoteLib.egg-info/top_level.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
PyNetstockQuoteLib
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# PyNetstockQuoteLib簡介<br>
|
|
2
|
+
|
|
3
|
+
針對臺灣股期交易市場,兆源公司提供輕量級報價API模組<br>
|
|
4
|
+
## 功能:<br>
|
|
5
|
+
即時提供證券、期貨與期權市場報價,多合一接口<br>
|
|
6
|
+
## 特點:<br>
|
|
7
|
+
1. 極致化 高效,快速響應市場行情<br>
|
|
8
|
+
2. 輕量級,整包大小不到 200 KB<br>
|
|
9
|
+
適合需要高速數據獲取且對資源占用敏感的應用場景<br>
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
**安裝方法:pip install PyNetstockQuoteLib**<br>
|
|
13
|
+
申請帳號請洽公司網站:https://www.fistek.com/<br>
|
|
14
|
+
電話:+886-2-87717385<br>
|
|
15
|
+
地址:臺灣臺北市大安區106光復南路72巷73號3樓<br>
|
|
16
|
+
|
|
17
|
+
## 函數列表:<br>
|
|
18
|
+
**1,連接**<br>
|
|
19
|
+
`def Connect(Address: str, nPort: unsigned short)-> bool: ...`<br>
|
|
20
|
+
**2,斷開連接**<br>
|
|
21
|
+
`def Disconnect() -> None: ...`<br>
|
|
22
|
+
**3,登錄**<br>
|
|
23
|
+
`def Login(UserName: str, Password: str, Software: str, Version: str, Company: str, Branch: str) -> None: ...`<br>
|
|
24
|
+
**4,運行阻塞函數**<br>
|
|
25
|
+
`def Go() -> None: ...`<br>
|
|
26
|
+
**5,注冊報價函數**<br>
|
|
27
|
+
`def SubscribeToQuote(Symbol: str, Exc: int, sExc: int = -1, rlot:bool = False) -> int: ...`<br>
|
|
28
|
+
**6,關閉注冊報價**<br>
|
|
29
|
+
`def CloseSubscribe(Index: int) -> bool: ...`<br>
|
|
30
|
+
**7,注冊Tick函數**<br>
|
|
31
|
+
`def SubscribeToTick(Symbol: str, Exc: int, sExc: int = -1, rlot:bool = False) -> int: ...`<br>
|
|
32
|
+
**8,獲得報價**<br>
|
|
33
|
+
`def GetQuote(Index: int, Field: int) -> int | float: ...`<br>
|
|
34
|
+
**9,獲得Tick數據**<br>
|
|
35
|
+
`def GetTick(Index:int)-> List[Dict[str, Union[int, float]]]: ...`<br>
|
|
36
|
+
**10,獲得基本資料(9-16)**<br>
|
|
37
|
+
`def GetInfo(Exc:int, Symbol:str, Field:str, sExc:int)-> str: ...`<br>
|
|
38
|
+
**11,設置主動回報callback**<br>
|
|
39
|
+
`def SetNoticeCallback(callback: Callable[[int, int, object, int], None]) -> None: ...`<br>
|
|
40
|
+
**12,設置登錄回報函數**<br>
|
|
41
|
+
`def SetLoginCallback(callback: Callable[[int, str, int], None]) -> None: ...`<br>
|
|
42
|
+
**13,設置交易日資訊回報函數**<br>
|
|
43
|
+
`def SetExcInfoCallback(callback: Callable[[int, int], None]) -> None: ...`<br>
|
|
44
|
+
**14,設置基本資料更新回報函數**<br>
|
|
45
|
+
`def SetStkiCallback(callback: Callable[[int, int, int], None]) -> None: ...`<br>
|
|
46
|
+
**15,設置報價回報callback**<br>
|
|
47
|
+
`def SetQuoteCallback(callback: Callable[[int, int], None]) -> None: ...`<br>
|
|
48
|
+
**16,設置Tick回報函數**<br>
|
|
49
|
+
`def SetTickCallback(callback: Callable[[int], None]) -> None: ...`<br>
|
|
50
|
+
|
|
51
|
+
## 示例1:Quote.py<br>
|
|
52
|
+
```python
|
|
53
|
+
import PyNetstockQuoteLib as NsQuote
|
|
54
|
+
|
|
55
|
+
Ind = 0
|
|
56
|
+
Ind1 = 0
|
|
57
|
+
#登錄回報
|
|
58
|
+
def OnLogin(Type,pInfo,InfoSize):
|
|
59
|
+
if(Type == NsQuote.SMSGL_LOGIN_OKAY):
|
|
60
|
+
global Ind,Ind1
|
|
61
|
+
print("登錄成功!")
|
|
62
|
+
#登錄成功后對商品進行報價訂閱
|
|
63
|
+
Ind = NsQuote.SubscribeToQuote("FITX",NsQuote.EXC_FITXN,NsQuote.EXC_FITX_T2)
|
|
64
|
+
Ind1 = NsQuote.SubscribeToQuote("2330",NsQuote.EXC_STOCK)
|
|
65
|
+
else:
|
|
66
|
+
print("登錄失敗")
|
|
67
|
+
#報價回報
|
|
68
|
+
def OnQuote(Index,Type):
|
|
69
|
+
if(Type == 1):
|
|
70
|
+
global Ind,Ind1
|
|
71
|
+
if(Index == Ind):
|
|
72
|
+
print("Sym:FITX,Name:" + NsQuote.GetInfo(NsQuote.EXC_FITXN,"FITX","name") +
|
|
73
|
+
"," + NsQuote.SYM_GLOBAL_DESC[NsQuote.SYM_LAST] +":" +
|
|
74
|
+
str(NsQuote.GetQuote(Index,NsQuote.SYM_LAST)) +
|
|
75
|
+
"," + NsQuote.SYM_GLOBAL_DESC[NsQuote.SYM_VOLUME] +":" +
|
|
76
|
+
str(NsQuote.GetQuote(Index,NsQuote.SYM_VOLUME)))
|
|
77
|
+
if(Index == Ind1):
|
|
78
|
+
print("Sym:2330,Last:" + str(NsQuote.GetQuote(Index,NsQuote.SYM_LAST)) +
|
|
79
|
+
",Vol:" + str(NsQuote.GetQuote(Index,NsQuote.SYM_VOLUME)))
|
|
80
|
+
|
|
81
|
+
#啟動入口
|
|
82
|
+
if NsQuote.Connect():
|
|
83
|
+
print("連接成功")
|
|
84
|
+
NsQuote.SetLoginCallback(OnLogin)
|
|
85
|
+
NsQuote.SetQuoteCallback(OnQuote)
|
|
86
|
+
NsQuote.Login("xxxxx", "xxxxx")
|
|
87
|
+
NsQuote.Go()
|
|
88
|
+
else:
|
|
89
|
+
print("連接失敗")
|
|
90
|
+
print("Over")
|
|
91
|
+
```
|
|
92
|
+
## 示例2:Tick.py<br>
|
|
93
|
+
```python
|
|
94
|
+
import PyNetstockQuoteLib as NsQuote
|
|
95
|
+
|
|
96
|
+
indTick = 0
|
|
97
|
+
#登錄回報
|
|
98
|
+
def OnLogin(Type,pInfo,InfoSize):
|
|
99
|
+
if(Type == NsQuote.SMSGL_LOGIN_OKAY):
|
|
100
|
+
print("登錄成功!")
|
|
101
|
+
else:
|
|
102
|
+
print("登錄失敗")
|
|
103
|
+
#Tick回報
|
|
104
|
+
def OnTick(Index):
|
|
105
|
+
#獲得Tick數據,返回字典列表迭代器
|
|
106
|
+
TickList = NsQuote.GetTick(Index)
|
|
107
|
+
#獲得Tick總數
|
|
108
|
+
Ticklen = len(TickList)
|
|
109
|
+
count = 0
|
|
110
|
+
#用基本資料獲取商品名稱
|
|
111
|
+
print(NsQuote.GetInfo(NsQuote.EXC_FITXN,"FITX","name"))
|
|
112
|
+
#顯示本次Tick信息
|
|
113
|
+
print("Index:" + str(Index) + " TickCount:",str(Ticklen))
|
|
114
|
+
#顯示10條數據用于測試
|
|
115
|
+
for Item in TickList:
|
|
116
|
+
print(Item)#Item是字典對象,實際使用時可以用Key取單元數據例如:Item["Last"]
|
|
117
|
+
count = count + 1
|
|
118
|
+
if (count >=10): break
|
|
119
|
+
#交易日資訊回報
|
|
120
|
+
def OnExcInfo(Type,Exc):
|
|
121
|
+
if(Exc == NsQuote.EXC_FITXN):#收到對應市場交易日資訊后注冊(較為單純)
|
|
122
|
+
global indTick
|
|
123
|
+
indTick = NsQuote.SubscribeToTick("FITX",NsQuote.EXC_FITXN,NsQuote.EXC_FITX_T2)
|
|
124
|
+
#程序入口
|
|
125
|
+
if NsQuote.Connect():
|
|
126
|
+
print("連接成功")
|
|
127
|
+
NsQuote.SetLoginCallback(OnLogin)
|
|
128
|
+
NsQuote.SetExcInfoCallback(OnExcInfo)
|
|
129
|
+
NsQuote.SetTickCallback(OnTick)
|
|
130
|
+
NsQuote.Login("xxxxx", "xxxxx")
|
|
131
|
+
NsQuote.Go()
|
|
132
|
+
else:
|
|
133
|
+
print("連接失敗")
|
|
134
|
+
print("Over")
|
|
135
|
+
```
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=65.0", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
# 必须与包名完全一致
|
|
7
|
+
name = "PyNetstockQuoteLib"
|
|
8
|
+
version = "1.0.9"
|
|
9
|
+
authors = [{"name" = "WeiTian", "email" = "twccad@163.com"}]
|
|
10
|
+
description = "兆源股份有限公司(FISTEK)提供台股報價API"
|
|
11
|
+
readme = "README.md"
|
|
12
|
+
license = { file = "LICENSE" } # 替换为实际许可证文件(若存在)
|
|
13
|
+
requires-python = ">=3.8"
|
|
14
|
+
classifiers = [
|
|
15
|
+
"Operating System :: Microsoft :: Windows :: Windows 7",
|
|
16
|
+
"Operating System :: Microsoft :: Windows :: Windows 8",
|
|
17
|
+
"Operating System :: Microsoft :: Windows :: Windows 8.1",
|
|
18
|
+
"Operating System :: Microsoft :: Windows :: Windows 10",
|
|
19
|
+
"Operating System :: Microsoft :: Windows :: Windows 11",
|
|
20
|
+
"Programming Language :: Python :: 3"
|
|
21
|
+
]
|
|
22
|
+
# 包数据配置(必须放在tool.setuptools下)
|
|
23
|
+
[tool.setuptools.package-data]
|
|
24
|
+
PyNetstockQuoteLib = ["*.pyd", "*.pyi", "*.py","*.md"]
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import platform
|
|
3
|
+
from setuptools import setup
|
|
4
|
+
|
|
5
|
+
def check_compatibility():
|
|
6
|
+
# 1. 仅允许 Windows 系统(排除 Linux/macOS)
|
|
7
|
+
if sys.platform != "win32":
|
|
8
|
+
raise RuntimeError("该包依赖 Windows 专属 .pyd 扩展,仅支持 Windows 系统!")
|
|
9
|
+
# 2. 仅允许 x64(64位)架构(.pyd 若为 64位编译,需拦截 32位系统)
|
|
10
|
+
if platform.machine() != "AMD64":
|
|
11
|
+
raise RuntimeError("该包仅支持 64位(x64)Windows 系统!")
|
|
12
|
+
# 3. 仅允许 Windows 7 及以上版本
|
|
13
|
+
win_version = float(platform.release()) # 处理 Win8.1(返回 8.1)
|
|
14
|
+
if win_version < 7.0:
|
|
15
|
+
raise RuntimeError("该包要求 Windows 7 及以上版本!")
|
|
16
|
+
|
|
17
|
+
# 安装前执行校验,失败则终止安装
|
|
18
|
+
check_compatibility()
|
|
19
|
+
|
|
20
|
+
# 读取 pyproject.toml 配置,无需重复写其他参数
|
|
21
|
+
setup()
|