返回列表 发布新帖

量化研究---开源强大小果qmt通达信预警板块交易系统

169 0
发表于 2025-4-14 13:41:20 | 显示全部楼层 阅读模式

开源小果通达信预警板块交易系统,我使用更多是文本预警交易系统

文章https://blog.csdn.net/qq_50882340/article/details/147212163?spm=1001.2014.3001.5502

略源代码,给我点赞,转发就可以

#encoding:gbk
'''
小果通达信预警板块交易系统
原理读取通达信预警写入板块的数据,没有在持股的标的买入
支持自定义板块卖出
作者:小果
微信:15117320079
'''
import pandas as pd
import numpy as np
import talib
import os
import time 
from datetime import datetime
text={
    "账户":"",
    "账户支持融资融券":"账户支持融资融券,账户类型STOCK/CREDIT",
    "账户类型":"STOCK",
    "交易品种说明":"stock/fund/bond",
    "交易品种":['stock','fund','bond'],
    "是否测试说明":"测试会读取板块的数据分析,不测试直接清空自选股数据,等待最新的数据",
    "是否测试":"否",
    "是否开启临时id记录":"是",
    "通达信路径":"E:/tdx/T0002/blocknew",
    "自选股板块":"XGTDXYJ",
    "剔除预警标开头":['688','300'],
    "通达信卖出板块":"SELL",
    "交易模式说明":"金额/数量",
    "交易模式":"金额",
    "固定交易金额":1000,
    "固定交易数量":100,
    "特殊交易标的设置":"特殊交易标的设置",
    "特殊交易标的":[],
    "特殊交易标的固定交易金额":15000,
    "特殊交易标的固定交易数量":100,
    "持股限制":20,
    "时间设置":"时间设置********",
    "交易时间段":8,
    "交易开始时间":0,
    "交易结束时间":24,
    "是否参加集合竞价":"否",
    "开始交易分钟":0,

}
class a:
    pass
a.buy_id_list=[]
def init(c):
    #账户
    c.account=text['账户']
    #账户类型
    c.account_type=text['账户类型']
    if c.account_type=='stock' or c.account_type=='STOCK':
        c.buy_code=23
        c.sell_code=24
    else:
        #融资融券
        c.buy_code=33
        c.sell_code=34
    c.path=text['通达信路径']
    c.name=text['自选股板块']
    c.is_open=text['是否开启临时id记录']
    c.xg_tdx=xg_tdx(path=r'{}'.format(c.path))
    test=text['是否测试']
    if test=='是':
        print('开启测试模型,实盘记得关闭')
    else:
        del_all_tdx_stock(c)

    print(get_account(c,c.account,c.account_type))
    print(get_position(c,c.account,c.account_type))
    #循环模式3秒
    c.run_time("run_buy_func","1nSecond","2024-07-25 13:20:00")
    c.run_time("run_sell_func","2nSecond","2024-07-25 13:20:00")
    #定时清空数据
    c.run_time("del_all_tdx_stock","1nDay","2024-07-25 09:10:00")
    c.run_time("del_all_tdx_stock","1nDay","2024-07-25 15:10:00")
    run_sell_func(c)
def handlebar(c):
    pass
def del_all_tdx_stock(c):
    '''
    运行程序前清空通达信预警的数据
    '''
    name=text['自选股板块']
    sell_name=text['通达信卖出板块']
    c.xg_tdx.del_all_tdx_stock(name=name)
    print(name,'数据清空成功')
    c.xg_tdx.del_all_tdx_stock(name=sell_name)
    print(sell_name,'数据清空成功')
def get_price(c,stock):
    '''
    获取最新价格
    '''
    tick=c.get_full_tick(stock_code=[stock])
    tick=tick[stock]
    price=tick['lastPrice']
    return price
def select_data_type(stock='600031'):
    '''
    选择数据类型
    '''
    stock=str(stock)
    if stock[:2] in ['11','12'] or stock[:3] in ['123','110','113','123','127','128','118','132','120']:
        return 'bond'
    elif stock[:2] in ['51','15','50','16','18','52']:
        return 'fund'
    else:
        return 'stock'
