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_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 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_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 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_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_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_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_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 test_get_account_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_account_simulate_option.script.lzma")) # 测试: 获取数据 api = TqApi(_ins_url=self.ins_url_2020_04_02, _td_url=self.td_url, _md_url=self.md_url) utils.RD = random.Random(4) order1 = api.insert_order("CZCE.SR007C5600", "SELL", "OPEN", 2, limit_price=50) order2 = api.insert_order("DCE.m2007-P-2900", "BUY", "OPEN", 3, limit_price=180) while order1.status == "ALIVE" or order2.status == "ALIVE": api.wait_update() account = api.get_account() # 测试脚本重新生成后,数据根据实际情况有变化 self.assertEqual( str(account), "{'currency': 'CNY', 'pre_balance': 10000000.0, 'static_balance': 10000000.0, 'balance': 9998650.0, 'available': 9989752.8, 'ctp_balance': nan, 'ctp_available': nan, 'float_profit': -300.0, 'position_profit': 0.0, 'close_profit': 0.0, 'frozen_margin': 0.0, 'margin': 4797.200000000001, 'frozen_commission': 0.0, 'commission': 50.0, 'frozen_premium': 0.0, 'premium': -5400.0, 'deposit': 0.0, 'withdraw': 0.0, 'risk_ratio': 0.00047978477094407754, 'market_value': 4100.0}" ) self.assertEqual(account.currency, "CNY") self.assertEqual(account.pre_balance, 10000000.0) self.assertEqual(account.balance, 9998650.0) self.assertEqual(account["commission"], 50.0) self.assertEqual(account["margin"], 4797.200000000001) self.assertEqual(account.position_profit, 0.0) self.assertEqual(account.available, 9989752.8) self.assertNotEqual(account.ctp_balance, account.ctp_balance) # nan self.assertEqual(account.float_profit, -300.0) self.assertEqual(account.position_profit, 0.0) self.assertEqual(account.margin, 4797.200000000001) self.assertEqual(account.commission, 50.0) self.assertEqual(account.premium, -5400.0) self.assertEqual(account.risk_ratio, 0.00047978477094407754) self.assertEqual(account.market_value, 4100.0) api.close()
def test_insert_order(self): """ 下单 """ # 预设服务器端响应 dir_path = os.path.dirname(os.path.realpath(__file__)) self.mock.run(os.path.join(dir_path, "log_file", "test_td_basic_insert_order_simulate.script.lzma")) # 测试: 模拟账户下单 # 非回测, 则需在盘中生成测试脚本: 测试脚本重新生成后,数据根据实际情况有变化,因此需要修改assert语句的内容 utils.RD = random.Random(2) 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.cu2004", "BUY", "OPEN", 2, limit_price=49200) while order1.status == "ALIVE" or order2.status == "ALIVE": api.wait_update() self.assertEqual(order1.order_id, "5c6e433715ba2bdd177219d30e7a269f") self.assertEqual(order1.direction, "BUY") self.assertEqual(order1.offset, "OPEN") self.assertEqual(order1.volume_orign, 1) self.assertEqual(order1.volume_left, 0) self.assertNotEqual(order1.limit_price, order1.limit_price) # 判断nan self.assertEqual(order1.price_type, "ANY") self.assertEqual(order1.volume_condition, "ANY") self.assertEqual(order1.time_condition, "IOC") self.assertAlmostEqual(1584423143664478000 / 1e9, order1.insert_date_time / 1e9, places=1) self.assertEqual(order1.status, "FINISHED") for k, v in order1.trade_records.items(): # 模拟交易为一次性全部成交,因此只有一条成交记录 self.assertAlmostEqual(1584423143664478000 / 1e9, v.trade_date_time / 1e9, places=1) del v.trade_date_time self.assertEqual(str(v), "{'order_id': '5c6e433715ba2bdd177219d30e7a269f', 'trade_id': '5c6e433715ba2bdd177219d30e7a269f|1', 'exchange_trade_id': '5c6e433715ba2bdd177219d30e7a269f|1', 'exchange_id': 'DCE', 'instrument_id': 'jd2005', 'direction': 'BUY', 'offset': 'OPEN', 'price': 3205.0, 'volume': 1, 'user_id': 'TQSIM', 'commission': 6.122999999999999}") self.assertEqual(order2.order_id, "cf1822ffbc6887782b491044d5e34124") 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, 49200.0) self.assertEqual(order2.price_type, "LIMIT") self.assertEqual(order2.volume_condition, "ANY") self.assertEqual(order2.time_condition, "GFD") self.assertAlmostEqual(1584423143666130000 / 1e9, order2.insert_date_time / 1e9, places=1) self.assertEqual(order2.status, "FINISHED") for k, v in order2.trade_records.items(): # 模拟交易为一次性全部成交,因此只有一条成交记录 self.assertAlmostEqual(1584423143666130000 / 1e9, v.trade_date_time / 1e9, places=1) del v.trade_date_time self.assertEqual(str(v), "{'order_id': 'cf1822ffbc6887782b491044d5e34124', 'trade_id': 'cf1822ffbc6887782b491044d5e34124|2', 'exchange_trade_id': 'cf1822ffbc6887782b491044d5e34124|2', 'exchange_id': 'SHFE', 'instrument_id': 'cu2004', 'direction': 'BUY', 'offset': 'OPEN', 'price': 49200.0, 'volume': 2, 'user_id': 'TQSIM', 'commission': 23.189999999999998}") api.close()
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")) # 测试: 模拟账户 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", "BUY", "OPEN", 2, limit_price=47550) while order1.status == "ALIVE" or order2.status == "ALIVE": api.wait_update() trade1 = api.get_trade("b8a1abcd1a6916c74da4f9fc3c6da5d7|1") trade2 = api.get_trade("1710cf5327ac435a7a97c643656412a9|2") self.assertEqual( str(trade1), "{'order_id': 'b8a1abcd1a6916c74da4f9fc3c6da5d7', 'trade_id': 'b8a1abcd1a6916c74da4f9fc3c6da5d7|1', 'exchange_trade_id': 'b8a1abcd1a6916c74da4f9fc3c6da5d7|1', 'exchange_id': 'DCE', 'instrument_id': 'jd2001', 'direction': 'BUY', 'offset': 'OPEN', 'price': 4569.0, 'volume': 1, 'trade_date_time': 1568876399999500000, 'symbol': 'DCE.jd2001', 'user_id': 'TQSIM', 'commission': 6.122999999999999}" ) self.assertEqual( str(trade2), "{'order_id': '1710cf5327ac435a7a97c643656412a9', 'trade_id': '1710cf5327ac435a7a97c643656412a9|2', 'exchange_trade_id': '1710cf5327ac435a7a97c643656412a9|2', 'exchange_id': 'SHFE', 'instrument_id': 'cu2001', 'direction': 'BUY', 'offset': 'OPEN', 'price': 47550.0, 'volume': 2, 'trade_date_time': 1568876399999500000, 'symbol': 'SHFE.cu2001', 'user_id': 'TQSIM', 'commission': 23.189999999999998}" ) self.assertEqual(trade1.direction, "BUY") self.assertEqual(trade1.offset, "OPEN") self.assertEqual(trade1.price, 4569.0) self.assertEqual(trade1.volume, 1) self.assertEqual(trade1.trade_date_time, 1568876399999500000) self.assertEqual(trade1.commission, 6.122999999999999) self.assertEqual(trade2.direction, "BUY") self.assertEqual(trade2.offset, "OPEN") self.assertEqual(trade2.price, 47550.0) self.assertEqual(trade2.volume, 2) self.assertEqual(trade2.trade_date_time, 1568876399999500000) self.assertEqual(trade2.commission, 23.189999999999998) 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_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_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 sell_close(): api = TqApi(TqAccount(bid, user_id, pwd), url=td_url, auth="ringo,Shinnytech123") test_logger.info(f"{'='*12} 期权 卖平仓 {'='*12}") quote = api.get_quote(symbol) # ETF 期权 order = api.insert_order(symbol=symbol, direction="SELL", offset="CLOSE", limit_price=quote.bid_price1, volume=3) while order.status == "ALIVE": api.wait_update() api.wait_update() api.close()
def test_is_changing(self): # 预设服务器端响应 self.mock.run("test_func_basic_is_changing.script") # 测试: 模拟账户下单 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)
def test_get_position(self): """ 获取持仓 """ # 预设服务器端响应 dir_path = os.path.dirname(os.path.realpath(__file__)) self.mock.run( os.path.join(dir_path, "log_file", "test_td_basic_get_position_simulate.script.lzma")) # 测试: 获取数据 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=4592) order2 = api.insert_order("DCE.jd2001", "BUY", "OPEN", 3) order3 = api.insert_order("DCE.jd2001", "SELL", "OPEN", 3) while order1.status == "ALIVE" or order2.status == "ALIVE" or order3.status == "ALIVE": api.wait_update() position = api.get_position("DCE.jd2001") # 测试脚本重新生成后,数据根据实际情况有变化 self.assertEqual( "{'exchange_id': 'DCE', 'instrument_id': 'jd2001', 'pos_long_his': 0, 'pos_long_today': 4, 'pos_short_his': 0, 'pos_short_today': 3, 'volume_long_today': 4, 'volume_long_his': 0, 'volume_long': 4, 'volume_long_frozen_today': 0, 'volume_long_frozen_his': 0, 'volume_long_frozen': 0, 'volume_short_today': 3, 'volume_short_his': 0, 'volume_short': 3, 'volume_short_frozen_today': 0, 'volume_short_frozen_his': 0, 'volume_short_frozen': 0, 'open_price_long': 4193.0, 'open_price_short': 4059.0, 'open_cost_long': 167720.0, 'open_cost_short': 121770.0, 'position_price_long': 4193.0, 'position_price_short': 4059.0, 'position_cost_long': 167720.0, 'position_cost_short': 121770.0, 'float_profit_long': -5320.0, 'float_profit_short': -30.0, 'float_profit': -5350.0, 'position_profit_long': -5320.0, 'position_profit_short': -30.0, 'position_profit': -5350.0, 'margin_long': 11429.6, 'margin_short': 8572.2, 'margin': 20001.800000000003, 'symbol': 'DCE.jd2001', 'last_price': 4060.0}", str(position)) self.assertEqual(1, position.pos) self.assertEqual(4, position.pos_long) self.assertEqual(3, position.pos_short) self.assertEqual(position.exchange_id, "DCE") self.assertEqual(position.instrument_id, "jd2001") self.assertEqual(position.pos_long_his, 0) self.assertEqual(position.pos_long_today, 4) self.assertEqual(position.pos_short_his, 0) self.assertEqual(position.pos_short_today, 3) self.assertEqual(position.volume_long_today, 4) self.assertEqual(position.volume_long_his, 0) self.assertEqual(position.volume_long, 4) self.assertEqual(position.volume_long_frozen_today, 0) self.assertEqual(position.volume_long_frozen_his, 0) self.assertEqual(position.volume_long_frozen, 0) self.assertEqual(position.volume_short_today, 3) self.assertEqual(position.volume_short_his, 0) self.assertEqual(position.volume_short, 3) self.assertEqual(position.volume_short_frozen_today, 0) self.assertEqual(position.volume_short_frozen_his, 0) self.assertEqual(position.volume_short_frozen, 0) self.assertEqual(position.open_price_long, 4193.0) self.assertEqual(position.open_price_short, 4059.0) self.assertEqual(position.open_cost_long, 167720.0) self.assertEqual(position.open_cost_short, 121770.0) self.assertEqual(position.position_price_long, 4193.0) self.assertEqual(position.position_price_short, 4059.0) self.assertEqual(position.position_cost_long, 167720.0) self.assertEqual(position.position_cost_short, 121770.0) self.assertEqual(position.float_profit_long, -5320.0) self.assertEqual(position.float_profit_short, -30.0) self.assertEqual(position.float_profit, -5350.0) self.assertEqual(position.position_profit_long, -5320.0) self.assertEqual(position.position_profit_short, -30.0) self.assertEqual(position.position_profit, -5350.0) self.assertEqual(position.margin_long, 11429.6) self.assertEqual(position.margin_short, 8572.2) self.assertEqual(position.margin, 20001.800000000003) self.assertEqual(position.symbol, "DCE.jd2001") self.assertEqual(position.last_price, 4060.0) # 其他取值方式测试 self.assertEqual(position["pos_long_today"], 4) self.assertEqual(position["pos_short_today"], 3) self.assertEqual(position["volume_long_his"], 0) self.assertEqual(position["volume_long"], 4) 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, _md_url="wss://nfmd.shinnytech.com/t/nfmd/front/mobile", _td_url=td_url) print(api._md_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"{'='*12} 期权 开仓 {'='*12}") quote = api.get_quote("CZCE.RM105") # ETF 期权 print(quote) # 挂单 # 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="CZCE.RM105", direction="BUY", offset="OPEN", limit_price=quote.ask_price1, volume=1) # 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) while order.status == "ALIVE": api.wait_update() api.wait_update() api.wait_update() 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()
df_long = reset_df_long(quote, GRID_AMOUNT, grid_region_long, grid_volume_long) df_short = reset_df_short(quote, GRID_AMOUNT, grid_region_short, grid_volume_short) ################################################################################# while True: api.wait_update() ################################################################################# if api.is_changing(ticks): now = time_to_datetime(ticks.iloc[-1].datetime) if (now.hour >= 9 and now.hour < 15) or (now.hour >= 21 and now.hour < 23): if is_clear_all1: api.insert_order(symbol, "SELL", close, position.pos_long, quote.bid_price1 - 2) is_clear_all1 = False if is_clear_all2: api.insert_order(symbol, "BUY", close, position.pos_short, quote.ask_price1 + 2) is_clear_all2 = False ################################################################################# if api.is_changing(quote): df = pd.DataFrame(api.get_order().values()) if not df.empty: df_long_open = df[ ((df["exchange_id"] + "." + df["instrument_id"]) == symbol) & (df["direction"] == "BUY") & ( df["offset"] == "OPEN") & (df["volume_left"] == df["volume_orign"]) & ( df["status"] == "ALIVE")] df_short_open = df[
def test_get_position_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_position_simulate_option.script.lzma")) # 测试: 获取数据 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", "BUY", "OPEN", 2, limit_price=55) order2 = api.insert_order("CZCE.SR007C5600", "BUY", "OPEN", 3, limit_price=55) order3 = api.insert_order("CZCE.SR007C5600", "SELL", "OPEN", 3, limit_price=10) order4 = api.insert_order("CZCE.SR007C5600", "SELL", "OPEN", 3) # 只有郑商所支持期权市价单 order5 = api.insert_order("DCE.m2007-P-2900", "BUY", "OPEN", 1) # 只有郑商所支持期权市价单 while order1.status == "ALIVE" or order2.status == "ALIVE" or order3.status == "ALIVE" or order4.status == "ALIVE" or order5.status == "ALIVE": api.wait_update() self.assertEqual(order4.volume_left, 0) self.assertEqual(order5.volume_left, 1) position = api.get_position("CZCE.SR007C5600") position2 = api.get_position("DCE.m2007-P-2900") self.assertEqual(0, position2.pos_long) self.assertEqual(0, position2.pos_short) # 测试脚本重新生成后,数据根据实际情况有变化 self.assertEqual( "{'exchange_id': 'CZCE', 'instrument_id': 'SR007C5600', 'pos_long_his': 0, 'pos_long_today': 5, 'pos_short_his': 0, 'pos_short_today': 6, 'volume_long_today': 5, 'volume_long_his': 0, 'volume_long': 5, 'volume_long_frozen_today': 0, 'volume_long_frozen_his': 0, 'volume_long_frozen': 0, 'volume_short_today': 6, 'volume_short_his': 0, 'volume_short': 6, 'volume_short_frozen_today': 0, 'volume_short_frozen_his': 0, 'volume_short_frozen': 0, 'open_price_long': 55.0, 'open_price_short': 22.5, 'open_cost_long': 2750.0, 'open_cost_short': 1350.0, 'position_price_long': 55.0, 'position_price_short': 22.5, 'position_cost_long': 2750.0, 'position_cost_short': 1350.0, 'float_profit_long': -1000.0, 'float_profit_short': -750.0, 'float_profit': -1750.0, 'position_profit_long': 0.0, 'position_profit_short': 0.0, 'position_profit': 0.0, 'margin_long': 0.0, 'margin_short': 8156.4000000000015, 'margin': 8156.4000000000015, 'market_value_long': 1750.0, 'market_value_short': -2100.0, 'market_value': -350.0, 'last_price': 35.0}", str(position)) self.assertEqual(-1, position.pos) self.assertEqual(5, position.pos_long) self.assertEqual(6, position.pos_short) self.assertEqual(position.exchange_id, "CZCE") self.assertEqual(position.instrument_id, "SR007C5600") self.assertEqual(position.pos_long_his, 0) self.assertEqual(position.pos_long_today, 5) self.assertEqual(position.pos_short_his, 0) self.assertEqual(position.pos_short_today, 6) self.assertEqual(position.volume_long_today, 5) self.assertEqual(position.volume_long_his, 0) self.assertEqual(position.volume_long, 5) self.assertEqual(position.volume_long_frozen_today, 0) self.assertEqual(position.volume_long_frozen_his, 0) self.assertEqual(position.volume_long_frozen, 0) self.assertEqual(position.volume_short_today, 6) self.assertEqual(position.volume_short_his, 0) self.assertEqual(position.volume_short, 6) self.assertEqual(position.volume_short_frozen_today, 0) self.assertEqual(position.volume_short_frozen_his, 0) self.assertEqual(position.volume_short_frozen, 0) self.assertEqual(position.open_price_long, 55.0) self.assertEqual(position.open_price_short, 22.5) self.assertEqual(position.open_cost_long, 2750.0) self.assertEqual(position.open_cost_short, 1350.0) self.assertEqual(position.position_price_long, 55.0) self.assertEqual(position.position_price_short, 22.5) self.assertEqual(position.position_cost_long, 2750.0) self.assertEqual(position.position_cost_short, 1350.0) self.assertEqual(position.float_profit_long, -1000.0) self.assertEqual(position.float_profit_short, -750.0) self.assertEqual(position.float_profit, -1750.0) self.assertEqual(position.position_profit_long, 0.0) self.assertEqual(position.position_profit_short, 0.0) self.assertEqual(position.position_profit, 0.0) self.assertEqual(position.margin_long, 0.0) self.assertEqual(position.margin_short, 8156.4000000000015) self.assertEqual(position.margin, 8156.4000000000015) self.assertEqual(position.market_value_long, 1750.0) self.assertEqual(position.market_value_short, -2100.0) self.assertEqual(position.market_value, -350.0) self.assertEqual(position.last_price, 35.0) # 其他取值方式测试 self.assertEqual(position["pos_long_today"], 5) self.assertEqual(position["pos_short_today"], 6) self.assertEqual(position["volume_long_his"], 0) self.assertEqual(position["volume_long"], 5) api.close()
#!/usr/bin/env python # -*- coding: utf-8 -*- from tqsdk import TqApi api = TqApi() quote = api.get_quote("SHFE.rb1910") # 开仓两手并等待完成 order = api.insert_order(symbol="SHFE.rb1910", direction="BUY", offset="OPEN", limit_price=quote.ask_price1, volume=2) while order.status != "FINISHED": api.wait_update() print("已开仓") # 平今两手并等待完成 order = api.insert_order(symbol="SHFE.rb1910", direction="SELL", offset="CLOSETODAY", limit_price=quote.bid_price1, volume=2) while order.status != "FINISHED": api.wait_update() print("已平今") # 关闭api,释放相应资源 api.close()
def test_insert_order_option(self): """ 期权下单 """ # 预设服务器端响应 dir_path = os.path.dirname(os.path.realpath(__file__)) self.mock.run( os.path.join( dir_path, "log_file", "test_td_basic_insert_order_simulate_option.script.lzma")) # 测试: 模拟账户下单 # 非回测, 则需在盘中生成测试脚本: 测试脚本重新生成后,数据根据实际情况有变化,因此需要修改assert语句的内容 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("SHFE.cu2006C47000", "BUY", "OPEN", 1, limit_price=135) order2 = api.insert_order("CZCE.SR007C5600", "SELL", "OPEN", 2, limit_price=30) order3 = api.insert_order("DCE.m2007-P-2900", "BUY", "OPEN", 3, limit_price=192) while order1.status == "ALIVE" or order2.status == "ALIVE" or order3.status == "ALIVE": api.wait_update() self.assertEqual(order1.order_id, "5c6e433715ba2bdd177219d30e7a269f") 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, 135.0) self.assertEqual(order1.price_type, "LIMIT") self.assertEqual(order1.volume_condition, "ANY") self.assertEqual(order1.time_condition, "GFD") self.assertAlmostEqual(1586829882005334000 / 1e9, order1.insert_date_time / 1e9, places=1) self.assertEqual(order1.status, "FINISHED") for k, v in order1.trade_records.items(): # 模拟交易为一次性全部成交,因此只有一条成交记录 self.assertAlmostEqual(1586829882005979000 / 1e9, v.trade_date_time / 1e9, places=1) del v.trade_date_time self.assertEqual( str(v), "{'order_id': '5c6e433715ba2bdd177219d30e7a269f', 'trade_id': '5c6e433715ba2bdd177219d30e7a269f|1', 'exchange_trade_id': '5c6e433715ba2bdd177219d30e7a269f|1', 'exchange_id': 'SHFE', 'instrument_id': 'cu2006C47000', 'direction': 'BUY', 'offset': 'OPEN', 'price': 135.0, 'volume': 1, 'user_id': 'TQSIM', 'commission': 10}" ) self.assertEqual(order2.order_id, "cf1822ffbc6887782b491044d5e34124") self.assertEqual(order2.direction, "SELL") self.assertEqual(order2.offset, "OPEN") self.assertEqual(order2.volume_orign, 2) self.assertEqual(order2.volume_left, 0) self.assertEqual(order2.limit_price, 30.0) self.assertEqual(order2.price_type, "LIMIT") self.assertEqual(order2.volume_condition, "ANY") self.assertEqual(order2.time_condition, "GFD") self.assertAlmostEqual(1586829882236154000 / 1e9, order2.insert_date_time / 1e9, places=1) self.assertEqual(order2.status, "FINISHED") for k, v in order2.trade_records.items(): # 模拟交易为一次性全部成交,因此只有一条成交记录 self.assertAlmostEqual(1586829882236518000 / 1e9, v.trade_date_time / 1e9, places=1) del v.trade_date_time self.assertEqual( str(v), "{'order_id': 'cf1822ffbc6887782b491044d5e34124', 'trade_id': 'cf1822ffbc6887782b491044d5e34124|2', 'exchange_trade_id': 'cf1822ffbc6887782b491044d5e34124|2', 'exchange_id': 'CZCE', 'instrument_id': 'SR007C5600', 'direction': 'SELL', 'offset': 'OPEN', 'price': 30.0, 'volume': 2, 'user_id': 'TQSIM', 'commission': 20}" ) self.assertEqual(order3.order_id, "4067c3584ee207f8da94e3e8ab73738f") self.assertEqual(order3.direction, "BUY") self.assertEqual(order3.offset, "OPEN") self.assertEqual(order3.volume_orign, 3) self.assertEqual(order3.volume_left, 0) self.assertEqual(order3.limit_price, 192.0) self.assertEqual(order3.price_type, "LIMIT") self.assertEqual(order3.volume_condition, "ANY") self.assertEqual(order3.time_condition, "GFD") self.assertAlmostEqual(1586829882228039000 / 1e9, order3.insert_date_time / 1e9, places=1) self.assertEqual(order3.status, "FINISHED") for k, v in order3.trade_records.items(): # 模拟交易为一次性全部成交,因此只有一条成交记录 self.assertAlmostEqual(1586829882228603000 / 1e9, v.trade_date_time / 1e9, places=1) del v.trade_date_time self.assertEqual( str(v), "{'order_id': '4067c3584ee207f8da94e3e8ab73738f', 'trade_id': '4067c3584ee207f8da94e3e8ab73738f|3', 'exchange_trade_id': '4067c3584ee207f8da94e3e8ab73738f|3', 'exchange_id': 'DCE', 'instrument_id': 'm2007-P-2900', 'direction': 'BUY', 'offset': 'OPEN', 'price': 192.0, 'volume': 3, 'user_id': 'TQSIM', 'commission': 30}" ) api.close()
from otg_check_helper import check_orders, check_positions, check_account, check_risk_rule, check_risk_data, check_all from test_for_etf.base_info import bid, user_id, pwd, td_url, test_logger if __name__ == '__main__': api = TqApi(TqAccount(bid, user_id, pwd), auth="ringo,Shinnytech123", _stock=True, _td_url=td_url) # 成交持仓比风控规则 rule = api.set_risk_management_rule("SSE", True, trade_units_limit=6, trade_position_ratio_limit=150) test_logger.info(f"{'='*12} 期权 开仓 {'='*12}") symbol = "SSE.10002477" quote = api.get_quote(symbol) # ETF 期权 # 挂单 buy_order = api.insert_order(symbol=symbol, direction="BUY", offset="OPEN", limit_price=quote.ask_price1, volume=10) while buy_order.status == "ALIVE": api.wait_update() check_all(api, bid, user_id) check_risk_rule(api, None) check_risk_data(api, symbol) api.close()
#!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'chengzhi' from tqsdk import TqApi, TqSim api = TqApi(TqSim()) # 获得 m1909 的持仓引用,当持仓有变化时 position 中的字段会对应更新 position = api.get_position("DCE.m1909") # 获得资金账户引用,当账户有变化时 account 中的字段会对应更新 account = api.get_account() # 下单并返回委托单的引用,当该委托单有变化时 order 中的字段会对应更新 order = api.insert_order(symbol="DCE.m1909", direction="BUY", offset="OPEN", volume=5) 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"])) if api.is_changing(position, "volume_long_today"): print("今多头: %d 手" % (position["volume_long_today"])) if api.is_changing(account, "available"): print("可用资金: %.2f" % (account["available"]))
# api = TqApi(TqAccount("快期模拟", "cjj208", "Chenjj1230")) api = TqApi(TqAccount("simnow", "090828", "jimc1230", front_broker='9999', front_url='tcp://180.168.146.187:10100'), web_gui="0.0.0.0:9876") # 获得 m2005 的持仓引用,当持仓有变化时 position 中的字段会对应更新 position = api.get_position("SHFE.rb2005") # 获得资金账户引用,当账户有变化时 account 中的字段会对应更新 account = api.get_account() # 下单并返回委托单的引用,当该委托单有变化时 order 中的字段会对应更新 order = api.insert_order(symbol="SHFE.rb2005", direction="BUY", offset="OPEN", volume=2, limit_price=3521) #canorder = api.cancel_order(order) while True: api.wait_update() if api.is_changing(order, ["status", "volume_orign", "volume_left"]): #subprocess.call("cls",shell=True) print("单状态: %s, 已成交: %d 手" % (order.status, order.volume_orign - order.volume_left)) if api.is_changing(position, "pos_long_today"): print("今多头: %d 手" % (position.pos_long_today)) if api.is_changing(account, "available"): print("可用资金: %.2f" % (account.available))
如果小于则平仓 ''' api = TqApi() # 获得 m2005 10秒K线的引用 klines = api.get_kline_serial("DCE.m2005", 10) # 判断开仓条件 while True: api.wait_update() if api.is_changing(klines): ma = sum(klines.close.iloc[-15:]) / 15 print("最新价", klines.close.iloc[-1], "MA", ma) if klines.close.iloc[-1] > ma: print("最新价大于MA: 市价开仓") api.insert_order(symbol="DCE.m2005", direction="BUY", offset="OPEN", volume=5) break # 判断平仓条件 while True: api.wait_update() if api.is_changing(klines): ma = sum(klines.close.iloc[-15:]) / 15 print("最新价", klines.close.iloc[-1], "MA", ma) if klines.close.iloc[-1] < ma: print("最新价小于MA: 市价平仓") api.insert_order(symbol="DCE.m2005", direction="SELL", offset="CLOSE", volume=5) break