[Add]cta strategy app supports for server side stop order

This commit is contained in:
vn.py 2019-03-22 22:31:19 +08:00
parent ec9a170ef3
commit a6ae319333
3 changed files with 70 additions and 20 deletions

View File

@ -18,7 +18,6 @@ from vnpy.trader.utility import round_to_pricetick
from .base import ( from .base import (
BacktestingMode, BacktestingMode,
EngineType, EngineType,
ORDER_CTA2VT,
STOPORDER_PREFIX, STOPORDER_PREFIX,
StopOrder, StopOrder,
StopOrderStatus, StopOrderStatus,

View File

@ -43,4 +43,3 @@ class StopOrder:
EVENT_CTA_LOG = "eCtaLog" EVENT_CTA_LOG = "eCtaLog"
EVENT_CTA_STRATEGY = "eCtaStrategy" EVENT_CTA_STRATEGY = "eCtaStrategy"
EVENT_CTA_STOPORDER = "eCtaStopOrder" EVENT_CTA_STOPORDER = "eCtaStopOrder"

View File

@ -18,7 +18,8 @@ from vnpy.trader.object import (
SubscribeRequest, SubscribeRequest,
LogData, LogData,
TickData, TickData,
BarData BarData,
ContractData
) )
from vnpy.trader.event import EVENT_TICK, EVENT_ORDER, EVENT_TRADE from vnpy.trader.event import EVENT_TICK, EVENT_ORDER, EVENT_TRADE
from vnpy.trader.constant import Direction, OrderType, Interval, Exchange, Offset from vnpy.trader.constant import Direction, OrderType, Interval, Exchange, Offset
@ -33,7 +34,6 @@ from .base import (
EngineType, EngineType,
StopOrder, StopOrder,
StopOrderStatus, StopOrderStatus,
ORDER_CTA2VT,
STOPORDER_PREFIX STOPORDER_PREFIX
) )
from .template import CtaTemplate from .template import CtaTemplate
@ -256,29 +256,26 @@ class CtaEngine(BaseEngine):
strategy, strategy.on_stop_order, stop_order strategy, strategy.on_stop_order, stop_order
) )
def send_limit_order( def send_server_order(
self, self,
strategy: CtaTemplate, strategy: CtaTemplate,
contract: ContractData,
direction: Direction, direction: Direction,
offset: Offset, offset: Offset,
price: float, price: float,
volume: float, volume: float,
type: OrderType
): ):
""" """
Send a new order. Send a new order to server.
""" """
contract = self.main_engine.get_contract(strategy.vt_symbol)
if not contract:
self.write_log(f"委托失败,找不到合约:{strategy.vt_symbol}", strategy)
return ""
# Create request and send order. # Create request and send order.
req = OrderRequest( req = OrderRequest(
symbol=contract.symbol, symbol=contract.symbol,
exchange=contract.exchange, exchange=contract.exchange,
direction=direction, direction=direction,
offset=offset, offset=offset,
type=OrderType.LIMIT, type=type,
price=price, price=price,
volume=volume, volume=volume,
) )
@ -292,8 +289,55 @@ class CtaEngine(BaseEngine):
vt_orderids.add(vt_orderid) vt_orderids.add(vt_orderid)
return vt_orderid return vt_orderid
def send_limit_order(
self,
strategy: CtaTemplate,
contract: ContractData,
direction: Direction,
offset: Offset,
price: float,
volume: float
):
"""
Send a limit order to server.
"""
return self.send_server_order(
strategy,
contract,
direction,
offset,
price,
volume,
OrderType.LIMIT
)
def send_server_stop_order(
self,
strategy: CtaTemplate,
contract: ContractData,
direction: Direction,
offset: Offset,
price: float,
volume: float
):
"""
Send a stop order to server.
Should only be used if stop order supported
on the trading server.
"""
return self.send_server_order(
strategy,
contract,
direction,
offset,
price,
volume,
OrderType.STOP
)
def send_stop_order( def send_local_stop_order(
self, self,
strategy: CtaTemplate, strategy: CtaTemplate,
direction: Direction, direction: Direction,
@ -302,7 +346,7 @@ class CtaEngine(BaseEngine):
volume: float, volume: float,
): ):
""" """
Send a new order. Create a new local stop order.
""" """
self.stop_order_count += 1 self.stop_order_count += 1
stop_orderid = f"{STOPORDER_PREFIX}.{self.stop_order_count}" stop_orderid = f"{STOPORDER_PREFIX}.{self.stop_order_count}"
@ -326,7 +370,7 @@ class CtaEngine(BaseEngine):
return stop_orderid return stop_orderid
def cancel_limit_order(self, strategy: CtaTemplate, vt_orderid: str): def cancel_server_order(self, strategy: CtaTemplate, vt_orderid: str):
""" """
Cancel existing order by vt_orderid. Cancel existing order by vt_orderid.
""" """
@ -338,7 +382,7 @@ class CtaEngine(BaseEngine):
req = order.create_cancel_request() req = order.create_cancel_request()
self.main_engine.cancel_order(req, order.gateway_name) self.main_engine.cancel_order(req, order.gateway_name)
def cancel_stop_order(self, strategy: CtaTemplate, stop_orderid: str): def cancel_local_stop_order(self, strategy: CtaTemplate, stop_orderid: str):
""" """
Cancel a local stop order. Cancel a local stop order.
""" """
@ -370,18 +414,26 @@ class CtaEngine(BaseEngine):
): ):
""" """
""" """
contract = self.main_engine.get_contract(strategy.vt_symbol)
if not contract:
self.write_log(f"委托失败,找不到合约:{strategy.vt_symbol}", strategy)
return ""
if stop: if stop:
return self.send_stop_order(strategy, direction, offset, price, volume) if contract.stop_supported:
return self.send_server_stop_order(strategy, contract, direction, offset, price, volume)
else:
return self.send_local_stop_order(strategy, contract, direction, offset, price, volume)
else: else:
return self.send_limit_order(strategy, direction, offset, price, volume) return self.send_limit_order(strategy, contract, direction, offset, price, volume)
def cancel_order(self, strategy: CtaTemplate, vt_orderid: str): def cancel_order(self, strategy: CtaTemplate, vt_orderid: str):
""" """
""" """
if vt_orderid.startswith(STOPORDER_PREFIX): if vt_orderid.startswith(STOPORDER_PREFIX):
self.cancel_stop_order(strategy, vt_orderid) self.cancel_local_stop_order(strategy, vt_orderid)
else: else:
self.cancel_limit_order(strategy, vt_orderid) self.cancel_server_order(strategy, vt_orderid)
def cancel_all(self, strategy: CtaTemplate): def cancel_all(self, strategy: CtaTemplate):
""" """