返回列表 发布新帖

原始版本qmt 实盘趋势交易策略,提供源代码

1575 2
发表于 2024-7-20 21:44:41 | 显示全部楼层 阅读模式
原始版本qmt 实盘趋势交易策略,提供源代码 链接https://mp.weixin.qq.com/s/cAdjgtrFSsR7RYuEEBGSeA
源代码
  1. import schedule
  2. from datetime import datetime
  3. import time
  4. import pandas as pd
  5. from xtquant.xttrader import XtQuantTrader, XtQuantTraderCallback
  6. from xtquant.xttype import StockAccount
  7. from xtquant import xtconstant
  8. import time
  9. import pandas as pd
  10. from xtquant import xtdata
  11. import numpy as np
  12. import schedule
  13. import math
  14. from datetime import datetime
  15. class MyXtQuantTraderCallback(XtQuantTraderCallback):
  16.     def on_disconnected(self):
  17.         """
  18.         连接断开
  19.         :return:
  20.         """
  21.         print("connection lost")
  22.     def on_stock_order(self, order):
  23.         """
  24.         委托回报推送
  25.         :param order: XtOrder对象
  26.         :return:
  27.         """
  28.         print("on order callback:")
  29.         print(order.stock_code, order.order_status, order.order_sysid)
  30.     def on_stock_asset(self, asset):
  31.         """
  32.         资金变动推送
  33.         :param asset: XtAsset对象
  34.         :return:
  35.         """
  36.         print("on asset callback")
  37.         print(asset.account_id, asset.cash, asset.total_asset)
  38.     def on_stock_trade(self, trade):
  39.         """
  40.         成交变动推送
  41.         :param trade: XtTrade对象
  42.         :return:
  43.         """
  44.         print("on trade callback")
  45.         print(trade.account_id, trade.stock_code, trade.order_id)
  46.     def on_stock_position(self, position):
  47.         """
  48.         持仓变动推送
  49.         :param position: XtPosition对象
  50.         :return:
  51.         """
  52.         print("on position callback")
  53.         print(position.stock_code, position.volume)
  54.     def on_order_error(self, order_error):
  55.         """
  56.         委托失败推送
  57.         :param order_error:XtOrderError 对象
  58.         :return:
  59.         """
  60.         print("on order_error callback")
  61.         print(order_error.order_id, order_error.error_id, order_error.error_msg)
  62.     def on_cancel_error(self, cancel_error):
  63.         """
  64.         撤单失败推送
  65.         :param cancel_error: XtCancelError 对象
  66.         :return:
  67.         """
  68.         print("on cancel_error callback")
  69.         print(cancel_error.order_id, cancel_error.error_id, cancel_error.error_msg)
  70.     def on_order_stock_async_response(self, response):
  71.         """
  72.         异步下单回报推送
  73.         :param response: XtOrderResponse 对象
  74.         :return:
  75.         """
  76.         print("on_order_stock_async_response")
  77.         print(response.account_id, response.order_id, response.seq)
  78. class xg_mean_line_tarder:
  79.     def __init__(self,path= r'D:/国金QMT交易端模拟/userdata_mini',
  80.                   session_id = 123456,account='55009640',account_type='STOCK',
  81.                   is_slippage=True,slippage=0.01):
  82.         '''
  83.         均线趋势交易策略
  84.         自己开发的小果交易框架
  85.         原始版本的qmt框架
  86.         网页 https://gitee.com/li-xingguo11111/qmt_trader
  87.         '''
  88.         if is_slippage==True:
  89.             self.slippage=slippage
  90.         else:
  91.             self.slippage=0
  92.         self.path=path
  93.         self.session_id=int(time.time())
  94.         self.account=account
  95.         self.account_type=account_type
  96.         self.xt_trader=''
  97.         self.acc=''
  98.         #避免下单失败多次下单
  99.         #买入记录
  100.         self.buy_stock_log=[]
  101.         #卖出记录
  102.         self.sell_stock_log=[]
  103.         #买入的目标金额
  104.         self.buy_max_value=10000
  105.         #卖出的目标金额
  106.         self.sell_max_value=0
  107.         #买入的分数
  108.         self.buy_score=50
  109.         #持有的分数
  110.         self.hold_score=50
  111.         #股票列表
  112.         self.code_list=['513100', '159632', '159941', '159502', '159509', '159655',
  113.                          '513500', '513300', '513400', '513850', '159659', '159660',
  114.                          '164824', '159866', '513030', '513080', '513730', '159687',
  115.                          '159937', '159980', '159985', '159981']
  116.         '''
  117.         证券代码            名称
  118.         0   513100       纳斯达克ETF
  119.         1   159632     纳斯达克ETF华安
  120.         2   159941     纳斯达克ETF广发
  121.         3   159502       标普生物ETF
  122.         4   159509     纳斯达克科技ETf
  123.         5   159655         标普ETF
  124.         6   513500      标普500ETF
  125.         7   513300     纳斯达克ETF华夏
  126.         8   513400        道琼斯ETF
  127.         9   513850       美国50ETF
  128.         10  159659  纳斯达克100招商ETF
  129.         11  159660  纳斯达克100添富ETF
  130.         12  164824         印度ETF
  131.         13  159866         日本ETF
  132.         14  513030         德国ETF
  133.         15  513080         法国ETF
  134.         16  513730      东南亚科技ETF
  135.         17  159687       亚太低碳ETF
  136.         18  159937         黄金ETF
  137.         19  159980         有色ETF
  138.         20  159985         豆粕ETF
  139.         21  159981       能源化工ETF
  140.         '''
  141.         self.data=xtdata
  142.         #跌破均线卖出
  143.         self.down_mean_line_sell=5
  144.         #调整股票代码
  145.         self.stock_list=[]
  146.         for stock in self.code_list:
  147.             self.stock_list.append(self.adjust_stock(stock=stock))
  148.         #订阅一分钟的数据,需要更快的话可以订阅tick数据
  149.         for stock in self.stock_list:
  150.             self.data.subscribe_quote(stock_code=stock,period='1d',start_time='20220101',
  151.                                       end_time='20500101',count=-1)
  152.     def check_is_trader_date_1(self,trader_time=4,start_date=9,end_date=14,start_mi=0,jhjj='否'):
  153.         '''
  154.         检测是不是交易时间
  155.         '''
  156.         if jhjj=='是':
  157.             jhjj_time=15
  158.         else:
  159.             jhjj_time=30
  160.         loc=time.localtime()
  161.         tm_hour=loc.tm_hour
  162.         tm_min=loc.tm_min
  163.         wo=loc.tm_wday
  164.         if wo<=trader_time:
  165.             if tm_hour>=start_date and tm_hour<=end_date:
  166.                 if tm_hour==9 and tm_min<jhjj_time:
  167.                     return False
  168.                 elif tm_min>=start_mi:
  169.                     return True
  170.                 else:
  171.                     return False
  172.             else:
  173.                 return False   
  174.         else:
  175.             print('周末')
  176.             return False
  177.     def select_data_type(self,stock='600031'):
  178.         '''
  179.         选择数据类型
  180.         '''
  181.         if stock[:3] in ['110','113','123','127','128','111','118'] or stock[:2] in ['11','12']:
  182.             return 'bond'
  183.         elif stock[:3] in ['510','511','512','513','514','515','516','517','518','588','159','501','164'] or stock[:2] in ['16']:
  184.             return 'fund'
  185.         else:
  186.             return 'stock'
  187.     def adjust_stock(self,stock='600031.SH'):
  188.         '''
  189.         调整代码
  190.         '''
  191.         if stock[-2:]=='SH' or stock[-2:]=='SZ' or stock[-2:]=='sh' or stock[-2:]=='sz':
  192.             stock=stock.upper()
  193.         else:
  194.             if stock[:3] in ['600','601','603','688','510','511',
  195.                              '512','513','515','113','110','118','501'] or stock[:2] in ['11']:
  196.                 stock=stock+'.SH'
  197.             else:
  198.                 stock=stock+'.SZ'
  199.         return stock
  200.     def adjust_amount(self,stock='',amount=''):
  201.         '''
  202.         调整数量
  203.         '''           
  204.         if stock[:3] in ['110','113','123','127','128','111'] or stock[:2] in ['11','12']:
  205.             amount=math.floor(amount/10)*10
  206.         else:
  207.             amount=math.floor(amount/100)*100
  208.         return amount
  209.     def select_slippage(self,stock='600031',price=15.01,trader_type='buy'):
  210.         '''
  211.         选择滑点
  212.         安价格来滑点,比如0.01就是一块
  213.         etf3位数,股票可转债2位数
  214.         '''
  215.         stock=self.adjust_stock(stock=stock)
  216.         data_type=self.select_data_type(stock=stock)
  217.         if data_type=='fund' or data_type=='bond':
  218.             slippage=self.slippage/10
  219.             if trader_type=='buy' or trader_type==23:
  220.                 price=price+slippage
  221.             else:
  222.                 price=price-slippage
  223.         else:
  224.             slippage=self.slippage
  225.             if trader_type=='buy' or trader_type==23:
  226.                 price=price+slippage
  227.             else:
  228.                 price=price-slippage
  229.         return price
  230.     def connect(self):
  231.         '''
  232.         连接
  233.         path qmt userdata_min是路径
  234.         session_id 账户的标志,随便
  235.         account账户,
  236.         account_type账户内类型
  237.         '''
  238.         print('链接qmt')
  239.         # path为mini qmt客户端安装目录下userdata_mini路径
  240.         path = self.path
  241.         # session_id为会话编号,策略使用方对于不同的Python策略需要使用不同的会话编号
  242.         session_id = self.session_id
  243.         xt_trader = XtQuantTrader(path, session_id)
  244.         # 创建资金账号为1000000365的证券账号对象
  245.         account=self.account
  246.         account_type=self.account_type
  247.         acc = StockAccount(account_id=account,account_type=account_type)
  248.         # 创建交易回调类对象,并声明接收回调
  249.         callback = MyXtQuantTraderCallback()
  250.         xt_trader.register_callback(callback)
  251.         # 启动交易线程
  252.         xt_trader.start()
  253.         # 建立交易连接,返回0表示连接成功
  254.         connect_result = xt_trader.connect()
  255.         
  256.         if connect_result==0:
  257.             # 对交易回调进行订阅,订阅后可以收到交易主推,返回0表示订阅成功
  258.             subscribe_result = xt_trader.subscribe(acc)
  259.             print(subscribe_result)
  260.             self.xt_trader=xt_trader
  261.             self.acc=acc
  262.             return xt_trader,acc
  263.         else:
  264.             print(connect_result)
  265.             print('qmt连接失败')
  266.     def position(self):
  267.         '''
  268.         对接同花顺
  269.         持股
  270.         '''
  271.         try:
  272.             positions = self.xt_trader.query_stock_positions(self.acc)
  273.             print("持仓数量:", len(positions))
  274.             data=pd.DataFrame()
  275.             if len(positions) != 0:
  276.                 for i in range(len(positions)):
  277.                     df=pd.DataFrame()
  278.                     df['账号类型']=[positions[i].account_type]
  279.                     df['资金账号']=[positions[i].account_id]
  280.                     df['证券代码']=[positions[i].stock_code]
  281.                     df['证券代码1']=[positions[i].stock_code]
  282.                     df['证券代码']=df['证券代码'].apply(lambda x:str(x)[:6])
  283.                     df['股票余额']=[positions[i].volume]
  284.                     df['可用余额']=[positions[i].can_use_volume]
  285.                     df['成本价']=[positions[i].open_price]
  286.                     df['参考成本价']=[positions[i].open_price]
  287.                     df['市值']=[positions[i].market_value]
  288.                     df['冻结数量']=[positions[i].frozen_volume]
  289.                     data=pd.concat([data,df],ignore_index=True)
  290.                 return data
  291.             else:
  292.                 df=pd.DataFrame()
  293.                 df['账号类型']=None
  294.                 df['资金账号']=None
  295.                 df['证券代码']=None
  296.                 df['股票余额']=None
  297.                 df['可用余额']=None
  298.                 df['成本价']=None
  299.                 df['市值']=None
  300.                 df['选择']=None
  301.                 df['持股天数']=None
  302.                 df['交易状态']=None
  303.                 df['明细']=None
  304.                 df['证券名称']=None
  305.                 df['冻结数量']=None
  306.                 df['市价']=None
  307.                 df['盈亏']=None
  308.                 df['盈亏比(%)']=None
  309.                 df['当日买入']=None       
  310.                 df['当日卖出']=None
  311.                 return df
  312.                
  313.         except:
  314.             df=pd.DataFrame()
  315.             return df
  316.     def balance(self):
  317.         '''
  318.         对接同花顺
  319.         '''
  320.         try:
  321.             asset = self.xt_trader.query_stock_asset(account=self.acc)
  322.             df=pd.DataFrame()
  323.             if asset:
  324.                 df['账号类型']=[asset.account_type]
  325.                 df['资金账户']=[asset.account_id]
  326.                 df['可用金额']=[asset.cash]
  327.                 df['冻结金额']=[asset.frozen_cash]
  328.                 df['持仓市值']=[asset.market_value]
  329.                 df['总资产']=[asset.total_asset]
  330.                 return df
  331.         except:
  332.             print('获取账户失败,读取上次数据,谨慎使用')
  333.             df=pd.DataFrame()
  334.             return df
  335.     def buy(self,security='600031.SH', order_type=xtconstant.STOCK_BUY,
  336.                     amount=100,price_type=xtconstant.FIX_PRICE,price=20,strategy_name='',order_remark=''):
  337.         '''
  338.         单独独立股票买入函数
  339.         '''
  340.         # 对交易回调进行订阅,订阅后可以收到交易主推,返回0表示订阅成功
  341.         subscribe_result = self.xt_trader.subscribe(self.acc)
  342.         print(self.xt_trader.query_stock_asset_async(account=self.acc,callback=subscribe_result))
  343.         #print(subscribe_result)
  344.         stock_code =self.adjust_stock(stock=security)
  345.         price=self.select_slippage(stock=security,price=price,trader_type='buy')
  346.         order_volume=amount
  347.         # 使用指定价下单,接口返回订单编号,后续可以用于撤单操作以及查询委托状态
  348.         if order_volume>0:
  349.             fix_result_order_id = self.xt_trader.order_stock_async(account=self.acc,stock_code=stock_code, order_type=order_type,
  350.                                                                 order_volume=order_volume, price_type=price_type,
  351.                                                                 price=price, strategy_name=strategy_name, order_remark=order_remark)
  352.             print('交易类型{} 代码{} 价格{} 数量{} 订单编号{}'.format(order_type,stock_code,price,order_volume,fix_result_order_id))
  353.             return fix_result_order_id
  354.         else:
  355.             print('买入 标的{} 价格{} 委托数量{}小于0有问题'.format(stock_code,price,order_volume))
  356.     def sell(self,security='600031.SH', order_type=xtconstant.STOCK_SELL,
  357.                     amount=100,price_type=xtconstant.FIX_PRICE,price=20,strategy_name='',order_remark=''):
  358.         '''
  359.         单独独立股票卖出函数
  360.         '''
  361.         # 对交易回调进行订阅,订阅后可以收到交易主推,返回0表示订阅成功
  362.         subscribe_result = self.xt_trader.subscribe(self.acc)
  363.         print(self.xt_trader.query_stock_asset_async(account=self.acc,callback=subscribe_result))
  364.         #print(subscribe_result)
  365.         stock_code =self.adjust_stock(stock=security)
  366.         price=self.select_slippage(stock=security,price=price,trader_type='sell')
  367.         order_volume=amount
  368.         # 使用指定价下单,接口返回订单编号,后续可以用于撤单操作以及查询委托状态
  369.         if order_volume>0:
  370.             fix_result_order_id = self.xt_trader.order_stock(account=self.acc,stock_code=stock_code, order_type=order_type,
  371.                                                                 order_volume=order_volume, price_type=price_type,
  372.                                                                 price=price, strategy_name=strategy_name, order_remark=order_remark)
  373.             print('交易类型{} 代码{} 价格{} 数量{} 订单编号{}'.format(order_type,stock_code,price,order_volume,fix_result_order_id))
  374.             return fix_result_order_id
  375.         else:
  376.             print('卖出 标的{} 价格{} 委托数量{}小于0有问题'.format(stock_code,price,order_volume))
  377.     def order_target_value(self,stock='501018',value=1000,price=1.33):
  378.         '''
  379.         目标价值下单
  380.         stock: 股票名字
  381.         value: 股票价值,value = 最新价 * 手数 * 保证金率(股票为1) * 乘数(股票为100)
  382.         prive交易的的价格
  383.         '''
  384.         hold_stock=self.position()
  385.         try:
  386.             del hold_stock['Unnamed: 0']
  387.         except:
  388.             pass
  389.         account=self.balance()
  390.         try:
  391.             del account['Unnamed: 0']
  392.         except:
  393.             pass
  394.         cash=account['可用金额'].tolist()[-1]
  395.         frozen_cash=account['冻结金额'].tolist()[-1]
  396.         market_value=account['持仓市值'].tolist()[-1]
  397.         total_asset=account['总资产'].tolist()[-1]
  398.         amount=math.floor(value/price)
  399.         if hold_stock.shape[0]>0:
  400.             stock=str(stock)
  401.             df1=hold_stock[hold_stock['证券代码']==stock]
  402.             if df1.shape[0]>0:
  403.                 #可以使用的数量兼容t0
  404.                 av_num=df1['可用余额'].tolist()[-1]
  405.                 #持有数量
  406.                 hold_num=df1['股票余额'].tolist()[-1]
  407.                 #持有的价值
  408.                 hold_value=df1['市值'].tolist()[-1]
  409.             else:
  410.                 av_num=0
  411.                 hold_num=0
  412.                 hold_value=0
  413.         else:
  414.             av_num=0
  415.             hold_num=0
  416.             hold_value=0
  417.         #买卖价值差转成数量
  418.         #可转债最新10
  419.         amount=self.adjust_amount(stock=stock,amount=amount)
  420.         #买卖的差额
  421.         buy_sell_num=math.floor(amount-float(hold_num))
  422.         buy_sell_num=self.adjust_amount(stock=stock,amount=buy_sell_num)
  423.         buy_sell_value=buy_sell_num*price
  424.         #存在买入差额,买入的大于持有的
  425.         if buy_sell_num>0:
  426.             if buy_sell_num>=10:
  427.                 #可用现金大于买卖的差额
  428.                 if cash>=buy_sell_value:
  429.                     print('目标价值下单{} 目标价值{} 可用资金{}大于买卖资金{} 目标数量{} 持有数量{} 可用数量{} 买入差额{}'.format(stock,value,cash,buy_sell_value,amount,hold_num,av_num,buy_sell_num))
  430.                     return 'buy',buy_sell_num,price
  431.                 else:
  432.                     print('目标价值下单{} 目标价值{} 可用资金{}小于买卖资金{} 目标数量{} 持有数量{} 可用数量{} 买入差额{}不下单'.format(stock,value,cash,buy_sell_value,amount,hold_num,av_num,buy_sell_num))
  433.                     return '',0,price
  434.             else:
  435.                 print('目标价值下单{} 目标价值{} 可用资金{} 买卖资金{} 目标数量{} 持有数量{} 可用数量{} 买入差额{}不下单小于最小单位去10'.format(stock,value,cash,buy_sell_value,amount,hold_num,av_num,buy_sell_num))
  436.                 return '',0,price
  437.         #存在卖出空间,目标数量小于持有数量卖出:
  438.         elif buy_sell_num <0:
  439.             #可以卖出的数量多
  440.             if av_num>=buy_sell_num:
  441.                 buy_sell_num=abs(buy_sell_num)
  442.                 buy_sell_num=self.adjust_amount(stock=stock,amount=buy_sell_num)
  443.                 print('目标价值下单{} 目标价值{} 目标数量{} 持有数量{} 可用数量{} 卖出差额{}'.format(stock,value,amount,hold_num,av_num,buy_sell_num))
  444.                 return 'sell',buy_sell_num,price
  445.             else:
  446.                 #可以卖出的不足卖出全部可以卖出的
  447.                 print('目标价值下单{} 目标价值{} 目标数量{} 持有数量{} 可用数量{}小于卖出数量 卖出差额{}'.format(stock,value,amount,hold_num,av_num,buy_sell_num))
  448.                 return 'sell',av_num,price
  449.         else:
  450.             print('目标价值下单{} 目标价值{} 目标数量{} 等于持有数量{} 可用数量{} 卖出差额{}不下单'.format(stock,value,amount,hold_num,av_num,buy_sell_num))
  451.             return '',0,price
  452.     def mean_line_models(self,df):
  453.         '''
  454.         均线模型
  455.         趋势模型
  456.         5,10,20,30,60
  457.         '''
  458.         df=df
  459.         df1=pd.DataFrame()
  460.         df1['5']=df['close'].rolling(window=5).mean()
  461.         df1['10']=df['close'].rolling(window=10).mean()
  462.         df1['20']=df['close'].rolling(window=20).mean()
  463.         df1['30']=df['close'].rolling(window=30).mean()
  464.         df1['60']=df['close'].rolling(window=60).mean()
  465.         score=0
  466.         #加分的情况
  467.         mean_5=df1['5'].tolist()[-1]
  468.         mean_10=df1['10'].tolist()[-1]
  469.         mean_20=df1['20'].tolist()[-1]
  470.         mean_30=df1['30'].tolist()[-1]
  471.         mean_60=df1['60'].tolist()[-1]
  472.         #相邻2个均线进行比较
  473.         if mean_5>mean_10:
  474.             score+=25
  475.         if mean_10>mean_20:
  476.             score+=25
  477.         if mean_20>mean_30:
  478.             score+=25
  479.         if mean_30>mean_60:
  480.             score+=25
  481.         return score
  482.     def down_n_mean_line_sell(self,df):
  483.         '''
  484.         跌破均线卖出
  485.         '''
  486.         df['n']=df['close'].rolling(window=self.down_mean_line_sell).mean()
  487.         if df['close'].tolist()[-1]<=df['n'].tolist()[-1]:
  488.             return True
  489.         else:
  490.             return False


  491.     def get_select_stock_data(self):
  492.         '''
  493.         选股模型
  494.         '''
  495.         position=self.position()
  496.         if position.shape[0]>0:
  497.             position['证券代码']=position['证券代码'].apply(lambda x:self.adjust_stock(x))
  498.             hold_stock_list=position['证券代码'].tolist()
  499.         else:
  500.             hold_stock_list=[]
  501.         #选股
  502.         #读取订阅数据
  503.         df=self.data.get_market_data_ex(stock_list=self.stock_list,period='1d',
  504.                                             start_time='20240101',end_time='20500101',count=-1)
  505.         #解析数据
  506.         buy_stock_list=[]
  507.         for stock in self.stock_list:
  508.             try:
  509.                 hist=df[stock]
  510.                 score=self.mean_line_models(df=hist)
  511.                 down=self.down_n_mean_line_sell(df=hist)
  512.                 if stock in hold_stock_list:
  513.                     print('{}有持股不买入'.format(stock))
  514.                 elif stock in self.buy_stock_log:
  515.                     print('{}有买入记录不交易'.format(stock))
  516.                 elif score<self.buy_score:
  517.                     print('{}趋势得分小于买入分数{}不交易'.format(stock,score,self.buy_score))
  518.                 else:
  519.                     print("{}符合趋势买入模型".format(stock))
  520.                     if down:
  521.                         print('{} 跌破均线{}不买入'.format(stock,self.down_mean_line_sell))
  522.                     else:
  523.                         print("{}符合趋势,均线买入模型".format(stock))
  524.                         buy_stock_list.append(stock)
  525.             except Exception as e:
  526.                 print(e)
  527.         return buy_stock_list
  528.     def get_stock_sell_data(self):
  529.         '''
  530.         卖出数据
  531.         '''
  532.         position=self.position()
  533.         if position.shape[0]>0:
  534.             position['证券代码']=position['证券代码'].apply(lambda x:self.adjust_stock(x))
  535.             hold_stock_list=position['证券代码'].tolist()
  536.         else:
  537.             hold_stock_list=[]
  538.         #选股
  539.         #解析数据
  540.         sell_stock_list=[]
  541.         if len(hold_stock_list)>0:
  542.             for stock in hold_stock_list:
  543.                 self.data.subscribe_quote(stock_code=stock,period='1d',start_time='20220101',
  544.                                       end_time='20500101',count=-1)
  545.             #读取订阅数据
  546.             df=self.data.get_market_data_ex(stock_list=hold_stock_list,period='1d',
  547.                                             start_time='20240101',end_time='20500101',count=-1)
  548.             for stock in hold_stock_list:
  549.                 try:
  550.                     hist=df[stock]
  551.                     score=self.mean_line_models(df=hist)
  552.                     down=self.down_n_mean_line_sell(df=hist)
  553.                     if stock in self.buy_stock_log:
  554.                         print('{}有卖出记录不交易'.format(stock))
  555.                     elif score<self.hold_score:
  556.                         print('{}趋势得分小于持有分数{}卖出'.format(stock,score,self.hold_score))
  557.                         sell_stock_list.append(stock)
  558.                     elif down:
  559.                         print('{} 跌破均线{}卖出'.format(stock,self.down_mean_line_sell))
  560.                         sell_stock_list.append(stock)
  561.                     else:
  562.                         print("{}符合趋势持有模型模型".format(stock))
  563.                 except Exception as e:
  564.                     print(e)
  565.                     
  566.             return sell_stock_list
  567.         else:
  568.             return sell_stock_list
  569.     def start_sell_trader(self):
  570.         '''
  571.         开始卖出
  572.         '''
  573.         if self.check_is_trader_date_1(trader_time=8,start_date=0,end_date=24,start_mi=0,jhjj='否'):
  574.             sell_stock_list=self.get_stock_sell_data()
  575.             if len(sell_stock_list)>0:
  576.                 for stock in sell_stock_list:
  577.                     try:
  578.                         price=self.data.get_full_tick(code_list=[stock])[stock]['lastPrice']
  579.                         trader_type,amount,price=self.order_target_value(stock=stock[:6],price=price,value=self.sell_max_value)
  580.                         if trader_type=='sell' and amount>=0:
  581.                             self.sell(security=stock[:6],price=price,amount=amount)
  582.                             self.sell_stock_log.append(stock)
  583.                         else:
  584.                             print('{}卖出不了'.format(stock))
  585.                     except Exception as e:
  586.                         print(e)
  587.             else:
  588.                 print('没有卖出的数据')
  589.         else:
  590.             print('{}不是交易时间'.format(datetime.now()))
  591.     def start_buy_trader(self):
  592.         '''
  593.         开始买入
  594.         '''
  595.         if self.check_is_trader_date_1(trader_time=8,start_date=0,end_date=24,start_mi=0,jhjj='否'):
  596.             buy_stock_list=self.get_select_stock_data()
  597.             if len(buy_stock_list)>0:
  598.                 for stock in buy_stock_list:
  599.                     try:
  600.                         price=self.data.get_full_tick(code_list=[stock])[stock]['lastPrice']
  601.                         trader_type,amount,price=self.order_target_value(stock=stock[:6],price=price,value=self.buy_max_value)
  602.                         if trader_type=='buy' and amount>=0:
  603.                             self.buy(security=stock[:6],price=price,amount=amount)
  604.                             self.buy_stock_log.append(stock)
  605.                         else:
  606.                             print('{}买入不了'.format(stock))
  607.                     except Exception as e:
  608.                         print(e)
  609.             else:
  610.                 print('没有买入的数据')
  611.         else:
  612.             print('{}不是交易时间'.format(datetime.now()))
  613.     def update_all_data(self):
  614.         '''
  615.         更新数据
  616.         '''
  617.         self.get_select_stock_data()
  618.         self.get_stock_sell_data()
  619.         self.start_sell_trader()
  620.         self.start_buy_trader()
  621.         self.buy_stock_log=[]
  622.         self.sell_stock_log=[]
  623.     def show_info(sef):
  624.         print('显示数据{} 程序运行正常'.format(datetime.now()))
  625. if __name__=='__main__':
  626.     trader=xg_mean_line_tarder(path= r'D:/国金QMT交易端模拟/userdata_mini',
  627.                   session_id = 123456,account='55011917',account_type='STOCK',
  628.                 )
  629.     trader.connect()
  630.     #qmt——taredr 网页 https://gitee.com/li-xingguo11111/qmt_trader
  631.     print(trader.balance())
  632.     print(trader.position())
  633.     #测试强调前面的#去掉,实盘的时候去掉下面这个代码
  634.     trader.update_all_data()
  635.     schedule.every().day.at('09:45').do(trader.update_all_data)
  636.     schedule.every().day.at('14:45').do(trader.update_all_data)
  637.     schedule.every(0.05).minutes.do(trader.show_info)
  638.     while True:
  639.         schedule.run_pending()
  640.         time.sleep(1)

  641.    
  642.    
复制代码



评论2

*******0079楼主
发表于 2024-7-20 21:45:18 | 显示全部楼层
不懂的可以联系我 微信15117320079
Anna向阳而生
发表于 2024-7-22 10:22:06 | 显示全部楼层
无门槛申请QMT(mini qmt),策略代写,股票低佣万0.854,融资4.5%-5% ,联系:Annalidian-8285

回复

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

客服专线

400-080-8112

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