def test_cancel_order(self): """ 撤单 注:本函数不是回测,重新在盘中生成测试用例script文件时更改为当前可交易的合约代码,且_ins_url可能需修改。 """ # 预设服务器端响应 dir_path = os.path.dirname(os.path.realpath(__file__)) self.mock.run(os.path.join(dir_path, "log_file", "test_td_basic_cancel_order_simulate.script.lzma")) # 测试: 模拟账户 utils.RD = random.Random(2) api = TqApi(_ins_url=self.ins_url_2020_04_02, _td_url=self.td_url, _md_url=self.md_url) order1 = api.insert_order("DCE.jd2005", "BUY", "OPEN", 1, limit_price=3040) order2 = api.insert_order("SHFE.cu2005", "BUY", "OPEN", 2, limit_price=39600) api.wait_update() self.assertEqual("ALIVE", order1.status) self.assertEqual("ALIVE", order2.status) api.cancel_order(order1) api.cancel_order(order2.order_id) while order1.status != "FINISHED" or order2.status != "FINISHED": api.wait_update() self.assertEqual("FINISHED", order1.status) self.assertEqual("FINISHED", order2.status) self.assertNotEqual(order1.volume_left, 0) self.assertNotEqual(order2.volume_left, 0) api.close()
def test_cancel_order(self): """ 撤单 """ # 预设服务器端响应 dir_path = os.path.dirname(os.path.realpath(__file__)) self.mock.run(os.path.join(dir_path, "log_file", "test_td_basic_cancel_order_simulate.script")) # 测试: 模拟账户 TqApi.RD = random.Random(2) api = TqApi(_ins_url=self.ins_url, _td_url=self.td_url, _md_url=self.md_url) order1 = api.insert_order("DCE.jd2001", "BUY", "OPEN", 1, limit_price=4570) order2 = api.insert_order("SHFE.cu2001", "BUY", "OPEN", 2, limit_price=47070) api.wait_update() self.assertEqual("ALIVE", order1.status) self.assertEqual("ALIVE", order2.status) api.cancel_order(order1) api.cancel_order(order2.order_id) api.wait_update() self.assertEqual("FINISHED", order1.status) self.assertEqual("FINISHED", order2.status) api.close()
def run_tianqin_code(bid, user_id, pwd, td_url): api = TqApi(TqAccount(bid, user_id, pwd), auth="[email protected],MaYanQiong", _stock=True, _td_url=td_url) is_ctp = False if bid == "快期模拟" else True account = api.get_account() if bid == "快期模拟": assert account.ctp_balance == '-' or math.isnan(account.ctp_balance) assert account.ctp_available == '-' or math.isnan( account.ctp_available) else: logger.info(f"{account.ctp_balance}, {account.ctp_available}") logger.info(f"{'='*30} 登录成功后,账户初始状态 {'='*30}") positions = api._data["trade"][user_id]["positions"] orders = api._data["trade"][user_id]["orders"] check_orders(orders, api, is_ctp) check_positions(positions, api, is_ctp) check_account(account, positions, is_ctp) check_risk_rule(api, None) check_risk_data(api, "SSE.10002513") api.set_risk_management_rule("SSE", True) logger.info(f"{'='*12} 期权 开仓 {'='*12}") quote = api.get_quote("SSE.10002513") # ETF 期权 # 挂单 # order = api.insert_order(symbol="SSE.10002513", direction="BUY", offset="OPEN", limit_price=quote.lower_limit + quote.price_tick, volume=2) order = api.insert_order(symbol="SSE.10002513", direction="SELL", offset="OPEN", limit_price=quote.upper_limit - quote.price_tick, volume=2) # 可成交 # order = api.insert_order(symbol="SSE.10002513", direction="BUY", offset="OPEN", limit_price=quote.ask_price1, volume=3) # 可成交 FAK 下单失败,CTP:交易所不支持的价格类型 # order = api.insert_order(symbol="SSE.10002513", direction="BUY", offset="OPEN", limit_price=quote.ask_price1, volume=2, advanced="FAK") # 可成交 FOK # order = api.insert_order(symbol="SSE.10002513", direction="BUY", offset="OPEN", limit_price=quote.ask_price1, volume=2, advanced="FOK") # BEST # order = api.insert_order(symbol="SSE.10002513", direction="SELL", offset="CLOSE", limit_price="BEST", volume=10) # BEST FOK 下单失败,已撤单报单被拒绝12038,合约代码:SSE.10002513,下单方向:买,开平标志:开仓,委托价格:最优价,委托手数:3 # order = api.insert_order(symbol="SSE.10002513", direction="SELL", offset="CLOSE", limit_price="BEST", volume=3, advanced="FOK") # any_price 通知: 下单失败,CTP:交易所不支持的价格类型 # order = api.insert_order(symbol="SSE.10002513", direction="BUY", offset="OPEN", volume=3) # FIVELEVEL 通知: 下单失败,CTP:交易所不支持的价格类型 # order = api.insert_order(symbol="SSE.10002513", direction="BUY", offset="OPEN", limit_price="FIVELEVEL", volume=3) api.cancel_order(order) api.cancel_order(order) api.cancel_order(order) while order.status == "ALIVE": api.wait_update() check_all(api, bid, user_id) check_risk_rule(api, None) check_risk_data(api, "SSE.10002513") api.close()
send_email(trading_info, subject, receiver) trading_info['position'] = trading_info['position'].apply( lambda x: int(np.around(x, 0))) trading_info.index = trading_info['trading_code'] print(trading_info) code_lst = trading_info.trading_code.tolist() while datetime.datetime.now().hour < 15: print( '==========================================================================================' ) orders = api.get_order() for oid, order in orders.items(): if order.status == 'ALIVE': print(order.status) api.cancel_order(order) positions = api.get_position() for symbol, order in positions.items(): if symbol not in code_lst: if order.pos_long > 0: Trd.insert_order_sp_limit(symbol) if order.pos_short > 0: Trd.insert_order_bp_limit(symbol) for code in code_lst: position_account = api.get_position(code) position_long = position_account.pos_long position_short = position_account.pos_short position = trading_info.loc[code]['position'] if code == 'DCE.y2009':
order_close_info = api.get_order(row["委平单号"]) if order_close_info.status == "FINISHED" and order_close_info.volume_left == 0: df_long.iloc[index, 4], df_long.iloc[index, 7], df_long.iloc[index, 8] = row[ "持仓"] - order_close_info.volume_orign, \ row[ "委平"] - order_close_info.volume_orign, float( "nan") # 多头委托10分钟不成交撤单,重设网格 if not df_long_open.empty and position.pos_long_today == 0: if df_long_open.insert_date_time.max() > 0 and time_to_datetime(quote.datetime) > time_to_datetime( df_long_open.insert_date_time.max()): if (time_to_datetime(quote.datetime) - time_to_datetime( df_long_open.insert_date_time.max())).seconds > 10 * 60: for i in df_long_open.order_id: api.cancel_order(i) df_long = reset_df_long(quote, GRID_AMOUNT, grid_region_long, grid_volume_long) # 多头平仓10分钟无成交且价格偏离5跳以上,平仓且重设多头网格 if not df_long_close.empty and position.pos_short_today > 0: if df_long_close.insert_date_time.max() > 0 and time_to_datetime(quote.datetime) > time_to_datetime( df_long_close.insert_date_time.max()): if (time_to_datetime(quote.datetime) - time_to_datetime( df_long_close.insert_date_time.max())).seconds > 10 * 60 and df_long_close.limit_price.min() - quote.bid_price1 >= 5: for i in df_long_close.order_id: api.cancel_order(i) is_clear_all1 = True df_long = reset_df_long(quote, GRID_AMOUNT, grid_region_long, grid_volume_long) #################################################################################
#!/usr/bin/env python # -*- coding: utf-8 -*- import time from tqsdk import TqApi, TqAccount api = TqApi(TqAccount('快期模拟', 'yhlz714', '86888196'), web_gui=True) # 获得 m2005 的持仓引用,当持仓有变化时 position 中的字段会对应更新 position = api.get_position("SHFE.rb2010") # 获得资金账户引用,当账户有变化时 account 中的字段会对应更新 account = api.get_account() # 下单并返回委托单的引用,当该委托单有变化时 order 中的字段会对应更新 # order = api.insert_order(symbol="SHFE.rb2010", direction="BUY", offset="OPEN", volume=5, limit_price=3575) orders = api.get_order() for i in orders: api.cancel_order(orders[i]) count = 0 while True: api.wait_update() # if api.is_changing(order, ["status", "volume_orign", "volume_left"]): # print("单状态: %s, 已成交: %d 手" % (order.status, order.volume_orign - order.volume_left)) # print(order.status) if api.is_changing(position, "pos_long_today"): print("今多头: %d 手" % (position.pos_long_today)) if api.is_changing(account, "available"): print("可用资金: %.2f" % (account.available)) count += 1 if 50 < count < 52: pass # api.cancel_order(order)
def run_tianqin_code(bid, user_id, pwd, td_url): api = TqApi(TqAccount(bid, user_id, pwd), auth="[email protected],MaYanQiong", _td_url=td_url) is_ctp = False if bid == "快期模拟" else True account = api.get_account() if bid == "快期模拟": assert account.ctp_balance == '-' or math.isnan(account.ctp_balance) assert account.ctp_available == '-' or math.isnan( account.ctp_available) else: logger.info(f"{account.ctp_balance}, {account.ctp_available}") logger.info(f"{'='*30} 登录成功后,账户初始状态 {'='*30}") positions = api._data["trade"][user_id]["positions"] orders = api._data["trade"][user_id]["orders"] check_orders(orders, api, is_ctp) check_positions(positions, api, is_ctp) check_account(account, positions, is_ctp) logger.info(f"{'='*30} 全部撤单 & 全部平仓 {'='*30}") for order in orders.values(): if order.status != "FINISHED": api.cancel_order(order) for pos in positions.values(): symbol = f"{pos.exchange_id}.{pos.instrument_id}" quote = api.get_quote(symbol) if pos.pos_long > 0: api.insert_order(symbol=symbol, direction="SELL", offset="CLOSE", limit_price=quote.bid_price1, volume=pos.pos_long) if pos.pos_short > 0: api.insert_order(symbol=symbol, direction="BUY", offset="CLOSE", limit_price=quote.ask_price1, volume=pos.pos_short) while True: api.wait_update(deadline=time.time() + 30) # 全部持仓清 0 is_all_clear = True for pos in positions.values(): if pos.pos_long > 0 or pos.pos_short > 0: is_all_clear = False for order in orders.values(): if order.status != "FINISHED": is_all_clear = False if is_all_clear: logger.info("全部撤单 & 全部平仓 ok") break else: logger.info("还没完成全部撤单 & 全部平仓") logger.info(f"{'='*12} 期货 开仓 {'='*12}") quote = api.get_quote("CZCE.RM105") api.insert_order(symbol="CZCE.RM105", direction="BUY", offset="OPEN", limit_price=quote.lower_limit + quote.price_tick, volume=2) api.insert_order(symbol="CZCE.RM105", direction="BUY", offset="OPEN", limit_price=quote.ask_price1, volume=3) quote1 = api.get_quote("CZCE.CF105") api.insert_order(symbol="CZCE.CF105", direction="SELL", offset="OPEN", limit_price=quote1.upper_limit - quote1.price_tick, volume=2) api.insert_order(symbol="CZCE.CF105", direction="SELL", offset="OPEN", limit_price=quote1.bid_price1, volume=3) check_all(api, bid, user_id) # logger.info(f"{'='*12} 期权 开仓 {'='*12}") # quote = api.get_quote("CZCE.RM009C2300") # api.insert_order(symbol="CZCE.RM009C2300", direction="BUY", offset="OPEN", # limit_price=quote.lower_limit + quote.price_tick, # volume=2) # api.insert_order(symbol="CZCE.RM009C2300", direction="BUY", offset="OPEN", limit_price=quote.ask_price1, # volume=3) # quote1 = api.get_quote("CZCE.CF009C11600") # api.insert_order(symbol="CZCE.CF009C11600", direction="SELL", offset="OPEN", # limit_price=quote1.upper_limit - quote1.price_tick, # volume=2) # api.insert_order(symbol="CZCE.CF009C11600", direction="SELL", offset="OPEN", limit_price=quote1.bid_price1, # volume=3) # # quote2 = api.get_quote("CZCE.RM009P2300") # api.insert_order(symbol="CZCE.RM009P2300", direction="BUY", offset="OPEN", # limit_price=quote2.lower_limit + quote2.price_tick, # volume=2) # api.insert_order(symbol="CZCE.RM009P2300", direction="BUY", offset="OPEN", limit_price=quote2.ask_price1, # volume=3) # quote3 = api.get_quote("CZCE.CF009C11600") # api.insert_order(symbol="CZCE.CF009P11600", direction="SELL", offset="OPEN", # limit_price=quote3.upper_limit - quote3.price_tick, # volume=2) # api.insert_order(symbol="CZCE.CF009P11600", direction="SELL", offset="OPEN", limit_price=quote3.bid_price1, # volume=3) # PUT # check_all(api, bid, user_id) # logger.info(f"{'='*30} 发平仓挂单 {'='*30}") # positions = api._data["trade"][user_id]["positions"] # for pos in positions.values(): # symbol = f"{pos.exchange_id}.{pos.instrument_id}" # quote = api.get_quote(symbol) # if pos.pos_long > 0: # api.insert_order(symbol=symbol, direction="SELL", offset="CLOSE", # limit_price=quote.upper_limit - quote.price_tick, # volume=pos.pos_long) # if pos.pos_short > 0: # api.insert_order(symbol=symbol, direction="BUY", offset="CLOSE", # limit_price=quote.lower_limit + quote.price_tick, # volume=pos.pos_short) # check_all(api, bid, user_id) api.close()