量化系统----开源简化版qmt实盘交易系统,提供源代码

量化系统----开源简化版qmt实盘交易系统,提供源代码 https://mp.weixin.qq.com/s/qeqH8XtUeoDjIJIXMe5D-w

最近有读者反应开源的qmt_trader内容太多了不知道怎么样使用,我独立了一个简单板块的easy_qmt_tarder方面大家的使用

qmt_tarder开源下载 量化系统--开源强大的qmt交易系统,提供源代码

开源地址 https://gitee.com/li-xingguo11111/qmt_trader,自己下载使用

图片

使用easy钱需要把xtquant当第三方库使用,复制到python安装路径下面参考视频

使用交易第一步登录qmt,选择极简模式,独立交易也可以

使用教程

#导入的简单版的qmt_trader#这个是我写的系统可以直接使用#参考miniqmt的配置,先把xtquant当作第三方库使用from easy_qmt_trader import easy_qmt_trader​​​​​​​
#只需要qmt安装路径,账户trader=easy_qmt_trader(path= r'D:/国金QMT交易端模拟/userdata_mini',                  session_id = 123456,account='55011917',account_type='STOCK')

链接qmt

trader.connect()

#获取持股

​​​​​​​

df=trader.position()df​​​​​​​
持仓数量: 19账号类型  资金账号  证券代码  股票余额  可用余额  成本价  参考成本价  市值0  2  55011917  513100  26600  26600  1.441  1.441  38011.41  2  55011917  513400  100  100  1.050  1.050  102.92  2  55011917  513850  7800  7800  1.279  1.279  9843.63  2  55011917  600031  400  400  19.165  19.165  6544.04  2  55011917  600111  400  0  16.975  16.975  6752.05  2  55011917  601666  400  0  11.343  11.343  4560.06  2  55011917  603628  26300  26300  14.103  14.103  325857.07  2  55011917  688080  400  400  57.858  57.858  11884.08  2  55011917  688118  22400  22400  16.514  16.514  326144.09  2  55011917  002519  111600  111600  5.021  5.021  530100.010  2  55011917  002600  400  0  5.605  5.605  2248.011  2  55011917  159655  6800  6800  1.462  1.462  10104.812  2  55011917  159687  100  100  1.300  1.300  125.313  2  55011917  159937  300  300  5.418  5.418  1589.114  2  55011917  161128  24600  24600  48.988  48.988  121499.415  2  55011917  164824  28900  28900  12.689  12.689  46413.416  2  55011917  300520  21700  21700  17.064  17.064  336350.017  2  55011917  301270  14600  14600  25.286  25.286  347918.018  2  55011917  301277  1200  1200  18.345  18.345  15600.0

获取账户

​​​​​​​

df=trader.balance()df

​​​​​​​

号类型  资金账户  可用金额  冻结金额  持仓市值  总资产0  2  55011917  16180069.98  638166.0  2141646.9  18321722.88

当日成交

​​​​​​​

df=trader.today_trades()df
  账号类型  资金账号  证券代码  委托类型  成交编号  成交时间  成交均价  成交数量  成交金额  订单编号  柜台合同编号  策略名称  委托备注0  2  55011917  688207  24  50004621  2024-06-21 01:31:10  12.26  58200  713532.0  1082131276  448    1  2  55011917  688137  24  50004622  2024-06-21 01:31:10  35.02  10400  364208.0  1082131277  449    2  2  55011917  688003  24  50004623  2024-06-21 01:31:10  34.80  5300  184440.0  1082131278  450    3  2  55011917  688080  24  50004624  2024-06-21 01:31:10  32.87  16200  532494.0  1082131280  452    4  2  55011917  688602  24  50004625  2024-06-21 01:31:11  8.70  41500  361050.0  1082131281  453    5  2  55011917  603628  23  50004626  2024-06-21 01:31:11  14.10  26300  370830.0  1082131282  454    6  2  55011917  688118  23  50005726  2024-06-21 01:51:15  16.51  22400  369824.0  1082134045  2399    7  2  55011917  301520  24  1002000635188457  2024-06-21 01:35:26  41.91  8200  343662.0  1082132668  1382

内容太多了个人下载源代码研

easy qmt_trader源代码​​​​​​​