def adjust_stock(stock='600031.SH'):
    '''
    调整代码
    '''
    if stock[-2:]=='SH' or stock[-2:]=='SZ' or stock[-2:]=='sh' or stock[-2:]=='sz':
        stock=stock.upper()
    else:
        if stock[:3] in ['600','601','603','605','688','689',
            ] or stock[:2] in ['11','51','58']:
            stock=stock+'.SH'
        else:
            stock=stock+'.SZ'
    return stock
def get_buy_stock(c):
    '''
    获取买入股票池数据
    '''
    if check_is_trader_date_1():
        tarder_type=text['交易品种']
        del_list=text['剔除预警标开头']
        hold_limit=text['持股限制']
        #读取持股
        hold_stock=get_position(c,c.account,c.account_type)
        if hold_stock.shape[0]>0:
            hold_stock=hold_stock[hold_stock['持仓量']>=10]
            if hold_stock.shape[0]>0:
                hold_stock['品种']=hold_stock['证券代码'].apply(lambda x:select_data_type(x))
                hold_stock['选择']=hold_stock['品种'].apply(lambda x:'是' if x in tarder_type else '不是')
                hold_stock=hold_stock[hold_stock['品种']=='是']
                if hold_stock.shape[0]>0:
                    hold_stock_list=hold_stock['证券代码'].tolist()
                    hold_stock_amount=len(hold_stock_list)
                else:
                    hold_stock_list=[]
                    hold_stock_amount=0
            else:
                hold_stock_list=[]
                hold_stock_amount=0
        else:
            hold_stock_list=[]
            hold_stock_amount=0
        #读取通达信自选股
        df=c.xg_tdx.read_tdx_stock(name=c.name)
        print(df)
        if df.shape[0]>0:
            df['证券代码']=df['证券代码'].apply(lambda x: str(x)[1:])
            df['证券代码']=df['证券代码'].apply(lambda x:adjust_stock(x))
            df['品种']=df['证券代码'].apply(lambda x:select_data_type(x))
            df['选择']=df['品种'].apply(lambda x:'是' if x in tarder_type else '不是')
            df=df[df['选择']=='是']
            df['剔除']=df['证券代码'].apply(lambda x: '是' if x in del_list  else '不是')
            if df.shape[0]>0:
                df=df[df['剔除']=='不是']
                if df.shape[0]>0:
                    tdx_stock_list=df['证券代码'].tolist()
                    tdx_stock_amount=len(tdx_stock_list)
                else:
                    tdx_stock_list=[]
                    tdx_stock_amount=0
            else:
                tdx_stock_list=[]
                tdx_stock_amount=0
        else:
            tdx_stock_list=[]
            tdx_stock_amount=0
        #检查委托买入没有成交的也计算在持股里面
        order=get_order(c,c.account,c.account_type)
        if order.shape[0]>0:
            #操作类型48买入
            order=order[order['操作类型']==48]
            '''
            ENTRUST_STATUS_WAIT_REPORTING   49  待报
            ENTRUST_STATUS_REPORTED 50  已报(已报出到柜台,待成交)
            ENTRUST_STATUS_REPORTED_CANCEL  51  已报待撤(对已报状态的委托撤单吗,等待柜台处理撤单请求)
            ENTRUST_STATUS_PARTSUCC_CANCEL  52  部成待撤(已报到柜台,已有部分成交,已发出对剩余部分的撤单,待柜台处理撤单请求)
            ENTRUST_STATUS_PART_CANCEL  53  部撤(已报到柜台,已有部分成交,剩余部分已撤)
            ENTRUST_STATUS_CANCELED 54  已撤
            ENTRUST_STATUS_PART_SUCC    55  部成(已报到柜台,已有部分成交)
            ENTRUST_STATUS_SUCCEEDED    56  已成
            ENTRUST_STATUS_JUNK 57  废单(不符合报单条件,委托被打回,相关信息再委托的废单原因字段查看)
            '''
            #可以撤销没有成交的类型
            #52,53自己考虑有没有添加
            cacal_list=[49,50,51]
            if order.shape[0]>0:
                order['未成交']=order['委托状态'].apply(lambda x:'是' if x in cacal_list else '不是')
                order=order[order['未成交']=='是']
                if order.shape[0]>0:
                    order_stock_list=order['证券代码'].tolist()
                else:
                    order_stock_list=[]
            else:
                order_stock_list=[]
        else:
            order_stock_list=[]
        for stock in order_stock_list:
            hold_stock_list.append(stock)
        hold_stock_amount=len(hold_stock_list)
        #买入股票列表
        buy_stock_list=[]
        for stock in tdx_stock_list:
            if stock not in hold_stock_list:
                print('通达信预警{}没有在持股买入'.format(stock))
                buy_stock_list.append(stock)
            else:
                print('通达信预警{}持股不买入'.format(stock))
        buy_df=pd.DataFrame()
        buy_df['证券代码']=buy_stock_list
        buy_amount=hold_limit-hold_stock_amount
        if buy_amount>0:
            buy_amount=buy_amount
        else:
            print('超过持股限制{}不买入'.format(hold_limit))
        buy_df=buy_df[:buy_amount]
        print('买入股票池*******************')
        print(buy_df)
        return buy_df
    else:
        print('{} 目前不是交易时间'.format(datetime.now()))
        buy_df=pd.DataFrame()
        return buy_df
