[Mod]调整算法交易组件目录结构,增加自动加载运行时目录下算法的功能

This commit is contained in:
vn.py 2018-07-24 09:16:46 +08:00
parent 1a75ef084a
commit ca4a0cdafb
7 changed files with 71 additions and 50 deletions

View 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, '')

View File

@ -8,9 +8,8 @@ from vnpy.trader.vtConstant import (DIRECTION_LONG, DIRECTION_SHORT,
PRICETYPE_LIMITPRICE, PRICETYPE_MARKETPRICE, PRICETYPE_LIMITPRICE, PRICETYPE_MARKETPRICE,
STATUS_REJECTED, STATUS_CANCELLED, STATUS_ALLTRADED) STATUS_REJECTED, STATUS_CANCELLED, STATUS_ALLTRADED)
from vnpy.trader.uiQt import QtWidgets from vnpy.trader.uiQt import QtWidgets
from vnpy.trader.app.algoTrading.algoTemplate import AlgoTemplate
from .algoTemplate import AlgoTemplate from vnpy.trader.app.algoTrading.uiAlgoWidget import AlgoWidget, QtWidgets
from .uiAlgoWidget import AlgoWidget, QtWidgets
from six import text_type from six import text_type

View File

@ -6,9 +6,8 @@ from collections import OrderedDict
from vnpy.trader.vtConstant import (DIRECTION_LONG, DIRECTION_SHORT, from vnpy.trader.vtConstant import (DIRECTION_LONG, DIRECTION_SHORT,
OFFSET_OPEN, OFFSET_CLOSE) OFFSET_OPEN, OFFSET_CLOSE)
from vnpy.trader.uiQt import QtWidgets from vnpy.trader.uiQt import QtWidgets
from vnpy.trader.app.algoTrading.algoTemplate import AlgoTemplate
from .algoTemplate import AlgoTemplate from vnpy.trader.app.algoTrading.uiAlgoWidget import AlgoWidget, QtWidgets
from .uiAlgoWidget import AlgoWidget, QtWidgets

View File

@ -9,9 +9,8 @@ from vnpy.trader.vtConstant import (DIRECTION_LONG, DIRECTION_SHORT,
OFFSET_OPEN, OFFSET_CLOSE, OFFSET_OPEN, OFFSET_CLOSE,
STATUS_ALLTRADED, STATUS_CANCELLED, STATUS_REJECTED) STATUS_ALLTRADED, STATUS_CANCELLED, STATUS_REJECTED)
from vnpy.trader.uiQt import QtWidgets from vnpy.trader.uiQt import QtWidgets
from vnpy.trader.app.algoTrading.algoTemplate import AlgoTemplate
from .algoTemplate import AlgoTemplate from vnpy.trader.app.algoTrading.uiAlgoWidget import AlgoWidget, QtWidgets
from .uiAlgoWidget import AlgoWidget, QtWidgets

View File

@ -7,9 +7,8 @@ from six import text_type
from vnpy.trader.vtConstant import (DIRECTION_LONG, DIRECTION_SHORT) from vnpy.trader.vtConstant import (DIRECTION_LONG, DIRECTION_SHORT)
from vnpy.trader.uiQt import QtWidgets from vnpy.trader.uiQt import QtWidgets
from vnpy.trader.app.algoTrading.algoTemplate import AlgoTemplate
from .algoTemplate import AlgoTemplate from vnpy.trader.app.algoTrading.uiAlgoWidget import AlgoWidget, QtWidgets
from .uiAlgoWidget import AlgoWidget, QtWidgets
######################################################################## ########################################################################

View File

@ -15,13 +15,7 @@ from vnpy.trader.vtConstant import (DIRECTION_LONG, DIRECTION_SHORT,
OFFSET_CLOSETODAY, OFFSET_CLOSEYESTERDAY) OFFSET_CLOSETODAY, OFFSET_CLOSEYESTERDAY)
from vnpy.trader.vtObject import VtSubscribeReq, VtOrderReq, VtCancelOrderReq, VtLogData from vnpy.trader.vtObject import VtSubscribeReq, VtOrderReq, VtCancelOrderReq, VtLogData
from .algo import ALGO_DICT
from .twapAlgo import TwapAlgo
from .dmaAlgo import DmaAlgo
from .stopAlgo import StopAlgo
from .stAlgo import StAlgo
from .mmAlgo import MmAlgo
EVENT_ALGO_LOG = 'eAlgoLog' # 算法日志事件 EVENT_ALGO_LOG = 'eAlgoLog' # 算法日志事件
@ -328,32 +322,3 @@ class AlgoEngine(object):
event = Event(EVENT_ALGO_SETTING) event = Event(EVENT_ALGO_SETTING)
event.dict_['data'] = algoSetting event.dict_['data'] = algoSetting
self.eventEngine.put(event) self.eventEngine.put(event)
# 加载目录下的算法模板
ALGO_DICT = {}
WIDGET_DICT = {}
path = os.path.abspath(os.path.dirname(__file__))
for root, subdirs, files in os.walk(path):
for name in files:
# 只有文件名以Algo.py结尾的才是算法文件
if len(name)>7 and name[-7:] == 'Algo.py':
# 模块名称需要模块路径前缀
moduleName = 'vnpy.trader.app.algoTrading.' + name.replace('.py', '')
module = importlib.import_module(moduleName)
# 获取算法类和控件类
for k in dir(module):
# 以Algo结尾的类是算法
if k[-4:] == 'Algo':
algo = module.__getattribute__(k)
# 以Widget结尾的类是控件
if k[-6:] == 'Widget':
widget = module.__getattribute__(k)
# 保存到字典中
ALGO_DICT[algo.templateName] = algo
WIDGET_DICT[algo.templateName] = widget

View File

@ -10,8 +10,9 @@ from vnpy.event import Event
from vnpy.trader.uiQt import QtCore, QtWidgets from vnpy.trader.uiQt import QtCore, QtWidgets
from .algoEngine import (EVENT_ALGO_LOG, EVENT_ALGO_PARAM, from .algoEngine import (EVENT_ALGO_LOG, EVENT_ALGO_PARAM,
EVENT_ALGO_VAR, EVENT_ALGO_SETTING, EVENT_ALGO_VAR, EVENT_ALGO_SETTING)
WIDGET_DICT) from .algo import WIDGET_DICT
######################################################################## ########################################################################