#统一同花顺from xtquant.xttrader import XtQuantTrader, XtQuantTraderCallbackfrom xtquant.xttype import StockAccountfrom xtquant import xtconstantimport timeimport pandas as pdimport randomimport mathimport jsonimport mathdef conv_time(ct):    '''    conv_time(1476374400000) --> '20161014000000.000'    '''    local_time = time.localtime(ct / 1000)    data_head = time.strftime('%Y%m%d%H%M%S', local_time)    data_secs = (ct - int(ct)) * 1000    time_stamp = '%s.%03d' % (data_head, data_secs)    return time_stampclass MyXtQuantTraderCallback(XtQuantTraderCallback):    def on_disconnected(self):        """        连接断开        :return:        """        print("connection lost")    def on_stock_order(self, order):        """        委托回报推送        :param order: XtOrder对象        :return:        """        print("on order callback:")        print(order.stock_code, order.order_status, order.order_sysid)    def on_stock_asset(self, asset):        """        资金变动推送        :param asset: XtAsset对象        :return:        """        print("on asset callback")        print(asset.account_id, asset.cash, asset.total_asset)    def on_stock_trade(self, trade):        """        成交变动推送        :param trade: XtTrade对象        :return:        """        print("on trade callback")        print(trade.account_id, trade.stock_code, trade.order_id)    def on_stock_position(self, position):        """        持仓变动推送        :param position: XtPosition对象        :return:        """        print("on position callback")        print(position.stock_code, position.volume)    def on_order_error(self, order_error):        """        委托失败推送        :param order_error:XtOrderError 对象        :return:        """        print("on order_error callback")        print(order_error.order_id, order_error.error_id, order_error.error_msg)    def on_cancel_error(self, cancel_error):        """        撤单失败推送        :param cancel_error: XtCancelError 对象        :return:        """        print("on cancel_error callback")        print(cancel_error.order_id, cancel_error.error_id, cancel_error.error_msg)    def on_order_stock_async_response(self, response):        """        异步下单回报推送        :param response: XtOrderResponse 对象        :return:        """        print("on_order_stock_async_response")        print(response.account_id, response.order_id, response.seq)class easy_qmt_trader:    def __init__(self,path= r'D:/国金QMT交易端模拟/userdata_mini',                  session_id = 123456,account='55009640',account_type='STOCK',                  is_slippage=True,slippage=0.01) -> None:        '''        简化版的qmt_trder方便大家做策略的开发类的继承        '''        self.xt_trader=''        self.acc=''        self.path=path        self.session_id=int(self.random_session_id())        self.account=account        self.account_type=account_type        if is_slippage==True:            self.slippage=slippage        else:            self.slippage=0    def random_session_id(self):        '''        随机id        '''        session_id=''        for i in range(0,9):            session_id+=str(random.randint(1,9))        return session_id    def select_slippage(self,stock='600031',price=15.01,trader_type='buy'):        '''        选择滑点        安价格来滑点,比如0.01就是一块        etf3位数,股票可转债2位数        '''        stock=self.adjust_stock(stock=stock)        data_type=self.select_data_type(stock=stock)        if data_type=='fund' or data_type=='bond':            slippage=self.slippage/10            if trader_type=='buy' or trader_type==23:                price=price+slippage            else:                price=price-slippage        else:            slippage=self.slippage            if trader_type=='buy' or trader_type==23:                price=price+slippage            else:                price=price-slippage        return price    def check_is_trader_date_1(self,trader_time=4,start_date=9,end_date=14,start_mi=0,jhjj='否'):        '''        检测是不是交易时间        '''        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    def select_data_type(self,stock='600031'):        '''        选择数据类型        '''        if stock[:3] in ['110','113','123','127','128','111','118'] or stock[:2] in ['11','12']:            return 'bond'        elif stock[:3] in ['510','511','512','513','514','515','516','517','518','588','159','501','164'] or stock[:2] in ['16']:            return 'fund'        else:            return 'stock'    def adjust_stock(self,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','688','510','511',                             '512','513','515','113','110','118','501'] or stock[:2] in ['11']:                stock=stock+'.SH'            else:                stock=stock+'.SZ'        return stock    def check_stock_is_av_buy(self,stock='128036',price='156.700',amount=10,hold_limit=100000):        '''        检查是否可以买入        '''        hold_stock=self.position()        try:            del hold_stock['Unnamed: 0']        except:            pass        account=self.balance()        try:            del account['Unnamed: 0']        except:            pass        #买入是价值        value=price*amount        cash=account['可用金额'].tolist()[-1]        frozen_cash=account['冻结金额'].tolist()[-1]        market_value=account['持仓市值'].tolist()[-1]        total_asset=account['总资产'].tolist()[-1]        if cash>=value:            print('允许买入{} 可用现金{}大于买入金额{} 价格{} 数量{}'.format(stock,cash,value,price,amount))            return True        else:            print('不允许买入{} 可用现金{}小于买入金额{} 价格{} 数量{}'.format(stock,cash,value,price,amount))            return False    def check_stock_is_av_sell(self,stock='128036',amount=10):        '''        检查是否可以卖出        '''        #stock=self.adjust_stock(stock=stock)        hold_data=self.position()        try:            del hold_data['Unnamed: 0']        except:            pass        account=self.balance()        try:            del account['Unnamed: 0']        except:            pass        #买入是价值        cash=account['可用金额'].tolist()[-1]        frozen_cash=account['冻结金额'].tolist()[-1]        market_value=account['持仓市值'].tolist()[-1]        total_asset=account['总资产'].tolist()[-1]        stock_list=hold_data['证券代码'].tolist()        if stock in stock_list:            hold_num=hold_data[hold_data['证券代码']==stock]['可用余额'].tolist()[-1]            if hold_num>=amount:                print('允许卖出:{} 持股{} 卖出{}'.format(stock,hold_num,amount))                return True            else:                print('不允许卖出持股不足:{} 持股{} 卖出{}'.format(stock,hold_num,amount))                return False        else:            print('不允许卖出没有持股:{} 持股{} 卖出{}'.format(stock,0,amount))            return False    def connect(self):        '''        连接        path qmt userdata_min是路径        session_id 账户的标志,随便        account账户,        account_type账户内类型        '''        print('链接qmt')        # path为mini qmt客户端安装目录下userdata_mini路径        path = self.path        # session_id为会话编号,策略使用方对于不同的Python策略需要使用不同的会话编号        session_id = self.session_id        xt_trader = XtQuantTrader(path, session_id)        # 创建资金账号为1000000365的证券账号对象        account=self.account        account_type=self.account_type        acc = StockAccount(account_id=account,account_type=account_type)        # 创建交易回调类对象,并声明接收回调        callback = MyXtQuantTraderCallback()        xt_trader.register_callback(callback)        # 启动交易线程        xt_trader.start()        # 建立交易连接,返回0表示连接成功        connect_result = xt_trader.connect()        if connect_result==0:            # 对交易回调进行订阅,订阅后可以收到交易主推,返回0表示订阅成功            subscribe_result = xt_trader.subscribe(acc)            print(subscribe_result)            self.xt_trader=xt_trader            self.acc=acc            return xt_trader,acc        else:            print('qmt连接失败')    def order_stock(self,stock_code='600031.SH', order_type=xtconstant.STOCK_BUY,                    order_volume=100,price_type=xtconstant.FIX_PRICE,price=20,strategy_name='',order_remark=''):            '''            下单,统一接口            :param account: 证券账号                :param stock_code: 证券代码, 例如"600000.SH"                :param order_type: 委托类型, 23:买, 24:卖                :param order_volume: 委托数量, 股票以'股'为单位, 债券以'张'为单位                :param price_type: 报价类型, 详见帮助手册                :param price: 报价价格, 如果price_type为指定价, 那price为指定的价格, 否则填0                :param strategy_name: 策略名称                :param order_remark: 委托备注                :return: 返回下单请求序号, 成功委托后的下单请求序号为大于0的正整数, 如果为-1表示委托失败            '''                    # 对交易回调进行订阅,订阅后可以收到交易主推,返回0表示订阅成功            subscribe_result = self.xt_trader.subscribe(self.acc)            print(self.xt_trader.query_stock_asset_async(account=self.acc,callback=subscribe_result))            #print(subscribe_result)            stock_code = self.adjust_stock(stock=stock_code)            price=self.select_slippage(stock=stock_code,price=price,trader_type=order_type)            # 使用指定价下单,接口返回订单编号,后续可以用于撤单操作以及查询委托状态            fix_result_order_id = self.xt_trader.order_stock(account=self.acc,stock_code=stock_code, order_type=order_type,                                                            order_volume=order_volume, price_type=price_type,                                                            price=price, strategy_name=strategy_name, order_remark=order_remark)            print('交易类型{} 代码{} 价格{} 数量{} 订单编号{}'.format(order_type,stock_code,price,order_volume,fix_result_order_id))            return fix_result_order_id    def buy(self,security='600031.SH', order_type=xtconstant.STOCK_BUY,                    amount=100,price_type=xtconstant.FIX_PRICE,price=20,strategy_name='',order_remark=''):        '''        单独独立股票买入函数        '''        # 对交易回调进行订阅,订阅后可以收到交易主推,返回0表示订阅成功        subscribe_result = self.xt_trader.subscribe(self.acc)        print(self.xt_trader.query_stock_asset_async(account=self.acc,callback=subscribe_result))        #print(subscribe_result)        stock_code =self.adjust_stock(stock=security)        price=self.select_slippage(stock=security,price=price,trader_type='buy')        order_volume=amount        # 使用指定价下单,接口返回订单编号,后续可以用于撤单操作以及查询委托状态        if order_volume>0:            fix_result_order_id = self.xt_trader.order_stock_async(account=self.acc,stock_code=stock_code, order_type=order_type,                                                                order_volume=order_volume, price_type=price_type,                                                                price=price, strategy_name=strategy_name, order_remark=order_remark)            print('交易类型{} 代码{} 价格{} 数量{} 订单编号{}'.format(order_type,stock_code,price,order_volume,fix_result_order_id))            return fix_result_order_id        else:            print('买入 标的{} 价格{} 委托数量{}小于0有问题'.format(stock_code,price,order_volume))    def sell(self,security='600031.SH', order_type=xtconstant.STOCK_SELL,                    amount=100,price_type=xtconstant.FIX_PRICE,price=20,strategy_name='',order_remark=''):        '''        单独独立股票卖出函数        '''        # 对交易回调进行订阅,订阅后可以收到交易主推,返回0表示订阅成功        subscribe_result = self.xt_trader.subscribe(self.acc)        print(self.xt_trader.query_stock_asset_async(account=self.acc,callback=subscribe_result))        #print(subscribe_result)        stock_code =self.adjust_stock(stock=security)        price=self.select_slippage(stock=security,price=price,trader_type='sell')        order_volume=amount        # 使用指定价下单,接口返回订单编号,后续可以用于撤单操作以及查询委托状态        if order_volume>0:            fix_result_order_id = self.xt_trader.order_stock(account=self.acc,stock_code=stock_code, order_type=order_type,                                                                order_volume=order_volume, price_type=price_type,                                                                price=price, strategy_name=strategy_name, order_remark=order_remark)            print('交易类型{} 代码{} 价格{} 数量{} 订单编号{}'.format(order_type,stock_code,price,order_volume,fix_result_order_id))            return fix_result_order_id        else:            print('卖出 标的{} 价格{} 委托数量{}小于0有问题'.format(stock_code,price,order_volume))
    def order_stock_async(self,stock_code='600031.SH', order_type=xtconstant.STOCK_BUY,                    order_volume=100,price_type=xtconstant.FIX_PRICE,price=20,strategy_name='',order_remark=''):        '''         释义         - 对股票进行异步下单操作,异步下单接口如果正常返回了下单请求序号seq,会收到on_order_stock_async_response的委托反馈        * 参数        - account - StockAccount 资金账号        - stock_code - str 证券代码, 如'600000.SH'        - order_type - int 委托类型        - order_volume - int 委托数量,股票以'股'为单位,债券以'张'为单位        - price_type - int 报价类型        - price - float 委托价格        - strategy_name - str 策略名称        - order_remark - str 委托备注        '''        # 对交易回调进行订阅,订阅后可以收到交易主推,返回0表示订阅成功        subscribe_result = self.xt_trader.subscribe(self.acc)        print(self.xt_trader.query_stock_asset_async(account=self.acc,callback=subscribe_result))        #print(subscribe_result)        stock_code = self.adjust_stock(stock=stock_code)        price=self.select_slippage(stock=stock_code,price=price,trader_type=order_type)        # 使用指定价下单,接口返回订单编号,后续可以用于撤单操作以及查询委托状态        fix_result_order_id = self.xt_trader.order_stock_async(account=self.acc,stock_code=stock_code, order_type=order_type,                                                            order_volume=order_volume, price_type=price_type,                                                            price=price, strategy_name=strategy_name, order_remark=order_remark)        print('交易类型{} 代码{} 价格{} 数量{} 订单编号{}'.format(order_type,stock_code,price,order_volume,fix_result_order_id))        return fix_result_order_id    def cancel_order_stock(self,order_id=12):        '''        :param account: 证券账号            :param order_id: 委托编号, 报单时返回的编号            :return: 返回撤单成功或者失败, 0:成功,  -1:委托已完成撤单失败, -2:未找到对应委托编号撤单失败, -3:账号未登陆撤单失败        '''        # 使用订单编号撤单        cancel_order_result = self.xt_trader.cancel_order_stock(account=self.acc,order_id=order_id)        if cancel_order_result==0:            print('成功')        elif cancel_order_result==-1:            print('委托已完成撤单失败')        elif cancel_order_result==-2:            print('找到对应委托编号撤单失败')        elif cancel_order_result==-3:            print('账号未登陆撤单失败')        else:            pass        return cancel_order_result    def cancel_order_stock_async(self,order_id=12):        '''        * 释义         - 根据订单编号对委托进行异步撤单操作        * 参数        - account - StockAccount  资金账号         - order_id - int 下单接口返回的订单编号        * 返回         - 返回撤单请求序号, 成功委托后的撤单请求序号为大于0的正整数, 如果为-1表示委托失败        * 备注        - 如果失败,则通过撤单失败主推接口返回撤单失败信息        '''        # 使用订单编号撤单        cancel_order_result = self.xt_trader.cancel_order_stock_async(account=self.acc,order_id=order_id)        if cancel_order_result==0:            print('成功')        elif cancel_order_result==-1:            print('委托已完成撤单失败')        elif cancel_order_result==-2:            print('找到对应委托编号撤单失败')        elif cancel_order_result==-3:            print('账号未登陆撤单失败')        else:            pass        return cancel_order_result    def query_stock_asset(self):        '''        :param account: 证券账号            :return: 返回当前证券账号的资产数据        '''        # 查询证券资产                asset = self.xt_trader.query_stock_asset(account=self.acc)        data_dict={}        if asset:            data_dict['账号类型']=asset.account_type            data_dict['资金账户']=asset.account_id            data_dict['可用金额']=asset.cash            data_dict['冻结金额']=asset.frozen_cash            data_dict['持仓市值']=asset.market_value            data_dict['总资产']=asset.total_asset            return data_dict        else:            print('获取失败资金')            data_dict['账号类型']=[None]            data_dict['资金账户']=[None]            data_dict['可用金额']=[None]            data_dict['冻结金额']=[None]            data_dict['持仓市值']=[None]            data_dict['总资产']=[None]            return  data_dict    def balance(self):        '''        对接同花顺        '''        try:            asset = self.xt_trader.query_stock_asset(account=self.acc)            df=pd.DataFrame()            if asset:                df['账号类型']=[asset.account_type]                df['资金账户']=[asset.account_id]                df['可用金额']=[asset.cash]                df['冻结金额']=[asset.frozen_cash]                df['持仓市值']=[asset.market_value]                df['总资产']=[asset.total_asset]                return df        except:            print('获取账户失败,读取上次数据,谨慎使用')            df=pd.DataFrame()            return df    def query_stock_orders(self):        '''        当日委托         :param account: 证券账号        :param cancelable_only: 仅查询可撤委托        :return: 返回当日所有委托的委托对象组成的list        '''        orders = self.xt_trader.query_stock_orders(self.acc)        print("委托数量", len(orders))        data=pd.DataFrame()        if len(orders) != 0:            for i in range(len(orders)):                df=pd.DataFrame()                df['账号类型']=[orders[i].account_type]                df['资金账号']=[orders[i].account_id]                df['证券代码']=[orders[i].stock_code]                df['证券代码']=df['证券代码'].apply(lambda x:str(x)[:6])                df['订单编号']=[orders[i].order_id]                df['柜台合同编号']=[orders[i].order_sysid]                df['报单时间']=[orders[i].order_time]                df['委托类型']=[orders[i].order_type]                df['委托数量']=[orders[i].order_volume]                df['报价类型']=[orders[i].price_type]                df['委托价格']=[orders[i].price]                df['成交数量']=[orders[i].traded_volume]                df['成交均价']=[orders[i].traded_price]                df['委托状态']=[orders[i].order_status]                df['委托状态描述']=[orders[i].status_msg]                df['策略名称']=[orders[i].strategy_name]                df['委托备注']=[orders[i].order_remark]                data=pd.concat([data,df],ignore_index=True)            data['报单时间']=pd.to_datetime(data['报单时间'],unit='s')            return data        else:            print('目前没有委托')            return data    def today_entrusts(self):        '''        对接同花顺        今天委托        '''        def select_data(x):            if x==48:                return '未报'            elif x==49:                return '待报'            elif x==50:                return '已报'            elif x==51:                return '已报待撤'            elif x==52:                return '部分待撤'            elif x==53:                return '部撤'            elif x==54:                return '已撤'            elif x==55:                return '部成'            elif x==56:                return '已成'            elif x==57:                return '废单'            else:                return '废单'        orders = self.xt_trader.query_stock_orders(self.acc)        print("委托数量", len(orders))        data=pd.DataFrame()        if len(orders) != 0:            for i in range(len(orders)):                df=pd.DataFrame()                df['账号类型']=[orders[i].account_type]                df['资金账号']=[orders[i].account_id]                df['证券代码']=[orders[i].stock_code]                df['证券代码']=df['证券代码'].apply(lambda x:str(x)[:6])                df['订单编号']=[orders[i].order_id]                df['柜台合同编号']=[orders[i].order_sysid]                df['报单时间']=[orders[i].order_time]                df['委托类型']=[orders[i].order_type]                df['委托数量']=[orders[i].order_volume]                df['报价类型']=[orders[i].price_type]                df['委托价格']=[orders[i].price]                df['成交数量']=[orders[i].traded_volume]                df['成交均价']=[orders[i].traded_price]                df['委托状态']=[orders[i].order_status]                df['委托状态描述']=[orders[i].status_msg]                df['策略名称']=[orders[i].strategy_name]                df['委托备注']=[orders[i].order_remark]                data=pd.concat([data,df],ignore_index=True)            data['报单时间']=df['报单时间'].apply(conv_time)            data['委托状态翻译']=data['委托状态'].apply(select_data)            data['未成交数量']=data['委托数量']-data['成交数量']            data['未成交价值']=data['未成交数量']*data['委托价格']            return data        else:            print('目前没有委托')            return data    def query_stock_trades(self):        '''        当日成交        '''        trades = self.xt_trader.query_stock_trades(self.acc)        print("成交数量:", len(trades))        data=pd.DataFrame()        if len(trades) != 0:            for i in range(len(trades)):                df=pd.DataFrame()                df['账号类型']=[trades[i].account_type]                df['资金账号']=[trades[i].account_id]                df['证券代码']=[trades[i].stock_code]                df['证券代码']=df['证券代码'].apply(lambda x:str(x)[:6])                df['委托类型']=[trades[i].order_type]                df['成交编号']=[trades[i].traded_id]                df['成交时间']=[trades[i].traded_time]                df['成交均价']=[trades[i].traded_price]                df['成交数量']=[trades[i].traded_volume]                df['成交金额']=[trades[i].traded_amount]                df['订单编号']=[trades[i].order_id]                df['柜台合同编号']=[trades[i].order_sysid]                df['策略名称']=[trades[i].strategy_name]                df['委托备注']=[trades[i].order_remark]                data=pd.concat([data,df],ignore_index=True)            data['成交时间']=pd.to_datetime(data['成交时间'],unit='s')            return data        else:            print('今日没有成交')                 return data    def today_trades(self):        '''        对接同花顺        今日成交        '''        trades = self.xt_trader.query_stock_trades(self.acc)        print("成交数量:", len(trades))        data=pd.DataFrame()        if len(trades) != 0:            for i in range(len(trades)):                df=pd.DataFrame()                df['账号类型']=[trades[i].account_type]                df['资金账号']=[trades[i].account_id]                df['证券代码']=[trades[i].stock_code]                df['证券代码']=df['证券代码'].apply(lambda x:str(x)[:6])                df['委托类型']=[trades[i].order_type]                df['成交编号']=[trades[i].traded_id]                df['成交时间']=[trades[i].traded_time]                df['成交均价']=[trades[i].traded_price]                df['成交数量']=[trades[i].traded_volume]                df['成交金额']=[trades[i].traded_amount]                df['订单编号']=[trades[i].order_id]                df['柜台合同编号']=[trades[i].order_sysid]                df['策略名称']=[trades[i].strategy_name]                df['委托备注']=[trades[i].order_remark]                data=pd.concat([data,df],ignore_index=True)            def select_data(x):                if x==xtconstant.STOCK_BUY:                    return '证券买入'                elif x==xtconstant.STOCK_SELL:                    return '证券卖出'                else:                    return '无'            df['操作']=df['委托类型'].apply(select_data)            data['成交时间']=pd.to_datetime(data['成交时间'],unit='s')            return data        else:            print('今日没有成交')                 return data    def query_stock_positions(self):        '''        查询账户所有的持仓        '''        positions = self.xt_trader.query_stock_positions(self.acc)        print("持仓数量:", len(positions))        data=pd.DataFrame()        if len(positions) != 0:            for i in range(len(positions)):                df=pd.DataFrame()                df['账号类型']=[positions[i].account_type]                df['资金账号']=[positions[i].account_id]                df['证券代码']=[positions[i].stock_code]                df['证券代码']=df['证券代码'].apply(lambda x:str(x)[:6])                df['持仓数量']=[positions[i].volume]                df['可用数量']=[positions[i].can_use_volume]                df['平均建仓成本']=[positions[i].open_price]                df['市值']=[positions[i].market_value]                data=pd.concat([data,df],ignore_index=True)            return data        else:            print('没有持股')            df=pd.DataFrame()            df['账号类型']=[None]            df['资金账号']=[None]            df['证券代码']=[None]            df['持仓数量']=[None]            df['可用数量']=[None]            df['平均建仓成本']=[None]            df['市值']=[None]            return df    def position(self):        '''        对接同花顺        持股        '''        try:            positions = self.xt_trader.query_stock_positions(self.acc)            print("持仓数量:", len(positions))            data=pd.DataFrame()            if len(positions) != 0:                for i in range(len(positions)):                    df=pd.DataFrame()                    df['账号类型']=[positions[i].account_type]                    df['资金账号']=[positions[i].account_id]                    df['证券代码']=[positions[i].stock_code]                    df['证券代码']=df['证券代码'].apply(lambda x:str(x)[:6])                    df['股票余额']=[positions[i].volume]                    df['可用余额']=[positions[i].can_use_volume]                    df['成本价']=[positions[i].open_price]                    df['参考成本价']=[positions[i].open_price]                    df['市值']=[positions[i].market_value]                    data=pd.concat([data,df],ignore_index=True)                return data            else:                df=pd.DataFrame()                df['账号类型']=None                df['资金账号']=None                df['证券代码']=None                df['股票余额']=None                df['可用余额']=None                df['成本价']=None                df['市值']=None                df['选择']=None                df['持股天数']=None                df['交易状态']=None                df['明细']=None                df['证券名称']=None                df['冻结数量']=None                df['市价']=None                df['盈亏']=None                df['盈亏比(%)']=None                df['当日买入']=None                  df['当日卖出']=None                return df                        except:            df=pd.DataFrame()            return df    def run_forever(self):        '''        阻塞线程,接收交易推送        '''        self.xt_trader.run_forever()    def stop(self):        self.xt_trader.stop()if __name__=='__main__':    models=easy_qmt_trader()    models.connect()    print(models.query_stock_orders())    models.buy()    models1=easy_qmt_trader(account='55009680',session_id=123457)    models1.connect()    print(models1.query_stock_positions())   

