在QMT中使用print可以打印出执行的日志,但是有时候执行程序时间长,打印的内容比较多,控制台中就要覆盖前面的内容,不能够完整的保留下来做分析,下面示例可以在print到控制台的同时记录到日志文件中。
#encoding:gbk
import pandas as pd
import numpy as np
import talib
import sys
import time
#Logger类的定义
class Logger(object):
def __init__(self,filename="Default.log"):
self.terminal=sys.stdout
self.log=open(filename,"w",encoding="utf-8") #防止编码错误
def write(self, message):
self.terminal.write(message)
self.log.write(message)
def flush(self):
pass
#log初始化函数,在函数中初始化log对象
def loginit():
t=time.strftime("-%Y%m%d-%H%M%S",time.localtime()) #时间戳
filename='d:\stock\log\log'+t+'.txt'
log=Logger(filename)
sys.stdout=log
def init(ContextInfo):
ContextInfo.stock_code_list=['000001.SZ']
ContextInfo.accID='18510385'
ContextInfo.set_universe(ContextInfo.stock_code_list)
ContextInfo.set_account(ContextInfo.accID)
loginit() #初始化log对象
def handlebar(ContextInfo):
timetag=ContextInfo.get_bar_timetag(ContextInfo.barpos)
dt=timetag_to_datetime(timetag,'%Y-%m-%d %H:%M%S')
print(dt,'-'*30)
if ContextInfo.is_last_bar() or dt[:10]==ContextInfo.end[:10]:
sys.stdout.log.close() #关闭文件
sys.stdout=sys.stdout.terminal #恢复输出的控制台引用
print('回测完成') #最后一句没有写到日志文件中