Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
cb6cec6
解决冲突
byblehua Dec 14, 2020
6f7e7c7
Revert "解决冲突"
byblehua Dec 14, 2020
97789d4
Revert "修正单词误写"
byblehua Dec 14, 2020
bc83c10
fix 错别字把“涡轮”改成正确的“窝轮”
Dec 17, 2020
dfffdf5
Revert "Revert "修正单词误写""
byblehua Dec 21, 2020
52f950e
修改灰度版本号4.0.1300
byblehua Dec 21, 2020
9f43020
交易账号列表增加sim_acc_type字段
Dec 22, 2020
c169315
交易账户资金增加新数据
Dec 24, 2020
5f5c216
获取最大可买卖增加期货和期权初始保证金
Dec 25, 2020
c565825
add 快照和报价接口,美股期权的支持。
Dec 28, 2020
53be931
fix 快照和报价的枚举类型的字段,统一设置成N/A。
Jan 5, 2021
a21a5cc
add pythonAPI窝轮的发行商新增国君字段。Issuer_GJ 国君。
Jan 12, 2021
2461ab4
add pythonAPI窝轮的发行商新增国君字段。Issuer_GJ 国君。
Jan 12, 2021
e004941
增加CltRiskStatus_Unknown枚举
Jan 18, 2021
ce6ff0a
Merge branch '2101' of github.com:FutunnOpen/py-futu-api into 2101
Jan 18, 2021
0cec1fb
add Python API 条件选股接口,优化补充财务数据和累积数据的提取方式
Jan 21, 2021
fdcf346
Merge remote-tracking branch 'origin/2101'
byblehua Jan 21, 2021
d92d176
add PythonAPI所有接口的枚举类型统一初始化为N/A。
Jan 27, 2021
682ba02
解锁交易协议更新
Feb 3, 2021
2e5ff32
版本号修改提交
byblehua Feb 23, 2021
0bdfeec
Merge remote-tracking branch 'origin/2102'
byblehua Mar 8, 2021
4b8ec96
修改版本号
byblehua Mar 8, 2021
4e42d44
修改版本号5.1.1320
byblehua Mar 8, 2021
0b546ad
更新proto
Mar 8, 2021
5b5abfe
支持jp和sg期货交易
Mar 9, 2021
6fd04ce
更新遗漏proto
Mar 10, 2021
96a5302
add 新增3min到价提醒字段,更新PythonAPI。
Mar 10, 2021
d76ab5a
fix:当收包过多处理不过来时,可以及时发送keep-alive,且不会因为收keep-alive超时而断开连接
Mar 10, 2021
eb8c02d
Merge remote-tracking branch 'origin/master' into 2103
byblehua Mar 23, 2021
c2afe83
修改版本号
byblehua Mar 23, 2021
da89e86
增加新加坡券商
Mar 31, 2021
ec32e5a
修改版本号
byblehua Apr 1, 2021
5ef9e64
pipy页面介绍
FutunnOpen Apr 14, 2021
2b6ded1
用户资金增加日元信息
Apr 16, 2021
75d0e39
Merge remote-tracking branch 'origin/2104'
byblehua Apr 26, 2021
3ff6a3f
fix:之前的网络收包优化有问题,可能造成缓存中的数据不能及时处理
Apr 26, 2021
3b194a2
Merge remote-tracking branch 'origin/2104'
byblehua Apr 27, 2021
b78ab08
同步5.4版本内容
byblehua Jun 17, 2021
4e9043c
修改正式版本号
byblehua Jun 17, 2021
85688c6
同步2106
byblehua Jun 22, 2021
80f322f
同步5.6.1808
byblehua Jul 15, 2021
caa2f13
修改版本号
byblehua Jul 15, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion futu/VERSION.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
4.0.1299
5.6.1808
107 changes: 88 additions & 19 deletions futu/common/constant.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class ProtoId(object):
InitConnect = 1001 # 初始化连接
GetGlobalState = 1002 # 获取全局状态
Notify = 1003 # 通知推送
KeepAlive = 1004 # 通知推送
KeepAlive = 1004 # 心跳保活
GetUserInfo = 1005 # 获取用户信息
Verification = 1006 # 请求或输入验证码
GetDelayStatistics = 1007 # 获取延迟统计
Expand All @@ -48,6 +48,7 @@ class ProtoId(object):
Trd_GetHistoryOrderList = 2221 # 获取历史订单列表
Trd_GetHistoryOrderFillList = 2222 # 获取历史成交列表
Trd_GetMaxTrdQtys = 2111 # 查询最大买卖数量
Trd_GetMarginRatio = 2223 # 获取融资融券数据

