综合交易模型自定义股票池支持同花顺QMT

单独在框架加了一个自定义股票池,支持自定义交易品种,支持股票,etf,可转债混合交易,我们只需要把买入,卖出的股票代码放在买入股票文件夹就可以

比如我们自定义纳斯达克和黄金趋势交易,程序带了一个趋势模块

"自定义交易品种交易":"自定义交易类型比如股票,可转债,etf***********",
    "自定义交易品种跌破N日均线卖出":5,
    "自定义交易品种持有分数":50,
    "买入前N":5,
    "自定义交易":"************************",

目前支持的策略

"模型策略":{
        "get_wencai_buy_data":"问财买入股票",
        "get_wencai_sell_data":"问财卖出股票",
        "get_dfcf_zh_buy_stock":"东方财富自选股买入",
        "get_dfcf_zh_sell_stock":"东方财富自选股卖出",
        "run_bond_cov_rend_strategy":"可转债趋势轮动策略",
        "run_limit_trading_strategy":"涨停板策略",
        "run_etf_trend_strategy":"etf趋势轮动策略",
        "run_bond_cov_popularity_strategy":"可转债人气策略",
        "run_stock_sentiment_strategy":"股票人气策略",
        "run_bond_cov_custom_factor_rotation":"可转债自定义因子轮动策略",
        "run_bond_cov_hot_concept_strategy":"可转债热门概念策略",
        "run_micro_stock_cap_trend_trading":"微盘股趋势轮动策略",
        "run_tdx_yj_trader_func_1":"通达信警告交易函数1",
        "run_tdx_trader_stock_buy":"通达信自选股买入",
        "run_tdx_trader_stock_sell":"通达信自选股卖出",
        "get_connect_trader_data":"合并交易数据",
        "run_joinquant_trader_strategy_get_simultaneous_stock_hold_models":"聚宽跟单持股模式",
        "run_joinquant_trader_strategy_get_simultaneous_transaction_models":"聚宽跟单成交模式",
        "run_customize_trading_strategies":"自定义交易股票池"
    },

自定义买入股票文件夹设置,只需要证券代码,比如纳斯达克+黄金,自定义

综合交易模型自定义股票池支持同花顺QMT

卖出股票也是一样的

综合交易模型自定义股票池支持同花顺QMT

第二步:选择交易系统

比如qmt

"交易系统设置":"*********************************************",
    "交易系统选择":"ths/qmt",
    "交易系统":"qmt",
    "交易品种":"全部",
    "交易品种说明":["stock","fund","bond","全部"],
    "同花顺下单路径":"C:/同花顺软件/同花顺/xiadan.exe",
    "识别软件安装位置":"C:/Program Files/Tesseract-OCR/tesseract",
    "qmt路径":"D:/国金QMT交易端模拟/userdata_mini",
    "qmt账户":"55009640",
    "qmt账户类型":"STOCK",
    "证券公司交易设置":"兼容老牌证券公司可转债1手为单位",

设置仓位

"资金管理模块说明":"程序默认管理方式有数量/资金",
    "资金分配设置":"交易数量设置数量和金额,利用可转债最低单位位设置条件,股票在基础数据*10,etf*100,值调整持有限制,持股限制",
    "交易模式":"数量",
    "固定交易资金":2500,
    "持有金额限制":5000,
    "固定交易数量":10,
    "持有限制":20,
    "持股限制":10,

第三步:运行user_def_models

处理一下自定义股票池,做趋势分析

尾盘股趋势交易策略

综合交易模型自定义股票池支持同花顺QMT

更新数据

综合交易模型自定义股票池支持同花顺QMT

综合交易模型自定义股票池支持同花顺QMT

程序分析程序写入的数据买入

综合交易模型自定义股票池支持同花顺QMT

卖出

综合交易模型自定义股票池支持同花顺QMT

第四步:运行trader_st开通的运行实盘交易

