Skip to content

Commit fe56a77

Browse files
committed
feat(trade): add fund details feature and modify related modules
1 parent cecf025 commit fe56a77

File tree

7 files changed

+178
-10
lines changed

7 files changed

+178
-10
lines changed

tigeropen/common/consts/service_types.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
ESTIMATE_TRADABLE_QUANTITY = "estimate_tradable_quantity"
3535
TRANSFER_FUND = "transfer_fund"
3636
AGGREGATE_ASSETS = "aggregate_assets"
37+
FUND_DETAILS = "fund_details"
3738

3839
USER_LICENSE = "user_license"
3940

tigeropen/examples/quote_client_demo.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -230,15 +230,15 @@ def test_market_scanner():
230230
base_filter1_value = item[base_filter1]
231231
accumulate_filter_value = item[accumulate_filter]
232232
print(
233-
f'page:{result.page}, symbol:{symbol}, base_filter1 value:{base_filter1_value}, accumulate_filter value:{accumulate_filter_value}')
233+
f'page:{result.startt}, symbol:{symbol}, base_filter1 value:{base_filter1_value}, accumulate_filter value:{accumulate_filter_value}')
234234
print(f'current page symbols:{result.symbols}')
235235
scanner_result_symbols.update(result.symbols)
236236
time.sleep(1)
237237
# 处理分页
238-
if result.page >= result.total_page - 1:
238+
if result.startt >= result.total_page - 1:
239239
is_last_page = True
240240
else:
241-
begin_page = result.page + 1
241+
begin_page = result.startt + 1
242242

243243
print(f'scanned symbols:{scanner_result_symbols}')
244244