# 订阅数据
Qot_Sub = 3001 # 订阅或者反订阅
Expand All @@ -73,7 +74,6 @@ class ProtoId(object):
Qot_RequestRehab = 3105 # 获取除权信息

# 其他行情数据
Qot_GetTradeDate = 3200 # 获取市场交易日
Qot_GetSuspend = 3201 # 获取股票停牌信息
Qot_GetStaticInfo = 3202 # 获取股票列表
Qot_GetSecuritySnapshot = 3203 # 获取股票快照
Expand All @@ -84,10 +84,7 @@ class ProtoId(object):
Qot_GetHoldingChangeList = 3208 # 获取高管持股变动
Qot_GetOptionChain = 3209 # 获取期权链

Qot_GetOrderDetail = 3016 # 获取委托明细
Qot_UpdateOrderDetail = 3017 # 推送委托明细

Qot_GetWarrant = 3210 # 拉取涡轮信息
Qot_GetWarrant = 3210 # 拉取窝轮信息
Qot_GetCapitalFlow = 3211 # 获取资金流向
Qot_GetCapitalDistribution = 3212 # 获取资金分布

Expand All @@ -103,6 +100,8 @@ class ProtoId(object):

Qot_GetUserSecurityGroup = 3222 # 获取自选股分组
Qot_GetMarketState = 3223 # 获取指定品种的市场状态
Qot_GetOptionExpirationDate = 3224 # 获取期权到期日

All_PushId = [Notify, KeepAlive, Trd_UpdateOrder, Trd_UpdateOrderFill, Qot_UpdateBroker,
Qot_UpdateOrderBook, Qot_UpdateKL, Qot_UpdateRT, Qot_UpdateBasicQot, Qot_UpdateTicker, Qot_UpdatePriceReminder]

Expand Down Expand Up @@ -255,6 +254,8 @@ class Market(FtEnum):
SH = "SH"
SZ = "SZ"
HK_FUTURE = "HK_FUTURE"
SG = "SG"
JP = "JP"

def load_dic(self):
return {
Expand All @@ -264,6 +265,8 @@ def load_dic(self):
self.SH: Qot_Common_pb2.QotMarket_CNSH_Security,
self.SZ: Qot_Common_pb2.QotMarket_CNSZ_Security,
self.HK_FUTURE: Qot_Common_pb2.QotMarket_HK_Future,
self.SG: Qot_Common_pb2.QotMarket_SG_Security,
self.JP: Qot_Common_pb2.QotMarket_JP_Security
}

QOT_MARKET_TO_TRD_SEC_MARKET_MAP = {
Expand All @@ -273,6 +276,8 @@ def load_dic(self):
Qot_Common_pb2.QotMarket_HK_Security: Trd_Common_pb2.TrdSecMarket_HK,
Qot_Common_pb2.QotMarket_HK_Future: Trd_Common_pb2.TrdSecMarket_HK,
Qot_Common_pb2.QotMarket_US_Security: Trd_Common_pb2.TrdSecMarket_US,
Qot_Common_pb2.QotMarket_SG_Security: Trd_Common_pb2.TrdSecMarket_SG,
Qot_Common_pb2.QotMarket_JP_Security: Trd_Common_pb2.TrdSecMarket_JP,
}


