分享

重磅------etf自动交易框架,支持自定义

 立志德美 2023-09-03 发布于上海

今天该了一天的可转债交易框架,改成了etf交易框架,支持自定义,搭配了etf轮动策略,多个实盘监测模块,星期一实盘测试看看

程序仅仅是个人的简单思路参考,不提供交易参考,后面对接qmt

可转债教程 可转债综合策略本地使用教程,支持自定义交易

更新数据模块

图片

图片

图片

保持的数据,全部的etf数据

图片

图片

分析原始数据

图片

图片

选择etf

图片

交易股票池

图片

程序启动程序超1700行代码

图片

运行的效果

图片

图片

图片

程序参数

{ '交易模型':'ETF交易模型', '策略名称':'ETF轮动', '开始时间':'20220101', '结束时间':'20500101', '停止程序':'假', '测试':'假', '交易品种说明,交易品种有':['债券型-长债','债券型-中短债','债券型-可转债','债券型-长债', '指数型-股票','商品','QDII'], '交易品种':['QDII','商品'], '品种说明':'统一类型的品种选择其中的一只', '开票买卖设置':'开票买卖设置', '买卖前是否更新数据':'否', '买卖前更新数据时间':'09:26', '交易时间配置':'配置如下,更新数据数据时间小于买入的时间', '交易时间段':8, '交易开始时间':9, '交易结束时间':24, '买入时间':'09:30', '卖出时间':'09:31', '趋势交易设置':'趋势交易设置', '是否趋势交易':'否', '趋势交易可转债':[], '资金管理模块':'资金管理模块设置,后面完善', '资金管理模块说明':'程序默认管理方式有数量/资金', '账户交易模式':'数量', '交易数量设置':'交易数量设置', '固定交易数量':1000, '资金管理设置':'资金管理后面方便分策略', '投资资金投资方式':'比例', '投资资金投资方式说明':'资金投资方式有比例/金额', '单一标的投资金额':100000, '账户投资可转债比例':0.5, '单一标的的投资比例':0.1, '持有限制':8, '持股限制':2000, '数据同步设置':'同步手机端操作的数据', '是否同步数据':'是', '同步周期':11, '持股周期设置':'持股轮动设置,可以买入小于持股限制数量不可以卖出', '是否开启持股周期':'否', '持股持股周期天数':4, '持股周期尾盘是否补仓':'是', '持股周期尾盘更新数据时间':'14:45', '持股周期是否允许T':'是', '持股周期尾盘买入时间':'14:53', '持股周期尾盘卖出时间':'14:50', '尾盘建仓设置':'尾盘建仓设置', '尾盘建仓说明':'尾盘建仓更新数据一般早于更新3分钟,尾盘建立仓为做T', '是否尾盘建仓':'是', '尾盘减仓更新数据时间':'14:45', '尾盘买入时间':'14:52', '尾盘卖出时间':'14:50', '尾盘建仓涨跌幅上限':3, '尾盘建仓涨跌幅下限':-1, '持ETF过夜设置':'持ETF过夜设置', '是否持etf过夜':'是', '不持转债过夜卖出时间':'14:54', '自定义设置':'自定义设置', '买卖数据源':'默认', '买卖数据中源说明':'数据源有默认和自定义', '可转债黑名单':[], '交易黑名单':[], '同花顺下单路径':'C:/同花顺软件/同花顺/xiadan.exe', '识别软件安装位置':'C:/Program Files/Tesseract-OCR/tesseract', 'qq':'1029762153@qq.com', 'qq掩码':'jgyhavzupyglecaf', '盘中调仓设置':'盘中调仓设置', '是否盘中调仓':'否', '盘中调仓周期':'14:00', '循环买入设置':'循环买入设置', '是否循环买入设置':'是', '循环买入刷新时间':0.5, '买入时间的涨跌幅上限':5, '买入时间的涨跌幅下限':-1, '循环卖出设置':'循环卖出设置', '是否循环卖出':'是', '循环卖出刷新时间':0.6, '当日止盈止损设置':'止盈止损设置', '是否当日止盈止损':'否', '一次性卖出':'不是', '止盈止损卖出数量':10, '当日止盈止损刷新时间':0.2, '当日止盈':8, '当日止损':-3, '账户止盈止损设置':'账户止盈止损设置', '是否账户止盈止损':'否', '账户止盈止损刷新时间':1, '账户止盈':15, '账户止损':-3, '冲高回落模块--超跌反弹':'冲高回落模块--超跌反弹', '是否冲高回落模块--超跌反弹':'否', '冲高最低收益':13, '从高回落幅度':-1, '超跌幅度':-3, '超跌反弹收益':2, '冲高回落模块--超跌反弹刷新时间':0.2, '是否需要补仓':'是', '可转债选择配置':'可转债选择配置', '实时涨跌幅上限':5, '实时涨跌幅下限':-1, '趋势分析参数':'均线分析--日线', '使用均线':[5,10,20,30,60], '均线最低分数':75, '持有均线最低分':25, '收益率分析模块':'收益率分析模块', '最近N天':5, '最近N天最大收益率':10, '最近N天最小收益率':-1, '最近N天最大回撤':5, '买入前N':5, '交易人气前N':60, '持有人气排行前N':100, '分钟脉冲':'分钟脉冲设置', '是否分钟脉冲':'是', '分钟脉冲时间':10, '分钟脉冲刷新时间':0.05, '分钟脉冲上涨':2, '分钟脉冲下跌':-3, '分钟脉冲是否时间增强':'是', '分钟脉冲增强小时':'9', '分钟脉冲增强分钟':'3500', '分钟脉冲增强倍数':2, '小时趋势':'小时趋势设置', '是否小时趋势':'否', '小时趋势时间':1, '小时趋势刷新时间':0.06, '小时趋势上涨':3, '小时趋势下跌':-3, '动态脉冲设置':'动态脉冲设置', '是否动态脉冲':'否', '动态脉冲设置说明':'利用过去5个交易日的平均振幅', '动态脉冲天数':5, '动态脉冲时间':10, '动态脉冲刷新时间':0.05, '动态脉冲上涨比例':0.38, '动态脉冲下跌比例':-0.6, 'zig':'zig设置', '是否zig':'否', 'zig转向点':0.02, 'zig刷新时间':0.5, '盘中参考均线交易设置':'盘中参考均线交易设置', '是否盘中参考均线':'否', '盘中参考数据周期':5, '盘中窗口':20, '盘中均线刷新时间':0.6, '可转债强制赎回':'可转债强制赎回配置', '是否剔除强制赎回':'不是', '距离强制赎回天数':1, '强制赎回状态':'非强制赎回', '发送通知':'真', '动态网格设置':'动态网格设置', '是否开启动态网格':'否', '动态网格网格说明':'采用最近N天的振幅均值为计算', '网格增强设置':'网格增强设置', '网格单元格小于':0.5, '增强倍数':3, '自定义网格刷新时间':0.05, '网格最近N天':5, '网格数量':6, '网格时间大小':200, '买卖分位数':0.75, '跌破最后一个网格是否全部卖出':'否', '网格止损线':-3, '自定义因子轮动模块':'自定义因子模块,单独独立成一个模型后面更新', '可转债支持的默认因子':['可转债代码', '可转债名称', '价格', '涨跌幅', '正股代码', '正股名称', '正股价', '正股涨跌', '正股PB', '转股价', '转股价值', '转股溢价率', '双低', '申万', '市场', '上市时间', '持有', '债券评级', '期权价值', '回售触发价', '强赎触发价', '转债占比', '基金持仓', '到期时间', '剩余年限', '剩余规模', '成交额', 'svolume', '换手率', '到期税前收益', '融资融券']}

程序上传了知识星球

启动程序源代码

