def test_api_vipuser(self): api = TqApi(auth="[email protected],MaYanQiong") self.assertEqual(api._md_url, "wss://api.shinnytech.com/t/nfmd/front/mobile") quote = api.get_quote("SSE.10002513") print(quote.datetime, quote.last_price) api.close()
def test_sim_insert_order_time_check_6(self): """ 模拟交易下单时间判断测试6 测试: 限价单,直到交易日结束都不能成交: 预期交易日结束撤单 """ # 预设服务器端响应 dir_path = os.path.dirname(os.path.realpath(__file__)) self.mock.run(os.path.join(dir_path, "log_file", "test_sim_insert_order_time_check_6.script.lzma")) # 测试: utils.RD = random.Random(4) api = TqApi(backtest=TqBacktest(datetime.datetime(2019, 12, 2, 10, 31, 00), datetime.datetime(2019, 12, 3)), _ins_url=self.ins_url_2019_12_04) symbol = "DCE.m2009" order1 = api.insert_order(symbol=symbol, direction="BUY", offset="OPEN", volume=5, limit_price=2750) # 到交易日结束都无法成交 order2 = api.insert_order(symbol=symbol, direction="BUY", offset="OPEN", volume=3) try: while True: api.wait_update() except BacktestFinished: self.assertEqual(order1.status, "FINISHED") self.assertEqual(order1.volume_orign, 5) self.assertEqual(order1.volume_left, 5) self.assertEqual(order2.status, "FINISHED") self.assertEqual(order2.volume_orign, 3) self.assertEqual(order2.volume_left, 0) self.assertEqual(order1.last_msg, "交易日结束,自动撤销当日有效的委托单(GFD)") api.close()
def test_openmd_vipuser(self): api = TqApi(_stock=False, auth="[email protected],MaYanQiong") self.assertEqual(api._md_url, "wss://u.shinnytech.com/t/md/front/mobile") self.assertRaises(Exception, api.get_quote, "SSE.000300") self.assertRaises(Exception, api.get_quote, "SSE.10002513") api.close()
def test_various_combinations_of_order_2(self): """ 测试 能在回测时正常使用开、平顺序的多种组合方式下单 1 单次开平 * n次 2 多次开 一次全平完 (本测试函数) 3 多次开 分多次平完 4 单次开 分多次平完 related commit: a2623aed0fd1d5e5e01c7d2452e7f7f7de999c6e """ # 预设服务器端响应 dir_path = os.path.dirname(os.path.realpath(__file__)) self.mock.run(os.path.join(dir_path, "log_file", "test_various_combinations_of_order_2.script.lzma")) # 测试2:多次开,一次全平完 utils.RD = random.Random(4) api = TqApi( backtest=TqBacktest(start_dt=datetime.datetime(2019, 12, 10, 9), end_dt=datetime.datetime(2019, 12, 11)), _ins_url=self.ins_url_2019_07_03, _td_url=self.td_url, _md_url=self.md_url) symbol = "DCE.m2005" position = api.get_position(symbol) order_open1 = api.insert_order(symbol, "BUY", "OPEN", 1) order_open2 = api.insert_order(symbol, "BUY", "OPEN", 1) order_open3 = api.insert_order(symbol, "BUY", "OPEN", 1) while order_open1.status != "FINISHED" or order_open2.status != "FINISHED" or order_open3.status != "FINISHED": api.wait_update() self.assertEqual(position.pos, 3) order_close1 = api.insert_order(symbol, "SELL", "CLOSE", 3) while order_close1.status != "FINISHED": api.wait_update() self.assertEqual(position.pos, 0) api.close()
def test_get_kline_serial(self): """ 获取K线数据 """ # 预设服务器端响应 dir_path = os.path.dirname(os.path.realpath(__file__)) self.mock.run( os.path.join(dir_path, "log_file", "test_md_basic_get_kline_serial.script.lzma")) # 测试: 获取K线数据 utils.RD = random.Random(1) api = TqApi(_ins_url=self.ins_url_2019_07_03, _td_url=self.td_url, _md_url=self.md_url) klines = api.get_kline_serial("SHFE.cu1909", 10) self.assertEqual(klines.iloc[-1].close, 47580.0) self.assertEqual(klines.iloc[-1].id, 660788) self.assertEqual(klines.iloc[-2].id, 660787) self.assertEqual(klines.iloc[-1].datetime, 1.56861719e+18) self.assertEqual(klines.iloc[-1].open, 47580) self.assertEqual(klines.iloc[-1].volume, 0.0) self.assertEqual(klines.iloc[-1].open_oi, 6940.0) self.assertEqual(klines.iloc[-1].duration, 10) # 其他取值方式 self.assertEqual(klines.duration.iloc[-1], 10) self.assertEqual(klines.iloc[-1]["duration"], 10) self.assertEqual(klines["duration"].iloc[-1], 10) # 报错测试 self.assertRaises(Exception, api.get_kline_serial, "SHFE.au1999", 10) self.assertRaises(AttributeError, klines.iloc[-1].__getattribute__, "dur") self.assertRaises(KeyError, klines.iloc[-1].__getitem__, "dur") api.close()
def test_get_account(self): """ 获取账户资金信息 """ # 预设服务器端响应 self.mock.run("test_td_basic_get_account_simulate.script") # 测试: 获取数据 api = TqApi(_ins_url=self.ins_url, _td_url=self.td_url, _md_url=self.md_url) TqApi.RD = random.Random(4) order = api.insert_order("DCE.jd2001", "BUY", "OPEN", 1, limit_price=4570) while order.status == "ALIVE": api.wait_update() account = api.get_account() self.assertEqual( str(account), "{'currency': 'CNY', 'pre_balance': 10000000.0, 'static_balance': 10000000.0, 'balance': 9999973.877, 'available': 9997116.477, 'float_profit': -20.0, 'position_profit': -20.0, 'close_profit': 0.0, 'frozen_margin': 0.0, 'margin': 2857.4, 'frozen_commission': 0.0, 'commission': 6.122999999999999, 'frozen_premium': 0.0, 'premium': 0.0, 'deposit': 0.0, 'withdraw': 0.0, 'risk_ratio': 0.00028574074644055193}" ) self.assertEqual(account.currency, "CNY") self.assertEqual(account.pre_balance, 10000000.0) self.assertEqual(9999973.877, account.balance) self.assertEqual(6.122999999999999, account["commission"]) self.assertEqual(2857.4, account["margin"]) self.assertEqual(-20.0, account.position_profit) api.close()
def test_get_quote_backtest(self): """ 回测获取行情报价 """ # 预设服务器端响应 dir_path = os.path.dirname(os.path.realpath(__file__)) self.mock.run(os.path.join(dir_path, "log_file", "test_md_backtest_get_quote.script.lzma")) # 测试 try: utils.RD = random.Random(1) api = TqApi(backtest=TqBacktest(datetime(2019, 10, 15), datetime(2019, 10, 16)), _ins_url=self.ins_url_2019_07_03, _td_url=self.td_url, _md_url=self.md_url) with closing(api): quote = api.get_quote("SHFE.cu2001") quote_data = {k: v for k, v in quote.items()} quote_data["trading_time"] = {k: v for k, v in quote_data["trading_time"].items()} self.assertEqual(json.dumps(quote_data, sort_keys=True), '{"amount": NaN, "ask_price1": 47070.0, "ask_price2": NaN, "ask_price3": NaN, "ask_price4": NaN, "ask_price5": NaN, "ask_volume1": 1, "ask_volume2": 0, "ask_volume3": 0, "ask_volume4": 0, "ask_volume5": 0, "average": NaN, "bid_price1": 47050.0, "bid_price2": NaN, "bid_price3": NaN, "bid_price4": NaN, "bid_price5": NaN, "bid_volume1": 1, "bid_volume2": 0, "bid_volume3": 0, "bid_volume4": 0, "bid_volume5": 0, "close": NaN, "commission": 11.594999999999999, "datetime": "2019-10-14 23:59:59.999999", "delivery_month": 1, "delivery_year": 2020, "expire_datetime": 1579071600.0, "expired": false, "highest": NaN, "ins_class": "FUTURE", "instrument_id": "SHFE.cu2001", "last_price": 47060.0, "lower_limit": NaN, "lowest": NaN, "margin": 16233.000000000002, "max_limit_order_volume": 500, "max_market_order_volume": 0, "min_limit_order_volume": 0, "min_market_order_volume": 0, "open": NaN, "open_interest": 45357, "option_class": "", "pre_close": NaN, "pre_open_interest": 0, "pre_settlement": NaN, "price_decs": 0, "price_tick": 10, "product_id": "cu", "settlement": NaN, "strike_price": NaN, "trading_time": {"day": [["09:00:00", "10:15:00"], ["10:30:00", "11:30:00"], ["13:30:00", "15:00:00"]], "night": [["21:00:00", "25:00:00"]]}, "underlying_symbol": "", "upper_limit": NaN, "volume": 0, "volume_multiple": 5}') # 其他取值方式 self.assertNotEqual(quote["pre_close"], quote.pre_close) self.assertNotEqual(quote.get("pre_settlement"), quote.pre_settlement) self.assertNotEqual(quote.get("highest"), quote.highest) self.assertNotEqual(quote.get("lowest"), quote.lowest) self.assertNotEqual(quote["open"], quote.open) self.assertNotEqual(quote["close"], quote.close) except BacktestFinished: api.close() print("backtest finished")
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 test_get_account(self): """ 获取账户资金信息 """ # 预设服务器端响应 dir_path = os.path.dirname(os.path.realpath(__file__)) self.mock.run( os.path.join(dir_path, "log_file", "test_td_basic_get_account_simulate.script.lzma")) # 测试: 获取数据 api = TqApi(_ins_url=self.ins_url, _td_url=self.td_url, _md_url=self.md_url) TqApi.RD = random.Random(4) order = api.insert_order("DCE.jd2001", "BUY", "OPEN", 1, limit_price=4570) while order.status == "ALIVE": api.wait_update() account = api.get_account() # 测试脚本重新生成后,数据根据实际情况有变化 self.assertEqual( str(account), "{'currency': 'CNY', 'pre_balance': 10000000.0, 'static_balance': 10000000.0, 'balance': 9994873.877, 'available': 9992016.477, 'float_profit': -5120.0, 'position_profit': -5120.0, 'close_profit': 0.0, 'frozen_margin': 0.0, 'margin': 2857.4, 'frozen_commission': 0.0, 'commission': 6.122999999999999, 'frozen_premium': 0.0, 'premium': 0.0, 'deposit': 0.0, 'withdraw': 0.0, 'risk_ratio': 0.00028588654896140217}" ) self.assertEqual(account.currency, "CNY") self.assertEqual(account.pre_balance, 10000000.0) self.assertEqual(9994873.877, account.balance) self.assertEqual(6.122999999999999, account["commission"]) self.assertEqual(2857.4, account["margin"]) self.assertEqual(-5120.0, account.position_profit) api.close()
def test_lib_insert_order_time_check_7(self): """ lib下单时间判断测试7 订阅合约: 订阅周六有行情的和周六无行情的 测试: (测试:回测从周六开始时 可交易时间段的计算、判断) 1 回测刚开始:current_datetime 为 0:00 , 只有cu能下单,另外两个合约直到白盘9点下单 """ # 预设服务器端响应 dir_path = os.path.dirname(os.path.realpath(__file__)) self.mock.run(os.path.join(dir_path, "log_file", "test_lib_insert_order_time_check_7.script.lzma.lzma")) TqApi.RD = random.Random(4) api = TqApi( backtest=TqBacktest(datetime.datetime(2019, 11, 30, 0, 0, 0), datetime.datetime(2019, 12, 2, 9, 30)), _ins_url=self.ins_url_2019_12_04) symbol1 = "SHFE.cu2002" # 有夜盘,凌晨1点结束夜盘 symbol2 = "SHFE.rb2002" # 夜盘23点结束 symbol3 = "DCE.jd2002" # 无夜盘 quote1 = api.get_quote(symbol1) quote2 = api.get_quote(symbol2) quote3 = api.get_quote(symbol3) position1 = api.get_position(symbol1) position2 = api.get_position(symbol2) position3 = api.get_position(symbol3) target_pos1 = TargetPosTask(api, symbol1) target_pos2 = TargetPosTask(api, symbol2) target_pos3 = TargetPosTask(api, symbol3) orders = api.get_order() try: # 1 回测刚开始:current_datetime 为 0:00 , 只有cu能下单,另外两个合约直到白盘9点下单 target_pos1.set_target_volume(1) target_pos2.set_target_volume(2) target_pos3.set_target_volume(3) while max(quote1.datetime, quote2.datetime, quote3.datetime) < "2019-11-30 00:02:00.000000": api.wait_update() self.assertEqual(len(orders), 1) while max(quote1.datetime, quote2.datetime, quote3.datetime) < "2019-11-30 00:15:00.000000": api.wait_update() self.assertEqual(len(orders), 1) self.assertEqual(position1.pos, 1) self.assertEqual(position2.pos, 0) self.assertEqual(position3.pos, 0) while max(quote1.datetime, quote2.datetime, quote3.datetime) < "2019-12-02 09:05:00.000000": api.wait_update() self.assertEqual(len(orders), 3) self.assertEqual(position1.pos, 1) self.assertEqual(position2.pos, 2) self.assertEqual(position3.pos, 3) while True: api.wait_update() except BacktestFinished: self.assertEqual(position1.pos, 1) self.assertEqual(position2.pos, 2) self.assertEqual(position3.pos, 3) api.close()
def record_quotes(symbols, _stock, _md_url): api = TqApi(auth=AUTH, _stock=_stock, _md_url=_md_url) api._requests["quotes"] = set(symbols) api._send_chan.send_nowait({ "aid": "subscribe_quote", "ins_list": ",".join(symbols) }) api.wait_update() api.wait_update() quotes = {} csv_files = {} for s in symbols: quotes[s] = api.get_quote(s) csv_files[s] = (create_csvfile(s, "new" if _stock else "old")) csv_files[s][1].writerow(["local_nano_time", "quote_nano_time"] + HEADER_ROW) end = time() + 60 * 60 # 记录 30 min 分钟的数据分析 while True: if end < time(): break api.wait_update() for s, q in quotes.items(): if api.is_changing(q): csv_files[s][1].writerow([ f"{time()*1e9:.0f}", f"{_str_to_nano(q['datetime']):.0f}" ] + [q[k] for k in HEADER_ROW]) close_csvfiles(csv_files) 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, debug="c.log") 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.10002504") api.set_risk_management_rule("SZSE", True) logger.info(f"{'='*12} 期权 开仓 {'='*12}") # quote = api.get_quote("SZSE.91000999") # ETF 期权 SSE.10002504 # print(quote) # 挂单 # order = api.insert_order(symbol="SSE.10002504", direction="BUY", offset="OPEN", limit_price=quote.lower_limit + quote.price_tick, volume=2) # order = api.insert_order(symbol="SSE.10002504", 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="SZSE.91000999", direction="BUY", offset="OPEN", limit_price="BEST", volume=5) # 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.wait_update() # 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, "SZSE.91000999") api.close()
def test_get_quote_normal_backtest(): """ 回测获取行情报价 """ # 获取行情 api = TqApi( backtest=TqBacktest(datetime(2019, 10, 15), datetime(2019, 10, 16)), _ins_url="https://openmd.shinnytech.com/t/md/symbols/2019-07-03.json") quote = api.get_quote("SHFE.cu2001") quote_data = {k: v for k, v in quote.items()} quote_data["trading_time"] = { k: v for k, v in quote_data["trading_time"].items() } assert json.dumps(quote_data, sort_keys=True) == \ '{"amount": NaN, "ask_price1": 47070.0, "ask_price2": NaN, "ask_price3": NaN, "ask_price4": NaN, "ask_price5": NaN, "ask_volume1": 1, "ask_volume2": 0, "ask_volume3": 0, "ask_volume4": 0, "ask_volume5": 0, "average": NaN, "bid_price1": 47050.0, "bid_price2": NaN, "bid_price3": NaN, "bid_price4": NaN, "bid_price5": NaN, "bid_volume1": 1, "bid_volume2": 0, "bid_volume3": 0, "bid_volume4": 0, "bid_volume5": 0, "close": NaN, "commission": 11.594999999999999, "datetime": "2019-10-14 23:59:59.999999", "delivery_month": 1, "delivery_year": 2020, "expire_datetime": 1579071600.0, "expired": false, "highest": NaN, "ins_class": "FUTURE", "instrument_id": "SHFE.cu2001", "last_price": 47060.0, "lower_limit": NaN, "lowest": NaN, "margin": 16233.000000000002, "max_limit_order_volume": 500, "max_market_order_volume": 0, "min_limit_order_volume": 0, "min_market_order_volume": 0, "open": NaN, "open_interest": 90714, "pre_close": NaN, "pre_open_interest": 0, "pre_settlement": NaN, "price_decs": 0, "price_tick": 10, "settlement": NaN, "strike_price": NaN, "trading_time": {"day": [["09:00:00", "10:15:00"], ["10:30:00", "11:30:00"], ["13:30:00", "15:00:00"]], "night": [["21:00:00", "25:00:00"]]}, "underlying_symbol": "", "upper_limit": NaN, "volume": 0, "volume_multiple": 5}' # 其他取值方式 assert quote["pre_close"] != quote.pre_close assert quote.get("pre_settlement") != quote.pre_settlement assert quote.get("highest") != quote.highest assert quote.get("lowest") != quote.lowest assert quote["open"] != quote.open assert quote["close"] != quote.close api.close()
def test_is_changing(self): """is_changing() 测试""" # 预设服务器端响应 dir_path = os.path.dirname(os.path.realpath(__file__)) self.mock.run(os.path.join(dir_path, "log_file", "test_func_basic_is_changing.script.lzma")) # 测试: 模拟账户下单 TqApi.RD = random.Random(4) api = TqApi(_ins_url=self.ins_url, _td_url=self.td_url, _md_url=self.md_url) quote = api.get_quote("SHFE.rb2001") position = api.get_position("SHFE.rb2001") order1 = api.insert_order("DCE.m2001", "BUY", "OPEN", 1) api.wait_update() order2 = api.insert_order("SHFE.rb2001", "SELL", "OPEN", 2) api.wait_update() self.assertEqual(api.is_changing(order2, "status"), True) self.assertEqual(api.is_changing(position, "volume_short"), True) self.assertEqual(api.is_changing(position, "volume_long"), False) order3 = api.insert_order("SHFE.rb2001", "BUY", "CLOSETODAY", 1) while order3.status == "ALIVE": api.wait_update() self.assertEqual(api.is_changing(order3, "status"), True) self.assertEqual(api.is_changing(position, "volume_short"), True) self.assertEqual(api.is_changing(quote, "last_price"), False) api.close()
def test_insert_order(self): """ 下单 """ # 预设服务器端响应 dir_path = os.path.dirname(os.path.realpath(__file__)) self.mock.run( os.path.join(dir_path, "test_td_basic_insert_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) order2 = api.insert_order("SHFE.cu2001", "BUY", "OPEN", 2, limit_price=47550) while order1.status == "ALIVE" or order2.status == "ALIVE": api.wait_update() self.assertEqual(order1.order_id, "d95bafc8f2a4d27bdcf4bb99f4bea973") self.assertEqual(order1.direction, "BUY") self.assertEqual(order1.offset, "OPEN") self.assertEqual(order1.volume_orign, 1) self.assertEqual(order1.volume_left, 0) self.assertEqual(order1.limit_price != order1.limit_price, True) # 判断nan self.assertEqual(order1.price_type, "ANY") self.assertEqual(order1.volume_condition, "ANY") self.assertEqual(order1.time_condition, "IOC") self.assertEqual(order1.insert_date_time, 631123200000000000) self.assertEqual(order1.status, "FINISHED") for k, v in order1.trade_records.items(): # 模拟交易为一次性全部成交 self.assertEqual( str(v), "{'order_id': 'd95bafc8f2a4d27bdcf4bb99f4bea973', 'trade_id': 'd95bafc8f2a4d27bdcf4bb99f4bea973|1', 'exchange_trade_id': 'd95bafc8f2a4d27bdcf4bb99f4bea973|1', 'exchange_id': 'DCE', 'instrument_id': 'jd2001', 'direction': 'BUY', 'offset': 'OPEN', 'price': 4570.0, 'volume': 1, 'trade_date_time': 1568875128644000000, 'symbol': 'DCE.jd2001', 'user_id': 'TQSIM', 'commission': 6.122999999999999}" ) self.assertEqual(order2.order_id, "5c6e433715ba2bdd177219d30e7a269f") self.assertEqual(order2.direction, "BUY") self.assertEqual(order2.offset, "OPEN") self.assertEqual(order2.volume_orign, 2) self.assertEqual(order2.volume_left, 0) self.assertEqual(order2.limit_price, 47550.0) self.assertEqual(order2.price_type, "LIMIT") self.assertEqual(order2.volume_condition, "ANY") self.assertEqual(order2.time_condition, "GFD") self.assertEqual(order2.insert_date_time, 631123200000000000) self.assertEqual(order2.status, "FINISHED") for k, v in order2.trade_records.items(): # 模拟交易为一次性全部成交 self.assertEqual( str(v), "{'order_id': '5c6e433715ba2bdd177219d30e7a269f', 'trade_id': '5c6e433715ba2bdd177219d30e7a269f|2', 'exchange_trade_id': '5c6e433715ba2bdd177219d30e7a269f|2', 'exchange_id': 'SHFE', 'instrument_id': 'cu2001', 'direction': 'BUY', 'offset': 'OPEN', 'price': 47550.0, 'volume': 2, 'trade_date_time': 1568875122000000000, 'symbol': 'SHFE.cu2001', 'user_id': 'TQSIM', 'commission': 23.189999999999998}" ) api.close()
def record_ticks(args): symbols, _stock, _md_url, _dir = args api = TqApi(auth=AUTH, _stock=_stock, _md_url=_md_url) for symbol in symbols: download_symbol(symbol, _stock, api, _dir) api.close() print(args)
def test_get_kline_serial(self): """ 获取K线数据 """ # 预设服务器端响应 self.mock.run("test_md_basic_get_kline_serial.script") # 测试: 获取K线数据 TqApi.RD = random.Random(1) api = TqApi(_ins_url=self.ins_url, _td_url=self.td_url, _md_url=self.md_url) klines = api.get_kline_serial("SHFE.cu1909", 10) self.assertEqual(klines.iloc[-1].close, 47580.0) self.assertEqual(klines.iloc[-1].id, 660788) self.assertEqual(klines.iloc[-2].id, 660787) self.assertEqual(klines.iloc[-1].datetime, 1.56861719e+18) self.assertEqual(klines.iloc[-1].open, 47580) self.assertEqual(klines.iloc[-1].volume, 0.0) self.assertEqual(klines.iloc[-1].open_oi, 6940.0) self.assertEqual(klines.iloc[-1].duration, 10) # 其他取值方式 self.assertEqual(klines.duration.iloc[-1], 10) self.assertEqual(klines.iloc[-1]["duration"], 10) self.assertEqual(klines["duration"].iloc[-1], 10) # 报错测试 self.assertRaises(Exception, api.get_kline_serial, "SHFE.au1999", 10) self.assertRaises(AttributeError, klines.iloc[-1].__getattribute__, "dur") self.assertRaises(KeyError, klines.iloc[-1].__getitem__, "dur") api.close()
def test_lib_insert_order_time_check_5(self): ''' lib下单时间判断测试5 回测时间: 起始交易日(datetime.date)在非周一 订阅: cu(有夜盘,凌晨1点结束夜盘),rb(夜盘23点结束),jd(无夜盘) 测试: 1 起始回测在21点后rb、cu下单,到第二日9点后jd下单 2 本交易日白盘9:00后jd下单 ''' # 预设服务器端响应 dir_path = os.path.dirname(os.path.realpath(__file__)) self.mock.run( os.path.join(dir_path, "log_file", "test_lib_insert_order_time_check_5.script.lzma")) utils.RD = random.Random(4) api = TqApi(backtest=TqBacktest(datetime.date(2019, 12, 3), datetime.date(2019, 12, 4)), _ins_url=self.ins_url_2019_12_04) # 2019, 12, 3:周二 symbol1 = "SHFE.cu2002" # 有夜盘,凌晨1点结束夜盘 symbol2 = "SHFE.rb2002" # 夜盘23点结束 symbol3 = "DCE.jd2002" # 无夜盘 quote1 = api.get_quote(symbol1) quote2 = api.get_quote(symbol2) quote3 = api.get_quote(symbol3) position1 = api.get_position(symbol1) position2 = api.get_position(symbol2) position3 = api.get_position(symbol3) target_pos1 = TargetPosTask(api, symbol1) target_pos2 = TargetPosTask(api, symbol2) target_pos3 = TargetPosTask(api, symbol3) orders = api.get_order() try: # 1 起始回测在21点后rb、cu下单,到第二日9点后jd下单 target_pos1.set_target_volume(1) target_pos2.set_target_volume(2) target_pos3.set_target_volume(3) while max(quote1.datetime, quote2.datetime, quote3.datetime) < "2019-12-02 21:05:00.000000": api.wait_update() self.assertEqual(len(orders), 2) self.assertEqual(position1.pos, 1) self.assertEqual(position2.pos, 2) self.assertEqual(position3.pos, 0) # 2 本交易日白盘9:00后jd下单 while max(quote1.datetime, quote2.datetime, quote3.datetime) < "2019-12-03 09:02:00.000000": api.wait_update() self.assertEqual(len(orders), 3) while True: api.wait_update() except BacktestFinished: self.assertEqual(len(orders), 3) self.assertEqual(position1.pos, 1) self.assertEqual(position2.pos, 2) self.assertEqual(position3.pos, 3) api.close()
def test_is_changing(self): """ is_changing() 测试 注:本函数不是回测,重新生成测试用例script文件时更改为当前可交易的合约代码,在盘中生成,且_ins_url可能需修改。 """ # 预设服务器端响应 dir_path = os.path.dirname(os.path.realpath(__file__)) self.mock.run( os.path.join(dir_path, "log_file", "test_func_basic_is_changing.script.lzma")) # 测试: 模拟账户下单 utils.RD = random.Random(4) api = TqApi(_ins_url=self.ins_url_2020_04_02, _td_url=self.td_url, _md_url=self.md_url) quote = api.get_quote("SHFE.rb2010") position = api.get_position("SHFE.rb2010") order1 = api.insert_order("DCE.m2009", "BUY", "OPEN", 1) api.wait_update() order2 = api.insert_order("SHFE.rb2010", "SELL", "OPEN", 2) api.wait_update() self.assertTrue(api.is_changing(order2, "status")) self.assertTrue(api.is_changing(position, "volume_short")) self.assertFalse(api.is_changing(position, "volume_long")) order3 = api.insert_order("SHFE.rb2010", "BUY", "CLOSETODAY", 1) while order3.status == "ALIVE": api.wait_update() self.assertTrue(api.is_changing(order3, "status")) self.assertTrue(api.is_changing(position, "volume_short")) self.assertFalse(api.is_changing(quote, "last_price")) api.close()
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_various_combinations_of_order_3(self): """ 测试 能在回测时正常使用开、平顺序的多种组合方式下单 1 单次开平 * n次 2 多次开 一次全平完 3 多次开 分多次平完 (本测试函数) 4 单次开 分多次平完 related commit: a2623aed0fd1d5e5e01c7d2452e7f7f7de999c6e """ # 预设服务器端响应 dir_path = os.path.dirname(os.path.realpath(__file__)) self.mock.run(os.path.join(dir_path, "log_file", "test_various_combinations_of_order_3.script")) # 测试3:多次开 分多次平完 TqApi.RD = random.Random(4) api = TqApi(backtest=TqBacktest(start_dt=datetime(2019, 12, 10, 9), end_dt=datetime(2019, 12, 11))) symbol = "DCE.m2005" position = api.get_position(symbol) t = 3 for i in range(t): order_open = api.insert_order(symbol, "BUY", "OPEN", 1) while order_open.status != "FINISHED": api.wait_update() self.assertEqual(position.pos, i + 1) for i in range(t): order_close = api.insert_order(symbol, "SELL", "CLOSE", 1) while order_close.status != "FINISHED": api.wait_update() self.assertEqual(position.pos, t - 1 - i) api.close()
def test_get_trade_option(self): """ 获取成交记录 """ # 预设服务器端响应 dir_path = os.path.dirname(os.path.realpath(__file__)) self.mock.run( os.path.join( dir_path, "log_file", "test_td_basic_get_trade_simulate_option.script.lzma")) # 测试: 模拟账户 utils.RD = random.Random(4) api = TqApi(_ins_url=self.ins_url_2020_04_02, _td_url=self.td_url, _md_url=self.md_url) order1 = api.insert_order("CZCE.SR007C5600", "SELL", "OPEN", 1, limit_price=50) order2 = api.insert_order("DCE.m2007-P-2900", "BUY", "OPEN", 2, limit_price=180) while order1.status == "ALIVE" or order2.status == "ALIVE": api.wait_update() trade1 = api.get_trade("1710cf5327ac435a7a97c643656412a9|1") trade2 = api.get_trade("8ca5996666ceab360512bd1311072231|2") self.assertAlmostEqual(1586501231007428000 / 1e9, trade1.trade_date_time / 1e9, places=1) self.assertAlmostEqual(1586501233361505000 / 1e9, trade2.trade_date_time / 1e9, places=1) del trade1["trade_date_time"] del trade2["trade_date_time"] self.assertEqual( str(trade1), "{'order_id': '1710cf5327ac435a7a97c643656412a9', 'trade_id': '1710cf5327ac435a7a97c643656412a9|1', 'exchange_trade_id': '1710cf5327ac435a7a97c643656412a9|1', 'exchange_id': 'CZCE', 'instrument_id': 'SR007C5600', 'direction': 'SELL', 'offset': 'OPEN', 'price': 50.0, 'volume': 1, 'user_id': 'TQSIM', 'commission': 10}" ) self.assertEqual( str(trade2), "{'order_id': '8ca5996666ceab360512bd1311072231', 'trade_id': '8ca5996666ceab360512bd1311072231|2', 'exchange_trade_id': '8ca5996666ceab360512bd1311072231|2', 'exchange_id': 'DCE', 'instrument_id': 'm2007-P-2900', 'direction': 'BUY', 'offset': 'OPEN', 'price': 180.0, 'volume': 2, 'user_id': 'TQSIM', 'commission': 20}" ) self.assertEqual(trade1.direction, "SELL") self.assertEqual(trade1.offset, "OPEN") self.assertEqual(trade1.price, 50.0) self.assertEqual(trade1.volume, 1) self.assertEqual(trade1.commission, 10) self.assertEqual(trade2.direction, "BUY") self.assertEqual(trade2.offset, "OPEN") self.assertEqual(trade2.price, 180.0) self.assertEqual(trade2.volume, 2) self.assertEqual(trade2.commission, 20) api.close()
def test_lib_insert_order_time_check_2(self): """ lib下单时间判断测试2 回测时间: 10:15 - 10:45 订阅合约: IF、T(无盘中休息时间),cu(有盘中休息时间) 测试: 10:15 - 10:30期间IF和T能立即下单,cu等到10:30以后下单; """ # 预设服务器端响应 dir_path = os.path.dirname(os.path.realpath(__file__)) self.mock.run( os.path.join(dir_path, "log_file", "test_lib_insert_order_time_check_2.script.lzma")) utils.RD = random.Random(4) api = TqApi(backtest=TqBacktest( datetime.datetime(2020, 2, 17, 10, 15, 0), datetime.datetime(2020, 2, 17, 10, 45, 0)), _ins_url=self.ins_url_2020_02_18, _td_url=self.td_url, _md_url=self.md_url) symbol1 = "SHFE.cu2003" symbol2 = "CFFEX.T2003" symbol3 = "CFFEX.IF2003" quote3 = api.get_quote(symbol3) position1 = api.get_position(symbol1) position2 = api.get_position(symbol2) position3 = api.get_position(symbol3) target_pos1 = TargetPosTask(api, symbol1) target_pos2 = TargetPosTask(api, symbol2) target_pos3 = TargetPosTask(api, symbol3) orders = api.get_order() try: # 1 10:15 - 10:30期间IF和T能立即下单,cu等到10:30以后下单; target_pos1.set_target_volume(1) target_pos2.set_target_volume(2) target_pos3.set_target_volume(3) while datetime.datetime.strptime( quote3.datetime, "%Y-%m-%d %H:%M:%S.%f") < datetime.datetime( 2020, 2, 17, 10, 25): api.wait_update() self.assertEqual(len(orders), 2) self.assertEqual(position1.pos, 0) self.assertEqual(position2.pos, 2) self.assertEqual(position3.pos, 3) while True: api.wait_update() except BacktestFinished: # 验证下單情況 self.assertEqual(len(orders), 3) self.assertEqual(position1.pos, 1) self.assertEqual(position2.pos, 2) self.assertEqual(position3.pos, 3) print("回测结束") api.close()
def run_tianqin_code(port): try: api = TqApi(web_gui="127.0.0.1:" + port) klines = api.get_kline_serial("SHFE.au1910", 24 * 60 * 60) ma = MA(klines, 30) # 使用tqsdk自带指标函数计算均线 while True: api.wait_update() except Exception as e: api.close()
def test_openmd_vipuser_bt(self): bt = TqBacktest(start_dt=datetime(2020, 6, 1), end_dt=datetime(2020, 6, 2)) api = TqApi(backtest=bt, _stock=False, auth="[email protected],MaYanQiong") quote = api.get_quote("DCE.m2009") print(quote.datetime, quote.last_price) self.assertEqual("2020-05-29 22:59:59.999999", quote.datetime) self.assertEqual(2826.0, quote.last_price) api.close()
def record_ticks(args): symbols, _stock, _md_url = args api = TqApi(auth=AUTH, _stock=_stock, _md_url=_md_url) for symbol in symbols: os.makedirs(f"S:/mayanqiong/klines_expired/{symbol}", exist_ok=True) for dur in [0, 1, 5, 15, 30, 60, 60 * 5, 60 * 15, 60 * 30, 60 * 60, 60 * 60 * 2, 60 * 60 * 4, 60 * 60 * 24, 60 * 60 * 24 * 7]: file_name = f"S:/mayanqiong/klines_expired/{symbol}/{'ticks' if dur == 0 else 'klines_' + str(dur)}_{'new' if _stock else 'old'}.csv" download_symbol_dur(symbol, dur, api, file_name) api.close() print(args)
def test_get_trade(self): """ 获取成交记录 """ # 预设服务器端响应 dir_path = os.path.dirname(os.path.realpath(__file__)) self.mock.run( os.path.join(dir_path, "log_file", "test_td_basic_get_trade_simulate.script.lzma")) # 测试: 模拟账户 utils.RD = random.Random(4) api = TqApi(_ins_url=self.ins_url_2019_07_03, _td_url=self.td_url, _md_url=self.md_url) order1 = api.insert_order("DCE.jd2005", "BUY", "OPEN", 1) order2 = api.insert_order("SHFE.cu2005", "BUY", "OPEN", 2, limit_price=40870) while order1.status == "ALIVE" or order2.status == "ALIVE": api.wait_update() trade1 = api.get_trade( "PYSDK_insert_1710cf5327ac435a7a97c643656412a9|1") trade2 = api.get_trade( "PYSDK_insert_8ca5996666ceab360512bd1311072231|2") self.assertAlmostEqual(1586414355666978000 / 1e9, trade1.trade_date_time / 1e9, places=1) self.assertAlmostEqual(1586414355667884000 / 1e9, trade2.trade_date_time / 1e9, places=1) del trade1["trade_date_time"] del trade2["trade_date_time"] self.assertEqual( str(trade1), "{'order_id': 'PYSDK_insert_1710cf5327ac435a7a97c643656412a9', 'trade_id': 'PYSDK_insert_1710cf5327ac435a7a97c643656412a9|1', 'exchange_trade_id': 'PYSDK_insert_1710cf5327ac435a7a97c643656412a9|1', 'exchange_id': 'DCE', 'instrument_id': 'jd2005', 'direction': 'BUY', 'offset': 'OPEN', 'price': 3317.0, 'volume': 1, 'user_id': 'TQSIM', 'commission': 6.122999999999999}" ) self.assertEqual( str(trade2), "{'order_id': 'PYSDK_insert_8ca5996666ceab360512bd1311072231', 'trade_id': 'PYSDK_insert_8ca5996666ceab360512bd1311072231|2', 'exchange_trade_id': 'PYSDK_insert_8ca5996666ceab360512bd1311072231|2', 'exchange_id': 'SHFE', 'instrument_id': 'cu2005', 'direction': 'BUY', 'offset': 'OPEN', 'price': 40870.0, 'volume': 2, 'user_id': 'TQSIM', 'commission': 23.189999999999998}" ) self.assertEqual(trade1.direction, "BUY") self.assertEqual(trade1.offset, "OPEN") self.assertEqual(trade1.price, 3317.0) self.assertEqual(trade1.volume, 1) self.assertEqual(trade1.commission, 6.122999999999999) self.assertEqual(trade2.direction, "BUY") self.assertEqual(trade2.offset, "OPEN") self.assertEqual(trade2.price, 40870.0) self.assertEqual(trade2.volume, 2) self.assertEqual(trade2.commission, 23.189999999999998) api.close()
def test_get_order(self): """ 获取委托单信息 """ # 预设服务器端响应 dir_path = os.path.dirname(os.path.realpath(__file__)) self.mock.run(os.path.join(dir_path, "log_file", "test_td_basic_get_order_simulate.script.lzma")) # 测试: 模拟账户下单 utils.RD = random.Random(4) api = TqApi(_ins_url=self.ins_url_2019_07_03, _td_url=self.td_url, _md_url=self.md_url) order1 = api.insert_order("DCE.jd2005", "BUY", "OPEN", 1) order2 = api.insert_order("SHFE.cu2005", "SELL", "OPEN", 2, limit_price=40750) while order1.status == "ALIVE" or order2.status == "ALIVE": api.wait_update() get_order1 = api.get_order(order1.order_id) get_order2 = api.get_order(order2.order_id) self.assertEqual(get_order1.order_id, "1710cf5327ac435a7a97c643656412a9") self.assertEqual(get_order1.direction, "BUY") self.assertEqual(get_order1.offset, "OPEN") self.assertEqual(get_order1.volume_orign, 1) self.assertEqual(get_order1.volume_left, 0) self.assertNotEqual(get_order1.limit_price, get_order1.limit_price) # 判断nan self.assertEqual(get_order1.price_type, "ANY") self.assertEqual(get_order1.volume_condition, "ANY") self.assertEqual(get_order1.time_condition, "IOC") # 因为TqSim模拟交易的 insert_date_time 不是固定值,所以改为判断范围(前后100毫秒) self.assertAlmostEqual(1586415071223454000 / 1e9, get_order1.insert_date_time / 1e9, places=1) self.assertEqual(get_order1.last_msg, "全部成交") self.assertEqual(get_order1.status, "FINISHED") self.assertEqual(get_order1.frozen_margin, 0) self.assertEqual(get_order2.order_id, "8ca5996666ceab360512bd1311072231") self.assertEqual(get_order2.direction, "SELL") self.assertEqual(get_order2.offset, "OPEN") self.assertEqual(get_order2.volume_orign, 2) self.assertEqual(get_order2.volume_left, 0) self.assertEqual(get_order2.limit_price, 40750) self.assertEqual(get_order2.price_type, "LIMIT") self.assertEqual(get_order2.volume_condition, "ANY") self.assertEqual(get_order2.time_condition, "GFD") self.assertAlmostEqual(1586415071224110000 / 1e9, get_order2["insert_date_time"] / 1e9, places=1) self.assertEqual(get_order2["last_msg"], "全部成交") self.assertEqual(get_order2["status"], "FINISHED") self.assertEqual(get_order2.frozen_margin, 0) del get_order1["insert_date_time"] del get_order2["insert_date_time"] self.assertEqual(str(get_order1), "{'order_id': '1710cf5327ac435a7a97c643656412a9', 'exchange_order_id': '1710cf5327ac435a7a97c643656412a9', 'exchange_id': 'DCE', 'instrument_id': 'jd2005', 'direction': 'BUY', 'offset': 'OPEN', 'volume_orign': 1, 'volume_left': 0, 'limit_price': nan, 'price_type': 'ANY', 'volume_condition': 'ANY', 'time_condition': 'IOC', 'last_msg': '全部成交', 'status': 'FINISHED', 'user_id': 'TQSIM', 'frozen_margin': 0.0, 'frozen_premium': 0.0}") self.assertEqual(str(get_order2), "{'order_id': '8ca5996666ceab360512bd1311072231', 'exchange_order_id': '8ca5996666ceab360512bd1311072231', 'exchange_id': 'SHFE', 'instrument_id': 'cu2005', 'direction': 'SELL', 'offset': 'OPEN', 'volume_orign': 2, 'volume_left': 0, 'limit_price': 40750.0, 'price_type': 'LIMIT', 'volume_condition': 'ANY', 'time_condition': 'GFD', 'last_msg': '全部成交', 'status': 'FINISHED', 'user_id': 'TQSIM', 'frozen_margin': 0.0, 'frozen_premium': 0.0}") api.close()
def test_get_order(self): """ 获取委托单信息 """ # 预设服务器端响应 dir_path = os.path.dirname(os.path.realpath(__file__)) self.mock.run(os.path.join(dir_path, "log_file", "test_td_basic_get_order_simulate.script")) # 测试: 模拟账户下单 TqApi.RD = random.Random(4) 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) order2 = api.insert_order("SHFE.cu2001", "SELL", "OPEN", 2, limit_price=47040) while order1.status == "ALIVE" or order2.status == "ALIVE": api.wait_update() get_order1 = api.get_order(order1.order_id) get_order2 = api.get_order(order2.order_id) self.assertEqual(str(get_order1), "{'order_id': '1710cf5327ac435a7a97c643656412a9', 'exchange_order_id': '1710cf5327ac435a7a97c643656412a9', 'exchange_id': 'DCE', 'instrument_id': 'jd2001', 'direction': 'BUY', 'offset': 'OPEN', 'volume_orign': 1, 'volume_left': 0, 'limit_price': nan, 'price_type': 'ANY', 'volume_condition': 'ANY', 'time_condition': 'IOC', 'insert_date_time': 631123200000000000, 'last_msg': '全部成交', 'status': 'FINISHED', 'user_id': 'TQSIM', 'symbol': 'DCE.jd2001', 'frozen_margin': 0.0}") self.assertEqual(str(get_order2), "{'order_id': '8ca5996666ceab360512bd1311072231', 'exchange_order_id': '8ca5996666ceab360512bd1311072231', 'exchange_id': 'SHFE', 'instrument_id': 'cu2001', 'direction': 'SELL', 'offset': 'OPEN', 'volume_orign': 2, 'volume_left': 0, 'limit_price': 47040.0, 'price_type': 'LIMIT', 'volume_condition': 'ANY', 'time_condition': 'GFD', 'insert_date_time': 631123200000000000, 'last_msg': '全部成交', 'status': 'FINISHED', 'user_id': 'TQSIM', 'symbol': 'SHFE.cu2001', 'frozen_margin': 0.0}") self.assertEqual(get_order1.order_id, "1710cf5327ac435a7a97c643656412a9") self.assertEqual(get_order1.direction, "BUY") self.assertEqual(get_order1.offset, "OPEN") self.assertEqual(get_order1.volume_orign, 1) self.assertEqual(get_order1.volume_left, 0) self.assertEqual(get_order1.limit_price != get_order1.limit_price, True) # 判断nan self.assertEqual(get_order1.price_type, "ANY") self.assertEqual(get_order1.volume_condition, "ANY") self.assertEqual(get_order1.time_condition, "IOC") self.assertEqual(get_order1.insert_date_time, 631123200000000000) self.assertEqual(get_order1.last_msg, "全部成交") self.assertEqual(get_order1.status, "FINISHED") self.assertEqual(get_order1.symbol, "DCE.jd2001") self.assertEqual(get_order1.frozen_margin, 0) self.assertEqual(get_order2.order_id, "8ca5996666ceab360512bd1311072231") self.assertEqual(get_order2.direction, "SELL") self.assertEqual(get_order2.offset, "OPEN") self.assertEqual(get_order2.volume_orign, 2) self.assertEqual(get_order2.volume_left, 0) self.assertEqual(get_order2.limit_price, 47040) self.assertEqual(get_order2.price_type, "LIMIT") self.assertEqual(get_order2.volume_condition, "ANY") self.assertEqual(get_order2.time_condition, "GFD") self.assertEqual(get_order2["insert_date_time"], 631123200000000000) self.assertEqual(get_order2["last_msg"], "全部成交") self.assertEqual(get_order2["status"], "FINISHED") self.assertEqual(get_order2.symbol, "SHFE.cu2001") self.assertEqual(get_order2.frozen_margin, 0) api.close()
def run_tianqin_code(port, queue): try: ins_url = "http://127.0.0.1:5000/t/md/symbols/2019-07-03.json" api = TqApi(_ins_url=ins_url, web_gui="127.0.0.1:" + port) queue.put("webready") klines = api.get_kline_serial("SHFE.au1910", 24 * 60 * 60) ma = MA(klines, 30) # 使用tqsdk自带指标函数计算均线 while True: api.wait_update() except Exception as e: api.close()