def _generate_order_data_from_req(self, req: OrderRequest): """ 将发单请求转换为发单数据 """ self.order_ref += 1 order_id = f"{self.frontid}-{self.sessionid}-{self.order_ref}" return req._create_order_data(gateway_name="looper", order_id=order_id, time=self.datetime)
def send_server_order(self, contract: ContractData, direction: Direction, offset: Offset, price: float, volume: float, type: OrderType, lock: bool): """ 发送新的单子给服务器 """ # 创建新的order_req. original_req = OrderRequest( symbol=contract.symbol, exchange=contract.exchange, direction=direction, offset=offset, type=type, price=price, volume=volume, ) # 通过本地持仓携带的转换请求功能 --> 详情见ctpbee下面的data_handle/local_position.py req_list = self.cta.app.recorder.position_manager.get( contract.local_symbol).convert_order_request(original_req, lock) # 发单 local_orderids = [] for req in req_list: local_orderid = self.cta.app.send_order(req, contract.gateway_name) local_orderids.append(local_orderid) self.cta.app.recorder.position_manager.get( contract.local_symbol).update_order_request( req, local_orderid) # Save relationship between orderid and strategy. self.orderid_strategy_map[local_orderid] = self.cta self.strategy_orderid_map[self.cta.cta_name].add(local_orderid) return local_orderids
def short(self, price, volume, origin, **kwargs): req = OrderRequest(price=price, volume=volume, exchange=origin.exchange, offset=Offset.OPEN, direction=Direction.SHORT, type=OrderType.LIMIT) return self.looper.send_order(req)
def generate_order_req_by_str(cls, symbol: str, exchange: str, direction: str, offset: str, type: str, volume, price): """ 手动构造发单请求""" if "." in symbol: symbol = symbol.split(".")[1] return OrderRequest(exchange=cls.exchange_map.get(exchange.upper()), symbol=symbol, direction=cls.direction_map.get(direction.upper()), offset=cls.offset_map.get(offset.upper()), type=cls.price_type_map.get(type.upper()), volume=volume, price=price)
def _convert_req_to_data(self, order: OrderRequest): # 随机生成一个order_ref while True: ref = random.randint(1, 100000) if ref not in self.order_ref_set: self.order_ref_set.add(ref) break order_id = f"{self.frontid}_{self.sessionid}_{ref}" return order._create_order_data(order_id=order_id, gateway_name="looper")
def generate_order_req_by_var(cls, symbol: str, exchange: Exchange, direction: Direction, offset: Offset, type: OrderType, volume, price: float): if "." in symbol: symbol = symbol.split(".")[0] return OrderRequest(symbol=symbol, exchange=exchange, direction=direction, offset=offset, type=type, volume=volume, price=price)
def buy(self, price, volume, origin, price_type: OrderType = OrderType.LIMIT, **kwargs): req = OrderRequest(price=price, volume=volume, exchange=origin.exchange, offset=Offset.OPEN, direction=Direction.LONG, type=price_type) return self.looper.send_order(req)
def short(self, price, volume, origin, price_type: OrderType = OrderType.LIMIT, **kwargs): if not isinstance(self.looper.params['slippage_short'], float) and not isinstance( self.looper.params['slippage_short'], int): raise ConfigError(message="滑点配置应为浮点小数") req = OrderRequest(price=price, volume=volume, exchange=origin.exchange, offset=Offset.OPEN, direction=Direction.SHORT, type=price_type, symbol=origin.symbol) return self.looper.send_order(req)
def send_order(self, req: OrderRequest): """ Send new order. """ self.order_ref += 1 ctp_req = { "InstrumentID": req.symbol, "LimitPrice": req.price, "VolumeTotalOriginal": int(req.volume), "OrderPriceType": ORDERTYPE_VT2CTP.get(req.type, ""), "Direction": DIRECTION_VT2CTP.get(req.direction, ""), "CombOffsetFlag": OFFSET_VT2CTP.get(req.offset, ""), "OrderRef": str(self.order_ref), "InvestorID": self.userid, "UserID": self.userid, "BrokerID": self.brokerid, "CombHedgeFlag": THOST_FTDC_HF_Speculation, "ContingentCondition": THOST_FTDC_CC_Immediately, "ForceCloseReason": THOST_FTDC_FCC_NotForceClose, "IsAutoSuspend": 0, "TimeCondition": THOST_FTDC_TC_GFD, "VolumeCondition": THOST_FTDC_VC_AV, "MinVolume": 1, "ExchangeID": req.exchange.value } if req.type == OrderType.FAK: ctp_req["OrderPriceType"] = THOST_FTDC_OPT_LimitPrice ctp_req["TimeCondition"] = THOST_FTDC_TC_IOC ctp_req["VolumeCondition"] = THOST_FTDC_VC_AV elif req.type == OrderType.FOK: ctp_req["OrderPriceType"] = THOST_FTDC_OPT_LimitPrice ctp_req["TimeCondition"] = THOST_FTDC_TC_IOC ctp_req["VolumeCondition"] = THOST_FTDC_VC_CV self.reqid += 1 self.reqOrderInsert(ctp_req, self.reqid) order_id = f"{self.frontid}_{self.sessionid}_{self.order_ref}" order = req._create_order_data(order_id, self.gateway_name) self.on_event(type=EVENT_ORDER, data=order) return order.local_order_id
def update_order_request(self, req: OrderRequest, local_order_id: str): """""" gateway_name, orderid = local_order_id.split(".") order = req.create_order_data(orderid, gateway_name) self.update_order(order)