请教各位,我想在while中跟踪订单变化,循环之前保存当时时间time1,while开始后当订单状态在2秒后(time.time()-time1>2)的状态还是pending就return 0,如果是ORDER_STATE_CLOSED,那就return 1,返回完成。
但是在实盘测试中,发现程序会进入无限循环不会停下来,最后一条信息就是“订单已下”
代码附下,请大大帮忙释疑
order_result =exchange.Sell(fee,size)
Log('订单已下')
if order_result==None:
return 0
if order_result!=None:
time1=time.time()
while True:
order_status=exchange.GetOrder(order_result).Status
if order_status==None and time.time()-time1>2:
Log('订单状态获取失败')
return 0
if order_status!=None:
if time.time()-time1>2 and (order_status==ORDER_STATE_CANCELED or order_status==ORDER_STATE_PENDING):
Log("订单挂单或被取消")
return 0
if order_status==ORDER_STATE_CLOSED:
Log("订单完成")
return 1
Inventor quantificado - sonho pequenoVeja o código abaixo. Não. order_result = exchange.Sell ((fee,size) # Subscrever Log (('Encomendas já feitas') if order_result==None: # Não retornou ID de pedido Retorno 0 Se a ordem_result!=None: # A ordem foi bem sucedida time1=time.time() # registro Nível de segundos Time bar while True: # julgamento circular order_status=exchange.GetOrder ((order_result).Status # Leia o estado da ordem if order_status==None and time.time() -time1>2: # e depois de fazer a encomenda, leitura de ciclo Julgar o tempo antes do estado da encomenda em comparação, detectar se é superior a 2 segundos Log (('Não conseguiu obter o estado do pedido') # Retorno 0 if order_status!=None: # Obtenção de status bem sucedida if time.time() -time1>2 and (order_status==ORDER_STATE_CANCELED or order_status==ORDER_STATE_PENDING): # O pedido é pendurado ou cancelado em 2 segundos Log (("Encomendas pendentes ou canceladas") Retorno 0 Se a ordem está encerrada Log (("Encomenda concluída") Retorno 1 Não. A lógica não deveria ser um problema. O problema encontrado pode ser que o GetOrder tenha retornado dados de pedidos com outros estados, como um estado desconhecido, ou seja, em que exchanges você está operando. Recomenda-se ver o valor específico do estado logo após a frase order_status=exchange.GetOrder.
Inventor quantificado - sonho pequenoO que é uma troca, o que é um par de negociação, além de um código de dúvida.
caçador1015O editor fez um erro ao enviar o post, e o código determinou que as variáveis eram consistentes. O disco real foi testado várias vezes e ficou preso no GetOrder e não saiu, nem reportou erros, nem retornou LOG.
Inventor quantificado - sonho pequenoSe o seu código está escrito errado, o ID deve ser indefinido e só aparece aqui no código. https://dn-filebox.qbox.me/d89332ffbe84fa2cdcac442649edb35f4f61a3cc.png
caçador1015Sonho, eu testei o disco real várias vezes nos últimos dois dias e descobri que o exchange.GetOrder () não voltou a aparecer depois de ser disparado, ou que o programa não saiu de dentro, o que levou a que eu não imprimasse o conteúdo de impressão que tinha configurado. def main (: #Log ((exchange.GetAccount)) time1=time.time ()) Log ((' registro de tempo é 'time1) depth = _C ((exchange.GetDepth); Orders_buy1=depth.Bids[0].Price Orders_buy2=depth.Bids.[1] Preço Orders_buy3=depth.Bids.[2] Preço Orders_sell1=depth.Asks[0].Price Orders_sell2=depth.Asks[1].Price Orders_sell3=depth.Asks[2].Price O que é isso? account=exchange.GetAccount (em inglês) O que é isso? Sell ((orders_buy1*0.999, 0.1); # fazer o pedido time1=time.time() # registar o cronograma de conclusão Se vender_order_id==None: Log (('Número de pedido em branco') if sell_order_id!=None: # se o número de pedido for obtido com sucesso order_back_message_last=None # registar a última vez Consultar o conteúdo da mensagem de retorno do pedido (initializado como None) O que é isso? while True: # entrou no ciclo while, com o GetOrder para rastrear informações de pedidos order_back_message=exchange.GetOrder ((order_result) Mensagem de retorno de #GetOrder (todos) Log (('query order returned content is',order_back_message) # sem cérebro de saída de ordem de retorno de conteúdo O que é isso? if order_back_message!=order_back_message_last: # se a ordem não corresponder à última, o log é exportado e atualizado Log (('query order returned content as', order_back_message) - O que é isso? - Não. O que é isso? O que é isso? order_status=order_back_message.Status # ordem retorna extrair Status da estrutura de dados ((não é necessário ver a partir de agora, porque não foi passado por cima) order_status=exchange.GetOrder ((sell_order_id).Estado Log (ordem) status se order_status==None and time.time (() -time1>2: Log (('Não conseguiu obter o estado do pedido') break Se o status da ordem!=Não: Se o status da ordem é: Log (('Hedging - sucesso') break #returnTrue elif time.time() -time1>2 and (order_status==ORDER_STATE_CANCELED or order_status==ORDER_STATE_PENDING): Log (('Hedging - falha') break #return False #Log ((exchange.GetAccount)) #Log (('xunhuan') #PD_SHORTLog (('tempo atual=',time.time(), 'tempo inicial=',time1)
Inventor quantificado - sonho pequenoSim, algumas bolsas de negociação têm estados padrão em vários documentos não-BotVS, BotVS é definido como um estado desconhecido, você pode ver o valor específico do estado após a sentença order_status=exchange.GetOrder. A partir daí, é possível ver qual é o valor do estado específico da ordem e julgar o problema (o que levou a entrar no ciclo de morte).
caçador1015@JoeJoe Dream Dream Big, eu estou no gateIO, o problema foi descoberto há alguns dias, escrevi um código simples e testei os resultados sem sentir nenhum problema. https://dn-filebox.qbox.me/97f571e4222ee9c61bd6e3cb203af319b11a8c72.png