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_various_combinations_of_order_4(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_4.script")) # 测试4:单次开 分多次平完 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) trades = api.get_trade() order_open = api.insert_order(symbol, "BUY", "OPEN", 3) while order_open.status != "FINISHED": api.wait_update() self.assertEqual(position.pos, 3) for i in range(3): order_close = api.insert_order(symbol, "SELL", "CLOSE", 1) while order_close.status != "FINISHED": api.wait_update() self.assertEqual(len(trades), 4) self.assertEqual(position.pos, 0) 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")) # 测试: 模拟账户 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()
class CuatroStrategy(Process): '''''' author = 'XIAO LI' boll_window = 20 boll_dev = 1.8 rsi_window = 14 rsi_signal = 20 fast_window = 4 slow_window = 26 trailing_long = 0.5 trailing_short = 0.3 vol = 1 boll_up = float('nan') boll_down = float('nan') rsi_value = float('nan') rsi_long = float('nan') rsi_short = float('nan') fast_ma = float('nan') slow_ma = float('nan') ma_trend = float('nan') intra_trade_high = float('nan') intra_trade_low = float('nan') long_stop = float('nan') short_stop = float('nan') parameters = [ 'boll_window' 'boll_dev' 'rsi_window' 'rsi_signal' 'fast_window' 'slow_window' 'trailing_long' 'trailing_short' 'vol' ] variables = [ 'boll_up' 'boll_down' 'rsi_value' 'rsi_long' 'rsi_short' 'fast_ma' 'slow_ma' 'ma_trend' 'intra_trade_high' 'intra_trade_low ' 'long_stop' 'short_stop' ] def __init__(self, symbol): Process.__init__(self) self.symbol = symbol self.rsi_long = 50 + self.rsi_signal self.rsi_short = 50 - self.rsi_signal self.api = TqApi(TqSim(init_balance=50000)) self.now = datetime.now() self.target_pos = TargetPosTask(self.api, self.symbol) self.ticks = self.api.get_tick_serial(self.symbol) self.klines5 = self.api.get_kline_serial(self.symbol, 60 * 5) self.klines15 = self.api.get_kline_serial(self.symbol, 60 * 15) self.position = self.api.get_position(self.symbol) def on_init(self): print(self.now, '策略初始化') def on_start(self): print(self.now, '策略启动') def on_stop(self): print(self.now, '策略停止') def on_tick(self, ticks): if self.api.is_changing(ticks, 'datetime'): if self.position.pos_long == 0 and self.position.pos_short == 0: if self.ma_trend > 0 and self.rsi_value >= self.rsi_long and ticks.iloc[-1].last_price > self.boll_up: self.target_pos.set_target_volume(self.vol) self.intra_trade_high = ticks.iloc[-1].last_price if self.ma_trend < 0 and self.rsi_value <= self.rsi_short and ticks.iloc[ -1].last_price < self.boll_down: self.target_pos.set_target_volume(-self.vol) self.intra_trade_low = ticks.iloc[-1].last_price elif self.position.pos_long > 0: self.intra_trade_high = max(self.intra_trade_high, ticks.iloc[-1].last_price) self.long_stop = (self.intra_trade_high - self.trailing_long * (self.boll_up - self.boll_down)) if ticks.iloc[-1].last_price < self.long_stop: self.target_pos.set_target_volume(0) self.intra_trade_high = float('nan') else: self.intra_trade_low = min(self.intra_trade_low, ticks.iloc[-1].last_price) self.short_stop = (self.intra_trade_low + self.trailing_short * (self.boll_up - self.boll_down)) if ticks.iloc[-1].last_price > self.short_stop: self.target_pos.set_target_volume(0) self.intra_trade_low = float('nan') def on_5minbar(self, klines5): if self.api.is_changing(klines5, 'datetime'): boll = ta.BOLL(klines5.iloc[:-1], self.boll_window, self.boll_dev).iloc[-1] self.boll_up = boll['top'] self.boll_down = boll['bottom'] self.rsi_value = ta.RSI(klines5.iloc[:-1], self.rsi_window).iloc[-1]['rsi'] def on_15minbar(self, klines15): if self.api.is_changing(klines15, 'datetime'): self.fast_ma = ta.SMA(klines15.iloc[:-1], self.fast_window, 2) self.slow_ma = ta.SMA(klines15.iloc[:-1], self.slow_window, 2) if self.fast_ma > self.slow_ma: self.ma_trend = 1 elif self.fast_ma < self.slow_ma: self.ma_trend = -1 else: self.ma_trend = 0 def on_order(self): if self.api.is_changing(self.api.get_order()): pass def on_trade(self): if self.api.is_changing(self.api.get_trade()): pass def run(self): self.on_init() self.on_start() while True: self.api.wait_update() self.on_tick(self.ticks) self.on_5minbar(self.klines5) self.on_15minbar(self.klines15) self.on_order() self.on_trade() self.on_stop()