def __init__(self, broker_id, investor_id, password, appid, authcode, productinfo, request_id=1): self.request_id = request_id self.broker_id = broker_id.encode() self.investor_id = investor_id.encode() self.password = password.encode() self.appid = appid.encode() self.authcode = authcode.encode() self.productinfo = productinfo self.q_order = Queue.Queue() self.logger = Logger()
def __init__(self, instruments, broker_id, investor_id, password, eventEngine, *args, **kwargs): self.request_id = 0 self.instruments = instruments self.broker_id = broker_id self.investor_id = investor_id self.password = password self.eventEngine = eventEngine self.eventEngine.start() self.logger = Logger()
sigprofit_info = [] posratio = [] skprofit = 0 bkprofit = 0 def today(): '''return today''' from datetime import time, datetime today = datetime.now().strftime('%Y-%m-%d') return today logfilename = BROKER_ID + '_' + INVESTOR_ID + strategy_name + '_交易日志' + str( today()) + '.log' log = Logger(logfilename=logfilename) initFund = 20000 feeRatio = 0.0065 instMultifier = 10 while True: if not q_server_info.empty(): info = q_server_info.get() # print info.ErrorID lastErrorID = info.ErrorID print('the last ErrorID is: ', lastErrorID, INVESTOR_ID, BROKER_ID) if lastErrorID == 7 or lastErrorID == 8: # print 'release the api...' # td.Release()
def MovingBreak(): lastErrorID = 0 logfilename = BROKER_ID + '_' + INVESTOR_ID + '_交易日志' + str(today) + '.log' log = Logger(logfilename=logfilename) pc_grid = grid s = S = ApiStruct.D_Sell b = B = ApiStruct.D_Buy k = K = ApiStruct.OF_Open p = P = ApiStruct.OF_Close pj = PJ = ApiStruct.OF_CloseToday pz = PZ = ApiStruct.OF_CloseYesterday # T['TE_RESUME'] = 'int' # 流重传方式 # TERT_RESTART = 0 # 从本交易日开始重传 # TERT_RESUME = 1 # 从上次收到的续传 # TERT_QUICK = 2 # 只传送登录后的流内容 # 登录行情服务器 md = MyMdApi(instruments=['rb1905'], broker_id=BROKER_ID, investor_id='*', password='******') md.Create(INVESTOR_ID + "data") md.RegisterFront(ADDR_MD) md.Init() td = MyTradeApi(broker_id=BROKER_ID, investor_id=INVESTOR_ID, passwd=PASSWORD) td.Create(LOGS_DIR + INVESTOR_ID + "_trader") td.RegisterFront(ADDR_TD) td.SubscribePublicTopic(2) td.SubscribePrivateTopic(2) td.Init() last_time = None buy_order = 0 sell_order = 0 bp_total = 0 sp_total = 0 bk_limit = 1 sk_limit = 1 up_trader_flag = False down_trader_flag = False buy_rec = list() sell_rec = list() while True: if not q_server_info.empty(): info = q_server_info.get() # print info.ErrorID lastErrorID = info.ErrorID print('the last ErrorID is: ', lastErrorID) if lastErrorID != 0: # print 'release the api...' # td.Release() print(datetime.now(), 'reconnect the trading server.') del td sleep(60) td = MyTradeApi(broker_id=BROKER_ID, investor_id=INVESTOR_ID, passwd=PASSWORD) td.Create(LOGS_DIR + INVESTOR_ID + "_trader") td.RegisterFront(ADDR_TD) td.SubscribePublicTopic(2) td.SubscribePrivateTopic(2) # td.ReqUserLogout() td.Init() sleep(60) if not q_depth_market_data.empty(): tick = q_depth_market_data.get() tickToBar(tick,granularity=180) D_open = tick.OpenPrice lastk = get_last_k_line(bars, inst, granularity) last_k_line = get_last_k_line(bars, inst, granularity) print((lastk, datetime.now())) O = get_k_line_column(bars, inst, granularity, ohlc='open') H = get_k_line_column(bars, inst, granularity, ohlc='high') L = get_k_line_column(bars, inst, granularity, ohlc='low') C = get_k_line_column(bars, inst, granularity, ohlc='close') # print(H[-3:],L[-3:], type(H[-1])) HL = HLV(H, L) MHL = max(HL) MminHL = min(HL) AVHL = sum(HL) / len(HL) vgrid = int(AVHL * 0.8) # calculate the uppper and lower band HV = HHV(H, 23) LV = LLV(L, 23) # #middle line Mid = MID(HV, LV) # 根据叮当值调整仓位控制参数 # bk_limit = 2 if C[-1] > Mid[-1] else 0 # bk_limit = 2 # sk_limit = 2 if C[-1] < Mid[-1] else 0 # sk_limit = 2 # print tick.InstrumentID, strategy_inst if lastk is not None and tick.InstrumentID == strategy_inst: if last_time != last_k_line['date_time']: last_time = last_k_line['date_time'] up_trader_flag = False down_trader_flag = False dingdang = 'Buy!' if tick.LastPrice > Mid[-1] else 'Sell' bkvol = buy_order - sp_total if buy_order - sp_total > 0 else 0 skvol = sell_order - bp_total if sell_order - bp_total > 0 else 0 # bkvol = get_day_bkvol(td, strategy_inst) # skvol = get_day_skvol(td, strategy_inst) # outformat = "当前时间:{tick.UpdateTime}, High:{last_k_line['high']}" # print(outformat) print('当前时间: ', tick.UpdateTime, 'HIGH:', last_k_line['high'], ' ', 'LOW:', last_k_line[ 'low'], '当前价: ', tick.LastPrice, '叮当值:', Mid[ -1], dingdang, 'buy_limit:', bk_limit, 'sell_limit:', sk_limit) print('buy_order: ', buy_order, 'sell_order: ', sell_order, BROKER_ID, INVESTOR_ID, tick.InstrumentID, 'sp_total: ', sp_total, 'bp_total: ', bp_total, '日多:', bkvol, '日空:', skvol) if not up_trader_flag and tick.LastPrice > last_k_line['high'] and bkvol < bk_limit: # 下多单 print(bkvol, bk_limit) up_trader_flag = True order_price = tick.LastPrice buy_rec.append([datetime.now(), order_price]) # if sell_order > 0: # td.PrepareOrder(tick.InstrumentID, B, P, sell_order, order_price) # sell_order -= sell_order td.PrepareOrder(tick.InstrumentID, b, k, single_volume, order_price) log.info(log.printfNow() + '下空单:' + str(single_volume) + ',orderprice:' + str( order_price) + 'skvol:' + str(skvol) + 'sk_limit:' + str(sk_limit)) # td.PrepareOrder(tick.InstrumentID, s, pz, single_volume, tick.LastPrice) info = 'buy: ' + tick.InstrumentID +' '+ str(order_price) mailsender(info, receivers) print('下多单', tick.InstrumentID, INVESTOR_ID, str(single_volume) + ',orderprice:' + str( order_price) + 'skvol:' + str(skvol) + 'sk_limit:' + str(sk_limit)) print('lastHigh:', last_k_line['high'], 'lastLow: ', last_k_line[ 'low'], 'lastPrice: ', tick.LastPrice) if not down_trader_flag and tick.LastPrice < last_k_line['low'] and skvol < sk_limit: # 下空单 down_trader_flag = True order_price = tick.LastPrice # if buy_order > 0: # td.PrepareOrder(tick.InstrumentID, S, P, buy_order, tick.LastPrice - pc_grid) # buy_order -= buy_order td.PrepareOrder(tick.InstrumentID, s, k, single_volume, order_price) log.info(log.printfNow() + '下空单:' + str(single_volume) + ',orderprice:' + str( order_price) + 'skvol:' + str(skvol) + 'sk_limit:' + str(sk_limit)) # td.PrepareOrder(tick.InstrumentID, b, pz, single_volume, tick.LastPrice) info = 'sell: ' + tick.InstrumentID + ' ' + str(order_price) mailsender(info, receivers) print('下空单', tick.InstrumentID, INVESTOR_ID, ', orderprice:' + str(order_price) + ', skvol:' + str( skvol) + ', sk_limit:' + str(sk_limit)) print('lastHigh:', last_k_line['high'], 'lastLow: ', last_k_line[ 'low'], 'lastPrice: ', tick.LastPrice) if not q_bar.empty(): bartmp = q_bar.get() bars[barinterval].append(bartmp) if not q_rtn_order.empty(): rtn_order = q_rtn_order.get() print(rtn_order) print('下单成功,请注意。。。') if not q_rtn_trade.empty(): rtn_td = q_rtn_trade.get() print('下单成交', rtn_td) ''' Trade(BrokerID='0127', InvestorID='200277', InstrumentID='ni1811', OrderRef='69169', UserID='200277', ExchangeID='SHFE', TradeID=' 652868', Direction='0', OrderSysID=' 2413585', ParticipantID='0011', ClientID='01789993', TradingRole='\x00', ExchangeInstID='ni1811', OffsetFlag='0', HedgeFlag='1', Price=112560.0, Volume=1, TradeDate='20180727', TradeTime='23:52:48', TradeType='\x00', PriceSource='\x00', TraderID='0011c6c', OrderLocalID=' 684', ClearingPartID='0011', BusinessUnit='', SequenceNo=1536, TradingDay='20180730', SettlementID=1, BrokerOrderSeq=2310, TradeSource='0') ''' # k if rtn_td.Direction == B: # 方向 多 if rtn_td.OffsetFlag == K and rtn_td.InstrumentID == strategy_inst: # 多单开仓成交,下平仓指令, 开盘价+30 buy_order += rtn_td.Volume order_price = rtn_td.Price + grid bkvol += rtn_td.Volume td.PrepareOrder(rtn_td.InstrumentID, s, pj, rtn_td.Volume, order_price) info = tick.InstrumentID + '多单建仓成交,平仓单挂单。。。' + str(order_price) print(info) # mailsender(info, receivers) elif rtn_td.OffsetFlag in [P, PJ, PZ] and rtn_td.InstrumentID == strategy_inst: # 平仓, print(rtn_td) bp_total += rtn_td.Volume sell_order -= rtn_td.Volume skvol -= rtn_td.Volume info = '平仓单成交。。。' print(info) # mailsender(info,receivers) elif rtn_td.Direction == S: # 方向:空 if rtn_td.OffsetFlag == K and rtn_td.InstrumentID == strategy_inst: # 开仓 # 空单建仓成交 sell_order += rtn_td.Volume skvol += rtn_td.Volume order_price = rtn_td.Price - grid td.PrepareOrder(rtn_td.InstrumentID, b, pj, rtn_td.Volume, order_price) info = '空单建仓成交,平仓单挂单。。。' print(info) # mailsender(info, receivers) elif rtn_td.OffsetFlag in [P, PJ, PZ] and rtn_td.InstrumentID == strategy_inst: sp_total += rtn_td.Volume buy_order -= rtn_td.Volume bkvol -= rtn_td.Volume info = '平仓单成交' + str(rtn_td.TradeTime)+ rtn_td.InstrumentID print(info) # mailsender(info, receivers) print(rtn_td.TradeTime, rtn_td.InstrumentID)
class Trader(TraderApi): def __init__(self, broker_id, investor_id, password, appid, authcode, productinfo, request_id=1): self.request_id = request_id self.broker_id = broker_id.encode() self.investor_id = investor_id.encode() self.password = password.encode() self.appid = appid.encode() self.authcode = authcode.encode() self.productinfo = productinfo self.q_order = Queue.Queue() self.logger = Logger() @staticmethod def is_error_rsp_info(info): # print info if info.ErrorID != 0: print "ErrorID=", info.ErrorID, ", ErrorMsg=", info.ErrorMsg.decode( 'gbk') return info.ErrorID != 0 def OnRspError(self, pRspInfo, nRequestID, bIsLast): self.ErrorRspInfo(pRspInfo, nRequestID) def ErrorRspInfo(self, info, request_id): """ :param info: :return: """ if info.ErrorID != 0: print('request_id=%s ErrorID=%d, ErrorMsg=%s', request_id, info.ErrorID, info.ErrorMsg.decode('gbk')) return info.ErrorID != 0 def OnHeartBeatWarning(self, nTimeLapse): """心跳超时警告。当长时间未收到报文时,该方法被调用。 @param nTimeLapse 距离上次接收报文的时间 """ print("on OnHeartBeatWarning time: ", nTimeLapse) def OnFrontDisconnected(self, nReason): print("on FrontDisConnected disconnected", nReason) def OnFrontConnected(self): print('Front connected....') req = ApiStruct.ReqAuthenticate( BrokerID=self.broker_id, UserID=self.investor_id, UserProductInfo="client_vnpy", # Password=self.password, AppID=self.appid, AuthCode=self.authcode) r = self.ReqAuthenticate(req, self.inc_request_id()) print(r) print('Req Authenticate finished...') time.sleep(3) # req = ApiStructure.ReqUserLoginField(BrokerID=self.broker_id, # UserID=self.investor_id, # Password=self.password) # self.ReqUserLogin(req, self.request_id) # print("trader on front connection") def OnRspAuthenticate(self, pRspAuthenticateField, pRspInfo, nRequestID, bIsLast): # print(pRspAuthenticateField.AppType) info.append(copy.deepcopy(pRspAuthenticateField)) print('client authenticate done. Req User login....') time.sleep(3) req = ApiStruct.ReqUserLogin(BrokerID=self.broker_id, UserID=self.investor_id, Password=self.password) r = self.ReqUserLogin(req, self.inc_request_id()) print(r) def OnRspUserLogin(self, pRspUserLogin, pRspInfo, nRequestID, bIsLast): print('系统登录完成。user login done.') print datetime.datetime.now( ), u"登录交易服务器...", bIsLast, pRspInfo.ErrorMsg.decode('gbk') print datetime.datetime.now(), 'user_login:'******'交易服务器登录成功。', pRspUserLogin.BrokerID, pRspUserLogin.UserID # Logger.info('OnRspUserLogin %s' % is_last) req = ApiStruct.SettlementInfoConfirm(BrokerID=self.broker_id, InvestorID=self.investor_id) self.ReqSettlementInfoConfirm(req, self.inc_request_id()) print datetime.datetime.now(), 'SettlementInfo Confirm Requested.' print datetime.datetime.now(), "get today's trading day:", repr( self.GetTradingDay()) else: print('something wrong, connect failed....') # # # if pRspInfo.ErrorID != 0: # print("server OnRspUserLogin failed error_id=%s msg:%s", # pRspInfo.ErrorID, pRspInfo.ErrorMsg.decode('gbk')) # else: # print("Trader user login successfully") # # inv = ApiStruct.QryInvestor(BrokerID=self.broker_id, InvestorID=self.investor_id) # # self.ReqQryInvestor(inv, self.inc_request_id()) # # req = ApiStruct.SettlementInfoConfirm(BrokerID = self.broker_id, InvestorID = self.investor_id) # # self.ReqSettlementInfoConfirm(req, self.inc_request_id()) # time.sleep(1) def OnRspSettlementInfoConfirm(self, pSettlementInfoConfirm, pRspInfo, nRequestID, bIsLast): print(pSettlementInfoConfirm, pRspInfo) """投资者结算结果确认响应""" print datetime.datetime.now( ), 'pSettlementInfoConfirm: ', pSettlementInfoConfirm print datetime.datetime.now( ), 'pRspInfo: ', pRspInfo, pRspInfo.ErrorMsg.decode('gbk') print datetime.datetime.now(), 'nRequestID: ', nRequestID print datetime.datetime.now(), 'bIsLast: ', bIsLast # info.append(pSettlementInfoConfirm) print(pRspInfo.ErrorMsg.decode("GBK")) def inc_request_id(self): self.request_id += 1 return self.request_id def OnRspQryInvestor(self, pInvestor, pRspInfo, nRequestID, bIsLast): print(pInvestor, pRspInfo) print pInvestor.InvestorName.decode('gbk'), pInvestor.Address.decode( 'gbk') def OnRtnOrder(self, pOrder): ''' 报单通知 CTP、交易所接受报单 Agent中不区分,所得信息只用于撤单 ''' q_rtn_order.put(deepcopy(pOrder)) self.q_order.put(deepcopy(pOrder)) # print repr(pOrder) self.logger.info(u'报单响应,Order=%s' % str(pOrder)) # print pOrder if pOrder.OrderStatus == 'a': # CTP接受,但未发到交易所 # print u'CTP接受Order,但未发到交易所, BrokerID=%s,BrokerOrderSeq = %s,TraderID=%s, OrderLocalID=%s' % (pOrder.BrokerID, pOrder.BrokerOrderSeq, pOrder.TraderID, pOrder.OrderLocalID) self.logger.info( u'TD:CTP接受Order,但未发到交易所, BrokerID=%s,BrokerOrderSeq = %s,TraderID=%s, OrderLocalID=%s' % (pOrder.BrokerID, pOrder.BrokerOrderSeq, pOrder.TraderID, pOrder.OrderLocalID)) # self.agent.rtn_order(pOrder) else: # print u'交易所接受Order,exchangeID=%s,OrderSysID=%s,TraderID=%s, OrderLocalID=%s' % (pOrder.ExchangeID, pOrder.OrderSysID, pOrder.TraderID, pOrder.OrderLocalID) self.logger.info( u'TD:交易所接受Order,exchangeID=%s,OrderSysID=%s,TraderID=%s, OrderLocalID=%s' % (pOrder.ExchangeID, pOrder.OrderSysID, pOrder.TraderID, pOrder.OrderLocalID)) # self.agent.rtn_order_exchange(pOrder) # self.agent.rtn_order(pOrder) def OnRtnTrade(self, pTrade): '''成交通知''' self.logger.info( u'TD:成交通知,BrokerID=%s,BrokerOrderSeq = %s,exchangeID=%s,OrderSysID=%s,TraderID=%s, OrderLocalID=%s' % (pTrade.BrokerID, pTrade.BrokerOrderSeq, pTrade.ExchangeID, pTrade.OrderSysID, pTrade.TraderID, pTrade.OrderLocalID)) self.logger.info(u'TD:成交回报,Trade=%s' % repr(pTrade)) pt = deepcopy(pTrade) # print u'报单成交:', pt.UserID, pt.InstrumentID, pt.Direction, pt.OffsetFlag, pt.Price q_rtn_trade.put(pt) # self.agent.rtn_trade(pTrade) def sendOrder(traderSpi, order): global mutex mutex.acquire() # print order traderSpi.ReqOrderInsert(order, traderSpi.inc_request_id()) # DatabaseController.insert_SendOrder(order) # print("sendOrder = " + order.InstrumentID + " dir = " + order.Direction) # + " strategy = " + self.__module__) # time.sleep(1) mutex.release() def formatOrder(self, inst, direc, open_close, volume, price): orderp = ApiStruct.InputOrder( InstrumentID=inst, Direction=direc, # ApiStruct.D_Buy or ApiStruct.D_Sell OrderRef=str(self.inc_request_id()), LimitPrice=price, VolumeTotalOriginal=volume, OrderPriceType=ApiStruct.OPT_LimitPrice, BrokerID=self.broker_id, InvestorID=self.investor_id, UserID=self.investor_id, CombOffsetFlag=open_close, # OF_Open, OF_Close, OF_CloseToday CombHedgeFlag=ApiStruct.HF_Speculation, VolumeCondition=ApiStruct.VC_AV, MinVolume=1, ForceCloseReason=ApiStruct.FCC_NotForceClose, IsAutoSuspend=1, UserForceClose=0, TimeCondition=ApiStruct.TC_GFD) # print orderp return orderp def PrepareOrder(self, inst, direc, open_close, volume, price): order = self.formatOrder(inst, direc, open_close, volume, price) # print u'send order:', inst, u'price: ', price, u'amount:', volume self.sendOrder(order) def qryPosition(self, InstrumentID=''): self.requestid += 1 if InstrumentID: req = ApiStruct.QryInvestorPosition(BrokerID=self.broker_id, InvestorID=self.investor_id, InstrumentID=InstrumentID) else: req = ApiStruct.QryInvestorPosition(BrokerID=self.broker_id, InvestorID=self.investor_id) self.ReqQryInvestorPosition(req, self.requestid) def OnRspQryInvestorPosition(self, pInvestorPosition, pRspInfo, nRequestID, bIsLast): # print pInvestorPosition if pInvestorPosition is not None: q_positions.put(copy.deepcopy(pInvestorPosition)) # if bIsLast: # print pInvestorPosition,'tete' # print pRspInfo def fetch_investor_position_detail(self, instrument_id): ''' 获取合约的当前持仓明细,目前没用 ''' # logging.info(u'A:获取合约%s的当前持仓..' % (instrument_id,)) print 'get posi' req = ApiStruct.QryInvestorPositionDetail(BrokerID=self.broker_id, InvestorID=self.investor_id, InstrumentID=instrument_id) self.ReqQryInvestorPositionDetail(req, self.inc_request_id()) # logging.info(u'A:查询持仓, 函数发出返回值:%s' % r) def fetch_instrument_marginrate(self, instrument_id): req = ApiStruct.QryInstrumentMarginRate( BrokerID=self.cuser.broker_id, InvestorID=self.cuser.investor_id, InstrumentID=instrument_id, HedgeFlag=ApiStruct.HF_Speculation) r = self.trader.ReqQryInstrumentMarginRate(req, self.inc_request_id()) logging.info(u'A:查询保证金率, 函数发出返回值:%s' % r) def fetch_instrument(self, instrument_id): req = ApiStruct.QryInstrument(InstrumentID=instrument_id, ) time.sleep(1) r = self.trader.ReqQryInstrument(req, self.inc_request_id()) logging.info(u'A:查询合约, 函数发出返回值:%s' % r) def rsp_qry_position(self, position): ''' 查询持仓回报, 每个合约最多得到4个持仓回报,历史多/空、今日多/空 ''' logging.info(u'agent 持仓:%s' % str(position)) if position != None: cur_position = self.instruments[position.InstrumentID].position if position.PosiDirection == ApiStruct.PD_Long: if position.PositionDate == ApiStruct.PSD_Today: cur_position.clong = position.Position # TodayPosition else: cur_position.hlong = position.Position # YdPosition else: # 空头 if position.PositionDate == ApiStruct.PSD_Today: cur_position.cshort = position.Position # TodayPosition else: cur_position.hshort = position.Position # YdPosition else: # 无持仓信息,保持默认设置 pass self.check_qry_commands() def rsp_qry_instrument_marginrate(self, marginRate): ''' 查询保证金率回报. ''' self.instruments[marginRate.InstrumentID].marginrate = ( marginRate.LongMarginRatioByMoney, marginRate.ShortMarginRatioByMoney) # print marginRate.InstrumentID,self.instruments[marginRate.InstrumentID].marginrate self.check_qry_commands() def rsp_qry_trading_account(self, account): ''' 查询资金帐户回报 ''' self.available = account.Available self.check_qry_commands() def rsp_qry_instrument(self, pinstrument): ''' 获得合约数量乘数. 这里的保证金率应该是和期货公司无关,所以不能使用 ''' if pinstrument.InstrumentID not in self.instruments: logging.warning(u'A_RQI:收到未监控的合约查询:%s' % (pinstrument.InstrumentID)) return self.instruments[ pinstrument.InstrumentID].multiple = pinstrument.VolumeMultiple self.instruments[pinstrument.InstrumentID].tick_base = int( pinstrument.PriceTick * 10 + 0.1) # print 'tick_base = %s' % (pinstrument.PriceTick,) self.check_qry_commands() def rsp_qry_position_detail(self, position_detail): ''' 查询持仓明细回报, 得到每一次成交的持仓,其中若已经平仓,则持量为0,平仓量>=1 必须忽略 ''' print str(position_detail) self.check_qry_commands() def rsp_qry_order(self, sorder): ''' 查询报单 可以忽略 ''' self.check_qry_commands() def rsp_qry_trade(self, strade): ''' 查询成交 可以忽略 ''' self.check_qry_commands()
def DingDangNo6(): logfilename = BROKER_ID + '_' + INVESTOR_ID + '_交易日志' + str(today) + '.log' log = Logger(logfilename=logfilename) config = incept_config() load_data_from_file() init_k_line_pump() workdays = TradingPeriod.get_workdays(begin=config['begin'], end=config['end']) workdays_exchange_trading_period_by_ts = \ TradingPeriod.get_workdays_exchange_trading_period( _workdays=workdays, exchange_trading_period=EXCHANGE_TRADING_PERIOD) inst = 'rb1905' granularity = 780 serverport = 'http://192.168.1.19:8008' bars = dict() barss = load_data_from_server(server_base=serverport, instruments_id=inst, granularity=granularity) barinterval = inst + '_' + str(granularity) bars[barinterval] = barss if today in workdays_exchange_trading_period_by_ts: trading_period_by_ts = workdays_exchange_trading_period_by_ts[today] else: print('Not trading day, return to system.') return pc_grid = grid s = S = ApiStruct.D_Sell b = B = ApiStruct.D_Buy k = K = ApiStruct.OF_Open p = P = ApiStruct.OF_Close pj = PJ = ApiStruct.OF_CloseToday pz = PZ = ApiStruct.OF_CloseYesterday # T['TE_RESUME'] = 'int' # 流重传方式 # TERT_RESTART = 0 # 从本交易日开始重传 # TERT_RESUME = 1 # 从上次收到的续传 # TERT_QUICK = 2 # 只传送登录后的流内容 # 登录行情服务器 md = MyMdApi(instruments=inst, broker_id=BROKER_ID, investor_id=INVESTOR_ID, password=PASSWORD) md.Create(INVESTOR_ID + "data") md.RegisterFront(ADDR_MD) md.Init() td = MyTradeApi(broker_id=BROKER_ID, investor_id=INVESTOR_ID, passwd=PASSWORD) td.Create(LOGS_DIR + INVESTOR_ID + "_trader") td.RegisterFront(ADDR_TD) td.SubscribePublicTopic(1) td.SubscribePrivateTopic(1) td.Init() last_time = None up_trader_flag = False down_trader_flag = False while True: if not q_depth_market_data.empty(): tick = q_depth_market_data.get() sewing_data_to_file_and_depositary(depth_market_data=tick) last_k_line = get_last_k_line(instrument_id=inst[0], interval=period) DayOpen = tick.OpenPrice DayHigh = tick.HighestPrice DayLow = tick.LowestPrice H = get_k_line_column(strategy_inst, strategy_period, ohlc='high') L = get_k_line_column(strategy_inst, strategy_period, ohlc='low') C = get_k_line_column(strategy_inst, strategy_period, ohlc='close') HL = HLV(H, L) MHL = max(HL) MminHL = min(HL) AVHL = sum(HL) / len(HL) vgrid = int(AVHL * 0.8) # calculate the uppper and lower band HV = HHV(H, 23) LV = LLV(L, 23) # #middle line DingDang = MID(HV, LV) allsig = cross(C, DingDang)[0] * 2 if last_k_line is not None and tick.InstrumentID == strategy_inst: if last_time != last_k_line['date_time']: last_time = last_k_line['date_time'] up_trader_flag = False down_trader_flag = False dingdang = 'Buy!' if tick.LastPrice > Mid[-1] else 'Sell' bkvol = buy_order - sp_total if buy_order - sp_total > 0 else 0 skvol = sell_order - bp_total if sell_order - bp_total > 0 else 0 # bkvol = get_day_bkvol(td, strategy_inst) # skvol = get_day_skvol(td, strategy_inst) print('当前时间: ', tick.UpdateTime, 'HIGH:', last_k_line['high'], ' ', 'LOW:', last_k_line['low'], '当前价: ', tick.LastPrice, '叮当值:', Mid[-1], dingdang, 'buy_limit:', bk_limit, 'sell_limit:', sk_limit) print('buy_order: ', buy_order, 'sell_order: ', sell_order, BROKER_ID, INVESTOR_ID, tick.InstrumentID, 'sp_total: ', sp_total, 'bp_total: ', bp_total, '日多:', bkvol, '日空:', skvol) if (not up_trader_flag and not last_k_line['low'] == last_k_line['high']) and tick.LastPrice > \ last_k_line['high'] and tick.LastPrice - last_k_line['high'] < 30 and bkvol < bk_limit: # 下多单 print(bkvol, bk_limit) up_trader_flag = True order_price = tick.LastPrice buy_rec.append([datetime.now(), order_price]) # if sell_order > 0: # td.PrepareOrder(tick.InstrumentID, B, P, sell_order, tick.LastPrice + pc_grid) # sell_order -= sell_order td.PrepareOrder(tick.InstrumentID, b, k, single_volume, order_price) log.info(log.printfNow() + '下空单:' + str(single_volume) + ',orderprice:' + str(order_price) + 'skvol:' + str(skvol) + 'sk_limit:' + str(sk_limit)) # td.PrepareOrder(tick.InstrumentID, s, pz, single_volume, tick.LastPrice) print() print( '下多单', tick.InstrumentID, INVESTOR_ID, str(single_volume) + ',orderprice:' + str(order_price) + 'skvol:' + str(skvol) + 'sk_limit:' + str(sk_limit)) print('lastHigh:', last_k_line['high'], 'lastLow: ', last_k_line['low'], 'lastPrice: ', tick.LastPrice) if (not down_trader_flag and not last_k_line['low'] == last_k_line['high']) and tick.LastPrice < \ last_k_line['low'] and (last_k_line['low'] - tick.LastPrice < 30) and skvol < sk_limit: # 下空单 down_trader_flag = True order_price = tick.LastPrice # if buy_order > 0: # td.PrepareOrder(tick.InstrumentID, S, P, buy_order, tick.LastPrice - pc_grid) # # buy_order -= buy_order td.PrepareOrder(tick.InstrumentID, s, k, single_volume, order_price) log.info(log.printfNow() + '下空单:' + str(single_volume) + ',orderprice:' + str(order_price) + 'skvol:' + str(skvol) + 'sk_limit:' + str(sk_limit)) # td.PrepareOrder(tick.InstrumentID, b, pz, single_volume, tick.LastPrice) print() print( '下空单', tick.InstrumentID, INVESTOR_ID, ', orderprice:' + str(order_price) + ', skvol:' + str(skvol) + ', sk_limit:' + str(sk_limit)) print('lastHigh:', last_k_line['high'], 'lastLow: ', last_k_line['low'], 'lastPrice: ', tick.LastPrice) if not q_rtn_order.empty(): rtn_order = q_rtn_order.get() print(rtn_order) print('下单成功,请注意。。。') if not q_rtn_trade.empty(): rtn_td = q_rtn_trade.get() print(rtn_td) ''' Trade(BrokerID='0127', InvestorID='200277', InstrumentID='ni1811', OrderRef='69169', UserID='200277', ExchangeID='SHFE', TradeID=' 652868', Direction='0', OrderSysID=' 2413585', ParticipantID='0011', ClientID='01789993', TradingRole='\x00', ExchangeInstID='ni1811', OffsetFlag='0', HedgeFlag='1', Price=112560.0, Volume=1, TradeDate='20180727', TradeTime='23:52:48', TradeType='\x00', PriceSource='\x00', TraderID='0011c6c', OrderLocalID=' 684', ClearingPartID='0011', BusinessUnit='', SequenceNo=1536, TradingDay='20180730', SettlementID=1, BrokerOrderSeq=2310, TradeSource='0') ''' # k if rtn_td.Direction == B: # 方向 多 if rtn_td.OffsetFlag == K and rtn_td.InstrumentID == strategy_inst: # 多单开仓成交,下平仓指令, 开盘价+30 buy_order += rtn_td.Volume order_price = rtn_td.Price + grid td.PrepareOrder(rtn_td.InstrumentID, s, pj, rtn_td.Volume, order_price) print('多单建仓成交,平仓单挂单。。。') elif rtn_td.OffsetFlag in [ P, PJ, PZ ] and rtn_td.InstrumentID == strategy_inst: # 平仓, bp_total += rtn_td.Volume elif rtn_td.Direction == S: # 方向:空 if rtn_td.OffsetFlag == K and rtn_td.InstrumentID == strategy_inst: # 开仓 # 空单建仓成交 sell_order += rtn_td.Volume order_price = rtn_td.Price - grid td.PrepareOrder(rtn_td.InstrumentID, b, pj, rtn_td.Volume, order_price) print('空单建仓成交,平仓单挂单。。。') elif rtn_td.OffsetFlag in [ P, PJ, PZ ] and rtn_td.InstrumentID == strategy_inst: sp_total += rtn_td.Volume print(rtn_td.TradeTime, rtn_td.InstrumentID)