综合交易模型59

综合交易模型 · 目录

上一篇量化系统--开源强大的qmt交易系统,提供源代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/860885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git的安装配置及使用(超详细!!!)

一、git概述 它是一个版本管理工具. 版本: 软件开发过程当中的重要节点. 作用: 团队协作,管理代码. 对于软件的学习, 会用就行. 1.1 安装及配置 下载地址: github.com 安装注意事项: 傻瓜式安装,一直下一步就好. 安装目录不要有中文. 尽量也不要有空格. 配置环境变量: 找到…

【深海王国】小学生都能玩的单片机?零基础入门单片机Arduino带你打开嵌入式的大门!(10)

Hi٩(๑o๑)۶, 各位深海王国的同志们&#xff0c;早上下午晚上凌晨好呀~辛勤工作的你今天也辛苦啦 (o゜▽゜)o☆ 今天大都督继续为大家带来系列——小学生都能玩的单片机&#xff01;带你一周内快速走进嵌入式的大门&#xff0c;let’s go&#xff01; &#xff08;10&#…

什么是钢直尺“光学影像式”仪器校准方法?

计量和我们生活密不可分&#xff0c;但是对于计量的了解大多数人并不深入&#xff0c;因此也会存在一些认知上的误差。比如一个体温计买来才几十块&#xff0c;但是做一次校准费用就是一两百。又或者是一把钢直尺才十几块成本&#xff0c;校准的费用却是成本的三到四倍。 不了…

