返回列表 发布新帖

qmt 实盘趋势交易策略,提供源代码

870 5
发表于 2024-7-16 22:59:46 | 显示全部楼层 阅读模式

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)


评论5

*******0079楼主
发表于 2024-7-16 23:00:08 | 显示全部楼层
不懂的可以微信联系我 15117320079
Anna向阳而生
发表于 2024-7-18 09:53:31 | 显示全部楼层
11111
*******3590_UPJ7a
发表于 2024-7-18 15:55:30 | 显示全部楼层
1111 111
Anna向阳而生
发表于 2024-7-19 14:05:52 | 显示全部楼层
无门槛申请QMT(mini qmt),策略开发,股票低佣万0.854,融资4.5%起,联系:Annalidian-8285
发表于 2024-7-29 08:14:15 | 显示全部楼层
小果量化这个框架非常好,难能可贵的作者将其开源,作者提供的券商也非常优秀。另外,我这儿有一些券商可作为补充,在这儿提供给大家:
佣金低:万0.85-万1
功能全:带miniqmt、可云端运行
门槛低:较少的资金即可申请
选择多:券商多、可用量化工具多
联系方式:v  off-igothen
本人也是量化交易者,欢迎咨询和技术交流!

回复

您需要登录后才可以回帖 登录 | 立即注册

客服专线

400-080-8112

用思考的速度交易,用真诚的态度合作,我们是认真的!
  • 关注公众号
  • 添加微信客服
Copyright © 2001-2025 迅投QMT社区 版权所有 All Rights Reserved. 蜀ICP备19002686号-2
关灯 快速发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表