def run_buy_func(c):
    '''
    运行买入函数
    '''
    print('********************************************************')
    print('********************************************************')
    print('********************************************************')
    trader_models=text['交易模式']
    fix_value=text['固定交易金额']
    fix_amount=text['固定交易金额']
    sep_fix_value=text['特殊交易标的固定交易金额']
    sep_fix_amount=text['特殊交易标的固定交易数量']
    sep_stock_list=text['特殊交易标的']
    if check_is_trader_date_1():
        #先卖在买入
        buy_df=get_buy_stock(c)
        #买入
        if buy_df.shape[0]>0:
            for stock in buy_df['证券代码'].tolist():
                if stock  in sep_stock_list:
                    print('{}在特殊标的里面*********'.format(stock))
                    fix_value=sep_fix_value
                    volume=sep_fix_amount
                else:
                    fix_value=text['固定交易金额']
                    volume=fix_amount
                print(stock,fix_value)
                if trader_models=='金额':
                    print('{}金额交易模式*******'.format(stock))
                    tader_type,amount,price=order_stock_value(c,c.account,c.account_type,stock,fix_value,'buy')
                    print(tader_type,amount,price)
                    if tader_type=='buy' and amount>=10 :
                        if c.is_open=='是':
                            if stock not in a.buy_id_list:
                                passorder(c.buy_code, 1101, c.account, str(stock), 5, 0, amount, '买入小果通达信预警板块交易系统',1,'小果通达信预警板块交易系统',c)
                                #passorder(23, 1101, c.account, str('513100.SH'), 5, 0, 100, '',1,'',c)
                                print('{} 最新价格 买入{} 元'.format(stock,fix_value))
                                a.buy_id_list.append(stock)
                            else:
                                print(stock,'在临时买入id里面不买入')
                        else:
                            passorder(c.buy_code, 1101, c.account, str(stock), 5, 0, amount, '买入小果通达信预警板块交易系统',1,'小果通达信预警板块交易系统',c)
                            #passorder(23, 1101, c.account, str('513100.SH'), 5, 0, 100, '',1,'',c)
                            print('{} 最新价格 买入{} 元'.format(stock,fix_value))
                            a.buy_id_list.append(stock)
                    else:
                        print('{}金额交易模式买入不了*******'.format(stock))
                else:
                    if c.is_open=='是':
                        if stock not in a.buy_id_list:
                            print('{}数量交易模式*******'.format(stock))
                            passorder(c.buy_code, 1101, c.account, str(stock), 5, 0, volume, '买入小果通达信预警板块交易系统',1,'小果通达信预警板块交易系统',c)
                            print('{} 最新价格 买入{} 数量'.format(stock,volume))
                        else:
                            print(stock,'在临时买入id里面不买入')
                    else:
                        print('{}数量交易模式*******'.format(stock))
                        passorder(c.buy_code, 1101, c.account, str(stock), 5, 0, volume, '买入小果通达信预警板块交易系统',1,'小果通达信预警板块交易系统',c)
                        print('{} 最新价格 买入{} 数量'.format(stock,volume))

        else:
            print('没有买入数据')
    else:
        print('{} 目前不少交易时间'.format(datetime.now()))
