feat libs,sdk,trend

This commit is contained in:
2026-09-07 14:04:26 +08:00
parent d37f9edefc
commit e320de3241
30 changed files with 515 additions and 507 deletions

View File

@@ -174,7 +174,7 @@ class PortfolioHandler(BaseHandler):
result = {
"assets": format_assets(account_data),
"positions": format_holding(positions),
"orders": [fixed_fields(order) for order in orders],
"orders": format_orders(orders),
}
self.write_json(result)
@@ -183,8 +183,7 @@ class PortfolioHandler(BaseHandler):
class HoldingHandler(BaseHandler):
def get(self):
positions = safe_call(get_trade_detail_data, self.acc(), 'stock', 'position') or []
holding = format_holding(positions)
self.write_json({"data": holding})
self.write_json(format_holding(positions))
class OrgHandler(BaseHandler):
def get(self, handler_type):
@@ -207,22 +206,18 @@ class OrgHandler(BaseHandler):
# get_trade_detail_data('account') - Query account assets
class AssetsHandler(BaseHandler):
def get(self):
_data = safe_call(get_trade_detail_data, self.acc(), 'stock', 'account')
_data = safe_call(get_trade_detail_data, self.acc(), 'stock', 'account') or []
self.write_json(format_assets(_data))
class OrderHandler(BaseHandler):
def get(self):
ret = safe_call(get_trade_detail_data, self.acc(), 'stock', 'order')
if ret is None:
ret = []
result = [fixed_fields(obj) for obj in ret]
self.write_json(result)
ret = safe_call(get_trade_detail_data, self.acc(), 'stock', 'order') or []
self.write_json(format_orders(ret))
class DealHandler(BaseHandler):
def get(self):
deals = safe_call(get_trade_detail_data, self.acc(), 'stock', 'deal') or []
rets = [fixed_fields(deal) for deal in deals]
self.write_json({"deals": rets})
self.write_json(format_deals(deals))
# ContextInfo.get_full_tick() - Get full tick data
class FullTickHandler(BaseHandler):
@@ -330,56 +325,70 @@ def format_holding(positions):
for position in positions:
stock = position.m_strInstrumentID + '.' + position.m_strExchangeID
holding[stock] = {
'StockCode': stock,
'TradeID':position.m_strTradeID,
'StockName': position.m_strInstrumentName,
'Direction': position.m_nDirection,
'Volume': position.m_nVolume,
'OpenPrice': position.m_dOpenPrice,
'OpenCost':position.m_dOpenCost,
'FloatProfit': position.m_dFloatProfit,
'MarketValue': position.m_dMarketValue,
'StockHolder': position.m_strStockHolder,
'FrozenVolume': position.m_nFrozenVolume,
'CanUseVolume': position.m_nCanUseVolume,
'OnRoadVolume': position.m_nOnRoadVolume,
'YesterdayVolume': position.m_nYesterdayVolume,
'LastPrice': position.m_dLastPrice,
'ProfitRate': position.m_dProfitRate,
'FutureTradeType': position.m_eFutureTradeType,
'ExpireDate': position.m_strExpireDate
'stock_code': stock,
'stock_name': position.m_strInstrumentName,
'direction': position.m_nDirection,
'volume': position.m_nVolume,
'open_price': position.m_dOpenPrice,
'open_cost':position.m_dOpenCost,
'float_profit': position.m_dFloatProfit,
'market_value': position.m_dMarketValue,
'stock_holder': position.m_strStockHolder,
'frozen_volume': position.m_nFrozenVolume,
'can_use_volume': position.m_nCanUseVolume,
'on_road_volume': position.m_nOnRoadVolume,
'yesterday_volume': position.m_nYesterdayVolume,
'last_price': position.m_dLastPrice,
'profit_rate': position.m_dProfitRate,
'future_trade_type': position.m_eFutureTradeType,
'expire_date': position.m_strExpireDate
}
return holding
TRADE_DETAIL_FIELDS = (
'm_strOrderSysID', 'm_strInstrumentID', 'm_strExchangeID',
'm_strInstrumentName', 'm_nOffsetFlag', 'm_nOrderStatus',
'm_nVolumeTotal', 'm_nVolumeTraded', 'm_nOrderTime',
'm_strInsertDate', 'm_strInsertTime', 'm_strRemark',
'm_dPrice', 'm_dTradePrice', 'm_dTradeAmount',
)
MISSING = object()
def fixed_fields(obj, fields=TRADE_DETAIL_FIELDS):
result = {}
for field in fields:
try:
value = getattr(obj, field, MISSING)
except TypeError:
continue
if value is MISSING:
continue
if not callable(value):
result[field] = str(value)
if not result:
attrs = getattr(obj, '__dict__', {})
result = {
key: str(value) for key, value in attrs.items()
if not key.startswith('_') and not callable(value)
}
def format_orders(orders):
"""显式转换委托/成交字段,保留原始数值类型。"""
result = []
for order in orders:
result.append({
'stock_code': order.m_strInstrumentID + '.' + order.m_strExchangeID,
'order_sys_id': order.m_strOrderSysID,
'ref': order.m_nRef,
'order_ref': order.m_strOrderRef,
'direction': order.m_nDirection,
'offset_flag': order.m_nOffsetFlag,
'limit_price': order.m_dLimitPrice,
'volume_total_original': order.m_nVolumeTotalOriginal,
'volume_traded': order.m_nVolumeTraded,
'volume_total': order.m_nVolumeTotal,
'traded_price': order.m_dTradedPrice,
'trade_amount': order.m_dTradeAmount,
'insert_date': order.m_strInsertDate,
'insert_time': order.m_strInsertTime,
'remark': order.m_strRemark,
'order_status': order.m_nOrderStatus,
})
return result
def format_deals(deals):
"""显式转换委托/成交字段,保留原始数值类型。"""
result = []
for d in deals:
result.append({
'stock_code': d.m_strInstrumentID + '.' + d.m_strExchangeID,
'order_sys_id': d.m_strOrderSysID,
'ref': d.m_nRef,
'order_ref': d.m_strOrderRef,
'direction': d.m_nDirection,
'offset_flag': d.m_nOffsetFlag,
'price': d.m_dPrice,
'volume': d.m_nVolume,
'trade_amount': d.m_dTradeAmount,
'trade_date': d.m_strTradeDate,
'trade_time': d.m_strTradeTime,
'remark': d.m_strRemark,
'close_profit': d.m_dCloseProfit,
})
return result
# ============= Route registration =============
def make_app():