请教各位,我想在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
発明者 量化 - 微かな夢このコードを見てください. ` ` order_result = exchange.Sell ((fee,size) # 下記のリスト ログ (('注文済み') if order_result==None: #返却されていません 注文ID 返信 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: #と下注後,回転読み取り 注文状態前の時間を判断する.比較,2秒を超えているかどうかを検出する. ログ (('注文状態取得失敗') # 返信 0 if order_status!=None: #状態取得成功しました if time.time() -time1>2 and (order_status==ORDER_STATE_CANCELED or order_status==ORDER_STATE_PENDING): #注文は2秒後に掛けるかキャンセルする Log (("注文が予定されているかキャンセルされている") 返信 0 if order_status==ORDER_STATE_CLOSED: #注文完了しました ログ (("注文完了") return 1 について ` ` 論理的には問題ないはずです. 発見した問題は,GetOrderが返した注文データに他の状態がある可能性がある.例えば,あなたがどの取引所で取引しているかを特定する未知の状態がある可能性があります. order_status=exchange.GetOrder ((order_result).Status) の後に,その状態の特定の値を見るために,Log ((order_status) を追加することをお勧めします.
発明者 量化 - 微かな夢取引先はどの取引所か,取引相手はどの取引所か,また,問題コードが発行されている.
ハンター1015投稿時に編集が間違って,コードで変数が一致していることが確認された. リアルディスクは何度もテストした結果,GetOrderに引っかかって出てきず,エラーも返さない,LOGも返さない.
発明者 量化 - 微かな夢このIDは定義されていないはずで,コードの中にこの場所しか出てこない. 初期化も与えることもありません. https://dn-filebox.qbox.me/d89332ffbe84fa2cdcac442649edb35f4f61a3cc.png
ハンター1015この2日間で実機を数回テストしたところ,exchange.GetOrderが起動した後に,まったく戻らない,あるいは,この文に入るとプログラムが死んでいるので,すべてのプリントコンテンツがプリントされないことがわかりました. def main ((()): は #Log ((exchange.GetAccount ((()) ブログを更新しました time1=time.time (時間) ログ (Log) の記録時間は',time1です. depth = _C (exchange.GetDepth); orders_buy1=depth.Bids[0].Price 詳細はこちらから orders_buy2=depth.Bids[1]. 価格 orders_buy3=depth.Bids[2] 価格 orders_sell1=depth.Asks[0].Price 詳細はこちらから orders_sell2=depth.Asks[1]. 価格 orders_sell3=depth.Asks[2] 価格 ありがとうございました. account=exchange.GetAccount (アカウントを取得する) ありがとうございました. sell_order_id = exchange.Sell ((orders_buy1*0.999,0.1);#注文する time1=time.time() # 記入する 完了 タイムタグ if sell_order_id==None: オーダーを1つずつ販売する ログ (('注文番号は空です') if sell_order_id!=None: #順序番号が取得された場合 order_back_message_last=None # 最後の回を記録する 注文の返信情報の内容を検索する ((初始化 None) ありがとうございました. while True: #whileループに入ると,GetOrderで注文情報を追跡します order_back_message=exchange.GetOrder ((order_result) #GetOrderの返信メッセージ (すべて) Log (('問い合わせ注文返信内容は',order_back_message) #無脳出力注文返信内容 ありがとうございました. if order_back_message!=order_back_message_last: #この注文の情報が前の注文と一致しない場合は,ログを輸出して更新します. ログ (('問い合わせの注文返信内容は',order_back_message) order_back_message_last=order_back_message 返信する 返信する ありがとうございました. ありがとうございました. order_status=order_back_message.Status# コマンドはデータ構造からStatusを抽出します (これからは見なくていいので,上には行っていません) order_status=exchange.GetOrder ((sell_order_id).ステータス ログ (※order_status) if order_status==None and time.time() -time1>2: オーダー・ステータスについて ログ (('注文状態取得失敗') ブレイク if order_status!=None: 命令が完了した場合は, if order_status ==ORDER_STATE_CLOSED: 命令が終了した場合は, ログ (『ヘッジ買い - 成功』) ブレイク #return True (#返還True) について elif time.time() -time1>2 and (order_status==ORDER_STATE_CANCELED or order_status==ORDER_STATE_PENDING): オーダー・ステータス=2 オーダー・ステータス=2 オーダー・ステータス=2 オーダー・ステータス=2 ログ (『ヘッジアップ - 失敗』) ブレイク #return False 返信する #Log ((exchange.GetAccount ((()) ブログを更新しました #Log (('xunhuan') について #PD_SHORTLog (('現在の時間=',time.time(),'初期時間=',time1)
発明者 量化 - 微かな夢ある取引所の注文状態には,様々な非BotVS文書の標準状態があり,BotVSは未知の状態として定義されている.あなたは,order_status=exchange.GetOrder (order_result) の後に,Status文とLog (order_status) の特定の値を追加して状態を見ることができます. 特定の注文の状態の値を見て,この問題を判断することができます (死循環に導いた原因).
ハンター1015@小小夢,大小夢,私はgateIOで,この問題は数日前に発見され,簡単なコードを書いて,結果を復習した. https://dn-filebox.qbox.me/97f571e4222ee9c61bd6e3cb203af319b11a8c72.png