def get_sell_stock(c):
    '''
    获取卖出股票池数据
    '''
    name=text['通达信卖出板块']
    tarder_type=text['交易品种']
    df=c.xg_tdx.read_tdx_stock(name=name)
    if df.shape[0]>0:
        df['证券代码']=df['证券代码'].apply(lambda x: str(x)[1:])
        df['证券代码']=df['证券代码'].apply(lambda x:adjust_stock(x))
        tdx_stock_list=df['证券代码'].tolist()
        tdx_stock_amount=len(tdx_stock_list)
    else:
        tdx_stock_list=[]
        tdx_stock_amount=0
    hold_stock=get_position(c,c.account,c.account_type)
    if hold_stock.shape[0]>0:
        hold_stock=hold_stock[hold_stock['可用数量']>=10]
        if hold_stock.shape[0]>0:
            hold_stock['品种']=hold_stock['证券代码'].apply(lambda x:select_data_type(x))
            hold_stock['选择']=hold_stock['品种'].apply(lambda x:'是' if x in tarder_type else '不是')
            hold_stock['卖出']=hold_stock['证券代码'].apply(lambda x:'是' if x in tdx_stock_list else '不是')

            sell_df=hold_stock[hold_stock['卖出']=='是']
        else:
            sell_df=pd.DataFrame()
    else:
        sell_df=pd.DataFrame()
    return sell_df

def run_sell_func(c):
    '''
    运行卖出函数
    '''
    print('********************************************************')
    print('********************************************************')
    print('********************************************************')
    trader_models=text['交易模式']
    fix_value=text['固定交易金额']
    fix_amount=text['固定交易金额']
    sep_fix_value=text['特殊交易标的固定交易金额']
    sep_fix_amount=text['特殊交易标的固定交易数量']
    sep_stock_list=text['特殊交易标的']
    if check_is_trader_date_1():
        sell_df=get_sell_stock(c)
        if sell_df.shape[0]>0:
            for stock,hold_amount,av_amount in zip(sell_df['证券代码'],sell_df['持仓量'],sell_df['可用数量']):
                try:
                    if av_amount>=10:
                        print('{} 持有数量{} 可以数量{}大于0 卖出数量{}'.format(stock,hold_amount,av_amount,av_amount))
                        passorder(c.sell_code, 1101,c.account, stock, 5, 0, av_amount, '卖出小果通达信预警板块交易系统',1,'小果通达信预警板块交易系统',c)
                    else:
                        print('{} 持有数量{} 可以数量{}等于0 卖出数量{} 不交易'.format(stock,hold_amount,av_amount,av_amount))
                except:
                    print('{}卖出有问题'.format(stock))
        else:
            print('没有卖出的数据')