外贸邮件推送有哪些策略?如何提升转化率?

外贸邮件推送的效果怎么优化&#xff1f;邮件推送的技巧有哪些&#xff1f; 外贸邮件推送是一种有效的市场营销策略&#xff0c;可以帮助企业开拓国际市场&#xff0c;增加销售额。然而&#xff0c;成功的外贸邮件推送并不是一蹴而就的&#xff0c;需要精心策划和执行。AokSen…

.NET 一款系统遥测实现权限维持的工具

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

多个 el-checkbox-group 使用同一个变量传参联动回显

<el-form-item label"保底对象" required><div style"display: flex"><span> A类&#xff1a;</span><el-checkbox-group v-model"guaranteedPartyA"><el-checkbox label"1">设备</el-checkbo…

[windows] 无拓展名文件设置默认打开方式为记事本

前言 本文是对[windows] 无拓展名文件设置默认打开方式_给无后缀文件添加打开方式选项-CSDN博客 的细节上的补充&#xff0c;对小白更友好。建议对照引用的博客观看。 管理员状态运行cmd 右键左下角开始位置&#xff0c;出现 左键点击打开终端管理员。 进去后直接输入cmd即…

COMSOL -电力输电线的电场和磁场仿真

为确保电力输电线周围人员和环境的安全&#xff0c;工程师必须对电力线产生的电场和磁场进行监控。通过多物理场仿真&#xff0c;工程师能够预测电力线产生的场如何从电力线中扩散&#xff0c;以及如何影响其辐射至地面的强度。这篇文章&#xff0c;我们将使用两个示例模型来说…

