[Mod]change send order return data to vt_orderids (list) to support offset converter function
This commit is contained in:
parent
353a9c0d8d
commit
15fbb54960
@ -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,
|
||||||
|
@ -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"
|
||||||
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
@ -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):
|
||||||
|
Loading…
Reference in New Issue
Block a user