[Mod]change send order return data to vt_orderids (list) to support offset converter function

This commit is contained in:
vn.py 2019-03-27 11:31:44 +08:00
parent 353a9c0d8d
commit 15fbb54960
5 changed files with 81 additions and 34 deletions

View File

@ -721,14 +721,16 @@ class BacktestingEngine:
offset: Offset, offset: Offset,
price: float, price: float,
volume: float, volume: float,
stop: bool = False, stop: bool,
lock: bool
): ):
"""""" """"""
price = round_to_pricetick(price, self.pricetick) price = round_to_pricetick(price, self.pricetick)
if stop: if stop:
return self.send_stop_order(direction, offset, price, volume) vt_orderid = self.send_stop_order(direction, offset, price, volume)
else: else:
return self.send_limit_order(direction, offset, price, volume) vt_orderid = self.send_limit_order(direction, offset, price, volume)
return [vt_orderid]
def send_stop_order( def send_stop_order(
self, self,

View File

@ -37,7 +37,8 @@ class StopOrder:
stop_orderid: str stop_orderid: str
strategy_name: str strategy_name: str
status: StopOrderStatus = StopOrderStatus.WAITING status: StopOrderStatus = StopOrderStatus.WAITING
vt_orderid: str = "" vt_orderids: list
lock: bool
EVENT_CTA_LOG = "eCtaLog" EVENT_CTA_LOG = "eCtaLog"

View File

@ -21,9 +21,19 @@ from vnpy.trader.object import (
BarData, BarData,
ContractData ContractData
) )
from vnpy.trader.event import EVENT_TICK, EVENT_ORDER, EVENT_TRADE from vnpy.trader.event import (
EVENT_TICK,
EVENT_ORDER,
EVENT_TRADE,
EVENT_POSITION
)
from vnpy.trader.constant import ( from vnpy.trader.constant import (
Direction, OrderType, Interval, Exchange, Offset, Status Direction,
OrderType,
Interval,
Exchange,
Offset,
Status
) )
from vnpy.trader.utility import load_json, save_json from vnpy.trader.utility import load_json, save_json
from vnpy.trader.database import DbTickData, DbBarData from vnpy.trader.database import DbTickData, DbBarData
@ -39,6 +49,7 @@ from .base import (
STOPORDER_PREFIX STOPORDER_PREFIX
) )
from .template import CtaTemplate from .template import CtaTemplate
from .converter import OffsetConverter
STOP_STATUS_MAP = { STOP_STATUS_MAP = {
@ -85,6 +96,8 @@ class CtaEngine(BaseEngine):
self.rq_client = None self.rq_client = None
self.rq_symbols = set() self.rq_symbols = set()
self.offset_converter = OffsetConverter(self.main_engine)
def init_engine(self): def init_engine(self):
""" """
""" """
@ -104,6 +117,7 @@ class CtaEngine(BaseEngine):
self.event_engine.register(EVENT_TICK, self.process_tick_event) self.event_engine.register(EVENT_TICK, self.process_tick_event)
self.event_engine.register(EVENT_ORDER, self.process_order_event) self.event_engine.register(EVENT_ORDER, self.process_order_event)
self.event_engine.register(EVENT_TRADE, self.process_trade_event) self.event_engine.register(EVENT_TRADE, self.process_trade_event)
self.event_engine.register(EVENT_POSITION, self.process_position_event)
def init_rqdata(self): def init_rqdata(self):
""" """
@ -185,6 +199,8 @@ class CtaEngine(BaseEngine):
def process_order_event(self, event: Event): def process_order_event(self, event: Event):
"""""" """"""
order = event.data order = event.data
self.offset_converter.update_order(order)
strategy = self.orderid_strategy_map.get(order.vt_orderid, None) strategy = self.orderid_strategy_map.get(order.vt_orderid, None)
if not strategy: if not strategy:
@ -217,6 +233,8 @@ class CtaEngine(BaseEngine):
"""""" """"""
trade = event.data trade = event.data
self.offset_converter.update_trade(trade)
strategy = self.orderid_strategy_map.get(trade.vt_orderid, None) strategy = self.orderid_strategy_map.get(trade.vt_orderid, None)
if not strategy: if not strategy:
return return
@ -229,6 +247,12 @@ class CtaEngine(BaseEngine):
self.call_strategy_func(strategy, strategy.on_trade, trade) self.call_strategy_func(strategy, strategy.on_trade, trade)
self.put_strategy_event(strategy) self.put_strategy_event(strategy)
def process_position_event(self, event: Event):
""""""
position = event.data
self.offset_converter.update_position(position)
def check_stop_order(self, tick: TickData): def check_stop_order(self, tick: TickData):
"""""" """"""
for stop_order in list(self.stop_orders.values()): for stop_order in list(self.stop_orders.values()):
@ -259,16 +283,17 @@ class CtaEngine(BaseEngine):
else: else:
price = tick.bid_price_5 price = tick.bid_price_5
vt_orderid = self.send_limit_order( vt_orderids = self.send_limit_order(
strategy, strategy,
stop_order.direction, stop_order.direction,
stop_order.offset, stop_order.offset,
price, price,
stop_order.volume stop_order.volume,
stop_order.lock
) )
# Update stop order status if placed successfully # Update stop order status if placed successfully
if vt_orderid: if vt_orderids:
# Remove from relation map. # Remove from relation map.
self.stop_orders.pop(stop_order.stop_orderid) self.stop_orders.pop(stop_order.stop_orderid)
@ -278,7 +303,7 @@ class CtaEngine(BaseEngine):
# Change stop order status to cancelled and update to strategy. # Change stop order status to cancelled and update to strategy.
stop_order.status = StopOrderStatus.TRIGGERED stop_order.status = StopOrderStatus.TRIGGERED
stop_order.vt_orderid = vt_orderid stop_order.vt_orderids = vt_orderids
self.call_strategy_func( self.call_strategy_func(
strategy, strategy.on_stop_order, stop_order strategy, strategy.on_stop_order, stop_order
@ -292,13 +317,14 @@ class CtaEngine(BaseEngine):
offset: Offset, offset: Offset,
price: float, price: float,
volume: float, volume: float,
type: OrderType type: OrderType,
lock: bool
): ):
""" """
Send a new order to server. Send a new order to server.
""" """
# Create request and send order. # Create request and send order.
req = OrderRequest( original_req = OrderRequest(
symbol=contract.symbol, symbol=contract.symbol,
exchange=contract.exchange, exchange=contract.exchange,
direction=direction, direction=direction,
@ -307,16 +333,25 @@ class CtaEngine(BaseEngine):
price=price, price=price,
volume=volume, volume=volume,
) )
vt_orderid = self.main_engine.send_order(
req, contract.gateway_name)
# Save relationship between orderid and strategy. # Convert with offset converter
self.orderid_strategy_map[vt_orderid] = strategy req_list = self.offset_converter.convert_order_request(original_req, lock)
vt_orderids = self.strategy_orderid_map[strategy.strategy_name] # Send Orders
vt_orderids.add(vt_orderid) vt_orderids = []
return vt_orderid for req in req_list:
self.offset_converter.update_order_request(req)
vt_orderid = self.main_engine.send_order(
req, contract.gateway_name)
vt_orderids.append(vt_orderid)
# Save relationship between orderid and strategy.
self.orderid_strategy_map[vt_orderid] = strategy
self.strategy_orderid_map[strategy.strategy_name].add(vt_orderid)
return vt_orderids
def send_limit_order( def send_limit_order(
self, self,
@ -325,7 +360,8 @@ class CtaEngine(BaseEngine):
direction: Direction, direction: Direction,
offset: Offset, offset: Offset,
price: float, price: float,
volume: float volume: float,
lock: bool
): ):
""" """
Send a limit order to server. Send a limit order to server.
@ -337,7 +373,8 @@ class CtaEngine(BaseEngine):
offset, offset,
price, price,
volume, volume,
OrderType.LIMIT OrderType.LIMIT,
lock
) )
def send_server_stop_order( def send_server_stop_order(
@ -347,7 +384,8 @@ class CtaEngine(BaseEngine):
direction: Direction, direction: Direction,
offset: Offset, offset: Offset,
price: float, price: float,
volume: float volume: float,
lock: bool
): ):
""" """
Send a stop order to server. Send a stop order to server.
@ -362,7 +400,8 @@ class CtaEngine(BaseEngine):
offset, offset,
price, price,
volume, volume,
OrderType.STOP OrderType.STOP,
lock
) )
def send_local_stop_order( def send_local_stop_order(
@ -372,6 +411,7 @@ class CtaEngine(BaseEngine):
offset: Offset, offset: Offset,
price: float, price: float,
volume: float, volume: float,
lock: bool
): ):
""" """
Create a new local stop order. Create a new local stop order.
@ -386,7 +426,8 @@ class CtaEngine(BaseEngine):
price=price, price=price,
volume=volume, volume=volume,
stop_orderid=stop_orderid, stop_orderid=stop_orderid,
strategy_name=strategy.strategy_name strategy_name=strategy.strategy_name,
lock=lock
) )
self.stop_orders[stop_orderid] = stop_order self.stop_orders[stop_orderid] = stop_order
@ -439,6 +480,7 @@ class CtaEngine(BaseEngine):
price: float, price: float,
volume: float, volume: float,
stop: bool, stop: bool,
lock: bool
): ):
""" """
""" """
@ -449,11 +491,11 @@ class CtaEngine(BaseEngine):
if stop: if stop:
if contract.stop_supported: if contract.stop_supported:
return self.send_server_stop_order(strategy, contract, direction, offset, price, volume) return self.send_server_stop_order(strategy, contract, direction, offset, price, volume, lock)
else: else:
return self.send_local_stop_order(strategy, contract, direction, offset, price, volume) return self.send_local_stop_order(strategy, contract, direction, offset, price, volume, lock)
else: else:
return self.send_limit_order(strategy, contract, direction, offset, price, volume) return self.send_limit_order(strategy, contract, direction, offset, price, volume, lock)
def cancel_order(self, strategy: CtaTemplate, vt_orderid: str): def cancel_order(self, strategy: CtaTemplate, vt_orderid: str):
""" """