tigeropen/quote/quote_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1797,7 +1797,7 @@ def get_warrant_filter(self, symbol, page=None, page_size=None, sort_field_name=
17971797
params = WarrantFilterParams()
17981798
params.lang = get_enum_value(self._lang)
17991799
params.symbol = symbol or (filter_params.symbol if filter_params else None)
1800-
params.page = page or (filter_params.page if filter_params else None)
1800+
params.page = page or (filter_params.startt if filter_params else None)
18011801
params.page_size = page_size or (filter_params.page_size if filter_params else None)
18021802
params.sort_field_name = sort_field_name or (filter_params.sort_field_name if filter_params else None)
18031803
params.sort_dir = get_enum_value(sort_dir or (filter_params.sort_dir if filter_params else None))

tigeropen/trade/request/model.py

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1549,3 +1549,110 @@ def to_openapi_dict(self):
15491549
if self.seg_type:
15501550
params['seg_type'] = self.seg_type
15511551
return params
1552+
1553+
class FundDetailsParams(BaseParams):
1554+
def __init__(self):
1555+
super().__init__()
1556+
self._account = None
1557+
self._secret_key = None
1558+
self._seg_types = None
1559+
self._fund_type = None
1560+
self._currency = None
1561+
self._start_date = None
1562+
self._end_date = None
1563+
self._start = None
1564+
self._limit = None
1565+
1566+
@property
1567+
def account(self):
1568+
return self._account
1569+
1570+
@account.setter
1571+
def account(self, value):
1572+
self._account = value
1573+
1574+
@property
1575+
def secret_key(self):
1576+
return self._secret_key
1577+
1578+
@secret_key.setter
1579+
def secret_key(self, value):
1580+
self._secret_key = value
1581+
1582+
@property
1583+
def seg_types(self):
1584+
return self._seg_types
1585+
1586+
@seg_types.setter
1587+
def seg_types(self, value):
1588+
self._seg_types = value
1589+
1590+
@property
1591+
def fund_type(self):
1592+
return self._fund_type
1593+
1594+
@fund_type.setter
1595+
def fund_type(self, value):
1596+
self._fund_type = value
1597+
1598+
@property
1599+
def currency(self):
1600+
return self._currency
1601+
1602+
@currency.setter
1603+
def currency(self, value):
1604+
self._currency = value
1605+
1606+
@property
1607+
def start_date(self):
1608+
return self._start_date
1609+
1610+
@start_date.setter
1611+
def start_date(self, value):
1612+
self._start_date = value
1613+
1614+
@property
1615+
def end_date(self):
1616+
return self._end_date
1617+
1618+
@end_date.setter
1619+
def end_date(self, value):
1620+
self._end_date = value
1621+
1622+
@property
1623+
def startt(self):
1624+
return self._start
1625+
1626+
@startt.setter
1627+
def startt(self, value):
1628+
self._start = value
1629+
1630+
@property
1631+
def limit(self):
1632+
return self._limit
1633+
1634+
@limit.setter
1635+
def limit(self, value):
1636+
self._limit = value
1637+
1638+
def to_openapi_dict(self):
1639+
params = super().to_openapi_dict()
1640+
if self.account:
1641+
params['account'] = self.account
1642+
if self.secret_key:
1643+
params['secret_key'] = self.secret_key
1644+
if self.seg_types:
1645+
params['seg_types'] = self.seg_types
1646+
if self.fund_type:
1647+
params['fund_type'] = self.fund_type
1648+
if self.currency:
1649+
params['currency'] = self.currency
1650+
if self.start_date:
1651+
params['start_date'] = self.start_date
1652+
if self.end_date:
1653+
params['end_date'] = self.end_date
1654+
if self._start is not None:
1655+
params['start'] = self._start
1656+
if self._limit:
1657+
params['limit'] = self._limit
1658+
return params
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# -*- coding: utf-8 -*-
2+
3+
import pandas as pd
4+
5+
from tigeropen.common.response import TigerResponse
6+
from tigeropen.common.util.string_utils import camel_to_underline, camel_to_underline_obj
7+
8+
9+
class FundDetailsResponse(TigerResponse):
10+
def __init__(self):
11+
super(FundDetailsResponse, self).__init__()
12+
self.result = pd.DataFrame()
13+
self._is_success = None
14+
15+
def parse_response_content(self, response_content):
16+
response = super(FundDetailsResponse, self).parse_response_content(response_content)
17+
if 'is_success' in response:
18+
self._is_success = response['is_success']
19+
20+
if self.data:
21+
data = {camel_to_underline(k): v for k, v in self.data.items()}
22+
items = data.get('items')
23+
if items:
24+
self.result = pd.DataFrame([camel_to_underline_obj(i) for i in items])
25+
self.result['page'] = data['page']
26+
self.result['limit'] = data['limit']
27+
self.result['item_count'] = data['item_count']
28+
self.result['page_count'] = data['page_count']
29+
self.result['timestamp'] = data['timestamp']

tigeropen/trade/response/funding_history_response.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
class FundingHistoryResponse(TigerResponse):
1212
def __init__(self):
1313
super(FundingHistoryResponse, self).__init__()
14-
self.data = None
14+
self.result = None
1515
self._is_success = None
1616

1717
def parse_response_content(self, response_content):
@@ -23,8 +23,8 @@ def parse_response_content(self, response_content):
2323
if isinstance(self.data, list):
2424
# 将驼峰命名转换为下划线命名
2525
items = [{camel_to_underline(k): v for k, v in item.items()} for item in self.data]
26-
self.data = pd.DataFrame(items)
26+
self.result = pd.DataFrame(items)
2727
else:
2828
# 单个记录的情况
2929
items = {camel_to_underline(k): v for k, v in self.data.items()}
30-
self.data = pd.DataFrame([items])
30+
self.result = pd.DataFrame([items])

tigeropen/trade/trade_client.py

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
CANCEL_ORDER, MODIFY_ORDER, PLACE_ORDER, ACTIVE_ORDERS, INACTIVE_ORDERS, FILLED_ORDERS, CONTRACT, PREVIEW_ORDER, \
1313
PRIME_ASSETS, ORDER_TRANSACTIONS, QUOTE_CONTRACT, ANALYTICS_ASSET, SEGMENT_FUND_AVAILABLE, SEGMENT_FUND_HISTORY, \
1414
TRANSFER_FUND, \
15-
TRANSFER_SEGMENT_FUND, CANCEL_SEGMENT_FUND, PLACE_FOREX_ORDER, ESTIMATE_TRADABLE_QUANTITY, AGGREGATE_ASSETS
15+
TRANSFER_SEGMENT_FUND, CANCEL_SEGMENT_FUND, PLACE_FOREX_ORDER, ESTIMATE_TRADABLE_QUANTITY, AGGREGATE_ASSETS, \
16+
FUND_DETAILS
1617
from tigeropen.common.exceptions import ApiException
1718
from tigeropen.common.util.common_utils import get_enum_value, date_str_to_timestamp
1819
from tigeropen.common.request import OpenApiRequest
@@ -21,13 +22,14 @@
2122
from tigeropen.trade.domain.order import Order
2223
from tigeropen.trade.request.model import ContractParams, AccountsParams, AssetParams, PositionParams, OrdersParams, \
2324
OrderParams, PlaceModifyOrderParams, CancelOrderParams, TransactionsParams, AnalyticsAssetParams, SegmentFundParams, \
24-
ForexTradeOrderParams, EstimateTradableQuantityModel, FundingHistoryParams, AggregateAssetParams
25+
ForexTradeOrderParams, EstimateTradableQuantityModel, FundingHistoryParams, AggregateAssetParams, FundDetailsParams
2526
from tigeropen.trade.response.account_profile_response import ProfilesResponse
2627
from tigeropen.trade.response.aggregate_assets_response import AggregateAssetsResponse
2728
from tigeropen.trade.response.analytics_asset_response import AnalyticsAssetResponse
2829
from tigeropen.trade.response.assets_response import AssetsResponse
2930
from tigeropen.trade.response.contracts_response import ContractsResponse
3031
from tigeropen.trade.response.forex_order_response import ForexOrderResponse
32+
from tigeropen.trade.response.fund_details_response import FundDetailsResponse
3133
from tigeropen.trade.response.order_id_response import OrderIdResponse
3234
from tigeropen.trade.response.order_preview_response import PreviewOrderResponse
3335
from tigeropen.trade.response.orders_response import OrdersResponse
@@ -935,11 +937,40 @@ def get_funding_history(self, seg_type=None):
935937
response = FundingHistoryResponse()
936938
response.parse_response_content(response_content)
937939
if response.is_success():
938-
return response.data
940+
return response.result
939941
else:
940942
raise ApiException(response.code, response.message)
941943
return None
942944

945+
def get_fund_details(self, seg_types, account=None, fund_type=None, currency=None,
946+
start=0, limit=50, start_date=None, end_date=None, secret_key=None,
947+
lang=None):
948+
params = FundDetailsParams()
949+
params.account = account if account else self._account
950+
params.secret_key = secret_key if secret_key else self._secret_key
951+
if seg_types:
952+
seg_types_list = seg_types if isinstance(seg_types, list) else [seg_types]
953+
seg_types_params = [get_enum_value(t) for t in seg_types_list]
954+
params.seg_types = seg_types_params
955+
params.fund_type = get_enum_value(fund_type)
956+
params.currency = get_enum_value(currency)
957+
params.startt = start
958+
params.limit = limit
959+
params.start_date = start_date
960+
params.end_date = end_date
961+
params.lang = get_enum_value(lang) if lang else get_enum_value(self._lang)
962+
963+
request = OpenApiRequest(FUND_DETAILS, biz_model=params)
964+
response_content = self.__fetch_data(request)
965+
if response_content:
966+
response = FundDetailsResponse()
967+
response.parse_response_content(response_content)
968+
if response.is_success():
969+
return response.result
970+
else:
971+
raise ApiException(response.code, response.message)
972+
973+
943974
def __fetch_data(self, request):
944975
try:
945976
response = super(TradeClient, self).execute(request)

0 commit comments

Comments
 (0)