[Add]algo trading app
This commit is contained in:
parent
566638426c
commit
be62354c1f
17
vnpy/app/algo_trading/__init__.py
Normal file
17
vnpy/app/algo_trading/__init__.py
Normal file
@ -0,0 +1,17 @@
|
||||
from pathlib import Path
|
||||
|
||||
from vnpy.trader.app import BaseApp
|
||||
|
||||
from .engine import AlgoEngine, APP_NAME
|
||||
|
||||
|
||||
class CtaStrategyApp(BaseApp):
|
||||
""""""
|
||||
|
||||
app_name = APP_NAME
|
||||
app_module = __module__
|
||||
app_path = Path(__file__).parent
|
||||
display_name = "算法交易"
|
||||
engine_class = AlgoEngine
|
||||
widget_name = "AlgoManager"
|
||||
icon_name = "algo.ico"
|
59
vnpy/app/algo_trading/algos/__init__.py
Normal file
59
vnpy/app/algo_trading/algos/__init__.py
Normal file
@ -0,0 +1,59 @@
|
||||
# encoding: UTF-8
|
||||
|
||||
'''
|
||||
动态载入所有的策略类
|
||||
'''
|
||||
from __future__ import print_function
|
||||
|
||||
import os
|
||||
import importlib
|
||||
import traceback
|
||||
|
||||
|
||||
# 用来保存算法类和控件类的字典
|
||||
ALGO_DICT = {}
|
||||
WIDGET_DICT = {}
|
||||
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def loadAlgoModule(path, prefix):
|
||||
"""使用importlib动态载入算法"""
|
||||
for root, subdirs, files in os.walk(path):
|
||||
for name in files:
|
||||
# 只有文件名以Algo.py结尾的才是算法文件
|
||||
if len(name)>7 and name[-7:] == 'Algo.py':
|
||||
try:
|
||||
# 模块名称需要模块路径前缀
|
||||
moduleName = prefix + name.replace('.py', '')
|
||||
module = importlib.import_module(moduleName)
|
||||
|
||||
# 获取算法类和控件类
|
||||
algo = None
|
||||
widget = None
|
||||
|
||||
for k in dir(module):
|
||||
# 以Algo结尾的类,是算法
|
||||
if k[-4:] == 'Algo':
|
||||
algo = module.__getattribute__(k)
|
||||
|
||||
# 以Widget结尾的类,是控件
|
||||
if k[-6:] == 'Widget':
|
||||
widget = module.__getattribute__(k)
|
||||
|
||||
# 保存到字典中
|
||||
if algo and widget:
|
||||
ALGO_DICT[algo.templateName] = algo
|
||||
WIDGET_DICT[algo.templateName] = widget
|
||||
except:
|
||||
print ('-' * 20)
|
||||
print ('Failed to import strategy file %s:' %moduleName)
|
||||
traceback.print_exc()
|
||||
|
||||
|
||||
# 遍历algo目录下的文件
|
||||
path1 = os.path.abspath(os.path.dirname(__file__))
|
||||
loadAlgoModule(path1, 'vnpy.trader.app.algoTrading.algo.')
|
||||
|
||||
# 遍历工作目录下的文件
|
||||
path2 = os.getcwd()
|
||||
loadAlgoModule(path2, '')
|
0
vnpy/app/algo_trading/algos/iceberg_algo.py
Normal file
0
vnpy/app/algo_trading/algos/iceberg_algo.py
Normal file
0
vnpy/app/algo_trading/algos/sniper_algo.py
Normal file
0
vnpy/app/algo_trading/algos/sniper_algo.py
Normal file
0
vnpy/app/algo_trading/algos/twap_algo.py
Normal file
0
vnpy/app/algo_trading/algos/twap_algo.py
Normal file
65
vnpy/app/algo_trading/engine.py
Normal file
65
vnpy/app/algo_trading/engine.py
Normal file
@ -0,0 +1,65 @@
|
||||
|
||||
from vnpy.event import EventEngine
|
||||
from vnpy.trader.engine import BaseEngine, MainEngine
|
||||
from vnpy.trader.event import (EVENT_TICK, EVENT_TIMER, EVENT_ORDER, EVENT_TRADE)
|
||||
|
||||
|
||||
class AlgoEngine(BaseEngine):
|
||||
""""""
|
||||
|
||||
def __init__(self, main_engine: MainEngine, event_engine: EventEngine):
|
||||
"""Constructor"""
|
||||
super().__init__(main_engine, event_engine)
|
||||
|
||||
self.algos = {}
|
||||
self.symbol_algo_map = {}
|
||||
self.orderid_algo_map = {}
|
||||
|
||||
self.register_event()
|
||||
|
||||
def register_event(self):
|
||||
""""""
|
||||
self.event_engine.register(EVENT_TICK, self.process_tick_event)
|
||||
self.event_engine.register(EVENT_TIMER, self.process_timer_event)
|
||||
self.event_engine.register(EVENT_ORDER, self.process_order_event)
|
||||
self.event_engine.register(EVENT_TRADE, self.process_trade_event)
|
||||
|
||||
def process_tick_event(self):
|
||||
""""""
|
||||
pass
|
||||
|
||||
def process_timer_event(self):
|
||||
""""""
|
||||
pass
|
||||
|
||||
def process_trade_event(self):
|
||||
""""""
|
||||
pass
|
||||
|
||||
def process_order_event(self):
|
||||
""""""
|
||||
pass
|
||||
|
||||
def start_algo(self, setting: dict):
|
||||
""""""
|
||||
pass
|
||||
|
||||
def stop_algo(self, algo_name: dict):
|
||||
""""""
|
||||
pass
|
||||
|
||||
def stop_all(self):
|
||||
""""""
|
||||
pass
|
||||
|
||||
def subscribe(self, algo, vt_symbol):
|
||||
""""""
|
||||
pass
|
||||
|
||||
def send_order(
|
||||
self,
|
||||
algo,
|
||||
vt_symbol
|
||||
):
|
||||
""""""
|
||||
pass
|
123
vnpy/app/algo_trading/template.py
Normal file
123
vnpy/app/algo_trading/template.py
Normal file
@ -0,0 +1,123 @@
|
||||
from vnpy.trader.engine import BaseEngine
|
||||
from vnpy.trader.object import TickData, OrderData, TradeData
|
||||
from vnpy.trader.constant import OrderType, Offset
|
||||
|
||||
class AlgoTemplate:
|
||||
""""""
|
||||
count = 0
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
algo_engine: BaseEngine,
|
||||
algo_name: str,
|
||||
setting: dict
|
||||
):
|
||||
"""Constructor"""
|
||||
self.algo_engine = algo_engine
|
||||
self.algo_name = algo_name
|
||||
|
||||
self.active = False
|
||||
self.active_orders = {} # vt_orderid:order
|
||||
|
||||
@staticmethod
|
||||
def new(cls, algo_engine:BaseEngine, setting: dict):
|
||||
"""Create new algo instance"""
|
||||
cls.count += 1
|
||||
algo_name = f"{cls.__name__}_{cls.count}"
|
||||
algo = cls(algo_engine, algo_name, setting)
|
||||
|
||||
def update_tick(self, tick: TickData):
|
||||
""""""
|
||||
if self.active:
|
||||
self.on_tick(tick)
|
||||
|
||||
def update_order(self, order: OrderData):
|
||||
""""""
|
||||
if self.active:
|
||||
if order.is_active():
|
||||
self.active_orders[order.vt_orderid] = order
|
||||
elif order.vt_orderid in self.active_orders:
|
||||
self.active_orders.pop(order.vt_orderid)
|
||||
|
||||
self.on_order(order)
|
||||
|
||||
def update_trade(self, trade: TradeData):
|
||||
""""""
|
||||
if self.active:
|
||||
self.on_trade(trade)
|
||||
|
||||
def update_timer(self):
|
||||
""""""
|
||||
if self.active:
|
||||
self.on_timer()
|
||||
|
||||
def on_start(self):
|
||||
""""""
|
||||
pass
|
||||
|
||||
def on_stop(self):
|
||||
""""""
|
||||
pass
|
||||
|
||||
def on_tick(self, tick: TickData):
|
||||
""""""
|
||||
pass
|
||||
|
||||
def on_order(self, order: OrderData):
|
||||
""""""
|
||||
pass
|
||||
|
||||
def on_trade(self, trade: TradeData):
|
||||
""""""
|
||||
pass
|
||||
|
||||
def on_timer(self):
|
||||
""""""
|
||||
pass
|
||||
|
||||
def start(self):
|
||||
""""""
|
||||
pass
|
||||
|
||||
def stop(self):
|
||||
""""""
|
||||
pass
|
||||
|
||||
def buy(
|
||||
self,
|
||||
vt_symbol,
|
||||
price,
|
||||
volume,
|
||||
order_type: OrderType = OrderType.LIMIT,
|
||||
offset: Offset = Offset.NONE
|
||||
):
|
||||
""""""
|
||||
return self.algo_engine.buy(
|
||||
vt_symbol,
|
||||
price,
|
||||
volume,
|
||||
order_type,
|
||||
offset
|
||||
)
|
||||
|
||||
def sell(
|
||||
self,
|
||||
vt_symbol,
|
||||
price,
|
||||
volume,
|
||||
order_type: OrderType = OrderType.LIMIT,
|
||||
offset: Offset = Offset.NONE
|
||||
):
|
||||
""""""
|
||||
return self.algo_engine.buy(
|
||||
vt_symbol,
|
||||
price,
|
||||
volume,
|
||||
order_type,
|
||||
offset
|
||||
)
|
||||
|
||||
|
||||
|
||||
|
||||
|
BIN
vnpy/app/algo_trading/ui/algo.ico
Normal file
BIN
vnpy/app/algo_trading/ui/algo.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 66 KiB |
0
vnpy/app/algo_trading/ui/widget.py
Normal file
0
vnpy/app/algo_trading/ui/widget.py
Normal file
Loading…
Reference in New Issue
Block a user