火绒被骂惨,良心居然也翻车?剩下3款软件还被误认为外国人开发

万万没想到&#xff0c;公认的国产良心软件“火绒”&#xff0c;居然也翻车&#xff0c;很多网友对其大失所望&#xff0c;甚至忍不住吐槽让他不要砸了自己的招牌。 事情的起因是这样的&#xff0c;火绒推出应用商店&#xff0c;并于正式公测&#xff0c;这是要逐渐走向全家桶的…

大模型应用RAG系列(一):初识RAG,RAG出现及未来发展趋势

题外话 之前我们在讲大模型的应用方向和架构时&#xff0c;有提到RAG、Agent、Fine-Tune。在作者写大模型专题的文章时&#xff0c;也是边学习&#xff0c;边梳理&#xff0c;边总结。在这个过程中&#xff0c;大模型在各个方向都不断地快速发展&#xff0c;对应的paper、理论…

AI绘画的10种变现方法,逼你躺平挣钱

AI绘画到底能多挣钱&#xff01; 马上看证据&#xff0c;知乎和其它平台的收益&#xff0c;AI绘画挣的稿费&#xff0c;还有某音某瓜的稿费。 都是有AI绘画的一大功劳&#xff01; 接下来介绍AI绘画的十种挣钱方法&#xff0c;有折腾的收益&#xff0c;也有躺平的收益&#x…