class xg_tdx:
    '''
    小果通达信自选股操作模型
    作者微信15117320079
    '''
    def __init__(self,path=r'E:\tdx\T0002\blocknew'):
            '''
            小果通达信自选股操作模型
            '''
            self.path=path

    def read_all_tdx_stock(self):
        '''
        读取全部的通达信板块
        '''
        try:
            all_path=os.listdir(r'{}'.format(self.path))
        except Exception as e:
            print(e,'通达信板块文件不存在')
            all_path=[]
        return all_path
    def creat_tdx_user_def_stock(self,name='CS_1'):
        '''
        建立通达信自定义自选股模块
        '''
        name_1='{}.blk'.format(name)
        path="{}\{}.blk".format(self.path,name)
        all_path=self.read_all_tdx_stock()
        if name_1 in all_path:
            print('{} 通达信自选股模块已经存在不建立'.format(name))
        else:
            with open(path, 'w', encoding='gbk') as file:
                file.writelines('')
                print('{} 通达信自选股板块建立成功'.format(name))
    def del_tdx_user_def_stock(self,name='CS'):
        '''
        删除自定义股票池板块
        '''
        name_1='{}.blk'.format(name)
        path="{}\{}.blk".format(self.path,name)
        all_path=self.read_all_tdx_stock()
        if name_1 in all_path:
            os.remove(path=path)
            print('自定义模块{}删除成功'.format(name))
        else:
            print(name_1,'不存在')
    def adjust_stock(self,stock='600031.SH'):
        '''
        调整代码
        '''
        if stock[:3] in ['600','601','603','605','688','689',
                ] or stock[:2] in ['11','51','58']:
            stock="1{}".format(stock)
        else:
            stock="0{}".format(stock)
        return stock
    def read_tdx_stock(self,name='CS'):
        '''
        读取通达信板块成分股
        '''
        path="{}\{}.blk".format(self.path,name)
        try:
            stock_list=[]
            with open(r'{}'.format(path)) as p:
                com=p.readlines()
                for stock in com:
                    if len(stock)>=6:
                        stock=stock.replace("\n", "")
                        stock_list.append(stock)
            df=pd.DataFrame()
            df['证券代码']=stock_list

        except Exception as e:
            print(e,'通达信路径有问题可能不存在',path)
            df=pd.DataFrame()
        return df
    def read_tdx_stock_user_path(self,path=''):
        '''
        读取通达信自定义板块数据
        '''
        try:
            stock_list=[]
            with open(r'{}'.format(path)) as p:
                com=p.readlines()
                for stock in com:
                    if len(stock)>=6:
                        stock=stock.replace("\n", "")
                        stock_list.append(stock)
            df=pd.DataFrame()
            df['证券代码']=stock_list

        except Exception as e:
            print(e,'通达信路径有问题可能不存在',path)
            df=pd.DataFrame()
        return df
    def add_tdx_stock(self,name='CS',stock='000001'):
        '''
        把股票添加到通达信自选股
        '''
        stock=self.adjust_stock(stock)
        name_1='{}.blk'.format(name)
        path="{}\{}.blk".format(self.path,name)
        all_path=self.read_all_tdx_stock()
        if name_1 in all_path:
            pass
        else:
            self.creat_tdx_user_def_stock(name=name)
            print(name,'自选股不存在建立')
        df=self.read_tdx_stock(name=name)
        if df.shape[0]>0:
            stock_list=df['证券代码'].tolist()
        else:
            print('{}自定义没有数据'.format(name))
            stock_list=[]
        if stock in stock_list:
            print('{} 在自选股{} 不添加'.format(stock,name))
        else:
            stock_list.append(stock)
            with open(path, 'w', encoding='gbk') as file:
                for stock in stock_list:
                    file.writelines(str(stock)+'\n')
                    print('{} 添加到自选股{}成功'.format(stock,name))


    def add_tdx_stock_list(self,name='CS',user_stock_list=['000001']):
        '''
        批量添加股票池到自选股
        '''
        name_1='{}.blk'.format(name)
        path="{}\{}.blk".format(self.path,name)
        all_path=self.read_all_tdx_stock()
        if name_1 in all_path:
            pass
        else:
            self.creat_tdx_user_def_stock(name=name)
            print(name,'自选股不存在建立')
        df=self.read_tdx_stock(name=name)
        if df.shape[0]>0:
            stock_list=df['证券代码'].tolist()
        else:
            print('{}自定义没有数据'.format(name))
            stock_list=[]
        for stock in user_stock_list:
            stock=self.adjust_stock(stock)
            if stock in stock_list:
                print('{} 在自选股{} 不添加'.format(stock,name))
            else:
                stock_list.append(stock)
        with open(path, 'w', encoding='gbk') as file:
            for stock in stock_list:
                file.writelines(str(stock)+'\n')
                print('{} 添加到自选股{}成功'.format(stock,name))
    def del_tdx_stock(self,name='CS',stock='000001'):
        '''
        删除通达信自选股成分股
        '''
        stock=self.adjust_stock(stock)
        name_1='{}.blk'.format(name)
        path="{}\{}.blk".format(self.path,name)
        all_path=self.read_all_tdx_stock()
        if name_1 in all_path:
            df=self.read_tdx_stock(name=name)
            if df.shape[0]>0:
                stock_list=df['证券代码'].tolist()
            else:
                print('{}自定义没有数据'.format(name))
                stock_list=[]
            if len(stock_list)>0:
                if stock in stock_list:
                    stock_list.remove(stock)
                    print('{} 删除自选股{}成功'.format(stock,name))
                else:
                    print('{}不在{}自选股不能删除'.format(stock,name))
            else:
                print('{} 自选股没有数据'.format(name))
            with open(path, 'w', encoding='gbk') as file:
                for stock in stock_list:
                    file.writelines(str(stock)+'\n')
        else:
            print('{} 自选股不存在'.format(name))
    def del_tdx_stock_list(self,name='CS',user_stock_list=['000001']):
        '''
        批量删除通达信自选股成分股
        '''
        name_1='{}.blk'.format(name)
        path="{}\{}.blk".format(self.path,name)
        all_path=self.read_all_tdx_stock()
        if name_1 in all_path:
            df=self.read_tdx_stock(name=name)
            if df.shape[0]>0:
                stock_list=df['证券代码'].tolist()
            else:
                print('{}自定义没有数据'.format(name))
                stock_list=[]
            if len(stock_list)>0:
                for stock in user_stock_list:
                    stock=self.adjust_stock(stock)
                    if stock in stock_list:
                        stock_list.remove(stock)
                        print('{} 删除自选股{}成功'.format(stock,name))
                    else:
                        print('{}不在{}自选股不能删除'.format(stock,name))
            else:
                print('{} 自选股没有数据'.format(name))
            with open(path, 'w', encoding='gbk') as file:
                for stock in stock_list:
                    file.writelines(str(stock)+'\n')
                    print('{} 从板块{}删除成功'.format(stock,name))
        else:
            print('{} 自选股不存在'.format(name))

    def del_all_tdx_stock(self,name='CS'):
        '''
        清空通达信自选股股票
        '''
        name_1='{}.blk'.format(name)
        path="{}\{}.blk".format(self.path,name)
        all_path=self.read_all_tdx_stock()
        if name_1 in all_path:
            stock_list=[]
            with open(path, 'w', encoding='gbk') as file:
                for stock in stock_list:
                    file.writelines(str(stock)+'\n')
            print('{}全部板块内容清空成功'.format(name))
        else:
            print('{} 自选股不存在'.format(name))
