private log
This commit is contained in:
parent
b845966b2a
commit
e0a50e5a29
4
.gitignore
vendored
4
.gitignore
vendored
@ -78,3 +78,7 @@ vn.trader/ctaStrategy02.py
|
|||||||
*.pyd
|
*.pyd
|
||||||
vn.trader/vnctpmd.pyd_old
|
vn.trader/vnctpmd.pyd_old
|
||||||
*.pyd_old
|
*.pyd_old
|
||||||
|
vn.trader/ctaStrategy06.py
|
||||||
|
vn.trader/ctaStrategy03.py
|
||||||
|
vn.trader/ctaStrategy05.py
|
||||||
|
vn.trader/ctaStrategy04.py
|
||||||
|
64
vn.trader/main.py
Normal file
64
vn.trader/main.py
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
# encoding: UTF-8
|
||||||
|
import time
|
||||||
|
import sys
|
||||||
|
import ctypes
|
||||||
|
try:
|
||||||
|
import bsddb
|
||||||
|
except:
|
||||||
|
import bsddb3 as bsddb
|
||||||
|
sys.modules['bsddb'] = bsddb
|
||||||
|
import json
|
||||||
|
from ctaStrategies import strategyClassDict
|
||||||
|
|
||||||
|
|
||||||
|
from vtEngine import MainEngine
|
||||||
|
from PyQt4.QtCore import QCoreApplication
|
||||||
|
from simple_monitor import *
|
||||||
|
from setup_logger import setup_logger
|
||||||
|
|
||||||
|
setup_logger(debug=True)
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def main():
|
||||||
|
app = QCoreApplication(sys.argv)
|
||||||
|
mainEngine = MainEngine()
|
||||||
|
mainEngine.dbConnect()
|
||||||
|
mainEngine.connect('CTP_Prod')
|
||||||
|
|
||||||
|
|
||||||
|
def loadStrategySetting(setting_file_name):
|
||||||
|
"""读取引擎中的策略配置"""
|
||||||
|
with open(setting_file_name) as f:
|
||||||
|
# 读取文件内容串=》Json对象
|
||||||
|
d = json.load(f)
|
||||||
|
|
||||||
|
# 策略实例名称,配置内容
|
||||||
|
for name, setting in d.items():
|
||||||
|
|
||||||
|
# 策略的类名称
|
||||||
|
strategyClassName = setting['strategyClassName']
|
||||||
|
|
||||||
|
if strategyClassName in strategyClassDict:
|
||||||
|
# 透过策略类字典,反射获取策略
|
||||||
|
strategyClass = strategyClassDict[strategyClassName]
|
||||||
|
|
||||||
|
# 初始化策略的设置
|
||||||
|
mainEngine.ctaEngine.initStrategy(name, strategyClass, setting)
|
||||||
|
else:
|
||||||
|
mainEngine.writeLog(u'无法找到策略类:' + strategyClassName)
|
||||||
|
break
|
||||||
|
|
||||||
|
loadStrategySetting('CTA_setting.json')
|
||||||
|
mainEngine.ctaEngine.startStrategy('Test1')
|
||||||
|
logM = LogMonitor(mainEngine.eventEngine)
|
||||||
|
errorM = ErrorMonitor(mainEngine.eventEngine)
|
||||||
|
tradeM = TradeMonitor(mainEngine.eventEngine)
|
||||||
|
orderM = OrderMonitor(mainEngine.eventEngine, mainEngine)
|
||||||
|
positionM = PositionMonitor(mainEngine.eventEngine)
|
||||||
|
accountM = AccountMonitor(mainEngine.eventEngine)
|
||||||
|
|
||||||
|
|
||||||
|
app.exec_()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
175
vn.trader/setup_logger.py
Normal file
175
vn.trader/setup_logger.py
Normal file
@ -0,0 +1,175 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# coding=utf8
|
||||||
|
import logging
|
||||||
|
import threading
|
||||||
|
import logging.config
|
||||||
|
import os.path
|
||||||
|
import uuid
|
||||||
|
from logging import handlers
|
||||||
|
|
||||||
|
|
||||||
|
SIMPLE_FORMAT = "[%(asctime)s] %(message)s"
|
||||||
|
RECORD_FORMAT = "[%(asctime)s.%(msecs)d][%(filename)s:%(lineno)d][%(process)d:%(threadName)s] %(message)s"
|
||||||
|
COLOR_FORMAT = {
|
||||||
|
'DEBUG': "\033[1;34m%(levelname)s\033[0m: ",
|
||||||
|
'INFO': "\033[1;32m%(levelname)s\033[0m: ",
|
||||||
|
'WARNING': "\033[1;33m%(levelname)s\033[0m: ",
|
||||||
|
'ERROR': "\033[1;31m%(levelname)s\033[0m: ",
|
||||||
|
}
|
||||||
|
DATE_FORMAT = "%Y-%m-%d %H:%M:%S"
|
||||||
|
|
||||||
|
|
||||||
|
class ExtFormatter(logging.Formatter):
|
||||||
|
|
||||||
|
def __init__(self, colorful=False, simple=False):
|
||||||
|
self._colorful = colorful
|
||||||
|
self._simple = simple
|
||||||
|
logging.Formatter.__init__(self, datefmt=DATE_FORMAT)
|
||||||
|
|
||||||
|
def format(self, record):
|
||||||
|
fmt = SIMPLE_FORMAT if self._simple else RECORD_FORMAT
|
||||||
|
if self._colorful:
|
||||||
|
self._fmt = COLOR_FORMAT[record.levelname] + fmt
|
||||||
|
else:
|
||||||
|
self._fmt = "%(levelname)s: " + fmt
|
||||||
|
return logging.Formatter.format(self, record)
|
||||||
|
|
||||||
|
|
||||||
|
class BasicFormatter(ExtFormatter):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
super(BasicFormatter, self).__init__()
|
||||||
|
|
||||||
|
|
||||||
|
class SimpleFormatter(ExtFormatter):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
super(SimpleFormatter, self).__init__(simple=True)
|
||||||
|
|
||||||
|
|
||||||
|
class ColorFormatter(ExtFormatter):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
super(ColorFormatter, self).__init__(colorful=True)
|
||||||
|
|
||||||
|
|
||||||
|
thread_data = threading.local()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class StreamHandler(logging.StreamHandler):
|
||||||
|
def acquire(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def release(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class FileHandler(handlers.TimedRotatingFileHandler):
|
||||||
|
def acquire(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def release(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def setup_logger(filename=None, debug=False):
|
||||||
|
handlers = []
|
||||||
|
LOGGING = {
|
||||||
|
'version': 1,
|
||||||
|
'disable_existing_loggers': True,
|
||||||
|
'formatters': {
|
||||||
|
'color': {
|
||||||
|
'()': ColorFormatter,
|
||||||
|
},
|
||||||
|
'basic': {
|
||||||
|
'()': BasicFormatter,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'handlers': {
|
||||||
|
'std_debug': {
|
||||||
|
'level': 'DEBUG',
|
||||||
|
'()': StreamHandler,
|
||||||
|
'formatter': 'basic',
|
||||||
|
},
|
||||||
|
'std_info': {
|
||||||
|
'level': 'INFO',
|
||||||
|
'()': StreamHandler,
|
||||||
|
'formatter': 'basic',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'loggers': {
|
||||||
|
'': {
|
||||||
|
'level': 'DEBUG',
|
||||||
|
'handlers': [],
|
||||||
|
'propagate': True,
|
||||||
|
},
|
||||||
|
'tornado.access': {
|
||||||
|
'level': 'DEBUG',
|
||||||
|
'handlers': [],
|
||||||
|
'propagate': False,
|
||||||
|
},
|
||||||
|
'tornado.application': {
|
||||||
|
'level': 'DEBUG',
|
||||||
|
'handlers': [],
|
||||||
|
'propagate': False,
|
||||||
|
},
|
||||||
|
'tornado.gen_log': {
|
||||||
|
'level': 'DEBUG',
|
||||||
|
'handlers': [],
|
||||||
|
'propagate': False,
|
||||||
|
},
|
||||||
|
'django': {
|
||||||
|
'handlers': [],
|
||||||
|
'propagate': True,
|
||||||
|
'level': 'INFO',
|
||||||
|
},
|
||||||
|
'django.request': {
|
||||||
|
'handlers': [],
|
||||||
|
'level': 'INFO',
|
||||||
|
'propagate': False,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
if filename:
|
||||||
|
base_name, ext = os.path.splitext(filename)
|
||||||
|
debug_filename = '%s-debug%s' % (base_name, ext)
|
||||||
|
local = {
|
||||||
|
'local_debug': {
|
||||||
|
'level': 'DEBUG',
|
||||||
|
'()': FileHandler,
|
||||||
|
'filename': debug_filename,
|
||||||
|
'formatter': 'basic',
|
||||||
|
'interval': 1,
|
||||||
|
'when': 'D',
|
||||||
|
},
|
||||||
|
'local_info': {
|
||||||
|
'level': 'INFO',
|
||||||
|
'()': FileHandler,
|
||||||
|
'filename': filename,
|
||||||
|
'formatter': 'basic',
|
||||||
|
'interval': 1,
|
||||||
|
'when': 'D',
|
||||||
|
},
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
LOGGING['handlers'].update(local)
|
||||||
|
handlers.append('local_info')
|
||||||
|
if debug:
|
||||||
|
handlers.append('local_debug')
|
||||||
|
else:
|
||||||
|
if debug:
|
||||||
|
handlers.append('std_debug')
|
||||||
|
else:
|
||||||
|
handlers.append('std_info')
|
||||||
|
|
||||||
|
for k, v in LOGGING['loggers'].items():
|
||||||
|
v['handlers'] = handlers
|
||||||
|
|
||||||
|
logging.config.dictConfig(LOGGING)
|
||||||
|
return LOGGING
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
setup_logger('aaa.log', debug=True)
|
||||||
|
logging.info("aaaa")
|
291
vn.trader/simple_monitor.py
Normal file
291
vn.trader/simple_monitor.py
Normal file
@ -0,0 +1,291 @@
|
|||||||
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from collections import OrderedDict
|
||||||
|
|
||||||
|
from PyQt4 import QtGui, QtCore
|
||||||
|
|
||||||
|
from eventEngine import *
|
||||||
|
from vtFunction import *
|
||||||
|
from vtGateway import *
|
||||||
|
import logging
|
||||||
|
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
class BasicMonitor(object):
|
||||||
|
"""
|
||||||
|
基础监控
|
||||||
|
|
||||||
|
headerDict中的值对应的字典格式如下
|
||||||
|
{'chinese': u'中文名', 'cellType': ""}
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def __init__(self, eventEngine=None, parent=None):
|
||||||
|
self.eventEngine = eventEngine
|
||||||
|
|
||||||
|
# 保存表头标签用
|
||||||
|
self.headerDict = OrderedDict() # 有序字典,key是英文名,value是对应的配置字典
|
||||||
|
self.headerList = [] # 对应self.headerDict.keys()
|
||||||
|
|
||||||
|
# 保存相关数据用
|
||||||
|
self.dataDict = {} # 字典,key是字段对应的数据,value是保存相关单元格的字典
|
||||||
|
self.dataKey = '' # 字典键对应的数据字段
|
||||||
|
|
||||||
|
# 监控的事件类型
|
||||||
|
self.eventType = ''
|
||||||
|
|
||||||
|
# 保存数据对象到单元格
|
||||||
|
self.saveData = False
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def setHeaderDict(self, headerDict):
|
||||||
|
"""设置表头有序字典"""
|
||||||
|
self.headerDict = headerDict
|
||||||
|
self.headerList = headerDict.keys()
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def setDataKey(self, dataKey):
|
||||||
|
"""设置数据字典的键"""
|
||||||
|
self.dataKey = dataKey
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def setEventType(self, eventType):
|
||||||
|
"""设置监控的事件类型"""
|
||||||
|
self.eventType = eventType
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def setSaveData(self, saveData):
|
||||||
|
"""设置是否要保存数据到单元格"""
|
||||||
|
self.saveData = saveData
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def registerEvent(self):
|
||||||
|
self.eventEngine.register(self.eventType, self.updateEvent)
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def updateEvent(self, event):
|
||||||
|
"""收到事件更新"""
|
||||||
|
data = event.dict_['data']
|
||||||
|
self.updateData(data)
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def updateData(self, data):
|
||||||
|
"""将数据更新到表格中"""
|
||||||
|
s = []
|
||||||
|
for header, value in self.headerDict.items():
|
||||||
|
v = getattr(data, header)
|
||||||
|
if isinstance(v, basestring) and not isinstance(v, unicode):
|
||||||
|
try:
|
||||||
|
v = v.decode('gbk')
|
||||||
|
except:
|
||||||
|
v = v.decode('utf8')
|
||||||
|
s.append('%s: %s' % (value['chinese'], v))
|
||||||
|
logging.info(' '.join(s))
|
||||||
|
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
class MarketMonitor(BasicMonitor):
|
||||||
|
"""市场监控组件"""
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def __init__(self, eventEngine, parent=None):
|
||||||
|
"""Constructor"""
|
||||||
|
super(MarketMonitor, self).__init__(eventEngine, parent)
|
||||||
|
|
||||||
|
# 设置表头有序字典
|
||||||
|
d = OrderedDict()
|
||||||
|
d['symbol'] = {'chinese': u'合约代码', 'cellType': ""}
|
||||||
|
d['vtSymbol'] = {'chinese': u'名称', 'cellType': ""}
|
||||||
|
d['lastPrice'] = {'chinese': u'最新价', 'cellType': ""}
|
||||||
|
d['volume'] = {'chinese': u'成交量', 'cellType': ""}
|
||||||
|
d['openInterest'] = {'chinese': u'持仓量', 'cellType': ""}
|
||||||
|
d['openPrice'] = {'chinese': u'开盘价', 'cellType': ""}
|
||||||
|
d['highPrice'] = {'chinese': u'最高价', 'cellType': ""}
|
||||||
|
d['lowPrice'] = {'chinese': u'最低价', 'cellType': ""}
|
||||||
|
d['bidPrice1'] = {'chinese': u'买一价', 'cellType': ""}
|
||||||
|
d['bidVolume1'] = {'chinese': u'买一量', 'cellType': ""}
|
||||||
|
d['askPrice1'] = {'chinese': u'卖一价', 'cellType': ""}
|
||||||
|
d['askVolume1'] = {'chinese': u'卖一量', 'cellType': ""}
|
||||||
|
d['time'] = {'chinese': u'时间', 'cellType': ""}
|
||||||
|
d['gatewayName'] = {'chinese': u'接口', 'cellType': ""}
|
||||||
|
self.setHeaderDict(d)
|
||||||
|
|
||||||
|
# 设置数据键
|
||||||
|
self.setDataKey('vtSymbol')
|
||||||
|
|
||||||
|
# 设置监控事件类型
|
||||||
|
self.setEventType(EVENT_TICK)
|
||||||
|
|
||||||
|
# 注册事件监听
|
||||||
|
self.registerEvent()
|
||||||
|
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
class LogMonitor(BasicMonitor):
|
||||||
|
"""日志监控"""
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def __init__(self, eventEngine, parent=None):
|
||||||
|
"""Constructor"""
|
||||||
|
super(LogMonitor, self).__init__(eventEngine, parent)
|
||||||
|
|
||||||
|
d = OrderedDict()
|
||||||
|
d['logTime'] = {'chinese': u'时间', 'cellType': ""}
|
||||||
|
d['logContent'] = {'chinese': u'内容', 'cellType': ""}
|
||||||
|
d['gatewayName'] = {'chinese': u'接口', 'cellType': ""}
|
||||||
|
self.setHeaderDict(d)
|
||||||
|
|
||||||
|
self.setEventType(EVENT_LOG)
|
||||||
|
self.registerEvent()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
class CtaLogMonitor(BasicMonitor):
|
||||||
|
"""日志监控"""
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def __init__(self, eventEngine, parent=None):
|
||||||
|
"""Constructor"""
|
||||||
|
super(CtaLogMonitor, self).__init__(eventEngine, parent)
|
||||||
|
|
||||||
|
d = OrderedDict()
|
||||||
|
d['logTime'] = {'chinese': u'时间', 'cellType': ""}
|
||||||
|
d['logContent'] = {'chinese': u'内容', 'cellType': ""}
|
||||||
|
# d['gatewayName'] = {'chinese': u'接口', 'cellType': ""}
|
||||||
|
self.setHeaderDict(d)
|
||||||
|
|
||||||
|
self.setEventType(EVENT_CTA_LOG)
|
||||||
|
self.registerEvent()
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
class ErrorMonitor(BasicMonitor):
|
||||||
|
"""错误监控"""
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def __init__(self, eventEngine, parent=None):
|
||||||
|
"""Constructor"""
|
||||||
|
super(ErrorMonitor, self).__init__(eventEngine, parent)
|
||||||
|
|
||||||
|
d = OrderedDict()
|
||||||
|
d['errorID'] = {'chinese': u'错误代码', 'cellType': ""}
|
||||||
|
d['errorMsg'] = {'chinese': u'错误信息', 'cellType': ""}
|
||||||
|
d['additionalInfo'] = {'chinese': u'补充信息', 'cellType': ""}
|
||||||
|
d['gatewayName'] = {'chinese': u'接口', 'cellType': ""}
|
||||||
|
self.setHeaderDict(d)
|
||||||
|
|
||||||
|
self.setEventType(EVENT_ERROR)
|
||||||
|
self.registerEvent()
|
||||||
|
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
class TradeMonitor(BasicMonitor):
|
||||||
|
"""成交监控"""
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def __init__(self, eventEngine, parent=None):
|
||||||
|
"""Constructor"""
|
||||||
|
super(TradeMonitor, self).__init__(eventEngine, parent)
|
||||||
|
|
||||||
|
d = OrderedDict()
|
||||||
|
d['tradeID'] = {'chinese': u'成交编号', 'cellType': ""}
|
||||||
|
d['orderID'] = {'chinese': u'委托编号', 'cellType': ""}
|
||||||
|
d['symbol'] = {'chinese': u'合约代码', 'cellType': ""}
|
||||||
|
d['vtSymbol'] = {'chinese': u'名称', 'cellType': ""}
|
||||||
|
d['direction'] = {'chinese': u'方向', 'cellType': ""}
|
||||||
|
d['offset'] = {'chinese': u'开平', 'cellType': ""}
|
||||||
|
d['price'] = {'chinese': u'价格', 'cellType': ""}
|
||||||
|
d['volume'] = {'chinese': u'数量', 'cellType': ""}
|
||||||
|
d['tradeTime'] = {'chinese': u'成交时间', 'cellType': ""}
|
||||||
|
d['gatewayName'] = {'chinese': u'接口', 'cellType': ""}
|
||||||
|
self.setHeaderDict(d)
|
||||||
|
|
||||||
|
self.setEventType(EVENT_TRADE)
|
||||||
|
self.registerEvent()
|
||||||
|
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
class OrderMonitor(BasicMonitor):
|
||||||
|
"""委托监控"""
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def __init__(self, eventEngine, mainEngine, parent=None):
|
||||||
|
"""Constructor"""
|
||||||
|
super(OrderMonitor, self).__init__(eventEngine, parent)
|
||||||
|
|
||||||
|
self.mainEngine = mainEngine
|
||||||
|
|
||||||
|
d = OrderedDict()
|
||||||
|
d['orderID'] = {'chinese': u'委托编号', 'cellType': ""}
|
||||||
|
d['symbol'] = {'chinese': u'合约代码', 'cellType': ""}
|
||||||
|
d['vtSymbol'] = {'chinese': u'名称', 'cellType': ""}
|
||||||
|
d['direction'] = {'chinese': u'方向', 'cellType': ""}
|
||||||
|
d['offset'] = {'chinese': u'开平', 'cellType': ""}
|
||||||
|
d['price'] = {'chinese': u'价格', 'cellType': ""}
|
||||||
|
d['totalVolume'] = {'chinese': u'委托数量', 'cellType': ""}
|
||||||
|
d['tradedVolume'] = {'chinese': u'成交数量', 'cellType': ""}
|
||||||
|
d['status'] = {'chinese': u'状态', 'cellType': ""}
|
||||||
|
d['orderTime'] = {'chinese': u'委托时间', 'cellType': ""}
|
||||||
|
d['cancelTime'] = {'chinese': u'撤销时间', 'cellType': ""}
|
||||||
|
d['frontID'] = {'chinese': u'前置编号', 'cellType': ""}
|
||||||
|
d['sessionID'] = {'chinese': u'会话编号', 'cellType': ""}
|
||||||
|
d['gatewayName'] = {'chinese': u'接口', 'cellType': ""}
|
||||||
|
self.setHeaderDict(d)
|
||||||
|
|
||||||
|
self.setDataKey('vtOrderID')
|
||||||
|
self.setEventType(EVENT_ORDER)
|
||||||
|
self.setSaveData(True)
|
||||||
|
|
||||||
|
self.registerEvent()
|
||||||
|
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
class PositionMonitor(BasicMonitor):
|
||||||
|
"""持仓监控"""
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def __init__(self, eventEngine, parent=None):
|
||||||
|
"""Constructor"""
|
||||||
|
super(PositionMonitor, self).__init__(eventEngine, parent)
|
||||||
|
|
||||||
|
d = OrderedDict()
|
||||||
|
d['symbol'] = {'chinese': u'合约代码', 'cellType': ""}
|
||||||
|
d['vtSymbol'] = {'chinese': u'名称', 'cellType': ""}
|
||||||
|
d['direction'] = {'chinese': u'方向', 'cellType': ""}
|
||||||
|
d['position'] = {'chinese': u'持仓量', 'cellType': ""}
|
||||||
|
d['ydPosition'] = {'chinese': u'昨持仓', 'cellType': ""}
|
||||||
|
d['frozen'] = {'chinese': u'冻结量', 'cellType': ""}
|
||||||
|
d['price'] = {'chinese': u'价格', 'cellType': ""}
|
||||||
|
d['gatewayName'] = {'chinese': u'接口', 'cellType': ""}
|
||||||
|
self.setHeaderDict(d)
|
||||||
|
|
||||||
|
self.setDataKey('vtPositionName')
|
||||||
|
self.setEventType(EVENT_POSITION)
|
||||||
|
self.registerEvent()
|
||||||
|
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
class AccountMonitor(BasicMonitor):
|
||||||
|
"""账户监控"""
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
def __init__(self, eventEngine, parent=None):
|
||||||
|
"""Constructor"""
|
||||||
|
super(AccountMonitor, self).__init__(eventEngine, parent)
|
||||||
|
|
||||||
|
d = OrderedDict()
|
||||||
|
d['accountID'] = {'chinese': u'账户', 'cellType': ""}
|
||||||
|
d['preBalance'] = {'chinese': u'昨结', 'cellType': ""}
|
||||||
|
d['balance'] = {'chinese': u'净值', 'cellType': ""}
|
||||||
|
d['available'] = {'chinese': u'可用', 'cellType': ""}
|
||||||
|
d['commission'] = {'chinese': u'手续费', 'cellType': ""}
|
||||||
|
d['margin'] = {'chinese': u'保证金', 'cellType': ""}
|
||||||
|
d['closeProfit'] = {'chinese': u'平仓盈亏', 'cellType': ""}
|
||||||
|
d['positionProfit'] = {'chinese': u'持仓盈亏', 'cellType': ""}
|
||||||
|
d['gatewayName'] = {'chinese': u'接口', 'cellType': ""}
|
||||||
|
self.setHeaderDict(d)
|
||||||
|
|
||||||
|
self.setDataKey('vtAccountID')
|
||||||
|
self.setEventType(EVENT_ACCOUNT)
|
||||||
|
self.registerEvent()
|
75
vn.trader/utils.py
Normal file
75
vn.trader/utils.py
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# coding=utf8
|
||||||
|
"""
|
||||||
|
上交所,市场代码 SHSE
|
||||||
|
深交所,市场代码 SZSE
|
||||||
|
中金所,市场代码 CFFEX
|
||||||
|
上期所,市场代码 SHFE
|
||||||
|
大商所,市场代码 DCE
|
||||||
|
郑商所,市场代码 CZCE
|
||||||
|
纽约商品交易所, 市场代码 CMX (GLN, SLN)
|
||||||
|
伦敦国际石油交易所, 市场代码 IPE (OIL, GAL)
|
||||||
|
纽约商业交易所, 市场代码 NYM (CON, HON)
|
||||||
|
芝加哥商品期货交易所,市场代码 CBT (SOC, SBC, SMC, CRC)
|
||||||
|
纽约期货交易所,市场代码 NYB (SGN)
|
||||||
|
|
||||||
|
"""
|
||||||
|
from gmsdk.api import md
|
||||||
|
from vtGateway import VtTickData
|
||||||
|
|
||||||
|
ret = md.init(
|
||||||
|
username='171322809@qq.com',
|
||||||
|
password='88888888',
|
||||||
|
mode=2
|
||||||
|
)
|
||||||
|
|
||||||
|
import arrow
|
||||||
|
|
||||||
|
|
||||||
|
def to_local(utc):
|
||||||
|
return arrow.get(utc).to('local')
|
||||||
|
|
||||||
|
|
||||||
|
def gm_to_vt(exchange, sym, tick):
|
||||||
|
obj = VtTickData()
|
||||||
|
|
||||||
|
obj.symbol = sym # 合约代码
|
||||||
|
obj.exchange = exchange # 交易所代码
|
||||||
|
obj.vtSymbol = sym # 合约在vt系统中的唯一代码,通常是 合约代码.交易所代码
|
||||||
|
|
||||||
|
local_time = to_local(tick.utc_time)
|
||||||
|
# 成交数据
|
||||||
|
obj.lastPrice = round(tick.last_price, 2) # 最新成交价
|
||||||
|
obj.lastVolume = tick.last_volume # 最新成交量
|
||||||
|
obj.volume = tick.cum_volume # 今天总成交量
|
||||||
|
obj.openInterest = tick.cum_position # 持仓量
|
||||||
|
obj.time = local_time.strftime('%H:%M:%S') # 时间 11:20:56.5
|
||||||
|
obj.date = local_time.strftime('%Y%m%d') # 日期 20151009
|
||||||
|
|
||||||
|
# 常规行情
|
||||||
|
obj.openPrice = tick.open # 今日开盘价
|
||||||
|
obj.highPrice = tick.high # 今日最高价
|
||||||
|
obj.lowPrice = tick.low # 今日最低价
|
||||||
|
obj.preClosePrice = tick.pre_close
|
||||||
|
|
||||||
|
obj.upperLimit = tick.upper_limit # 涨停价
|
||||||
|
obj.lowerLimit = tick.lower_limit # 跌停价
|
||||||
|
|
||||||
|
# 一档行情
|
||||||
|
obj.bidPrice1, obj.bidVolume1 = tick.bids[0]
|
||||||
|
|
||||||
|
obj.askPrice1, obj.askVolume1 = tick.asks[0]
|
||||||
|
return obj
|
||||||
|
|
||||||
|
|
||||||
|
def get_last_n_ticks(exchange, sym, n):
|
||||||
|
ticks = md.get_last_n_ticks('%s.%s' % (exchange, sym), 10)
|
||||||
|
res = []
|
||||||
|
for tick in ticks:
|
||||||
|
res.append(gm_to_vt(exchange, sym, tick))
|
||||||
|
return res[::-1]
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
for tick in get_last_n_ticks('SHFE', 'ag1606', 10):
|
||||||
|
print tick.date, tick.time, tick
|
Loading…
Reference in New Issue
Block a user