ArcGIS Pro三维空间分析、专题制图、遥感制图全流程系统教学

ESRI宣布&#xff1a;ArcGIS 10.8.2 是 ArcMap 的当前版本&#xff0c;在 2026 年 3 月 1 日之前将继续受支持。我们没有计划在 2021/22 年随 ArcGIS 版本一起发布 ArcMap 10.9.x。这意味着 10.8.x 系列将是 ArcMap 的最终版本系列&#xff0c;并将在 2026 年 3 月 1 日之前受支…

28. 深度学习中的损失函数:起源、分类及统一理解

在深度学习和机器学习领域&#xff0c;损失函数&#xff08;Loss Function&#xff09;是优化问题的核心&#xff0c;决定了模型参数的调整方向和幅度。尽管损失函数种类繁多&#xff0c;但理解其起源和背后的理论有助于我们更好地选择和应用它们。 损失函数的起源 所有的优化…

Python爬虫实战:利用代理IP批量下载哔哩哔哩美女视频

文章 目录 1.前言2.爬取目标3.准备工作3.1 环境安装3.2 代理免费获取 四、爬虫实战分析4.1 翻页分析4.2 获取视频跳转链接4.3 下载视频4.4 视频音频合并4.5 完整源码 五、总结 1.前言 粉丝们&#xff08;lsp&#xff09;期待已久的Python批量下载哔哩哔哩美女视频教程它终于来…