View File

@ -166,17 +166,18 @@ class CtaTemplate(ABC):
price: float, price: float,
volume: float, volume: float,
stop: bool = False, stop: bool = False,
lock: bool = False
): ):
""" """
Send a new order. Send a new order.
""" """
if self.trading: if self.trading:
vt_orderid = self.cta_engine.send_order( vt_orderids = self.cta_engine.send_order(
self, direction, offset, price, volume, stop self, direction, offset, price, volume, stop, lock
) )
return vt_orderids
else: else:
vt_orderid = "" return []
return vt_orderid
def cancel_order(self, vt_orderid: str): def cancel_order(self, vt_orderid: str):
""" """

View File

@ -334,13 +334,14 @@ class StopOrderMonitor(BaseMonitor):
"cell": BaseCell, "cell": BaseCell,
"update": False, "update": False,
}, },
"vt_orderid": {"display": "限价委托号", "cell": BaseCell, "update": True}, "vt_orderids": {"display": "限价委托号", "cell": BaseCell, "update": True},
"vt_symbol": {"display": "代码", "cell": BaseCell, "update": False}, "vt_symbol": {"display": "代码", "cell": BaseCell, "update": False},
"order_type": {"display": "类型", "cell": EnumCell, "update": False}, "order_type": {"display": "类型", "cell": EnumCell, "update": False},
"price": {"display": "价格", "cell": BaseCell, "update": False}, "price": {"display": "价格", "cell": BaseCell, "update": False},
"volume": {"display": "数量", "cell": BaseCell, "update": True}, "volume": {"display": "数量", "cell": BaseCell, "update": False},
"status": {"display": "状态", "cell": EnumCell, "update": True}, "status": {"display": "状态", "cell": EnumCell, "update": True},
"strategy": {"display": "策略名", "cell": StrategyCell, "update": True}, "lock": {"display": "锁仓", "cell": BaseCell, "update": False},
"strategy": {"display": "策略名", "cell": StrategyCell, "update": False},
} }
def init_ui(self): def init_ui(self):