def sub_cmd_refresh(args): instance_id = args.sii instance = get_instance(instance_id) print('marketing data src: %s strategy config path: %s ' % (instance['mds'], instance['sc'])) config = xq.get_strategy_config(instance['sc']) pprint.pprint(config, indent=4) engine = BackTest(instance_id, instance['mds'], config) module_name = config["module_name"].replace("/", ".") class_name = config["class_name"] strategy = ts.createInstance(module_name, class_name, config, engine) refresh(engine, engine.md, strategy, [ datetime.fromtimestamp(order["create_time"]) for order in instance['orders'] ]) orders = engine.orders for idx, order in enumerate(engine.orders): old_order = instance['orders'][idx] if "high" in old_order: order["high"] = old_order["high"] order["high_time"] = old_order["high_time"] order["low"] = old_order["low"] order["low_time"] = old_order["low_time"] engine.analyze(config['symbol'], engine.orders, True, True)
def sub_cmd_chart_diff(args): print(args.siis) print(len(args.siis)) siis = args.siis if len(siis) != 2: exit(1) instance_a = get_instance(siis[0]) instance_b = get_instance(siis[1]) if instance_a['sc'] != instance_b['sc']: print(instance_a['sc']) print(instance_b['sc']) exit(1) start_time = min(instance_a['start_time'], instance_b['start_time']) end_time = max(instance_a['end_time'], instance_b['end_time']) orders_a = instance_a['orders'] orders_b = instance_b['orders'] md = DBMD(instance_a['mds']) md.tick_time = end_time config = xq.get_strategy_config(instance_a['sc']) symbol = config["symbol"] interval = config["kline"]["interval"] title = symbol + ' ' + config['kline']['interval'] + ' ' + config[ 'class_name'] ordersets = [] ordersets.append(orders_a) ordersets.append(orders_b) chart(title, md, symbol, interval, start_time, end_time, ordersets, args)
def real2_update(args): record = {} if args.user: record["user"] = args.user if args.instance_id: record["instance_id"] = args.instance_id if args.config_path: record["config_path"] = args.config_path if args.exchange: record["exchange"] = args.exchange if args.value: instance = si.get_strategy_instance(args.sii) instance_id = instance["instance_id"] exchange_name = instance["exchange"] if not exchange_name: exchange_name = record["exchange_name"] config_path = instance["config_path"] if not config_path: config_path = record["config_path"] value = instance["value"] config = xq.get_strategy_config(config_path) symbol = config['symbol'] realEngine = RealEngine(instance_id, exchange_name, config, value) orders = realEngine.get_orders(symbol) if orders: return record["value"] = args.value if args.status: record["status"] = args.status if record: si.update_strategy_instance({"instance_id": args.sii}, record)
def sub_cmd_search(args): if not (args.m and args.sc): exit(1) instance_id = create_instance_id() config = xq.get_strategy_config(args.sc) pprint.pprint(config) module_name = config["module_name"].replace("/", ".") class_name = config["class_name"] symbol = config['symbol'] engine = BackTest(instance_id, args.m, config, args.log) strategy = ts.createInstance(module_name, class_name, config, engine) md = engine.md start_time, end_time = get_time_range(md, symbol, args.r) count = args.count result = [] for i in range(count): rs = strategy.search_init() print("%d/%d %s" % (i, count, rs)) tick_count = run2(engine, md, strategy, start_time, end_time) result.append((i, rs, engine.search_calc(symbol, engine.orders))) engine.orders = [] sorted_rs = sorted(result, key=lambda x: x[2][0], reverse=True) for r in sorted_rs: info = "%6s %30s %s " % r print(info) engine.log_debug(info)
def view(args): instance_id = args.sii instance = get_instance(instance_id) config = xq.get_strategy_config(instance['sc']) engine = BackTest(instance_id, instance['mds'], config) engine.view(config['symbol'], instance['orders'])
def sub_cmd_multisearch(args): if not (args.m and args.sc): exit(1) config = xq.get_strategy_config(args.sc) pprint.pprint(config) module_name = config["module_name"].replace("/", ".") class_name = config["class_name"] symbol = config['symbol'] md = DBMD(args.m, kl.KLINE_DATA_TYPE_JSON) start_time, end_time = get_time_range(md, symbol, args.r) count = args.count cpus = cpu_count() print("count: %s, cpus: %s" % (count, cpus)) result_q = Manager().Queue() #Manager中的Queue才能配合Pool task_q = Manager().Queue() #Manager中的Queue才能配合Pool for index in range(count): task_q.put(index) print('Parent process %s.' % os.getpid()) p = Pool(cpus) for i in range(cpus): #p.apply_async(child_process_test, args=(i, task_q, result_q)) p.apply_async(child_process, args=(i, task_q, result_q, args.m, config, module_name, class_name, start_time, end_time)) print('Waiting for all subprocesses done...') p.close() start_time = datetime.now() result = [] while len(result) < count: if result_q.empty(): time.sleep(1) else: value = result_q.get() print("result value: ", value) result.append(value) sys.stdout.write(" %d/%d, cost: %s, progress: %g%% \r" % (len(result), count, datetime.now() - start_time, round((len(result) / count) * 100, 2))) sys.stdout.flush() print("") #print("result queue(len: %s)" % (result_q.qsize())) p.join() print('All subprocesses done.') sorted_rs = sorted(result, key=lambda x: x[1][0], reverse=True) for r in sorted_rs: #print("r: ", r) info = "%6s %30s %s " % r print(info)
def sub_cmd_continue(args): old_instance = get_instance(args.sii) mds_name = old_instance['mds'] sc = old_instance['sc'] print('marketing data src: %s strategy config path: %s ' % (mds_name, sc)) config = xq.get_strategy_config(sc) pprint.pprint(config, indent=4) module_name = config["module_name"].replace("/", ".") class_name = config["class_name"] symbol = config['symbol'] instance_id = create_instance_id() if args.log: logfilename = class_name + "_" + symbol + "_" + instance_id + ".log" print(logfilename) log.init("backtest", logfilename) log.info("strategy name: %s; config: %s" % (class_name, config)) engine = BackTest(instance_id, mds_name, config, args.log) strategy = ts.createInstance(module_name, class_name, config, engine) engine.orders = old_instance["orders"] continue_time = old_instance["end_time"] oldest_time = engine.md.get_oldest_time(strategy.config['symbol'], kl.KLINE_INTERVAL_1MINUTE) if continue_time < oldest_time: continue_time = oldest_time latest_time = engine.md.get_latest_time(strategy.config['symbol'], kl.KLINE_INTERVAL_1MINUTE) end_time = latest_time print(" time range old( %s ~ %s ); continue( %s ~ %s )" % (old_instance["start_time"].strftime("%Y-%m-%d %H:%M"), old_instance["end_time"].strftime("%Y-%m-%d %H:%M"), continue_time.strftime("%Y-%m-%d %H:%M"), end_time.strftime("%Y-%m-%d %H:%M"))) print("run2 kline_data_type: %s " % (engine.md.kline_data_type)) tick_count = run2(engine, engine.md, strategy, continue_time, end_time) print("\n total tick count: %d" % (tick_count)) engine.analyze_orders(engine.orders) _id = bt_db.insert_one( BACKTEST_INSTANCES_COLLECTION_NAME, { "instance_id": instance_id, "start_time": old_instance["start_time"], "end_time": end_time, "orders": engine.orders, "mds": mds_name, "sc": sc, }, ) engine.display(symbol, engine.orders, strategy.cur_price, end_time, True, args.rmk)
def analyze(args): instance_id = args.sii instance = get_instance(instance_id) print('marketing data src: %s strategy config path: %s ' % (instance['mds'], instance['sc'])) config = xq.get_strategy_config(instance['sc']) pprint.pprint(config, indent=4) engine = BackTest(instance_id, instance['mds'], config) engine.analyze(config['symbol'], instance['orders'], args.hl, args.rmk)
def chart(args): instance_id = args.sii instance = get_instance(instance_id) config = xq.get_strategy_config(instance['sc']) engine = BackTest(instance_id, instance['mds'], config) engine.md.tick_time = instance['end_time'] engine.orders = instance['orders'] engine.chart(config['symbol'], instance['start_time'], instance['end_time'], args)
def real2_list(args): td_db = get_mongodb(setup.trade_db_name) ss = td_db.find(si.STRATEGY_INSTANCE_COLLECTION_NAME, {"user": args.user}) #pprint(ss) all_value = 0 all_his_profit = 0 all_flo_profit = 0 all_commission = 0 title_head_fmt = "%-30s %10s%12s" head_fmt = "%-30s %10s(%10.0f)" title_profit_fmt = "%21s %21s %12s" profit_fmt = "%12.2f(%6.2f%%) %12.2f(%6.2f%%) %12.2f" title_tail_fmt = " %-60s %-20s %10s" print(title_head_fmt % ("instance_id", "value", "") + title_profit_fmt % ("history_profit", "floating_profit", "commission") + title_tail_fmt % ("config_path", "exchange", "status")) for s in ss: instance_id = s["instance_id"] exchange_name = s["exchange"] value = s["value"] config_path = s["config_path"] if "status" in s: status = s["status"] else: status = "" if status != args.status and status != "": continue all_value += value profit_info = "" try: config = xq.get_strategy_config(config_path) symbol = config['symbol'] realEngine = RealEngine(instance_id, exchange_name, config, value) orders = realEngine.get_orders(symbol) pst_info = realEngine.get_pst_by_orders(orders) history_profit, history_profit_rate, history_commission = realEngine.get_history(pst_info) all_his_profit += history_profit floating_profit, floating_profit_rate, floating_commission, cur_price = realEngine.get_floating(symbol, pst_info) all_flo_profit += floating_profit commission = history_commission + floating_commission all_commission += commission profit_info = profit_fmt % (history_profit, history_profit_rate*100, floating_profit, floating_profit_rate*100, commission) except Exception as ept: profit_info = "error: %s" % (ept) print(head_fmt % (instance_id, value, (value+history_profit+floating_profit)) + profit_info + title_tail_fmt % (config_path, exchange_name, status)) if args.stat: print(head_fmt % ("all", all_value, all_value+all_his_profit+all_flo_profit) + profit_fmt % (all_his_profit, all_his_profit/all_value*100, all_flo_profit, all_flo_profit/all_value*100, all_commission))
def sub_cmd_signal(args): if not (args.m and args.sc): exit(1) instance_id = create_instance_id() config = xq.get_strategy_config(args.sc) pprint.pprint(config) module_name = config["module_name"].replace("/", ".") class_name = config["class_name"] symbol = config['symbol'] interval = config["kline"]["interval"] if args.log: logfilename = class_name + "_" + symbol + "_" + instance_id + ".log" print(logfilename) log.init("testsignal", logfilename) log.info("strategy name: %s; config: %s" % (class_name, config)) md = DBMD(args.m, kl.KLINE_DATA_TYPE_JSON) engine = TestSignal(md, instance_id, config, args.log) strategy = ts.createInstance(module_name, class_name, config, engine) start_time, end_time = get_time_range(md, symbol, args.r) print("run2 kline_data_type: %s " % (md.kline_data_type)) tick_count = run2(engine, md, strategy, start_time, end_time) print("\n total tick count: %d" % (tick_count)) #pprint.pprint(engine.signals) print("signal count: ", len(engine.signals)) ''' _id = bt_db.insert_one( BACKTEST_INSTANCES_COLLECTION_NAME, { "instance_id": instance_id, "start_time": start_time, "end_time": end_time, "signals": engine.signals, "mds": args.m, "sc": args.sc, }, ) ''' if args.chart: signalsets = engine.get_signalsets() title = "signal: " + symbol + ' ' + config['kline']['interval'] + ' ' if strategy.name: title += strategy.name else: title += config['class_name'] chart(title, engine.md, symbol, interval, start_time, end_time, [], args, signalsets)
def sub_cmd_run(args): if not (args.m and args.sc): exit(1) instance_id = create_instance_id() config = xq.get_strategy_config(args.sc) pprint.pprint(config) module_name = config["module_name"].replace("/", ".") class_name = config["class_name"] symbol = config['symbol'] if args.log: logfilename = class_name + "_" + symbol + "_" + instance_id + ".log" print(logfilename) log.init("backtest", logfilename) log.info("strategy name: %s; config: %s" % (class_name, config)) engine = BackTest(instance_id, args.m, config, args.log) strategy = ts.createInstance(module_name, class_name, config, engine) md = engine.md start_time, end_time = get_time_range(md, symbol, args.r) print("run2 kline_data_type: %s " % (md.kline_data_type)) tick_count = run2(engine, md, strategy, start_time, end_time) print("\n total tick count: %d" % (tick_count)) engine.analyze_orders(engine.orders) _id = bt_db.insert_one( BACKTEST_INSTANCES_COLLECTION_NAME, { "instance_id": instance_id, "start_time": start_time, "end_time": end_time, "orders": engine.orders, "mds": args.m, "sc": args.sc, }, ) engine.display(symbol, engine.orders, strategy.cur_price, end_time, True, args.rmk) if args.chart: ordersets = [] ordersets.append(engine.orders) chart(md, engine.config, start_time, end_time, ordersets, args)
def real2_list(args): td_db = get_mongodb(setup.trade_db_name) ss = td_db.find(si.STRATEGY_INSTANCE_COLLECTION_NAME, {"user": args.user}) #pprint(ss) title1_fmt = "%-30s %10s" title2_fmt = "%-60s %-20s %10s" print((title1_fmt + " %s " + title2_fmt) % ("instance_id", "value", " history_profit floating_profit", "config_path", "exchange", "status")) for s in ss: instance_id = s["instance_id"] exchange_name = s["exchange"] value = s["value"] config_path = s["config_path"] if "status" in s: status = s["status"] else: status = "" if status != args.status and status != "": continue profit_info = "" try: config = xq.get_strategy_config(config_path) symbol = config['symbol'] realEngine = RealEngine(instance_id, exchange_name, config, value) orders = realEngine.get_orders(symbol) pst_info = realEngine.get_pst_by_orders(orders) history_profit, history_profit_rate, history_commission = realEngine.get_history( pst_info) floating_profit, floating_profit_rate, floating_commission, cur_price = realEngine.get_floating( symbol, pst_info) profit_info = "%10.2f(%6.2f%%) %10.2f(%6.2f%%)" % ( history_profit, history_profit_rate * 100, floating_profit, floating_profit_rate * 100) except Exception as ept: profit_info = "error: %s" % (ept) print((title1_fmt + " %s " + title2_fmt) % (instance_id, value, profit_info, config_path, exchange_name, status))
def sub_cmd_chart(args): instance_id = args.sii instance = get_instance(instance_id) start_time = instance['start_time'] end_time = instance['end_time'] orders = instance['orders'] md = DBMD(instance['mds']) md.tick_time = end_time config = xq.get_strategy_config(instance['sc']) symbol = config["symbol"] interval = config["kline"]["interval"] title = symbol + ' ' + config['kline']['interval'] + ' ' + config['class_name'] ordersets = [] ordersets.append(orders) chart(title, md, symbol, interval, start_time, end_time, ordersets, args)
def run(args): if not (args.m and args.sc and args.r): exit(1) instance_id = datetime.now().strftime("%Y%m%d-%H%M%S_") + str( uuid.uuid1()) # 每次回测都是一个独立的实例 print('instance_id: %s' % instance_id) config = xq.get_strategy_config(args.sc) module_name = config["module_name"].replace("/", ".") class_name = config["class_name"] symbol = config['symbol'] time_range = args.r start_time, end_time = ts.parse_date_range(time_range) if args.log: logfilename = class_name + "_" + symbol + "_" + time_range + "_" + instance_id + ".log" print(logfilename) log.init("backtest", logfilename) log.info("strategy name: %s; config: %s" % (class_name, config)) engine = BackTest(instance_id, args.m, config) strategy = ts.createInstance(module_name, class_name, config, engine) engine.run(strategy, start_time, end_time) engine.analyze(symbol, engine.orders) _id = bt_db.insert_one( BACKTEST_INSTANCES_COLLECTION_NAME, { "instance_id": instance_id, "start_time": start_time, "end_time": end_time, "orders": engine.orders, "mds": args.m, "sc": args.sc, }, ) if args.chart: engine.chart(symbol, start_time, end_time, args)
parser.add_argument('-direction', choices=[bl.DIRECTION_LONG, bl.DIRECTION_SHORT], help='direction') parser.add_argument('-action', choices=[bl.OPEN_POSITION, bl.CLOSE_POSITION], help='action') #parser.add_argument('-pr', type=float, default=0, help='postion rate') parser.add_argument('-rmk', help='remark') args = parser.parse_args() print(args) if not (args.sii and args.action): parser.print_help() exit(1) instance = get_strategy_instance(args.sii) config = xq.get_strategy_config(instance['config_path']) re = RealEngine(args.sii, instance['exchange'], config, instance['value']) symbol = config['symbol'] klines = re.md.get_klines(symbol, config["kline"]["interval"], 1) if len(klines) <= 0: exit(1) cur_price = float(klines[-1][re.md.get_kline_seat_close()]) pst_info = re.get_position(symbol, cur_price) if args.action == bl.OPEN_POSITION: pst_rate = 1 else: pst_rate = 0 print('before position info: %s' % (pst_info))
realEngine = RealEngine(instance_id, exchange_name, config, value) orders = realEngine.get_orders(symbol) realEngine.view(symbol, orders) def real_analyze(config, instance_id, exchange_name, value, display_rmk): symbol = config['symbol'] realEngine = RealEngine(instance_id, exchange_name, config, value) orders = realEngine.get_orders(symbol) realEngine.analyze(symbol, orders, display_rmk) if __name__ == "__main__": parser = argparse.ArgumentParser(description='real') parser.add_argument('-e', help='exchange') parser.add_argument('-sc', help='strategy config') parser.add_argument('-sii', help='strategy instance id') parser.add_argument('-v', type=int, help='value') parser.add_argument('--debug', help='debug', action="store_true") parser.add_argument('--log', help='log', action="store_true") args = parser.parse_args() print(args) if not (args.e and args.sc and args.sii and args.v): parser.print_help() exit(1) config = xq.get_strategy_config(args.sc) real_run(config, args.sii, args.e, args.v, args)
def real2_analyze(args): instance = si.get_strategy_instance(args.sii) config = xq.get_strategy_config(instance['config_path']) real_analyze(config, args.sii, instance['exchange'], instance['value'], args.hl, args.rmk)
def real2_view(args): instance = si.get_strategy_instance(args.sii) config = xq.get_strategy_config(instance['config_path']) real_view(config, args.sii, instance['exchange'], instance['value'])