qmt 实盘趋势交易策略,提供源代码
qmt 实盘趋势交易策略,提供源代码链接https://mp.weixin.qq.com/s/MGecSUpQ8OqGZ3Bw0vrx6A
源代码
from qmt_trader.qmt_trader import qmt_trader
from qmt_trader.qmt_data import qmt_data
import schedule
from datetime import datetime
import time
import pandas as pd
class xg_mean_line_tarder:
def __init__(self,path= r'D:/国金QMT交易端模拟/userdata_mini',
session_id = 123456,account='55011917',account_type='STOCK',
is_slippage=True,slippage=0.01,test=True):
'''
均线趋势交易策略
自己开发的小果交易框架
'''
self.path=path
self.session_id=session_id
self.account=account
self.account_type=account_type
self.is_slippage=is_slippage
self.slippage=slippage
self.test=test
#避免下单失败多次下单
#买入记录
self.buy_stock_log=[]
#卖出记录
self.sell_stock_log=[]
#买入的目标金额
self.buy_max_value=10000
#卖出的目标金额
self.sell_max_value=0
#买入的分数
self.buy_score=50
#持有的分数
self.hold_score=50
#股票列表
self.code_list=['513100', '159632', '159941', '159502', '159509', '159655',
'513500', '513300', '513400', '513850', '159659', '159660',
'164824', '159866', '513030', '513080', '513730', '159687',
'159937', '159980', '159985', '159981']
'''
证券代码 名称
0 513100 纳斯达克ETF
1 159632 纳斯达克ETF华安
2 159941 纳斯达克ETF广发
3 159502 标普生物ETF
4 159509 纳斯达克科技ETf
5 159655 标普ETF
6 513500 标普500ETF
7 513300 纳斯达克ETF华夏
8 513400 道琼斯ETF
9 513850 美国50ETF
10 159659 纳斯达克100招商ETF
11 159660 纳斯达克100添富ETF
12 164824 印度ETF
13 159866 日本ETF
14 513030 德国ETF
15 513080 法国ETF
16 513730 东南亚科技ETF
17 159687 亚太低碳ETF
18 159937 黄金ETF
19 159980 有色ETF
20 159985 豆粕ETF
21 159981 能源化工ETF
'''
self.trader=qmt_trader(path=self.path,account=self.account,account_type=self.account_type,
is_slippage=self.is_slippage,slippage=self.slippage)
self.data=qmt_data()
#跌破均线卖出
self.down_mean_line_sell=5
#调整股票代码
self.stock_list=[]
for stock in self.code_list:
self.stock_list.append(self.trader.adjust_stock(stock=stock))
#订阅一分钟的数据,需要更快的话可以订阅tick数据
for stock in self.stock_list:
self.data.subscribe_quote(stock_code=stock,period='1d',start_time='20220101',
end_time='20500101',count=-1)
def connact(self):
'''
链接qmt
'''
try:
self.trader.connect()
print(self.trader.balance())
print(self.trader.position())
return True
except Exception as e:
print("运行错误:",e)
print('{}连接失败'.format('qmt'))
return False
def mean_line_models(self,df):
'''
均线模型
趋势模型
5,10,20,30,60
'''
df=df
df1=pd.DataFrame()
df1['5']=df['close'].rolling(window=5).mean()
df1['10']=df['close'].rolling(window=10).mean()
df1['20']=df['close'].rolling(window=20).mean()
df1['30']=df['close'].rolling(window=30).mean()
df1['60']=df['close'].rolling(window=60).mean()
score=0
#加分的情况
mean_5=df1['5'].tolist()[-1]
mean_10=df1['10'].tolist()[-1]
mean_20=df1['20'].tolist()[-1]
mean_30=df1['30'].tolist()[-1]
mean_60=df1['60'].tolist()[-1]
#相邻2个均线进行比较
if mean_5>mean_10:
score+=25
if mean_10>mean_20:
score+=25
if mean_20>mean_30:
score+=25
if mean_30>mean_60:
score+=25
return score
def down_n_mean_line_sell(self,df):
'''
跌破均线卖出
'''
df['n']=df['close'].rolling(window=self.down_mean_line_sell).mean()
if df['close'].tolist()[-1]<=df['n'].tolist()[-1]:
return True
else:
return False
def get_select_stock_data(self):
'''
选股模型
'''
position=self.trader.position()
if position.shape[0]>0:
position['证券代码']=position['证券代码'].apply(lambda x:self.trader.adjust_stock(x))
hold_stock_list=position['证券代码'].tolist()
else:
hold_stock_list=[]
#选股
#读取订阅数据
df=self.data.get_market_data_ex(stock_list=self.stock_list,period='1d',
start_time='20240101',end_time='20500101',count=-1)
#解析数据
buy_stock_list=[]
for stock in self.stock_list:
try:
hist=df[stock]
score=self.mean_line_models(df=hist)
down=self.down_n_mean_line_sell(df=hist)
if stock in hold_stock_list:
print('{}有持股不买入'.format(stock))
elif stock in self.buy_stock_log:
print('{}有买入记录不交易'.format(stock))
elif score<self.buy_score:
print('{}趋势得分小于买入分数{}不交易'.format(stock,score,self.buy_score))
else:
print("{}符合趋势买入模型".format(stock))
if down:
print('{} 跌破均线{}不买入'.format(stock,self.down_mean_line_sell))
else:
print("{}符合趋势,均线买入模型".format(stock))
buy_stock_list.append(stock)
except Exception as e:
print(e)
return buy_stock_list
def get_stock_sell_data(self):
'''
卖出数据
'''
position=self.trader.position()
if position.shape[0]>0:
position['证券代码']=position['证券代码'].apply(lambda x:self.trader.adjust_stock(x))
hold_stock_list=position['证券代码'].tolist()
else:
hold_stock_list=[]
#选股
#解析数据
sell_stock_list=[]
if len(hold_stock_list)>0:
for stock in hold_stock_list:
self.data.subscribe_quote(stock_code=stock,period='1d',start_time='20220101',
end_time='20500101',count=-1)
#读取订阅数据
df=self.data.get_market_data_ex(stock_list=hold_stock_list,period='1d',
start_time='20240101',end_time='20500101',count=-1)
for stock in hold_stock_list:
try:
hist=df[stock]
score=self.mean_line_models(df=hist)
down=self.down_n_mean_line_sell(df=hist)
if stock in self.buy_stock_log:
print('{}有卖出记录不交易'.format(stock))
elif score<self.hold_score:
print('{}趋势得分小于持有分数{}卖出'.format(stock,score,self.hold_score))
sell_stock_list.append(stock)
elif down:
print('{} 跌破均线{}卖出'.format(stock,self.down_mean_line_sell))
sell_stock_list.append(stock)
else:
print("{}符合趋势持有模型模型".format(stock))
except Exception as e:
print(e)
return sell_stock_list
else:
return sell_stock_list
def start_sell_trader(self):
'''
开始卖出
'''
if self.trader.check_is_trader_date_1(trader_time=4,start_date=9,end_date=14,start_mi=0,jhjj='否'):
sell_stock_list=self.get_stock_sell_data()
if len(sell_stock_list)>0:
for stock in sell_stock_list:
try:
price=self.data.get_full_tick(code_list=[stock])[stock]['lastPrice']
trader_type,amount,price=self.trader.order_target_value(stock=stock[:6],price=price,value=self.sell_max_value)
if trader_type=='sell' and amount>=0:
self.trader.sell(security=stock[:6],price=price,amount=amount)
self.sell_stock_log.append(stock)
else:
print('{}卖出不了'.format(stock))
except Exception as e:
print(e)
else:
print('没有卖出的数据')
else:
print('{}不是交易时间'.format(datetime.now()))
def start_buy_trader(self):
'''
开始买入
'''
if self.trader.check_is_trader_date_1(trader_time=4,start_date=9,end_date=14,start_mi=0,jhjj='否'):
buy_stock_list=self.get_select_stock_data()
if len(buy_stock_list)>0:
for stock in buy_stock_list:
try:
price=self.data.get_full_tick(code_list=[stock])[stock]['lastPrice']
trader_type,amount,price=self.trader.order_target_value(stock=stock[:6],price=price,value=self.buy_max_value)
if trader_type=='buy' and amount>=0:
self.trader.buy(security=stock[:6],price=price,amount=amount)
self.buy_stock_log.append(stock)
else:
print('{}买入不了'.format(stock))
except Exception as e:
print(e)
else:
print('没有买入的数据')
else:
print('{}不是交易时间'.format(datetime.now()))
def update_all_data(self):
'''
更新数据
'''
self.get_select_stock_data()
self.get_stock_sell_data()
self.start_sell_trader()
self.start_buy_trader()
self.buy_stock_log=[]
self.sell_stock_log=[]
def show_info(sef):
print('显示数据{} 程序运行正常'.format(datetime.now()))
if __name__=='__main__':
trader=xg_mean_line_tarder(path= r'D:/国金QMT交易端模拟/userdata_mini',
session_id = 123456,account='55011917',account_type='STOCK',
is_slippage=True,slippage=0.01,test=False)
trader.connact()
#测试强调前面的#符合
#trader.update_all_data()
schedule.every().day.at('09:45').do(trader.update_all_data)
schedule.every().day.at('14:45').do(trader.update_all_data)
schedule.every(0.05).minutes.do(trader.show_info)
while True:
schedule.run_pending()
time.sleep(1)