选择交易策略,自定义交易策略

"目前设置说明":"早上交易人气,下午做概念,2个策略的间隔长,干扰小,手动更新数据是最后一个策略的",
    "自定义函数运行类型":["定时"],
    "自定义函数模块运行时间":["09:45"],
    "自定义函数":["run_customize_trading_strategies"],
    "黑名单":["600031"],

运行效果

综合交易模型自定义股票池支持同花顺QMT

开始下单

综合交易模型自定义股票池支持同花顺QMT

下单的结果

综合交易模型自定义股票池支持同花顺QMT

下单的结果,当前时间不能交易

综合交易模型自定义股票池支持同花顺QMT

源代码

自定义交易模块的代码,支持同花顺,qmt

from trader_tool.stock_data import stock_data
from trader_tool.bond_cov_data import bond_cov_data
from trader_tool.shape_analysis import shape_analysis
from trader_tool.analysis_models import analysis_models
import pandas as pd
from trader_tool.ths_rq import ths_rq
from tqdm import tqdm
import numpy as np
import json
from  trader_tool import jsl_data
from qmt_trader.qmt_trader_ths import qmt_trader_ths
from xgtrader.xgtrader import xgtrader
from trader_tool.ths_rq import ths_rq
from trader_tool.ths_board_concept_data import ths_board_concept_data
from trader_tool.unification_data import unification_data
import os
import pandas as pd
class customize_trading_strategies:
    def __init__(self,trader_tool='ths',exe='C:/同花顺软件/同花顺/xiadan.exe',tesseract_cmd='C:/Program Files/Tesseract-OCR/tesseract',
                qq='1029762153@qq.com',open_set='否',qmt_path='D:/国金QMT交易端模拟/userdata_mini',
                qmt_account='55009640',qmt_account_type='STOCK',name='customize_trading_strategies'):
        '''
        分析模型
        '''
        self.exe=exe
        self.tesseract_cmd=tesseract_cmd
        self.qq=qq
        self.trader_tool=trader_tool
        self.open_set=open_set
        self.qmt_path=qmt_path
        self.qmt_account=qmt_account
        self.qmt_account_type=qmt_account_type
        if trader_tool=='ths':
            self.trader=xgtrader(exe=self.exe,tesseract_cmd=self.tesseract_cmd,open_set=open_set)
        else:
            self.trader=qmt_trader_ths(path=qmt_path,account=qmt_account,account_type=qmt_account_type)
        self.stock_data=stock_data()
        self.bond_cov_data=bond_cov_data()
        self.ths_rq=ths_rq()
        self.path=os.path.dirname(os.path.abspath(__file__))
        self.ths_board_concept_data=ths_board_concept_data()
        self.name=name
        self.data=unification_data(trader_tool=self.trader_tool)
        self.data=self.data.get_unification_data()
        self.trader.connect()
    def save_position(self):
        '''
        保存持股数据
        '''
        with open(r'分析配置.json',encoding='utf-8') as f:
            com=f.read()
        text=json.loads(com)
        del_stock_list=text['黑名单']
        trader_type=text['交易品种']
        def select_del_stock_list(x):
            if str(x)[:6] in del_stock_list:
                return '是'
            else:
                return '否'
        df=self.trader.position()
        try:
            if df==False:
                print('获取持股失败')
        except:
            if df.shape[0]>0:
                if trader_type=='全部':
                    df=df
                else:
                    df['选择']=df['证券代码'].apply(self.trader.select_data_type)
                    df=df[df['选择']==trader_type]
                print(df)
                df=df[df['可用余额']>=10]
                df['黑名单']=df['证券代码'].apply(select_del_stock_list)
                df=df[df['黑名单']=='否']
                print('剔除黑名单**********')
                df.to_excel(r'持股数据\持股数据.xlsx')
                return df
            else:
                df=pd.DataFrame()
                df['账号类型']=None
                df['资金账号']=None
                df['证券代码']=None
                df['股票余额']=None
                df['可用余额']=None
                df['成本价']=None
                df['市值']=None
                df['选择']=None
                df['持股天数']=None
                df['交易状态']=None
                df['明细']=None
                df['证券名称']=None
                df['冻结数量']=None
                df['市价']=None  
                df['盈亏']=None
                df['盈亏比(%)']=None
                df['当日买入']=None  
                df['当日卖出']=None
                df.to_excel(r'持股数据\持股数据.xlsx')
                return df
    def save_balance(self):
        '''
        保持账户数据
        '''
        df=self.trader.balance()
        df.to_excel(r'账户数据\账户数据.xlsx')
        return df
    def mean_line_models(self,df):
        '''
        均线模型
        趋势模型
        5,10,20,30,60
        '''
        df=df
        #df=self.bond_cov_data.get_cov_bond_hist_data(stock=stock,start=start_date,end=end_date,limit=1000000000)
        df1=pd.DataFrame()
        df1['date']=df['date']
        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 get_del_buy_sell_data(self):
        '''
        处理交易股票池买入股票
        '''
        with open(r'分析配置.json',encoding='utf-8') as f:
            com=f.read()
        text=json.loads(com)
        limit=text['持股限制']
        n=text['自定义交易品种跌破N日均线卖出']
        df=pd.read_excel(r'持股数据\持股数据.xlsx',dtype='object')
        df1=df[df['可用余额']>=10]
        hold_stock_list=df['证券代码'].tolist()
        trader_df=pd.read_excel(r'买入股票\买入股票.xlsx',dtype='object')
        if trader_df.shape[0]>0:
            trader_df['证券代码']=trader_df['证券代码'].astype(str)
            def select_data(stock):
                if stock in hold_stock_list:
                    try:
                        num=df1[df1['证券代码']==stock]['可用余额'].tolist()[-1]
                        if float(num)>=float(limit):
                            return '持股超过限制'
                        else:
                            return '持股不足'
                    except:
                        return '持股超过限制'
                else:
                    return '没有持股'
            trader_df['持股检查']=trader_df['证券代码'].apply(select_data)
            trader_df=trader_df[trader_df['持股检查'] !='持股超过限制']
            hold_stock_list=trader_df['证券代码'].tolist()
            sell_list=[]
            mean_score_list=[]
            for stock in hold_stock_list:
                try:
                    hist_df=self.data.get_hist_data_em(stock=stock)
                    score=self.mean_line_models(df=hist_df)
                    mean_score_list.append(score)
                    models=shape_analysis(df=hist_df)
                    mean_line=models.get_down_mean_line_sell(n=n)
                    if mean_line=='是':
                        sell_list.append('是')
                    else:
                        sell_list.append('不是')
                except:
                    print('{}有问题--处理交易股票池买入股票'.format(stock))
                    mean_score_list.append(None)
                    sell_list.append('是')
            trader_df['跌破均线']=sell_list
            trader_df['均线得分']=mean_score_list
            trader_df=trader_df[trader_df['跌破均线']=='不是']  
            trader_df=trader_df.sort_values(by='均线得分',ascending=False)
            trader_df.to_excel(r'买入股票\买入股票.xlsx')
            print(trader_df)
            return trader_df
        else:
            print('-处理交易股票池买入股票,买入文件没有数据')
    def get_buy_sell_stock(self):
        '''
        获取买卖数据
        '''
        with open('分析配置.json'.format(self.path),encoding='utf-8') as f:
            com=f.read()
        text=json.loads(com)
        buy_num=text['买入前N']
        hold_limit=text['持有限制']
        df=pd.read_excel(r'持股数据\持股数据.xlsx',dtype='object')
        hold_min_score=text['自定义交易品种持有分数']
        df1=df[df['可用余额']>=10]
        hold_stock_list=df['证券代码'].tolist()
        def select_stock(x):
            '''
            选择股票
            '''
            if x in hold_stock_list:
                return '持股不足'
            else:
                return "持股不足"
        try:
            del df['Unnamed: 0']
        except:
            pass
        trader_df=pd.read_excel(r'买入股票\买入股票.xlsx',dtype='object')
        try:
            del trader_df['Unnamed: 0']
        except:
            pass
        sell_df=pd.read_excel(r'卖出股票\卖出股票.xlsx')
        if sell_df.shape[0]>0:
            sell_df['证券代码']=sell_df['证券代码'].astype(str)
            sell_list=sell_df['证券代码'].tolist()
        else:
            print('卖出文件没有数据')
            sell_list=[]
        if trader_df.shape[0]>0:
            trader_df['选择']=trader_df['证券代码'].apply(select_stock)
            trader_df=trader_df[trader_df['选择']=='持股不足']
            if df1.shape[0]>0:
                #卖出列表
                
                #持股列表
                hold_stock_list=df['证券代码'].tolist()
                #对持有的可转债做均线分析
                for stock in hold_stock_list:
                    try:
                        bond_data=self.data.get_hist_data_em(stock=stock)
                        socre=self.mean_line_models(df=bond_data)
                        if socre<hold_min_score:
                            print('{} {}分数不符合最低{}分'.format(stock,socre,hold_min_score))
                            sell_list.append(stock)
                        else:
                            pass
                    except:
                        print('{}卖出数据有问题'.format(stock))
                #跌破均线分析
                n=text['自定义交易品种跌破N日均线卖出']
                for stock in hold_stock_list:
                        try:
                            hist_df=self.data.get_hist_data_em(stock=stock)
                            models=shape_analysis(df=hist_df)
                            mean_line=models.get_down_mean_line_sell(n=n)
                            if mean_line=='是':
                                sell_list.append(stock)
                                print('{}跌破均线'.format(stock))
                            else:
                                pass
                        except:
                            pass
                sell_df=pd.DataFrame()
                sell_df['证券代码']=sell_list
                sell_df['交易状态']='未卖'
                if sell_df.shape[0]>0:
                    print('卖出*****************')
                    print(sell_df)
                    sell_df['策略名称']=self.name
                    sell_df=sell_df[['证券代码','交易状态']]
                    sell_df.to_excel(r'卖出股票\卖出股票.xlsx')
                else:
                    print('没有卖出的可转债')
                    sell_df['证券代码']=[None]
                    sell_df['交易状态']=[None]
                    sell_df['策略名称']=self.name
                    sell_df=sell_df[['证券代码','交易状态']]
                    sell_df.to_excel(r'卖出股票\卖出股票.xlsx')
                hold_num=df1.shape[0]
                if hold_num>0:
                    av_buy_num=hold_limit-hold_num
                    av_buy_num=av_buy_num+sell_df.shape[0]
                    buy_df=trader_df[:av_buy_num]
                else:
                    buy_df=trader_df[:buy_num]
                buy_df['交易状态']='未买'
                print('买入*****************')
                print(buy_df)
                buy_df=buy_df[['证券代码','交易状态']]
                buy_df.to_excel(r'买入股票\买入股票.xlsx')
                return buy_df
            else:
                buy_df=trader_df[:hold_limit]
                buy_df['交易状态']='未买'
                print('买入*****************')
                print(buy_df)
                buy_df=buy_df[['证券代码','交易状态']]
                buy_df.to_excel(r'买入股票\买入股票.xlsx')
                return buy_df
        else:
            print('买入股票文件没有数据')
    def update_all_data(self):
        '''
        更新策略数据
        '''
        print(self.save_position())
        print(self.save_balance())
        self.get_del_buy_sell_data()
        self.get_buy_sell_stock()

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/88913
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 2024 年 7 月 18 日
下一篇 2024 年 7 月 18 日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注