今天该了一天的可转债交易框架,改成了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_data from bond_cov_data import bond_cov_data from etf_fund_data import etf_fund_data from xgtrader import xgtrader import pandas as pd from ths_rq import ths_rq from tqdm import tqdm import numpy as np import time import json from analysis_models import analysis_models from datetime import datetime import schedule class 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)
|