def check_is_trader_date_1():
    '''
    检测是不是交易时间
    '''
    trader_time=text['交易时间段']
    start_date=text['交易开始时间']
    end_date=text['交易结束时间']
    start_mi=text['开始交易分钟']
    jhjj=text['是否参加集合竞价']
    if jhjj=='是':
        jhjj_time=15
    else:
        jhjj_time=30
    loc=time.localtime()
    tm_hour=loc.tm_hour
    tm_min=loc.tm_min
    wo=loc.tm_wday
    if wo<=trader_time:
        if tm_hour>=start_date and tm_hour<=end_date:
            if tm_hour==9 and tm_min<jhjj_time:
                return False

            elif tm_min>=start_mi:
                return True
            else:
                return False
        else:
            return False  
    else:
        print('周末')
        return False
#获取账户总权益m_dBalance
def get_account(c,accountid,datatype):
    '''
    获取账户数据
    '''
    accounts = get_trade_detail_data(accountid, datatype, 'account')
    result={}
    for dt in accounts:
        result['总资产']=dt.m_dBalance
        result['净资产']=dt.m_dAssureAsset
        result['总市值']=dt.m_dInstrumentValue
        result['总负债']=dt.m_dTotalDebit
        result['可用金额']=dt.m_dAvailable
        result['盈亏']=dt.m_dPositionProfit
    return result
