Skip to content

Commit d76f6b2

Browse files
committed
更新新版CTP API
1 parent 3307c30 commit d76f6b2

6 files changed

Lines changed: 538 additions & 494 deletions

File tree

LICENSE.md

Lines changed: 183 additions & 183 deletions
Large diffs are not rendered by default.

trader/main.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ def emit(self, message: logging.LogRecord):
4646

4747

4848
if __name__ == '__main__':
49-
os.path.exists(app_dir.user_log_dir) or os.makedirs(app_dir.user_log_dir)
49+
if not os.path.exists(app_dir.user_log_dir):
50+
os.makedirs(app_dir.user_log_dir)
5051
log_file = os.path.join(app_dir.user_log_dir, 'trader.log')
5152
file_handler = handlers.RotatingFileHandler(log_file, encoding='utf-8', maxBytes=1024*1024, backupCount=1)
5253
general_formatter = logging.Formatter(config.get('LOG', 'format'))
@@ -56,7 +57,7 @@ def emit(self, message: logging.LogRecord):
5657
console_handler.setFormatter(general_formatter)
5758
console_handler.setLevel('DEBUG')
5859
redis_handler = RedislHandler(config.get('MSG_CHANNEL', 'weixin_log'))
59-
redis_handler.setFormatter(config.get('LOG', 'weixin_format'))
60+
redis_handler.setFormatter(logging.Formatter(config.get('LOG', 'weixin_format')))
6061
redis_handler.setLevel(config.get('LOG', 'flower_level', fallback='INFO'))
6162
logger = logging.getLogger()
6263
logger.setLevel('DEBUG')

trader/strategy/brother2.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# coding=utf-8
2+
# pyright: reportAttributeAccessIssue=false, reportOptionalMemberAccess=false, reportOptionalSubscript=false, reportOptionalOperand=false, reportArgumentType=false, reportOperatorIssue=false, reportGeneralTypeIssues=false
23
#
34
# Copyright 2016 timercrack
45
#
@@ -18,6 +19,7 @@
1819
from collections import defaultdict
1920
import datetime
2021
from decimal import Decimal
22+
from typing import Tuple, Any
2123
import logging
2224
from django.db.models import Q, F, Sum
2325
from django.utils import timezone
@@ -68,7 +70,7 @@ async def start(self):
6870
now = int(today.strftime('%H%M'))
6971
if today.isoweekday() < 6 and (820 <= now <= 1550 or 2010 <= now <= 2359): # 非交易时间查不到数据
7072
await self.refresh_account()
71-
order_list = await self.query('Order')
73+
order_list = await self.query('Order') or []
7274
for order in order_list:
7375
# 未成交订单
7476
if int(order['OrderStatus']) in range(1, 5) and order['OrderSubmitStatus'] == ApiStruct.OSS_Accepted:
@@ -114,7 +116,7 @@ async def refresh_account(self):
114116
async def refresh_position(self):
115117
try:
116118
logger.debug('更新持仓...')
117-
pos_list = await self.query('InvestorPositionDetail')
119+
pos_list = await self.query('InvestorPositionDetail') or []
118120
self.__cur_pos.clear()
119121
for pos in pos_list:
120122
if 'empty' in pos and pos['empty'] is True or len(pos['InstrumentID']) > 6:
@@ -157,7 +159,7 @@ async def refresh_instrument(self):
157159
try:
158160
logger.debug("更新合约...")
159161
inst_dict = defaultdict(dict)
160-
inst_list = await self.query('Instrument')
162+
inst_list = await self.query('Instrument') or []
161163
for inst in inst_list:
162164
if inst['empty']:
163165
continue
@@ -360,7 +362,9 @@ async def cancel_order(self, order: dict):
360362
await sub_client.close()
361363
result = task.result()[0]
362364
if 'ErrorID' in result:
363-
logger.warning(f"撤销订单出错: {ctp_errors[result['ErrorID']]}")
365+
err_id = result['ErrorID']
366+
err_msg = ctp_errors.get(err_id, f"未知错误码:{err_id}")
367+
logger.warning(f"撤销订单出错: {err_msg}")
364368
return False
365369
return True
366370
except Exception as e:
@@ -514,7 +518,7 @@ async def OnRtnOrder(self, _: str, order: dict):
514518
return
515519
if order["OrderSysID"]:
516520
logger.debug(f"订单回报: {self.get_order_string(order)}")
517-
order_obj, _ = self.save_order(order)
521+
order_obj, created = self.save_order(order)
518522
if not order_obj:
519523
return
520524
signal = order_obj.signal
@@ -722,7 +726,7 @@ def calculate(self, day, create_main_bar=True):
722726
except Exception as e:
723727
logger.warning(f'calculate 发生错误: {repr(e)}', exc_info=True)
724728

725-
def calc_signal(self, inst: Instrument, day: datetime.datetime) -> (Signal, Decimal):
729+
def calc_signal(self, inst: Instrument, day: datetime.datetime) -> tuple[Any | None, Decimal]:
726730
try:
727731
break_n = self.__strategy.param_set.get(code='BreakPeriod').int_value
728732
atr_n = self.__strategy.param_set.get(code='AtrPeriod').int_value
@@ -850,10 +854,11 @@ def calc_signal(self, inst: Instrument, day: datetime.datetime) -> (Signal, Deci
850854
volume_ori = volume_ori if volume_ori else volume
851855
logger.info(f"新信号: {sig}({volume_ori:.1f}手) "
852856
f"预估保证金: {use_margin:.0f}({use_margin / 10000:.1f}万)")
853-
return signal, use_margin
857+
return signal, Decimal(use_margin)
854858
except Exception as e:
855859
logger.warning(f'calc_signal 发生错误: {repr(e)}', exc_info=True)
856-
return None, 0
860+
return None, Decimal(0)
861+
return None, Decimal(0)
857862

858863
def calc_up_limit(self, inst: Instrument, bar: DailyBar):
859864
settlement = bar.settlement

0 commit comments

Comments
 (0)