机器人控制系列教程之运动规划(1)

机械臂的运动 工业机器人的运动&#xff0c;根据其运动轨迹可分为点到点的运动和路径跟踪运动。点到点的运动只关心特点的位置点&#xff0c;而路径跟踪运动关心整个运动路径。 点到点运动 点到点的运动根据目标点的机器人位姿&#xff0c;利用逆向运动学求取机器人各个关节…

低代码平台如何重塑项目管理:效率与创新的新边界

引言 随着数字化转型的加速和技术创新的推动&#xff0c;低代码开发平台在近年来逐渐崭露头角&#xff0c;成为企业和组织加速应用开发和创新的重要工具。低代码平台通过提供可视化的开发环境和预构建的组件&#xff0c;极大地简化了应用程序的开发过程&#xff0c;使非专业开发…

C++学习全教程(day1:变量和数据类型、运算符、流行控制语句)

目录 一、变量和数据类型 1、变量 2、标识符 3、作用域 4、常量 5、数据类型 1.基本数据类型-整型 2.char类型 3.bool类型 4.浮点类型 5.字面值常量 二、运算符 1、算数运算符 2、赋值运算符 3、复合赋值运算符 4、关系和逻辑运算 1.关系运算符 -------结果是…

PointCloudLib NDT3D算法实现点云配准 C++版本

0.实现效果 效果不咋好 ,参数不好调整 1.算法原理 3D NDT(Normal Distributions Transform)算法是一种用于同时定位和地图生成(SLAM)的机器人导航算法,特别适用于三维点云数据的配准。以下是关于3D NDT算法的详细解释: 算法原理 点云划分与分布计算:3D NDT算法首先将…

2024第十三届中国PMO大会主持人介绍

全国PMO专业人士年度盛会 由PMO评论主办的2024第十三届中国PMO大会邀请了到十几位知名企业的PMO和项目管理专家来担任大会主持人。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xff01; 主持人介绍 肖杨&#xff0c;国际知名组织级项目管理专家&#xff0c;微薄之力…

武汉星起航:亚马逊全球化布局助力企业拓展国际市场

在当今全球化经济的大背景下&#xff0c;企业如何突破地域限制&#xff0c;将产品推向更广阔的市场&#xff0c;成为了摆在众多企业家面前的重要课题。武汉星起航相信&#xff0c;亚马逊&#xff0c;作为全球最大的在线零售平台之一&#xff0c;以其独特的全球化布局和强大的服…