def generateCandidateCode(dbh, setup): logic = {} desc = formatCommentStrings(setup) hdr = setHeader(setup) logic["lsb"] = lsbLogic(setup) logic["poi"] = poiLogic(dbh, setup) logic["filters"] = filterLogic(dbh, setup) logic["tseg"] = timeSegmentLogic(setup) logic["stop_loss"] = stopLossLogic(setup) logic["profit_target"] = profitTargetLogic(setup) logger.debug(logic) pprint.pprint(logic) if not good_logic(logic): warn("Not Good Logic") return None logger.debug(setup) pprint.pprint(setup) strat = processStrategyTemplate(setup["template_version"], hdr, desc, setup, logic) logger.debug(f"write Candidate to {setup['strategy_file']}") open(setup["strategy_file"], "w").write(strat) return strat
def add_non_optimized_settings(dbh, proto_id, cand_params): logger.debug(f"add_non_optimized_settings(dbh, {proto_id}, {cand_params}):") proto_settings = queryPrototypeParams(dbh, proto_id) for setting in proto_settings: if setting.name not in cand_params.keys(): if setting.input_type != "var": warn( f"add_non_optimized_settings: setting should be var for proto {proto_id} var {setting.name} !!!!" ) continue cand_params[setting.name] = setting.value
def parseInput(param): logger.debug(f"parseInput({param.input_type}):") logger.debug(f"parseInput({param.value}):") if param.input_type == "range": return param.name, addInputRange(param) elif param.input_type == "list": return param.name, addInputList(param) elif param.input_type == "var": return param.name, addInputVar(param) else: warn(f"input_type({param.input_type}) not coded for, id={param.id}")
def poiLogic(dbh, setup): logger.debug("================= poiLogic") logger.debug(setup) pprint.pprint(setup) id_list = glom(setup, "opt_inputs.poi.value", default=None) logger.debug(f"id_list = {id_list}") if not id_list: id_list = glom(setup, "param_vars.poi.value", default=None) logger.debug(f"not id_list: {id_list}") # new logic: candidate if not id_list: id_list = glom(setup, "vars.poi.setting", default=None) logger.debug(f"poi id = {id_list}") logic = [] if id_list == "" or id_list == None: return logic ids = id_list if isinstance(id_list, str): logger.debug("id_list is a str") ids = id_list.split(",") if len(ids) == 0: return [] for id in ids: logger.debug(f"for id is{id}") q = queryPoi(dbh, id) if not q: # logic = None warn(f"poiLogic: No POI logic for id: {id}") continue logger.debug("append to logic") logic.append({ "poi_id": id, "common": q.common_logic, "long": q.long_logic, "short": q.short_logic, }) logger.debug("check vars") if q.vars: for v in q.vars.split(";"): logger.debug(f"for v is {v}") name, dtype, value = v.split(":") # setup["param_vars"][name] = {"d_type": dtype, "value": value} setup["vars"][name] = { "d_type": dtype, "setting": value, "el_block": "variable", } #'opt_inputs': {'filter_1': {'dtype': 'int', # 'type': 'distinct', # 'value': [2, 5, 6]}, return logic
def timeSegmentLogic(setup): seg = glom(setup, "opt_inputs.time_segment.value", default=None) if not seg: seg = glom(setup, "param_vars.time_segment.value", default=None) # new logic: candidate if not seg: seg = glom(setup, "vars.time_segment.setting", default=None) tseg = calcTimeSegmentSize(setup["sess_start"], setup["sess_end"]) timeframe = int(setup["timeframes"][0]["tf"]) sess_start = setup["sess_start"] sess_end = setup["sess_end"] if len(seg) > 1: code = f""" Switch (time_segment) begin case 0: begin time_filter = True; end; case 1 : begin time_filter = time > {sess_start} and time <= {add2hhmm(sess_start, tseg)}; end; case 2 : begin time_filter = time > {add2hhmm(sess_start, tseg)} and time <= {add2hhmm(sess_start, (2*tseg) )}; end; case 3 : begin time_filter = time > {add2hhmm(sess_start, (2*tseg))} and time < {add2hhmm(sess_end,-timeframe)}; end; end; """ elif len(seg) == 1: if seg[0] == "0": code = f"time_filter = True;" elif seg[0] == "1": code = f"time_filter = time > {sess_start} and time <= {add2hhmm(sess_start, tseg)};" elif seg[0] == "2": code = f"time_filter = time > {add2hhmm(sess_start, tseg)} and time <= {add2hhmm(sess_start, (2*tseg) )};" elif seg[0] == "3": code = f"time_filter = time > {add2hhmm(sess_start, (2*tseg))} and time < {add2hhmm(sess_end,-timeframe)};" else: warn(f"timeSegmentLogic({seg}) NOT CODED") else: code = f"time_filter = True;" return code
def generateStrategyCode(dbh, setup): logic = {} desc = "" # formatCommentStrings(setup) hdr = "" # setHeader(setup) logic["lsb"] = lsbLogic(setup) logic["poi"] = poiLogic(dbh, setup) logic["filters"] = filterLogic(dbh, setup) logic["tseg"] = timeSegmentLogic(setup) logic["stop_loss"] = stopLossLogic(setup) logic["profit_target"] = profitTargetLogic(setup) setup["logic"] = {} setup["logic"]["lsb"] = lsbLogic(setup) setup["logic"]["poi"] = poiLogic(dbh, setup) setup["logic"]["filters"] = filterLogic(dbh, setup) setup["logic"]["tseg"] = timeSegmentLogic(setup) setup["logic"]["stop_loss"] = stopLossLogic(setup) setup["logic"]["profit_target"] = profitTargetLogic(setup) logger.debug(logic) pprint.pprint(logic) if not good_logic(logic): warn("Not Good Logic") return None logger.debug(setup) pprint.pprint(setup) hdr = "" desc = {} desc["chart_setup"] = "" desc["prototype_info"] = "" strat = processStrategyTemplate(setup["strategy_template_v"], hdr, desc, setup, logic) logger.debug(f"write Strategy to {setup['strategy_file']}") open(setup["strategy_file"], "w").write(strat) return strat
def getStrategySetup(dbh, strat_id): logger.debug(f"strat_id = {strat_id}") strat = queryStrategy(dbh, strat_id) settings = queryStrategySettings(dbh, strat_id) params = queryStrategyParams(dbh, strat_id) setup = {} setup["strat_id"] = strat_id setup["cand_id"] = strat.cand_id setup["strategy_template_v"] = strat.strategy_template_v setup["oos_curve_template_v"] = strat.oos_curve_template_v setup["jcl_version"] = strat.jcl_version setup["symbol"] = strat.symbol setup["chart_series"] = strat.chart_series setup["reopt_param_names"] = strat.reopt_param_names setup["fitness_func"] = strat.fitness_function setup["max_bars_back"] = strat.max_days_back setup["oosPercentLast"] = 0 setup["session_num"] = strat.market_session_id setup["session_name"] = f"session {strat.market_session_id}" setup["strategy_file"] = strat.strategy_file setup["strategy_oos_file"] = strat.strategy_oos_file setup["sess_start"], setup["sess_end"] = setSessionVars( dbh, setup["session_num"]) setup["data_series"] = setDataSeries(setup["chart_series"]) setup["vars"] = {} setup["counts"] = {} setup["counts"]["el_vars"] = 0 setup["counts"]["el_inputs"] = 0 setup["counts"]["data_series"] = 0 setup["opt_inputs"] = {} for p in params: logger.debug(f"params: p={p.name}") param_name, param_setup = parseInput(p) setup["opt_inputs"][param_name] = param_setup setup["vars"][param_name] = param_setup setup["param_vars"] = {} for s in settings: logger.debug(f"settings: s={s.name}") setup["vars"].setdefault(s.name, {})["d_type"] = s.data_type setup["vars"][s.name]["setting"] = s.value for k in setup["vars"]: logger.debug(f"vars: k={k}") if "value" in setup["vars"][k].keys() and isinstance( setup["vars"][k]["value"], (list, )): setup["vars"][k]["el_block"] = "input" setup["counts"]["el_inputs"] += 1 else: setup["vars"][k]["el_block"] = "variable" setup["counts"]["el_vars"] += 1 setup["var_names"] = [] setup["input_names"] = [] for k, v in setup["vars"].items(): logger.debug(f"items: {v}") pprint.pprint(f"*getCandidateSetup: items: {v}") if v["el_block"] == "input": setup["input_names"].append(k) elif v["el_block"] == "variable": setup["var_names"].append(k) else: warn( f"el_block not defined, strat_id={setup['strat_id']}, var={k}") setup["timeframes"] = [] for ds in setup["chart_series"].split(","): i, symbol, tf, unit = ds.split(":") tf_d = {"ds": i, "symbol": symbol, "tf": tf, "unit": unit} setup["timeframes"].append(tf_d) setup["counts"]["data_series"] += 1 dir = f"{ats_dir}/Data/StrategyCode/" if platform.system() == "Windows": dir = str(PureWindowsPath(ats_dir_win / strategy_code_dir)) setup["strategy_name"] = f"strat_{strat_id}" setup["strategy_file"] = f"{dir}/{setup['strategy_name']}" dir = f"{ats_dir}/Data/OptimizationApiCode/" if platform.system() == "Windows": dir = str(PureWindowsPath(ats_dir_win / jcl_code_dir)) setup["jcl_file"] = f"{dir}{setup['strategy_name']}.jcl" return setup