[Add]cta strategy app supports for server side stop order
This commit is contained in:
parent
ec9a170ef3
commit
a6ae319333
@ -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,
|
||||||
|
@ -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"
|
||||||
|
|
||||||
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
Loading…
Reference in New Issue
Block a user