from  stock_data import stock_datafrom bond_cov_data import bond_cov_datafrom etf_fund_data import etf_fund_datafrom xgtrader import xgtraderimport pandas as pdfrom ths_rq import ths_rqfrom tqdm import tqdmimport numpy as npimport timeimport jsonfrom analysis_models import analysis_modelsfrom datetime import datetimeimport scheduleclass trader_strategy:    def __init__(self,exe='C:/同花顺软件/同花顺/xiadan.exe',tesseract_cmd='C:/Program Files/Tesseract-OCR/tesseract',qq='1029762153@qq.com'):        '''        参数配置        '''        self.exe=exe        self.tesseract_cmd=tesseract_cmd        self.qq=qq        self.stock_data=stock_data(qq=self.qq)        self.bond_cov_data=bond_cov_data()        self.etf_fund_data=etf_fund_data()        self.analysis_models=analysis_models()        self.trader=xgtrader(exe=self.exe,tesseract_cmd=self.tesseract_cmd)        self.ths_rq=ths_rq()    def connact(self):        '''        链接同花顺        '''        try:            self.trader.connect()            print('同花顺连接成功')            return True        except:            print('同花顺连接失败')            return False    def adjust_hold_data(self,stock='603918',trader_type='sell',price=12,amount=100):        '''        模拟持股数据        '''        price=float(price)        amount=float(amount)        df=pd.read_excel(r'持股数据\持股数据.xlsx',dtype='object')        del df['Unnamed: 0']        df.index=df['证券代码']        df1=df[df['证券代码']==stock]        if df1.shape[0]>0:            #可用余额            available_balance=df1['可用余额'].tolist()[-1]            #股票余额            stock_balance=df1['股票余额'].tolist()[-1]            if trader_type=='buy':                stock_balance+=float(amount)                available_balance+=float(amount)            elif trader_type=='sell':                available_balance-=float(amount)                stock_balance-=float(amount)                if available_balance<=0:                    available_balance=0                stock_balance-=float(amount)                if stock_balance<=0:                    stock_balance=0            else:                pass            df1['可用余额']=[available_balance]            df1['股票余额']=[stock_balance]            data=df.drop(stock,axis=0)            data=pd.concat([data,df1],ignore_index=True)            data.to_excel(r'持股数据\持股数据.xlsx')            print('持股数据调整成功')        else:            df2=pd.DataFrame()            df2['明细']=['0']            df2['证券代码']=[stock]            df2['证券名称']=['0']            df2['股票余额']=[amount]            df2['可用余额']=[amount]            df2['冻结数量']=[0]            df2['成本价']=[price]            df2['市价']=[price]            df2['盈亏']=[0]            df2['盈亏比(%)']=[0]            df2['市值']=[amount*price]            df2['当日买入']=[0]            df2['当日卖出']=[0]            df2['交易市场']=[0]            df2['持股天数']=[0]            data=pd.concat([df,df2],ignore_index=True)            data.to_excel(r'持股数据\持股数据.xlsx')            print('持股数据调整成功')                                      print('{}没有持股'.format(stock))    def adjust_account_cash(self,stock='128036',trader_type='buy',price=123,amount=10):        '''        调整账户资金        '''        price=float(price)        amount=float(amount)        df=pd.read_excel(r'账户数据\账户数据.xlsx',dtype='object')        try:            del df['Unnamed: 0']        except:            pass        value=price*amount        #可用余额        av_user_cash=float(df['可用金额'].tolist()[-1])        if trader_type=='buy':            av_user_cash-=value        elif trader_type=='sell':            av_user_cash+=value        else:            av_user_cash=av_user_cash        df['可用金额']=[av_user_cash]        df.to_excel(r'账户数据\账户数据.xlsx')        print('账户资金调整完成')        return df    def check_cov_bond_av_trader(self,stock='128106'):        '''        检查可转债是否可以交易        '''        with open(r'分析配置.json',encoding='utf-8') as f:            com=f.read()        text=json.loads(com)        del_select=text['是否剔除强制赎回']        del_stock=text['可转债黑名单']        del_trader_stock=text['交易黑名单']        yjl=pd.read_excel(r'可转债全部数据\可转债全部数据.xlsx')        try:            del yjl['Unnamed: 0']        except:            pass        yjl_list=yjl['可转债代码'].tolist()        if stock not in del_stock or stock not in del_trader_stock:            if stock in yjl_list:                print('{}不允许交易 不在溢价率范围'.format(stock))                return False            else:                if del_select=='是':                    select_df=pd.read_excel(r'非强制赎回\非强制赎回.xlsx',dtype='object')                else:                    select_df=pd.read_excel(r'强制赎回\强制赎回.xlsx',dtype='object')                try:                    del select_df['Unnamed: 0']                except:                    pass                stock_list=select_df['cell.bond_id'].tolist()                if stock in stock_list:                    print('{}非强制赎回可以交易'.format(stock))                    return True                else:                    print('{}强制赎回/靠近强制赎回不可以交易'.format(stock))                    return False        else:            print('{}可转债黑名单'.format(stock))            return False    def check_stock_is_av_buy(self,stock='128036',price='156.700',amount=10):        '''        检查是否可以买入        '''        price=float(price)        amount=float(amount)        with open(r'分析配置.json',encoding='utf-8') as f:            com=f.read()        text=json.loads(com)        hold_limit=text['持股限制']        qs_list=text['趋势交易可转债']        if stock in qs_list and qs_list=='是':            print('买入 :{}趋势交易不操作'.format(stock))            return False        else:                buy_value=price*amount            cash_df=pd.read_excel(r'账户数据\账户数据.xlsx',dtype='object')            try:                del cash_df['Unnamed: 0']            except:                pass            av_user_cash=cash_df['可用金额'].tolist()[-1]            #持股            hold_data=pd.read_excel(r'持股数据\持股数据.xlsx',dtype='object')            try:                del hold_data['Unnamed: 0']            except:                pass            if hold_data.shape[0]>0:                stock_list=hold_data['证券代码'].tolist()                if stock in stock_list:                    hold_num=hold_data[hold_data['证券代码']==stock]['可用余额'].tolist()[-1]                    if hold_num<hold_limit and av_user_cash>=(buy_value+5):                        print('允许买入: 代码{} 持股{} 可用资金{}'.format(stock,hold_num,av_user_cash))                        return True                    elif hold_num<hold_limit and av_user_cash<buy_value:                        print('{}不允许买入:可以金额 {} 不足'.format(stock,av_user_cash))                        return False                    elif hold_num>=hold_limit:                        print('{}不允许买入:超过持有限制'.format(stock))                        return False                    else:                        return False                else:                    if av_user_cash>=(buy_value+5):                        print('允许买入: 代码{} 可用资金{}'.format(stock,av_user_cash))                        return True                    elif av_user_cash<buy_value:                        print('{}不允许买入:可以金额 {} 不足'.format(stock,av_user_cash))                        return False                    else:                        return False            else:                if av_user_cash>=(buy_value+5):                    print('允许买入: 代码{} 可用资金{}'.format(stock,av_user_cash))                    return True                elif av_user_cash<buy_value:                    print('{}不允许买入:可以金额 {} 不足'.format(stock,av_user_cash))                    return False                else:                    return False    def check_stock_is_av_sell(self,stock='128036',amount=10):        '''        检查是否可以卖出        '''        with open(r'分析配置.json',encoding='utf-8') as f:            com=f.read()        text=json.loads(com)        del_select=text['是否剔除强制赎回']        qs_select=text['是否趋势交易']        qs_list=text['趋势交易可转债']        select=text['是否开启持股周期']        hold_daily_limit=text['持股持股周期天数']        trader_T=text['持股周期是否允许T']        if trader_T=='是':            select='否'        else:            select='是'        hold_data=pd.read_excel(r'持股数据\持股数据.xlsx',dtype='object')        if select=='是':            hold_daily=hold_data[hold_data['证券代码']==str(stock)]['持股天数'].tolist()[-1]            if int(hold_daily)<int(hold_daily_limit):                print('目前持股 {}天小于限制持股{}天不允许卖出'.format(hold_daily,hold_daily_limit))                return False            else:                       if stock in qs_list and qs_list=='是':                    print('卖出:{}趋势交易不操作'.format(stock))                    return False                else:                        #这个黑名单用来处理错误可转债                    del_stock=text['交易黑名单']                    amount=float(amount)                    #持股                    hold_data=pd.read_excel(r'持股数据\持股数据.xlsx',dtype='object')                    hold_data['证券代码']=hold_data['证券代码'].astype(str)                    stock=str(stock)                    try:                        del hold_data['Unnamed: 0']                    except:                        pass                    if hold_data.shape[0]>0:                        stock_list=hold_data['证券代码'].tolist()                        if stock in stock_list:                            if stock in del_select or stock in del_stock:                                print('{}在交易黑名单不允许交易'.format(stock))                                return False                            else:                                hold_num=hold_data[hold_data['证券代码']==stock]['可用余额'].tolist()[-1]                                if int(hold_num)>=int(amount):                                    print('{}允许卖出'.format(stock))                                    return True                                elif int(hold_num)>=100:                                    print('持股{}小于卖出的数量{} 自动调整为 {}'.format(hold_num,amount,hold_num))                                    return True                                else:                                    print('{}不允许卖出:持股不足100'.format(stock))                                    return False                        else:                            print('{}不允许卖出:没有持股'.format(stock))                            return False                    else:                        print('{}不允许卖出:账户没有持股'.format(stock))                        return False        else:                   if stock in qs_list and qs_list=='是':                print('卖出:{}趋势交易不操作'.format(stock))                return False            else:                    #这个黑名单用来处理错误可转债                del_stock=text['交易黑名单']                amount=float(amount)                #持股                hold_data=pd.read_excel(r'持股数据\持股数据.xlsx',dtype='object')                hold_data['证券代码']=hold_data['证券代码'].astype(str)                stock=str(stock)                try:                    del hold_data['Unnamed: 0']                except:                    pass                if hold_data.shape[0]>0:                    stock_list=hold_data['证券代码'].tolist()                    if stock in stock_list:                        if stock in del_select or stock in del_stock:                            print('{}在交易黑名单不允许交易'.format(stock))                            return False                        else:                            hold_num=hold_data[hold_data['证券代码']==stock]['可用余额'].tolist()[-1]                            if int(hold_num)>=int(amount):                                print('{}允许卖出'.format(stock))                                return True                            elif int(hold_num)>=100:                                    print('持股{}小于卖出的数量{} 自动调整为 {}'.format(hold_num,amount,hold_num))                                    return True                            else:                                print('{}不允许卖出:持股不足100'.format(stock))                                return False                else:                    print('{}不允许卖出:账户没有持股'.format(stock))                    return False    def run_stock_trader_buy(self):        '''        运行交易策略 etf,买入        '''        if self.stock_data.check_is_trader_date_1()==True:        #if True:            with open('分析配置.json','r+',encoding='utf-8') as f:                com=f.read()            text=json.loads(com)            seed=text['发送通知']            stop=text['停止程序']            max_zdf=text['买入时间的涨跌幅上限']            min_zdf=text['买入时间的涨跌幅下限']            data_source=text['买卖数据源']            name=text['策略名称']            trader_stats=[]            if stop=='真':                print('程序停止')            else:                if data_source=='默认':                    df=pd.read_excel(r'买入股票\买入股票.xlsx',dtype='object')                    try:                        del df['Unnamed: 0']                    except:                        pass                else:                    df=pd.read_excel(r'自定义买入\自定义买入.xlsx',dtype='object')                    try:                        del df['Unnamed: 0']                    except:                        pass                if df.shape[0]>0:                    for stock,stats in zip(df['代码'].tolist(),df['交易状态'].tolist()):                        if stats=='未买':                            amount=text['固定交易数量']                            #检查是不是强制赎回可转债用                            #if self.check_cov_bond_av_trader(stock=stock):                            if True:                                spot_data=self.etf_fund_data.get_etf_fund_spot_data(stock=stock)                                #价格                                price=spot_data['最新价']                                #实时涨跌幅                                zdf=spot_data['涨跌幅']                                #检查是不是可以买入                                if self.check_stock_is_av_buy(stock=stock,price=price,amount=amount):                                    if zdf<=max_zdf and zdf>=min_zdf:                                        self.trader.buy(security=stock,price=price,amount=amount)                                        text1='买入 时间{} 代码{} 价格{} 数量{}'.format(datetime.now(),stock,price,amount)                                        text1='买入'+name+text1                                        print(text1)                                        if seed=='真':                                            self.stock_data.seed_emial_qq(text=text1)                                        else:                                            pass                                        #标记状态                                        trader_stats.append('已买')                                        #调整持股                                        self.adjust_hold_data(stock=stock,trader_type='buy',price=price,amount=amount)                                        #调整账户资金                                        self.adjust_account_cash(stock=stock,trader_type='buy',price=price,amount=amount)                                    else:                                        print('时间{} 代码{} 涨跌幅{}不在涨跌幅范围'.format(datetime.now(),stock,zdf))                                        trader_stats.append('未买')                                else:                                    trader_stats.append('未买')                            else:                                trader_stats.append('强制赎回')                        else:                            trader_stats.append(stats)                    df['交易状态']=trader_stats                    if data_source=='默认':                        df.to_excel(r'买入股票\买入股票.xlsx')                    else:                        df.to_excel(r'自定义买入\自定义买入.xlsx')                  else:                    print('买入etf为空')        else:            print('{}目前不是交易时间'.format(datetime.now()))    def run_stock_tail_platetrader_buy(self):        '''        运行交易策略 etf,尾盘买入        '''        if self.stock_data.check_is_trader_date_1()==True:        #if True:            with open('分析配置.json','r+',encoding='utf-8') as f:                com=f.read()            text=json.loads(com)            seed=text['发送通知']            stop=text['停止程序']            max_zdf=text['尾盘建仓涨跌幅上限']            min_zdf=text['尾盘建仓涨跌幅下限']            data_source=text['买卖数据源']            name=text['策略名称']            trader_stats=[]            if stop=='真':                print('程序停止')            else:                if data_source=='默认':                    df=pd.read_excel(r'买入股票\买入股票.xlsx',dtype='object')                    try:                        del df['Unnamed: 0']                    except:                        pass                else:                    df=pd.read_excel(r'自定义买入\自定义买入.xlsx',dtype='object')                    try:                        del df['Unnamed: 0']                    except:                        pass                if df.shape[0]>0:                    for stock,stats in zip(df['代码'].tolist(),df['交易状态'].tolist()):                        if stats=='未买':                            amount=text['固定交易数量']                            #检查是不是强制赎回                            if self.check_cov_bond_av_trader(stock=stock):                                spot_data=self.bond_cov_data.get_cov_bond_spot(stock=stock)                                #价格                                price=spot_data['最新价']                                #实时涨跌幅                                zdf=spot_data['涨跌幅']                                #检查是不是可以买入                                if self.check_stock_is_av_buy(stock=stock,price=price,amount=amount):                                    if zdf<=max_zdf and zdf>=min_zdf:                                        self.trader.buy(security=stock,price=price,amount=amount)                                        text1='买入 时间{} 代码{} 价格{} 数量{}'.format(datetime.now(),stock,price,amount)                                        text1='买入'+name+text1                                        print(text1)                                        if seed=='真':                                            self.stock_data.seed_emial_qq(text=text1)                                        else:                                            pass                                        #标记状态                                        trader_stats.append('已买')                                        #调整持股                                        self.adjust_hold_data(stock=stock,trader_type='buy',price=price,amount=amount)                                        #调整账户资金                                        self.adjust_account_cash(stock=stock,trader_type='buy',price=price,amount=amount)                                    else:                                        print('时间{} 代码{} 涨跌幅{}不在涨跌幅范围'.format(datetime.now(),stock,zdf))                                        trader_stats.append('未买')                                else:                                    trader_stats.append('未买')                            else:                                trader_stats.append('强制赎回')                        else:                            trader_stats.append(stats)                    df['交易状态']=trader_stats                    if data_source=='默认':                        df.to_excel(r'买入股票\买入股票.xlsx')                    else:                        df.to_excel(r'自定义买入\自定义买入.xlsx')                  else:                    print('买入etf为空')        else:            print('{}目前不是交易时间'.format(datetime.now()))    def run_stock_trader_sell(self):        '''        运行交易策略 股票,策略卖出        '''        if self.stock_data.check_is_trader_date_1()==True:        #if True:            with open('分析配置.json','r+',encoding='utf-8') as f:                com=f.read()            text=json.loads(com)            seed=text['发送通知']            stop=text['停止程序']            data_source=text['买卖数据源']            name=text['策略名称']            stats_list=[]            if stop=='真':                print('程序停止')            else:                if data_source=='默认':                    df=pd.read_excel(r'持股数据\持股数据.xlsx',dtype='object')                else:                    df=pd.read_excel(r'自定义卖出\自定义卖出.xlsx',dtype='object')                try:                    del df['Unnamed: 0']                except:                    pass                if df.shape[0]>0:                    for stock,stats in zip(df['证券代码'].tolist(),df['交易状态'].tolist()):                        if stats=='未卖':                            amount=text['固定交易数量']                            #检查是否可以卖出                            if self.check_stock_is_av_sell(stock=stock,amount=amount):                                hold_data=pd.read_excel(r'持股数据\持股数据.xlsx',dtype='object')                                hold_num=hold_data[hold_data['证券代码']==stock]['可用余额'].tolist()[-1]                                if int(hold_num)>=amount:                                    amount=amount                                else:                                    amount=hold_num                                #获取实时数据                                spot_data=self.etf_fund_data.get_etf_fund_spot_data(stock=stock)                                #价格                                price=spot_data['最新价']                                stock=str(stock)                                self.trader.sell(security=stock,price=price,amount=amount)                                text1='策略卖出 时间{} 代码{} 价格{} 数量{}'.format(datetime.now(),stock,price,amount)                                text1=name+text1                                print(text1)                                if seed=='真':                                    self.stock_data.seed_emial_qq(text=text1)                                else:                                    pass                                #标记状态                                #hold_data=pd.read_excel(r'持股数据\持股数据.xlsx',dtype='object')                                hold_data['证券代码']=hold_data['证券代码'].astype(str)                                stock=str(stock)                                try:                                    del hold_data['Unnamed: 0']                                except:                                    pass                                hold_num=hold_data[hold_data['证券代码']==stock]['可用余额'].tolist()[-1]                                if hold_num>=10:                                    stats_list.append('未卖')                                else:                                    stats_list.append('已买')                                #调整持股                                self.adjust_hold_data(stock=stock,trader_type='sell',price=price,amount=amount)                                #调整账户资金                                self.adjust_account_cash(stock=stock,trader_type='sell',price=price,amount=amount)                            else:                                stats_list.append('未卖')                        else:                            print('不是卖出状态')                            stats_list.append(stats)                    df['交易状态']=stats_list                    if data_source=='默认':                        df.to_excel(r'卖出股票\卖出股票.xlsx')                    else:                        df.to_excel(r'自定义卖出\自定义卖出.xlsx')                  else:                    print('没有卖出的可转债')        else:            print('{}目前不是交易时间'.format(datetime.now()))    def run_stock_trader_sell_1(self):        '''        运行交易策略 股票,策略卖出,尾盘清仓        '''        if self.stock_data.check_is_trader_date_1()==True:        #if True:            with open('分析配置.json','r+',encoding='utf-8') as f:                com=f.read()            text=json.loads(com)            seed=text['发送通知']            stop=text['停止程序']            data_source=text['买卖数据源']            name=text['策略名称']            stats_list=[]            if stop=='真':                print('程序停止')            else:                if data_source=='默认':                    df=pd.read_excel(r'持股数据\持股数据.xlsx',dtype='object')                else:                    df=pd.read_excel(r'自定义卖出\自定义卖出.xlsx',dtype='object')                try:                    del df['Unnamed: 0']                except:                    pass                if df.shape[0]>0:                    for stock,stats in zip(df['证券代码'].tolist(),df['交易状态'].tolist()):                        if stats=='未卖':                            amount=df[df['证券代码']==stock]['可用余额'].tolist()[-1]                            #检查是否可以卖出                            if self.check_stock_is_av_sell(stock=stock,amount=amount):                                #获取实时数据                                spot_data=self.etf_fund_data.get_etf_fund_spot_data(stock=stock)                                #价格                                price=spot_data['最新价']                                stock=str(stock)                                self.trader.sell(security=stock,price=price,amount=amount)                                text1='策略卖出 时间{} 代码{} 价格{} 数量{}'.format(datetime.now(),stock,price,amount)                                text1=name+text1                                print(text1)                                if seed=='真':                                    self.stock_data.seed_emial_qq(text=text1)                                else:                                    pass                                #标记状态                                hold_data=pd.read_excel(r'持股数据\持股数据.xlsx',dtype='object')                                hold_data['证券代码']=hold_data['证券代码'].astype(str)                                stock=str(stock)                                try:                                    del hold_data['Unnamed: 0']                                except:                                    pass                                hold_num=hold_data[hold_data['证券代码']==stock]['可用余额'].tolist()[-1]                                if hold_num>=10:                                    stats_list.append('未卖')                                else:                                    stats_list.append('已买')                                #调整持股                                self.adjust_hold_data(stock=stock,trader_type='sell',price=price,amount=amount)                                #调整账户资金                                self.adjust_account_cash(stock=stock,trader_type='sell',price=price,amount=amount)                            else:                                stats_list.append('未卖')                        else:                            print('不是卖出状态')                            stats_list.append(stats)                    df['交易状态']=stats_list                    if data_source=='默认':                        df.to_excel(r'卖出股票\卖出股票.xlsx')                    else:                        df.to_excel(r'自定义卖出\自定义卖出.xlsx')                  else:                    print('没有卖出的etf')        else:            print('{}目前不是交易时间'.format(datetime.now()))    def daily_dynamic_stop_profit_stop_loss(self):        '''        当日止盈止损        '''        if self.stock_data.check_is_trader_date_1()==True:        #if True:            with open('分析配置.json','r+',encoding='utf-8') as f:                com=f.read()            text=json.loads(com)            #amount=text['固定交易数量']            seed=text['发送通知']            stop=text['停止程序']            stop_profit=text['当日止盈']            stop_loss=text['当日止损']            sell_all=text['一次性卖出']            name=text['策略名称']            if stop=='真':                print('程序停止')            else:                df=pd.read_excel(r'持股数据\持股数据.xlsx',dtype='object')                try:                    del df['Unnamed: 0']                except:                    pass                if df.shape[0]>0:                    stock_list=df['证券代码'].tolist()                    for stock in stock_list:                        #检查是否可以交易                        #if self.check_cov_bond_av_trader(stock=stock):                        if True:                            #持有数量                            hold_num=df[df['证券代码']==stock]['可用余额'].tolist()[-1]                            if sell_all=='是':                                amount=hold_num                            else:                                amount=text['固定交易数量']                            #检查是否可以卖出                            if self.check_stock_is_av_sell(stock=stock,amount=amount):                                if int(hold_num)>=amount:                                    amount=amount                                else:                                    amount=hold_num                                spot_data=self.etf_fund_data.get_etf_fund_spot_data(stock=stock)                                cost_price=df[df['证券代码']==stock]['成本价'].tolist()[-1]                                #价格                                price=spot_data['最新价']                                #实时涨跌幅                                zdf=((price-cost_price)/cost_price)*100                                if zdf>=stop_profit:                                    stock=str(stock)                                    self.trader.sell(security=stock,price=price,amount=amount)                                    text1='当日止盈卖出 时间{} 代码{} 价格{} 数量{}'.format(datetime.now(),stock,price,amount)                                    text1=name+text1                                    print(text1)                                    if seed=='真':                                        self.stock_data.seed_emial_qq(text=text1)                                    else:                                        pass                                    #调整持股                                    self.adjust_hold_data(stock=stock,trader_type='sell',price=price,amount=amount)                                    #调整账户资金                                    self.adjust_account_cash(stock=stock,trader_type='sell',price=price,amount=amount)                                elif zdf<=stop_loss:                                    stock=str(stock)                                    self.trader.sell(security=stock,price=price,amount=amount)                                    text1='当日止损卖出 时间{} 代码{} 价格{} 数量{}'.format(datetime.now(),stock,price,amount)                                    text1=name+text1                                    print(text1)                                    if seed=='真':                                        self.stock_data.seed_emial_qq(text=text1)                                    else:                                        pass                                    #调整持股                                    self.adjust_hold_data(stock=stock,trader_type='sell',price=price,amount=amount)                                    #调整账户资金                                    self.adjust_account_cash(stock=stock,trader_type='sell',price=price,amount=amount)                                else:                                    print('{} {}不符合当日止盈止损条件'.format(stock,datetime.now()))                            else:                                print('{} {}当日止盈不可以卖出'.format(stock,datetime.now()))                        else:                            print('{}当日止盈不可以交易'.format(datetime.now()))                else:                    print('{}当日止盈没有持股'.format(datetime.now()))        else:            print('{}当日止盈不是交易时间'.format(datetime.now()))    def dynamic_stop_profit_stop_loss(self):        '''        动态/账户止盈止损        '''        if self.stock_data.check_is_trader_date_1()==True:        #if True:            with open('分析配置.json','r+',encoding='utf-8') as f:                com=f.read()            text=json.loads(com)            #amount=text['固定交易数量']            seed=text['发送通知']            stop=text['停止程序']            stop_profit=text['账户止盈']            stop_loss=text['账户止损']            sell_all=text['一次性卖出']            name=text['策略名称']            if stop=='真':                print('程序停止')            else:                df=pd.read_excel(r'持股数据\持股数据.xlsx',dtype='object')                try:                    del df['Unnamed: 0']                except:                    pass                if df.shape[0]>0:                    stock_list=df['证券代码'].tolist()                    for stock in stock_list:                        #检查是否可以交易                        #if self.check_cov_bond_av_trader(stock=stock):                        if True:                            #持有数量                            hold_num=df[df['证券代码']==stock]['可用余额'].tolist()[-1]                            cost_price=df[df['证券代码']==stock]['成本价'].tolist()[-1]                            if sell_all=='是':                                amount=hold_num                            else:                                amount=text['固定交易数量']                            #检查是否可以卖出                            if self.check_stock_is_av_sell(stock=stock,amount=amount):                                if int(hold_num)>=amount:                                    amount=amount                                else:                                    amount=hold_num                                spot_data=self.etf_fund_data.get_etf_fund_spot_data(stock=stock)                                #价格                                price=spot_data['最新价']                                #实时涨跌幅                                zdf=((price-cost_price)/cost_price)*100                                if zdf>=stop_profit:                                    stock=str(stock)                                    self.trader.sell(security=stock,price=price,amount=amount)                                    text1='账户止盈卖出 时间{} 代码{} 价格{} 数量{}'.format(datetime.now(),stock,price,amount)                                    text1=name+text1                                    print(text1)                                    if seed=='真':                                        self.stock_data.seed_emial_qq(text=text1)                                    else:                                        pass                                    #调整持股                                    self.adjust_hold_data(stock=stock,trader_type='sell',price=price,amount=amount)                                    #调整账户资金                                    self.adjust_account_cash(stock=stock,trader_type='sell',price=price,amount=amount)                                elif zdf<=stop_loss:                                    stock=str(stock)                                    self.trader.sell(security=stock,price=price,amount=amount)                                    text1='账户止损卖出 时间{} 代码{} 价格{} 数量{}'.format(datetime.now(),stock,price,amount)                                    text1=name+text1                                    print(text1)                                    if seed=='真':                                        self.stock_data.seed_emial_qq(text=text1)                                    else:                                        pass                                    #调整持股                                    self.adjust_hold_data(stock=stock,trader_type='sell',price=price,amount=amount)                                    #调整账户资金                                    self.adjust_account_cash(stock=stock,trader_type='sell',price=price,amount=amount)                                else:                                    print('{} {}不符合账户止盈止损条件'.format(stock,datetime.now()))                            else:                                print('{} {}账户止盈不可以卖出'.format(stock,datetime.now()))                        else:                            print('{}账户止盈不可以交易'.format(datetime.now()))                else:                    print('{}账户止盈没有持股'.format(datetime.now()))        else:            print('{}账户止盈止损不是交易时间'.format(datetime.now()))    def surge_and_fall_overfall_rebound_func(self):        '''        冲高回落---超跌反弹        '''        if self.stock_data.check_is_trader_date_1()==True:        #if True:            with open('分析配置.json','r+',encoding='utf-8') as f:                com=f.read()            text=json.loads(com)            #amount=text['固定交易数量']            seed=text['发送通知']            min_return=text['冲高最低收益']            max_down=text['从高回落幅度']            max_df=text['超跌幅度']            ft_return=text['超跌反弹收益']            sell_all=text['一次性卖出']            name=text['策略名称']            df=pd.read_excel(r'持股数据\持股数据.xlsx',dtype='object')            try:                del df['Unnamed: 0']            except:                pass            df['可用余额']=df['可用余额'].astype(float)            #股票不能T0            #df1=df[df['可用余额']>=10]            df1=df            if df1.shape[0]>0:                stock_list=df1['证券代码'].tolist()                for stock in stock_list:                    #持有数量                    hold_num=df[df['证券代码']==stock]['可用余额'].tolist()[-1]                    if sell_all=='是':                        amount=hold_num                    else:                        amount=text['固定交易数量']                    trader_type,select,text1=self.analysis_models.surge_and_fall_overfall_rebound(stock=stock,                        min_return=min_return,max_down=max_down,max_df=max_df,ft_return=ft_return                    )                    #冲高回落卖出                    if trader_type=='冲高回落' and select==True:                        #检查是否可以卖出                        if self.check_stock_is_av_sell(stock=stock,amount=amount):                            if int(hold_num)>=amount:                                amount=amount                            else:                                amount=hold_num                            #获取实时数据                            spot_data=self.etf_fund_data.get_etf_fund_spot_data(stock=stock)                            #价格                            price=spot_data['最新价']                            stock=str(stock)                            self.trader.sell(security=stock,price=price,amount=amount)                            #text1='卖出 时间{} 代码{} 价格{} 数量{}'.format(datetime.now(),stock,price,amount)                            text1=name+text1                            print(text1)                            if seed=='真':                                self.stock_data.seed_emial_qq(text=text1)                            else:                                pass                            #调整持股                            self.adjust_hold_data(stock=stock,trader_type='sell',price=price,amount=amount)                            #调整账户资金                            self.adjust_account_cash(stock=stock,trader_type='sell',price=price,amount=amount)                        else:                            print('{}  {} 冲高回落 不可以卖出'.format(stock,datetime.now()))                    #超跌反弹买入                    elif trader_type=='超跌反弹' and select==True:                        #检查是不是强制赎回                        #if self.check_cov_bond_av_trader(stock=stock):                        if True:                            spot_data=self.etf_fund_data.get_etf_fund_spot_data(stock=stock)                            #价格                            price=spot_data['最新价']                            #实时涨跌幅                            zdf=spot_data['涨跌幅']                            #检查是不是可以买入                            if self.check_stock_is_av_buy(stock=stock,price=price,amount=amount):                                self.trader.buy(security=stock,price=price,amount=amount)                                #text1='买入 时间{} 代码{} 价格{} 数量{}'.format(datetime.now(),stock,price,amount)                                text1=name+text1                                print(text1)                                if seed=='真':                                    self.stock_data.seed_emial_qq(text=text1)                                else:                                    pass                                #调整持股                                self.adjust_hold_data(stock=stock,trader_type='buy',price=price,amount=amount)                                #调整账户资金                                self.adjust_account_cash(stock=stock,trader_type='buy',price=price,amount=amount)                            else:                                print('{} {}冲高回落超跌反弹不可以买入'.format(stock,datetime.now()))                        else:                            print('{} {}冲高回落超跌反弹不交易'.format(stock,datetime.now()))                    else:                        print('{} {}不符合冲高回落超跌反弹'.format(stock,datetime.now()))            else:                print('{}冲高回落超跌反弹没有持股'.format(datetime.now()))        else:            print('{}冲高回落超跌反弹不是交易时间'.format(datetime.now()))    def get_mi_pulse_trader(self):        '''        分钟脉冲分析        '''        if self.stock_data.check_is_trader_date_1()==True:            with open('分析配置.json','r+',encoding='utf-8') as f:                com=f.read()            text=json.loads(com)            seed=text['发送通知']            pulse_time=text['分钟脉冲时间']            max_pulse=text['分钟脉冲上涨']            min_pulse=text['分钟脉冲下跌']            sell_all=text['一次性卖出']            name=text['策略名称']            select=text['分钟脉冲是否时间增强']            h=text['分钟脉冲增强小时']            mi=text['分钟脉冲增强分钟']            num=text['分钟脉冲增强倍数']            df=pd.read_excel(r'持股数据\持股数据.xlsx',dtype='object')            try:                del df['Unnamed: 0']            except:                pass            df['可用余额']=df['可用余额'].astype(float)            #股票不能T0            #df1=df[df['可用余额']>=10]            df1=df            if df1.shape[0]>0:                stock_list=df1['证券代码'].tolist()                for stock in stock_list:                    hold_num=df[df['证券代码']==stock]['可用余额'].tolist()[-1]                    if sell_all=='是':                        amount=hold_num                    else:                        amount=text['固定交易数量']                    #脉冲                    try:                        pulse=self.analysis_models.get_mi_pulse_trader_analysis(n=pulse_time,x1=max_pulse,                        x2=min_pulse,stock=stock,select=select,h=h,mi=mi,num=num)                    except:                        print('分钟脉冲分析{}有问题'.format(stock))                        pulse=False                    #脉冲卖出                    if pulse=='sell':                        #检查是否可以卖出                        if self.check_stock_is_av_sell(stock=stock,amount=amount):                            if int(hold_num)>=amount:                                amount=amount                            else:                                amount=hold_num                            #获取实时数据                            spot_data=self.etf_fund_data.get_etf_fund_spot_data(stock=stock)                            #价格                            price=spot_data['最新价']                            stock=str(stock)                            self.trader.sell(security=stock,price=price,amount=amount)                            text1='分钟向上脉冲卖出 时间{} 代码{} 价格{} 数量{}'.format(datetime.now(),stock,price,amount)                            text1=name+text1                            print(text1)                            if seed=='真':                                self.stock_data.seed_emial_qq(text=text1)                            else:                                pass                            #调整持股                            self.adjust_hold_data(stock=stock,trader_type='sell',price=price,amount=amount)                            #调整账户资金                            self.adjust_account_cash(stock=stock,trader_type='sell',price=price,amount=amount)                        else:                            print('分钟脉冲{} {} 不可以卖出'.format(stock,datetime.now()))                    elif pulse=='buy':                         #检查是不是强制赎回                        #if self.check_cov_bond_av_trader(stock=stock):                        if True:                            spot_data=self.etf_fund_data.get_etf_fund_spot_data(stock=stock)                            #价格                            price=spot_data['最新价']                            #实时涨跌幅                            zdf=spot_data['涨跌幅']                            #检查是不是可以买入                            if self.check_stock_is_av_buy(stock=stock,price=price,amount=amount):                                self.trader.buy(security=stock,price=price,amount=amount)                                text1='分钟向下脉冲买入 时间{} 代码{} 价格{} 数量{}'.format(datetime.now(),stock,price,amount)                                text1=name+text1                                print(text1)                                if seed=='真':                                    self.stock_data.seed_emial_qq(text=text1)                                else:                                    pass                                #调整持股                                self.adjust_hold_data(stock=stock,trader_type='buy',price=price,amount=amount)                                #调整账户资金                                self.adjust_account_cash(stock=stock,trader_type='buy',price=price,amount=amount)                            else:                                print('分钟脉冲{} {} 不可以买入'.format(stock,datetime.now()))                        else:                            print('分钟脉冲{} {} 强制赎回不可以交易'.format(stock,datetime.now()))                    else:                        print('分钟脉冲{} {} 不符合买入要求'.format(stock,datetime.now()))            else:                print('分钟脉冲{} 没有持股'.format(datetime.now()))        else:            print('分钟脉冲{} 不是交易时间'.format(datetime.now()))    def get_dynamicmi_pulse_trader(self):        '''        动态脉冲分钟交易        '''        if self.stock_data.check_is_trader_date_1()==True:        #if True:            with open('分析配置.json','r+',encoding='utf-8') as f:                com=f.read()            text=json.loads(com)            seed=text['发送通知']            daily=text['动态脉冲天数']            mi=text['动态脉冲时间']            up_ratio=text['动态脉冲上涨比例']            down_ratio=text['动态脉冲下跌比例']            sell_all=text['一次性卖出']            name=text['策略名称']            df=pd.read_excel(r'持股数据\持股数据.xlsx',dtype='object')            try:                del df['Unnamed: 0']            except:                pass            df['可用余额']=df['可用余额'].astype(float)            #股票不能T0            #df1=df[df['可用余额']>=10]            df1=df            if df1.shape[0]>0:                stock_list=df1['证券代码'].tolist()                for stock in stock_list:                    hold_num=df[df['证券代码']==stock]['可用余额'].tolist()[-1]                    if sell_all=='是':                        amount=hold_num                    else:                        amount=text['固定交易数量']                    #脉冲                    try:                        pulse=self.analysis_models.get_dynamic_trader_analysis(daily=daily,mi=mi,x=up_ratio,x1=down_ratio)                    except:                        print('动态脉冲分钟交易{}有问题'.format(stock))                        pulse=False                    #脉冲卖出                    if pulse=='sell':                        #检查是否可以卖出                        if self.check_stock_is_av_sell(stock=stock,amount=amount):                            if int(hold_num)>=amount:                                amount=amount                            else:                                amount=hold_num                            #获取实时数据                            spot_data=self.etf_fund_data.get_etf_fund_spot_data(stock=stock)                            #价格                            price=spot_data['最新价']                            stock=str(stock)                            self.trader.sell(security=stock,price=price,amount=amount)                            text1='动态脉冲分钟交易卖出 时间{} 代码{} 价格{} 数量{}'.format(datetime.now(),stock,price,amount)                            text1=name+text1                            print(text1)                            if seed=='真':                                self.stock_data.seed_emial_qq(text=text1)                            else:                                pass                            #调整持股                            self.adjust_hold_data(stock=stock,trader_type='sell',price=price,amount=amount)                            #调整账户资金                            self.adjust_account_cash(stock=stock,trader_type='sell',price=price,amount=amount)                        else:                            print('动态脉冲分钟交易{} {} 不可以卖出'.format(stock,datetime.now()))                    elif pulse=='buy':                         #检查是不是强制赎回                        #if self.check_cov_bond_av_trader(stock=stock):                        if True:                            spot_data=self.etf_fund_data.get_etf_fund_spot_data(stock=stock)                            #价格                            price=spot_data['最新价']                            #实时涨跌幅                            zdf=spot_data['涨跌幅']                            #检查是不是可以买入                            if self.check_stock_is_av_buy(stock=stock,price=price,amount=amount):                                self.trader.buy(security=stock,price=price,amount=amount)                                text1='动态脉冲买入 时间{} 代码{} 价格{} 数量{}'.format(datetime.now(),stock,price,amount)                                text1=name+text1                                print(text1)                                if seed=='真':                                    self.stock_data.seed_emial_qq(text=text1)                                else:                                    pass                                #调整持股                                self.adjust_hold_data(stock=stock,trader_type='buy',price=price,amount=amount)                                #调整账户资金                                self.adjust_account_cash(stock=stock,trader_type='buy',price=price,amount=amount)                            else:                                print('动态脉冲分钟交易{} {} 不可以买入'.format(stock,datetime.now()))                        else:                            print('动态脉冲分钟交易{} {} 强制赎回不可以交易'.format(stock,datetime.now()))                    else:                        print('动态脉冲分钟交易{} {} 不符合买入要求'.format(stock,datetime.now()))            else:                print('动态脉冲分钟交易{} 没有持股'.format(datetime.now()))        else:            print('动态脉冲分钟交易{} 不是交易时间'.format(datetime.now()))    def get_hour_pulse_trader(self):        '''        小时趋势        '''        if self.stock_data.check_is_trader_date_1()==True:        #if True:            with open('分析配置.json','r+',encoding='utf-8') as f:                com=f.read()            text=json.loads(com)            seed=text['发送通知']            pulse_time=text['小时趋势时间']            max_pulse=text['小时趋势上涨']            min_pulse=text['小时趋势下跌']            sell_all=text['一次性卖出']            name=text['策略名称']            df=pd.read_excel(r'持股数据\持股数据.xlsx',dtype='object')            try:                del df['Unnamed: 0']            except:                pass            df['可用余额']=df['可用余额'].astype(float)            #股票不能T0            #df1=df[df['可用余额']>=10]            df1=df            if df1.shape[0]>0:                stock_list=df1['证券代码'].tolist()                for stock in stock_list:                    hold_num=df[df['证券代码']==stock]['可用余额'].tolist()[-1]                    if sell_all=='是':                        amount=hold_num                    else:                        amount=text['固定交易数量']                    #脉冲                    pulse=self.analysis_models.get_hour_pulse_trader_analysis(hour=pulse_time*60,x1=max_pulse,x2=min_pulse,stock=stock)                    #脉冲卖出                    if pulse=='sell':                        #检查是否可以卖出                        if self.check_stock_is_av_sell(stock=stock,amount=amount):                            if int(hold_num)>=amount:                                amount=amount                            else:                                amount=hold_num                            #获取实时数据                            spot_data=self.etf_fund_data.get_etf_fund_spot_data(stock=stock)                            #价格                            price=spot_data['最新价']                            stock=str(stock)                            self.trader.sell(security=stock,price=price,amount=amount)                            text1='小时趋势卖出 时间{} 代码{} 价格{} 数量{}'.format(datetime.now(),stock,price,amount)                            text1=name+text1                            print(text1)                            if seed=='真':                                self.stock_data.seed_emial_qq(text=text1)                            else:                                pass                            #调整持股                            self.adjust_hold_data(stock=stock,trader_type='sell',price=price,amount=amount)                            #调整账户资金                            self.adjust_account_cash(stock=stock,trader_type='sell',price=price,amount=amount)                        else:                            print('小时趋势{} {} 不可以卖出'.format(stock,datetime.now()))                    elif pulse=='buy':                        #检查是不是强制赎回                        #if self.check_cov_bond_av_trader(stock=stock):                        if True:                            spot_data=self.bond_cov_data.get_cov_bond_spot(stock=stock)                            #价格                            price=spot_data['最新价']                            #实时涨跌幅                            zdf=spot_data['涨跌幅']                            #检查是不是可以买入                            if self.check_stock_is_av_buy(stock=stock,price=price,amount=amount):                                self.trader.buy(security=stock,price=price,amount=amount)                                text1='小时趋势买入 时间{} 代码{} 价格{} 数量{}'.format(datetime.now(),stock,price,amount)                                text1=name+text1                                print(text1)                                if seed=='真':                                    self.stock_data.seed_emial_qq(text=text1)                                else:                                    pass                                #调整持股                                self.adjust_hold_data(stock=stock,trader_type='buy',price=price,amount=amount)                                #调整账户资金                                self.adjust_account_cash(stock=stock,trader_type='buy',price=price,amount=amount)                            else:                                print('小时趋势{} {} 不可以买入'.format(stock,datetime.now()))                        else:                            print('小时趋势{} {} 强制赎回不可以交易'.format(stock,datetime.now()))                    else:                        print('小时趋势{} {} 不符合买入要求'.format(stock,datetime.now()))            else:                print('小时趋势{} 没有持股'.format(datetime.now()))        else:            print('小时趋势{} 不是交易时间'.format(datetime.now()))    def get_mean_line_trade(self):        '''        参考均线交易        '''        if self.stock_data.check_is_trader_date_1()==True:        #if True:            with open('分析配置.json','r+',encoding='utf-8') as f:                com=f.read()            text=json.loads(com)            seed=text['发送通知']            update_time=text['盘中均线刷新时间']            data_type=text['盘中参考数据周期']            n=text['盘中窗口']            sell_all=text['一次性卖出']            name=text['策略名称']            df=pd.read_excel(r'持股数据\持股数据.xlsx',dtype='object')            try:                del df['Unnamed: 0']            except:                pass            df['可用余额']=df['可用余额'].astype(float)            #股票不能T0            #df1=df[df['可用余额']>=10]            df1=df            if df1.shape[0]>0:                stock_list=df1['证券代码'].tolist()                for stock in stock_list:                    hold_num=df[df['证券代码']==stock]['可用余额'].tolist()[-1]                    if sell_all=='是':                        amount=hold_num                    else:                        amount=text['固定交易数量']                    #参考均线交易                    try:                        pulse=self.analysis_models.get_trader_mean_line_analysis(stock=stock,n=data_type,mean_line=n)                    except:                        print('参考均线{}有问题'.format(stock))                        pulse=False                    #参考均线交易卖出                    if pulse=='sell':                        #检查是否可以卖出                        if self.check_stock_is_av_sell(stock=stock,amount=amount):                            if int(hold_num)>=amount:                                amount=amount                            else:                                amount=hold_num                            #获取实时数据                            spot_data=self.etf_fund_data.get_etf_fund_spot_data(stock=stock)                            #价格                            price=spot_data['最新价']                            stock=str(stock)                            self.trader.sell(security=stock,price=price,amount=amount)                            text1='参考均线交易卖出 时间{} 代码{} 价格{} 数量{}'.format(datetime.now(),stock,price,amount)                            text1=name+text1                            print(text1)                            if seed=='真':                                self.stock_data.seed_emial_qq(text=text1)                            else:                                pass                            #调整持股                            self.adjust_hold_data(stock=stock,trader_type='sell',price=price,amount=amount)                            #调整账户资金                            self.adjust_account_cash(stock=stock,trader_type='sell',price=price,amount=amount)                        else:                            print('参考均线交易趋势{} {} 不可以卖出'.format(stock,datetime.now()))                    elif pulse=='buy':                        #检查是不是强制赎回                        #if self.check_cov_bond_av_trader(stock=stock):                        if True:                            spot_data=self.bond_cov_data.get_cov_bond_spot(stock=stock)                            #价格                            price=spot_data['最新价']                            #实时涨跌幅                            zdf=spot_data['涨跌幅']                            #检查是不是可以买入                            if self.check_stock_is_av_buy(stock=stock,price=price,amount=amount):                                self.trader.buy(security=stock,price=price,amount=amount)                                text1='参考均线交易买入 时间{} 代码{} 价格{} 数量{}'.format(datetime.now(),stock,price,amount)                                text1=name+text1                                print(text1)                                if seed=='真':                                    self.stock_data.seed_emial_qq(text=text1)                                else:                                    pass                                #调整持股                                self.adjust_hold_data(stock=stock,trader_type='buy',price=price,amount=amount)                                #调整账户资金                                self.adjust_account_cash(stock=stock,trader_type='buy',price=price,amount=amount)                            else:                                print('参考均线交易{} {} 不可以买入'.format(stock,datetime.now()))                        else:                            print('参考均线交易{} {} 强制赎回不可以交易'.format(stock,datetime.now()))                    else:                        print('参考均线交易{} {} 不符合买入要求'.format(stock,datetime.now()))            else:                print('参考均线交易{} 没有持股'.format(datetime.now()))        else:            print('参考均线交易{} 不是交易时间'.format(datetime.now()))
def get_zig_trader(self): ''' 之子转向 ''' if self.stock_data.check_is_trader_date_1()==True: #if True: with open('分析配置.json','r+',encoding='utf-8') as f: com=f.read() text=json.loads(com) seed=text['发送通知'] x=text['zig转向点'] sell_all=text['一次性卖出'] name=text['策略名称'] df=pd.read_excel(r'持股数据\持股数据.xlsx',dtype='object') try: del df['Unnamed: 0'] except: pass df['可用余额']=df['可用余额'].astype(float) #股票不能T0 #df1=df[df['可用余额']>=10] df1=df if df1.shape[0]>0: stock_list=df1['证券代码'].tolist() for stock in stock_list: hold_num=df[df['证券代码']==stock]['可用余额'].tolist()[-1] if sell_all=='是': amount=hold_num else: amount=text['固定交易数量'] try: zig=self.analysis_models.cacal_zig_data(stock=stock,x=x) stats=zig['买卖点'].tolist()[-1] except: print('zig{}有问题'.format(stock)) stats=False if stats=='sell': #检查是否可以卖出 if self.check_stock_is_av_sell(stock=stock,amount=amount): if int(hold_num)>=amount: amount=amount else: amount=hold_num #获取实时数据 spot_data=self.etf_fund_data.get_etf_fund_spot_data(stock=stock) #价格 price=spot_data['最新价'] stock=str(stock) self.trader.sell(security=stock,price=price,amount=amount) text1='之子转向卖出 时间{} 代码{} 价格{} 数量{}'.format(datetime.now(),stock,price,amount) text1=name+text1 print(text1) if seed=='真': self.stock_data.seed_emial_qq(text=text1) else: pass #调整持股 self.adjust_hold_data(stock=stock,trader_type='sell',price=price,amount=amount) #调整账户资金 self.adjust_account_cash(stock=stock,trader_type='sell',price=price,amount=amount) else: print('之子转向{} {} 不可以卖出'.format(stock,datetime.now())) elif stats=='buy': #检查是不是强制赎回 #if self.check_cov_bond_av_trader(stock=stock): if True: spot_data=self.bond_cov_data.get_cov_bond_spot(stock=stock) #价格 price=spot_data['最新价'] #实时涨跌幅 zdf=spot_data['涨跌幅'] #检查是不是可以买入 if self.check_stock_is_av_buy(stock=stock,price=price,amount=amount): self.trader.buy(security=stock,price=price,amount=amount) text1='之子转向买入 时间{} 代码{} 价格{} 数量{}'.format(datetime.now(),stock,price,amount) text1=name+text1 print(text1) if seed=='真': self.stock_data.seed_emial_qq(text=text1) else: pass #调整持股 self.adjust_hold_data(stock=stock,trader_type='buy',price=price,amount=amount) #调整账户资金 self.adjust_account_cash(stock=stock,trader_type='buy',price=price,amount=amount) else: print('之子转向{} {} 不可以买入'.format(stock,datetime.now())) else: print('之子转向{} {} 强制赎回不可以交易'.format(stock,datetime.now())) else: print('之子转向{} {} 不符合买入要求'.format(stock,datetime.now())) else: print('之子转向{} 没有持股'.format(datetime.now())) else: print('之子转向{} 不是交易时间'.format(datetime.now())) def updata_all_data(self): ''' 更新全部数据 ''' if True: self.analysis_models.updata_all_data() else: self.connact() print('{} 目前不是交易时间'.format(datetime.now())) def updata_all_data_1(self): ''' 更新全部数据 ''' if self.stock_data.check_is_trader_date_1()==True: self.analysis_models.updata_all_data_1() else: self.connact() print('{} 目前不是交易时间'.format(datetime.now())) def save_account_data(self): ''' 保持账户数据 ''' #if self.stock_data.check_is_trader_date_1()==True: if True: #持股 try: print('获取持股成功') self.analysis_models.save_position() except: print('获取持股失败') #账户 try: print('获取账户成功') self.analysis_models.save_balance() except: print('获取账户失败') else: self.connact() print('{} 目前不是交易时间'.format(datetime.now())) def save_account_data_1(self): ''' 保持账户数据 ''' #if self.stock_data.check_is_trader_date_1()==True: if True: #持股 try: print('获取持股成功') self.analysis_models.save_position_1() except: print('获取持股失败') #账户 try: print('获取账户成功') self.analysis_models.save_balance() except: print('获取账户失败') else: self.connact() print('{} 目前不是交易时间'.format(datetime.now())) def seed_qq_email(self): #self.connact() #self.trader.refresh() if self.stock_data.check_is_trader_date()==True: with open('分析配置.json','r+',encoding='utf-8') as f: com=f.read() text=json.loads(com) name=text['策略名称'] #if True: if self.connact()==True: now=str(datetime.now()) text1=name+now+'程序连接正常' print(text1) with open('分析配置.json','r+',encoding='utf-8') as f: com=f.read() text=json.loads(com) seed=text['发送通知'] if seed=='真': self.stock_data.seed_emial_qq(text=text1) else: pass else: self.connact() else: self.connact() print('{} 目前不是交易时间'.format(datetime.now())) def get_dt_grid_trade(self): ''' 动态网格交易 ''' if self.stock_data.check_is_trader_date_1()==True: #if True: with open('分析配置.json','r+',encoding='utf-8') as f: com=f.read() text=json.loads(com) seed=text['发送通知'] daily=text['网格最近N天'] n=text['网格数量'] tiem_size=text['网格时间大小'] q=text['买卖分位数'] entiy_select=text['网格单元格小于'] bs=text['增强倍数'] stop=text['跌破最后一个网格是否全部卖出'] if stop=='True': stop=True else: stop=False stop_line=text['网格止损线'] sell_all=text['一次性卖出'] name=text['策略名称'] df=pd.read_excel(r'持股数据\持股数据.xlsx',dtype='object') try: del df['Unnamed: 0'] except: pass df['可用余额']=df['可用余额'].astype(float) #股票不能T0 #df1=df[df['可用余额']>=10] df1=df if df1.shape[0]>0: stock_list=df1['证券代码'].tolist() for stock in stock_list: hold_num=df[df['证券代码']==stock]['可用余额'].tolist()[-1] if sell_all=='是': amount=hold_num else: amount=text['固定交易数量'] # 动态网格交易 #try: pulse,text1=self.analysis_models.get_grid_analysis(stock=stock,daily=daily,n=n,time_size=tiem_size, buy_sell_dot=q,stop=stop,stop_line=stop_line,entiy_select=entiy_select,bs=bs) #except: #print('动态网格交易{}有问题'.format(stock)) #pulse=False # 动态网格交易 if pulse in ['sell','all_sell','sell_up']: #'sell_down'不卖出 #检查是否可以卖出 if self.check_stock_is_av_sell(stock=stock,amount=amount): if int(hold_num)>=amount: amount=amount else: amount=hold_num #获取实时数据 spot_data=self.bond_cov_data.get_cov_bond_spot(stock=stock) #价格 price=spot_data['最新价'] stock=str(stock) if pulse=='all_sell': hold_num=df[df['证券代码']==stock]['可用余额'].tolist()[-1] amount=amount else: amount self.trader.sell(security=stock,price=price,amount=amount) #text1=' 动态网格交易卖出 时间{} 代码{} 价格{} 数量{}'.format(datetime.now(),stock,price,amount) text1=name+text1 print(text1) if seed=='真': self.stock_data.seed_emial_qq(text=text1) else: pass #调整持股 self.adjust_hold_data(stock=stock,trader_type='sell',price=price,amount=amount) #调整账户资金 self.adjust_account_cash(stock=stock,trader_type='sell',price=price,amount=amount) else: print(' 动态网格交易{} {} 不可以卖出'.format(stock,datetime.now())) elif pulse=='buy': #检查是不是强制赎回 #if self.check_cov_bond_av_trader(stock=stock): if True: spot_data=self.bond_cov_data.get_cov_bond_spot(stock=stock) #价格 price=spot_data['最新价'] #实时涨跌幅 zdf=spot_data['涨跌幅'] #检查是不是可以买入 if self.check_stock_is_av_buy(stock=stock,price=price,amount=amount): self.trader.buy(security=stock,price=price,amount=amount) #text1=' 动态网格交易买入 时间{} 代码{} 价格{} 数量{}'.format(datetime.now(),stock,price,amount) text1=name+text1 print(text1) if seed=='真': self.stock_data.seed_emial_qq(text=text1) else: pass #调整持股 self.adjust_hold_data(stock=stock,trader_type='buy',price=price,amount=amount) #调整账户资金 self.adjust_account_cash(stock=stock,trader_type='buy',price=price,amount=amount) else: print('动态网格交易{} {} 不可以买入'.format(stock,datetime.now())) else: print('动态网格交易{} {} 强制赎回不可以交易'.format(stock,datetime.now())) else: print('动态网格交易{} {} 不符合买入要求'.format(stock,datetime.now())) else: print('动态网格交易{} 没有持股'.format(datetime.now())) else: print('动态网格交易{} 不是交易时间'.format(datetime.now()))if __name__=='__main__': ''' 交易策略 ''' with open('分析配置.json','r+',encoding='utf-8') as f: com=f.read() text=json.loads(com) exe=text['同花顺下单路径'] tesseract_cmd=text['识别软件安装位置'] qq=text['qq'] test=text['测试'] trader=trader_strategy(exe=exe,tesseract_cmd=tesseract_cmd,qq=qq) trader.connact() #运行就更新账户数据 #trader.save_account_data() if test=='真': trader.seed_qq_email() trader.save_account_data() trader.updata_all_data() trader.run_stock_trader_buy() trader.run_stock_trader_sell() trader.daily_dynamic_stop_profit_stop_loss() trader.dynamic_stop_profit_stop_loss() trader.surge_and_fall_overfall_rebound_func() trader.get_mi_pulse_trader() trader.get_dynamicmi_pulse_trader trader.get_hour_pulse_trader() trader.get_zig_trader() trader.get_mean_line_trade() trader.get_dynamicmi_pulse_trader() trader.get_dt_grid_trade() else: #交易前先保存数据 #trader.save_account_data_1() buy_sell_select=text['买卖前是否更新数据'] if buy_sell_select=='是': print('启动买卖前更新数据') buy_sell_updare_time=text['买卖前更新数据时间'] schedule.every().day.at('{}'.format(buy_sell_updare_time)).do(trader.updata_all_data_1) else: print('不启动买卖前更新数据') trader.save_account_data_1() #盘中调仓库 is_update=text['是否盘中调仓'] trader_update_time=text['盘中调仓周期'] if is_update=='是': #trader.updata_all_data() pass else: pass hold_stock=text['是否持etf过夜'] sell_stock_time=text['不持转债过夜卖出时间'] if hold_stock=='是': print('持etf过夜') pass else: print('不持etf过夜') schedule.every().day.at('{}'.format(sell_stock_time)).do(trader.run_stock_trader_sell_1) #尾盘建仓设置 tail_plate_select=text['是否尾盘建仓'] if tail_plate_select=='是': print('启动尾盘建仓') tail_buy_time=text['尾盘买入时间'] tail_sell_time=text['尾盘卖出时间'] tail_update=text['尾盘减仓更新数据时间'] schedule.every().day.at('{}'.format(tail_buy_time)).do(trader.run_stock_tail_platetrader_buy) schedule.every().day.at('{}'.format(tail_sell_time)).do(trader.run_stock_trader_sell_1) schedule.every().day.at('{}'.format(tail_update)).do(trader.updata_all_data) else: print('不启动尾盘建仓') #建仓 buy_time=text['买入时间'] schedule.every().day.at('{}'.format(buy_time)).do(trader.run_stock_trader_buy) #卖出 sell_time=text['卖出时间'] schedule.every().day.at('{}'.format(sell_time)).do(trader.run_stock_trader_sell) #循环买入 cycle_buy_select=text['是否循环买入设置'] if cycle_buy_select=='是': print('循环买入启动') cycle_buy_time=text['循环买入刷新时间'] schedule.every(cycle_buy_time).minutes.do(trader.run_stock_trader_buy) else: print('不启动循环买入程序') #循环卖出 cycle_sell_select=text['是否循环卖出'] if cycle_sell_select=='是': print('循环卖出启动') cycle_sell_time=text['循环卖出刷新时间'] schedule.every(cycle_sell_time).minutes.do(trader.run_stock_trader_sell) else: print('不启动循环卖出程序') #当日止盈止损 daily_zyzs_select=text['是否当日止盈止损'] if daily_zyzs_select=='是': print('当日止盈止损启动') daily_zyzs_time=text['当日止盈止损刷新时间'] schedule.every(daily_zyzs_time).minutes.do(trader.daily_dynamic_stop_profit_stop_loss) else: print('不启动止盈止损') #账户止盈止损 account_zyzs_select=text['是否账户止盈止损'] if account_zyzs_select=='是': print('启动账户止盈止损') account_zyzs_time=text['账户止盈止损刷新时间'] schedule.every(account_zyzs_time).minutes.do(trader.dynamic_stop_profit_stop_loss) else: print('不启动账户止盈止损') #冲高回落模块--超跌反弹 cghl_zdft_select=text['是否冲高回落模块--超跌反弹'] if cghl_zdft_select=='是': print('启动冲高回落模块--超跌反弹') cghl_zdft_time=text['冲高回落模块--超跌反弹刷新时间'] schedule.every(cghl_zdft_time).minutes.do(trader.surge_and_fall_overfall_rebound_func) else: print('不启动启动冲高回落模块--超跌反弹') #分钟脉冲设置 fzmc_select=text['是否分钟脉冲'] if fzmc_select=='是': print('启动分钟脉冲') fzmc_time=text['分钟脉冲刷新时间'] schedule.every(fzmc_time).minutes.do(trader.get_mi_pulse_trader) else: print('不启动分钟脉冲') #小时趋势 xsqs_select=text['是否小时趋势'] if xsqs_select=='是': print('启动小时趋势') xsqs_time=text['小时趋势刷新时间'] xsqs_time=xsqs_time schedule.every(xsqs_time).minutes.do(trader.get_hour_pulse_trader) else: print('不启动小时趋势') #动态分钟脉冲 dt_mi_select=text['是否动态脉冲'] if dt_mi_select=='是': print('启动动态脉冲') dt_mi_time=text['动态脉冲刷新时间'] schedule.every(dt_mi_time).minutes.do(trader.get_dynamicmi_pulse_trader) else: print('不启动动态脉冲') #之子转向 zig_select=text['是否zig'] if zig_select=='是': print('启动zig') zig_time=text['zig刷新时间'] schedule.every(zig_time).minutes.do(trader.get_zig_trader) else: print('不启动zig') #盘中均线刷新时间 mean_select=text['是否盘中参考均线'] if mean_select=='是': print('启动盘中参考均线') trader_mean_line_update_time=text['盘中均线刷新时间'] schedule.every(trader_mean_line_update_time).minutes.do(trader.get_mean_line_trade) else: print('不启动盘中参考均线') #发qq schedule.every(10).minutes.do(trader.seed_qq_email) #盘中换股 trader_select=text['是否盘中调仓'] if trader_select=='是': print('启动盘中调仓') trader_update=text['盘中调仓周期'] #更新数据 schedule.every().day.at('{}'.format(trader_update)).do(trader.updata_all_data_1) else: print('不启动盘中调仓') #同步手动下单数据 tb_select=text['是否同步数据'] tb_time=text['同步周期'] if tb_select=='是': print('启动同步数据') schedule.every(tb_time).minutes.do(trader.save_account_data_1) else: print('不启动同步数据') #是否开启动态网格 dt_grid_select=text['是否开启动态网格'] dt_grid_time=text['自定义网格刷新时间'] if dt_grid_select=='是': print('开启动态网格') schedule.every(dt_grid_time).minutes.do(trader.get_dt_grid_trade) else: print('不开启动态网格') #更新数据 schedule.every().day.at('15:10').do(trader.updata_all_data) while True: schedule.run_pending()        time.sleep(1)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多