#获取持仓信息{code.market:手数}
def get_position(c,accountid,datatype):
    '''
    获取持股数据
    '''
    positions = get_trade_detail_data(accountid,datatype, 'position')
    data=pd.DataFrame()
    print('持股数量{}'.format(len(positions)))
    if len(positions)>0:
        df=pd.DataFrame()
        try:
            for dt in positions:
                df['股票代码']=[dt.m_strInstrumentID]
                df['市场类型']=[dt.m_strExchangeID]
                df['证券代码']=df['股票代码']+'.'+df['市场类型']
                df['证券名称']=[dt.m_strInstrumentName]
                df['持仓量']=[dt.m_nVolume]
                df['可用数量']=[dt.m_nCanUseVolume]
                df['成本价']=[dt.m_dOpenPrice]
                df['市值']=[dt.m_dInstrumentValue]
                df['持仓成本']=[dt.m_dPositionCost]
                df['盈亏']=[dt.m_dPositionProfit]
                data=pd.concat([data,df],ignore_index=True)

        except Exception as e:
            print('获取持股隔离股票池有问题')
            data=pd.DataFrame()
    else:
        data=pd.DataFrame()
    return data 
def get_order(c,accountid,datatype):
    '''
    获取委托
    '''
    data=pd.DataFrame()
    orders = get_trade_detail_data(accountid,datatype, 'order')
    print('委托数量{}'.format(len(orders)))
    if len(orders)>0:
        df=pd.DataFrame()
        for o in orders:
            df['股票代码']=[o.m_strInstrumentID]
            df['市场类型']=[o.m_strExchangeID]
            df['证券代码']=df['股票代码']+'.'+df['市场类型']
            df['买卖方向']=[o.m_nOffsetFlag]
            df['委托数量']=[o.m_nVolumeTotalOriginal]
            df['成交均价']=[o.m_dTradedPrice]
            df['成交数量']=[o.m_nVolumeTraded]
            df['成交金额']=[o.m_dTradeAmount]
            df['投资备注']=[o.m_strRemark]
            df['委托状态']=[o.m_nOrderStatus]
            df['操作类型']=[o.m_nOffsetFlag]
            data=pd.concat([data,df],ignore_index=True)
    else:
        data=pd.DataFrame()
    return data
def get_deal(c,accountid,datatype):
    '''
    获取成交
    '''
    data=pd.DataFrame()
    deals = get_trade_detail_data(account, 'stock', 'deal')
    print('成交数量{}'.format(len(deals)))
    if len(deals):
        df=pd.DataFrame()
        for dt in deals:
            df['股票代码']=[dt.m_strInstrumentID]
            df['市场类型']=[dt.m_strExchangeID]
            df['证券代码']=df['股票代码']+'.'+df['市场类型']
            df['证券名称']=[dt.m_strInstrumentName]
            df['买卖方向']=[dt.m_nOffsetFlag]
            df['成交价格']=[dt.m_dPrice]
            df['成交数量']=[dt.m_nVolume]
            df['成交金额']=[dt.m_dTradeAmount]
            data=pd.concat([data,df],ignore_index=True)
    else:
        data=pd.DataFrame()