Expand Down Expand Up @@ -393,7 +398,7 @@ class SecurityType(FtEnum):
.. py:attribute:: ETF
交易所交易基金(Exchange Traded Funds)
.. py:attribute:: WARRANT
港股涡轮牛熊证
港股窝轮牛熊证
.. py:attribute:: BOND
债券
.. py:attribute:: DRVT
Expand Down Expand Up @@ -461,14 +466,11 @@ class SubType(FtEnum):
分时
.. py:attribute:: BROKER
买卖经纪
.. py:attribute:: ORDER_DETAIL
委托明细
"""
NONE = "N/A"
TICKER = "TICKER"
QUOTE = "QUOTE"
ORDER_BOOK = "ORDER_BOOK"
# ORDER_DETAIL = "ORDER_DETAIL"
K_1M = "K_1M"
K_3M = "K_3M"
K_5M = "K_5M"
Expand Down Expand Up @@ -1358,7 +1360,7 @@ def load_dic(self):
'''-------------------------SortField----------------------------'''


# 涡轮排序
# 窝轮排序
class SortField(FtEnum):
NONE = "N/A" # 未知
CODE = "CODE" # 代码
Expand Down Expand Up @@ -1472,7 +1474,7 @@ def load_dic(self):
'''-------------------------IpoPeriod----------------------------'''


# 涡轮上市日
# 窝轮上市日
class IpoPeriod(FtEnum):
NONE = "N/A" # 未知
TODAY = "TODAY" # 今日上市
Expand All @@ -1495,7 +1497,7 @@ def load_dic(self):
'''-------------------------PriceType----------------------------'''


# 涡轮价外/内,界内证表示界内界外
# 窝轮价外/内,界内证表示界内界外
class PriceType(FtEnum):
NONE = "N/A" # 未知
OUTSIDE = "OUTSIDE" # 价外,界内证表示界外
Expand All @@ -1512,7 +1514,7 @@ def load_dic(self):
'''-------------------------WarrantStatus----------------------------'''


# 涡轮状态
# 窝轮状态
class WarrantStatus(FtEnum):
NONE = "N/A" # 未知
NORMAL = "NORMAL" # 正常状态
Expand All @@ -1533,7 +1535,7 @@ def load_dic(self):
'''-------------------------Issuer----------------------------'''


# 涡轮发行人
# 窝轮发行人
class Issuer(FtEnum):
NONE = "N/A" # 未知
SG = "SG" # 法兴
Expand All @@ -1559,6 +1561,7 @@ class Issuer(FtEnum):
VT = "VT" # 瑞通
KC = "KC" # 比联
MS = "MS" # 摩利
GJ = "GJ" # 国君

def load_dic(self):
return {
Expand All @@ -1585,7 +1588,8 @@ def load_dic(self):
self.HT: Qot_Common_pb2.Issuer_HT,
self.VT: Qot_Common_pb2.Issuer_VT,
self.KC: Qot_Common_pb2.Issuer_KC,
self.MS: Qot_Common_pb2.Issuer_MS
self.MS: Qot_Common_pb2.Issuer_MS,
self.GJ: Qot_Common_pb2.Issuer_GJ
}


Expand Down Expand Up @@ -2224,13 +2228,15 @@ class Currency(FtEnum):
HKD = 'HKD' # 港币
USD = 'USD' # 美元
CNH = 'CNH' # 离岸人民币
JPY = 'JPY' # 日元

def load_dic(self):
return {
self.NONE: Trd_Common_pb2.Currency_Unknown,
self.HKD: Trd_Common_pb2.Currency_HKD,
self.USD: Trd_Common_pb2.Currency_USD,
self.CNH: Trd_Common_pb2.Currency_CNH
self.CNH: Trd_Common_pb2.Currency_CNH,
self.JPY: Trd_Common_pb2.Currency_JPY
}

class CltRiskLevel(FtEnum):
Expand All @@ -2251,13 +2257,42 @@ def load_dic(self):
self.OPT_DANGER: Trd_Common_pb2.CltRiskLevel_OptDanger
}


class CltRiskStatus(FtEnum):
NONE = 'N/A'
LEVEL1 = 'LEVEL1'
LEVEL2 = 'LEVEL2'
LEVEL3 = 'LEVEL3'
LEVEL4 = 'LEVEL4'
LEVEL5 = 'LEVEL5'
LEVEL6 = 'LEVEL6'
LEVEL7 = 'LEVEL7'
LEVEL8 = 'LEVEL8'
LEVEL9 = 'LEVEL9'

def load_dic(self):
return {
self.NONE: Trd_Common_pb2.CltRiskStatus_Unknown,
self.LEVEL1: Trd_Common_pb2.CltRiskStatus_Level1,
self.LEVEL2: Trd_Common_pb2.CltRiskStatus_Level2,
self.LEVEL3: Trd_Common_pb2.CltRiskStatus_Level3,
self.LEVEL4: Trd_Common_pb2.CltRiskStatus_Level4,
self.LEVEL5: Trd_Common_pb2.CltRiskStatus_Level5,
self.LEVEL6: Trd_Common_pb2.CltRiskStatus_Level6,
self.LEVEL7: Trd_Common_pb2.CltRiskStatus_Level7,
self.LEVEL8: Trd_Common_pb2.CltRiskStatus_Level8,
self.LEVEL9: Trd_Common_pb2.CltRiskStatus_Level9,
}

class TradeDateMarket(FtEnum):
NONE = 'N/A' # 未知
HK = 'HK' # 港股市场
US = 'US' # 美股市场
CN = 'CN' # A股市场
NT = 'NT' # 深(沪)股通
ST = 'ST' # 港股通(深、沪)
JP_FUTURE = 'JP_FUTURE' # 日本期货
SG_FUTURE = 'SG_FUTURE' # 新加坡期货

def load_dic(self):
return {
Expand All @@ -2266,7 +2301,9 @@ def load_dic(self):
self.US: Qot_Common_pb2.TradeDateMarket_US,
self.CN: Qot_Common_pb2.TradeDateMarket_CN,
self.NT: Qot_Common_pb2.TradeDateMarket_NT,
self.ST: Qot_Common_pb2.TradeDateMarket_ST
self.ST: Qot_Common_pb2.TradeDateMarket_ST,
self.JP_FUTURE: Qot_Common_pb2.TradeDateMarket_JP_Future,
self.SG_FUTURE: Qot_Common_pb2.TradeDateMarket_SG_Future,
}

class SetPriceReminderOp(FtEnum):
Expand Down Expand Up @@ -2318,6 +2355,8 @@ class PriceReminderType(FtEnum):
ASK_PRICE_DOWN = "ASK_PRICE_DOWN" # 卖一价低于
BID_VOL_UP = "BID_VOL_UP" # 买一量高于
ASK_VOL_UP = "ASK_VOL_UP" # 卖一量高于
THREE_MIN_CHANGE_RATE_UP = "THREE_MIN_CHANGE_RATE_UP" # 3分钟涨幅
THREE_MIN_CHANGE_RATE_DOWN = "THREE_MIN_CHANGE_RATE_DOWN" # 3分钟跌幅

def load_dic(self):
return {
Expand All @@ -2335,6 +2374,8 @@ def load_dic(self):
self.ASK_PRICE_DOWN: Qot_Common_pb2.PriceReminderType_AskPriceDown,
self.BID_VOL_UP: Qot_Common_pb2.PriceReminderType_BidVolUp,
self.ASK_VOL_UP: Qot_Common_pb2.PriceReminderType_AskVolUp,
self.THREE_MIN_CHANGE_RATE_UP: Qot_Common_pb2.PriceReminderType_3MinChangeRateUp,
self.THREE_MIN_CHANGE_RATE_DOWN: Qot_Common_pb2.PriceReminderType_3MinChangeRateDown,
}

class PriceReminderMarketStatus(FtEnum):
Expand Down Expand Up @@ -2406,10 +2447,38 @@ class SecurityFirm(FtEnum):
NONE = 'N/A'
FUTUSECURITIES = 'FUTUSECURITIES'
FUTUINC = 'FUTUINC'
FUTUSG = 'FUTUSG'

def load_dic(self):
return {
self.NONE: Trd_Common_pb2.SecurityFirm_Unknown,
self.FUTUSECURITIES: Trd_Common_pb2.SecurityFirm_FutuSecurities,
self.FUTUINC: Trd_Common_pb2.SecurityFirm_FutuInc
self.FUTUINC: Trd_Common_pb2.SecurityFirm_FutuInc,
self.FUTUSG: Trd_Common_pb2.SecurityFirm_FutuSG
}

# 模拟交易账号类型
class SimAccType(FtEnum):
NONE = 'N/A'
STOCK = 'STOCK'
OPTION = 'OPTION'

def load_dic(self):
return {
self.NONE: Trd_Common_pb2.SimAccType_Unknown,
self.STOCK: Trd_Common_pb2.SimAccType_Stock,
self.OPTION: Trd_Common_pb2.SimAccType_Option
}

# 期权交割周期
class ExpirationCycle(FtEnum):
NONE = 'N/A'
WEEK = 'WEEK'
MONTH = 'MONTH'

def load_dic(self):
return {
self.NONE: Qot_Common_pb2.ExpirationCycle_Unknown,
self.WEEK: Qot_Common_pb2.ExpirationCycle_Week,
self.MONTH: Qot_Common_pb2.ExpirationCycle_Month
}
2 changes: 1 addition & 1 deletion futu/common/ft_logger.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ def __init__(self, **args):
self.console_logger.setLevel(self._console_level)
self.console_logger.propagate = False

self.formatter = logging.Formatter('%(asctime)s %(message)s')
self.formatter = logging.Formatter('%(asctime)s | %(process)d | %(message)s')

if not hasattr(self, 'fileHandler'):
file_name = 'py_' + datetime.now().strftime('%Y_%m_%d') + '.log'
Expand Down
4 changes: 0 additions & 4 deletions futu/common/handler_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,6 @@ def __init__(self, cb_check_recv):
"type": PriceReminderHandlerBase,
"obj": PriceReminderHandlerBase()
}
# 3017: {
# "type": OrderDetailHandlerBase,
# "obj": OrderDetailHandlerBase()
# }
}

def set_handler(self, handler):
Expand Down
13 changes: 12 additions & 1 deletion futu/common/network_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ def __init__(self):
self._next_conn_id = 1
self._lock = threading.RLock()
self._mgr_lock = threading.Lock() # Used to control start and stop
self._pending_read_conns = set()
self._create_all()

def _close_all(self):
Expand Down Expand Up @@ -178,8 +179,8 @@ def work():
return RET_OK, '', conn_id

def poll(self):
now = datetime.now()
events = self._selector.select(0.02)
now = datetime.now()
for key, evt_mask in events:
if key.fileobj == self._r_sock:
self._r_sock.recv(1024)
Expand All @@ -195,8 +196,14 @@ def poll(self):
self._on_write(conn)

if evt_mask & selectors.EVENT_READ != 0:
self._pending_read_conns.discard(conn)
self._on_read(conn)

for conn in self._pending_read_conns:
self._on_read(conn)

self._pending_read_conns.clear()

activate_elapsed_time = now - self._last_activate_time
check_req_elapsed_time = now - self._last_check_req_time
is_activate = activate_elapsed_time.total_seconds() >= 0.05
Expand Down Expand Up @@ -483,6 +490,10 @@ def _on_read(self, conn):
del conn.readbuf[:head_len+body_len]
packet_count += 1
self._on_packet(conn, head_dict, Err.Ok.code, '', rsp_body)
if packet_count >= 10:
self._pending_read_conns.add(conn)
self._w_sock.send(b'1')
break #收10个包强制跳出循环,避免长时间解包导致无法发送心跳

if is_closed:
self.close(conn.conn_id)
Expand Down
Loading