定时开仓的例子是在盈损风控管理的基础上开发的。通过参数设定好交易的时间点,及需要交易的所有合约及相关交易参数。关于账户配置、盈损管理的内容请参考前文:
参数字典
1 2 3 4 5 6 7 8 9 10 11 12 |
pl_parameter = {b"ID": 9, # 开仓时间点 b"AnchorTimeList": [b"01:05:00", b"01:05:30", b"01:06:00", b"01:06:30", b"01:07:00", b"01:07:30", b"01:08:00", b"01:08:30"], # 计划交易的合约及参数 b"TradingScheduleDict": {b"rb2001": {b"ExchangeID": b"SHFE", b"Direction": 1, b"Volume": 1}, b"ag1912": {b"ExchangeID": b"SHFE", b"Direction": 1, b"Volume": 1}, }, # 止损参数 b"ProfitLossParameterDict": {b"rb2001": {b"0": [2], b"1": [2]}, b"ag1912": {b"0": [10], b"1": [10]}, } } |
AnchorTimeList是开仓时间点。TradingScheduleDict是报单参数。ProfitLossParameterDict是盈损参数。
初始化参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
def init_parameter(self): """ 初始化策略参数 :return: """ parameter_dict = self.md_queue.get(block=False) # 策略参数结构体 self.pl_parameter_dict = parameter_dict[b"ProfitLossParameterDict"] self.order_ref = parameter_dict[b"ID"] * 10000 self.order_ref_range = [self.order_ref, self.order_ref + 10000] self.trading_schedule = parameter_dict[b"TradingScheduleDict"] self.anchor_time_list = parameter_dict[b"AnchorTimeList"] for instrument_id in self.trading_schedule.keys(): if instrument_id not in self.instrument_id_registered: self.instrument_id_registered.append(instrument_id) self._write_log(f"策略参数初始化完成!ID=>{parameter_dict[b'ID']}") |
创建行情与交易进程之前将参数字典放入队列中,创建交易实例时从队列中取出参数字典为一些属性赋值。
实时更新时间条件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
def update_time_trigger(self, server_time, instrument_id): """ 如果触发时间条件则发出开仓委托。 :param server_time: 服务器时间列表。server_time[0]表示最新时间,server_time[1]表示前一刻的时间 :param instrument_id: 合约 :return: """ for anchor_time in self.anchor_time_list: if server_time[1] < anchor_time <= server_time[0]: self.order_ref += 1 exchange_id = self.trading_schedule[instrument_id][b"ExchangeID"] volume = self.trading_schedule[instrument_id][b"Volume"] direction = self.trading_schedule[instrument_id][b"Direction"] order_price = self.get_default_price(instrument_id, direction) self.req_order_insert(exchange_id, instrument_id, order_price, volume, self.order_ref, direction, b"0") self._write_log(f"服务器时间{server_time[0]}触发{anchor_time}{'买' if direction == b'0' else '卖'}开仓{instrument_id},价格:{order_price},手数:{volume}") |
如果行情时间触发开仓时间点,则根据该合约的交易参数进行报单。报单成交后实时监控持仓是否触发止盈止损条件。
使用方法
配置账户并设置止损参数之后,运行timing_trading_example.py即可。从快期客户端可监控所有交易情况。
完整代码下载地址:
码云:https://gitee.com/AlgoPlus/AlgoPlus
GitHub:https://github.com/CTPPlus/AlgoPlus
AlgoPlus是使用Cython、ctypes技术封装的Python版量化投资开源框架,不仅释放了GIL,而且充分利用CTP线程特性,既能满足低延时的交易需求,又提高了易用性。
看了你的所有文档,所有例子,也看了源代码,文档太少了,而且也很不详细,具体编写策略的用例也几乎没有,有的也太简单,没有详细的复杂策略关于仓位控制,开仓,平仓,撤单等操作例子。希望增加更多复杂策略的例子,更加详细的文档。如果能够参照tqsdk或vnpy的文档,特别是关于复杂策略怎么编写,策略的运行流程和原理,在策略运行中满足条件的开平仓,仓位更新等,如果有这些,说不定这个框架会更好推广。
2.0版本已经发布了,结构更清晰,给出了一些非常实用的例子,您可以试试