def order_stock_value(c,accountid,datatype,stock,value,trader_type):
    '''
    价值下单函数
    '''
    price=get_price(c,stock)
    hold_stock=get_position(c,accountid,datatype)
    if hold_stock.shape[0]>0:
        hold_stock=hold_stock[hold_stock['持仓量']>=10]
        if hold_stock.shape[0]>0:
            hold_df=hold_stock[hold_stock['证券代码']==stock]
            if hold_df.shape[0]>0:
                hold_amount=hold_df['持仓量'].tolist()[-1]
                av_amount=hold_df['可用数量'].tolist()[-1]
            else:
                hold_amount=0
                av_amount=0
        else:
            hold_amount=0
            av_amount=0
    else:
        hold_amount=0
        av_amount=0
    account=get_account(c,accountid,datatype)
    av_cash=account['可用金额']
    amount=value/price
    if str(stock)[:2] in ['11','12']:
        amount=int(amount/10)*10
    else:
        amount=int(amount/100)*100
    if trader_type=='buy':
        if av_cash>=value and amount>=10:
            print('金额下单可以资金{}大于买入金额{} 买入{} 价格{} 数量{}'.format(av_cash,value,stock,price,amount))
            return 'buy',amount,price
        else:
            print('金额下单可以资金{}小于买入金额{} 不买入{} 价格{} 数量{}'.format(av_cash,value,stock,price,amount))
            return '','',price 
    elif trader_type=='sell':
        if av_amount>=amount and amount>=10:
            print('金额下单 持有数量{} 可用数量{} 大于卖出数量{} 卖出{} 价格{} 数量{}'.format(hold_amount,av_amount,amount,stock,price,amount))
            return 'sell',amount,price
        elif av_amount<amount and av_amount>=10:
            print('金额下单 持有数量{} 可用数量{} 小于卖出数量{},可以数量大于10 卖出{} 价格{} 数量{}'.format(hold_amount,av_amount,amount,stock,price,amount))
            return 'sell',amount,price
        else:
            print('金额下单 持有数量{} 可用数量{} 小于卖出数量{},不卖出{} 价格{} 数量{}'.format(hold_amount,av_amount,amount,stock,price,amount))
            return 'sell',amount,price
    else:
        print('金额下单未知的交易类型{}'.format(stock))
        return '',amount,price
def order_target_amount(c,accountid,datatype,stock,price,target_amount,com_ratio=0.0001):
    '''
    目标交易数量
    '''
    account=get_account(c,accountid,datatype)
    #可以使用的现金
    av_cash=account['可用金额']
    position=get_position(c,accountid,datatype)
    if position.shape[0]>0:
        position[position['持仓量']>=10]
        if position.shape[0]>0:
            hold_amount=position['持仓量'].tolist()[-1]
            av_amount=position['可用数量'].tolist()[-1]
        else:
            hold_amount=0
            av_amount=0
    else:
        hold_amount=0
        av_amount=0
    #可以交易的数量
    av_trader_amount=target_amount-hold_amount
    #存在买入空间
    if av_trader_amount>=10:
        #买入的价值
        value=av_trader_amount*price
        #手续费
        com=value*com_ratio
        if av_cash>=value+com:
            print('{} 目标数量{} 持有数量{} 可用数量{} 买入数量{} 可用资金{} 大于买入资金{} 买入'.format(stock,target_amount,hold_amount,av_amount,av_trader_amount,av_cash,value))
            return 'buy',price,av_trader_amount
        else:
            print('{} 目标数量{} 持有数量{} 可用数量{} 买入数量{} 可用资金{} 小于买入资金{} 不买入'.format(stock,target_amount,hold_amount,av_amount,av_trader_amount,av_cash,value))
            return '',price,av_trader_amount
    elif av_trader_amount<=-10:
        av_trader_amount=abs(av_trader_amount)
        if av_amount>=av_trader_amount:
            print('{} 目标数量{} 持有数量{} 可用数量{}大于 卖出数量{} 卖出'.format(stock,target_amount,hold_amount,av_amount,av_trader_amount))
            return 'sell',price,-av_trader_amount
        else:
            print('{} 目标数量{} 持有数量{} 可用数量{}小于 卖出数量{} 卖出全部'.format(stock,target_amount,hold_amount,av_amount,av_trader_amount))
            return 'sell',price,-av_amount
    else:
        print('{} 目标数量{} 持有数量{}一样不交易'.format(stock,target_amount,hold_amount))
        return '','',''

回复

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

客服专线

400-080-8112

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