def take_profit(self, position_info, cur_price): """ 止盈 """ tp_signals = [] if "high" not in position_info: return tp_cfg tp_cfg = self.config["risk_control"]["take_profit"] if "base_buy" in tp_cfg and tp_cfg["base_buy"] > 0 and ( position_info["high"] - cur_price) / position_info["price"] > tp_cfg["base_buy"]: tp_signals.append( xq.create_signal( xq.SIDE_SELL, 0, " 止盈", "盈利回落,基于持仓价的{:8.2%}".format(tp_cfg["base_buy"]))) if "base_high" in tp_cfg and tp_cfg[ "base_high"] > 0 and cur_price / position_info["high"] < ( 1 - tp_cfg["base_high"]): tp_signals.append( xq.create_signal( xq.SIDE_SELL, 0, " 止盈", "盈利回落,基于最高价的{:8.2%}".format(tp_cfg["base_high"]))) return tp_signals """
def stop_loss(self, position_info, cur_price): """ 止损 """ sl_signals = [] # 风控第一条:亏损金额超过额度的10%,如额度1000,亏损金额超过100即刻清仓 limit_mode = self.config["mode"] limit_value = self.value if limit_mode == 0: pass elif limit_mode == 1: limit_value += position_info["history_profit"] else: self.log_error("请选择额度模式,默认是0") sl_cfg = self.config["risk_control"]["stop_loss"] if "base_value" in sl_cfg and sl_cfg[ "base_value"] > 0 and limit_value * sl_cfg[ "base_value"] + position_info["profit"] <= 0: sl_signals.append( xq.create_signal( xq.SIDE_SELL, 0, " 止损", "亏损金额超过额度的{:8.2%}".format(sl_cfg["base_value"]), ts.get_next_open_timedelta(self.now()))) # 风控第二条:当前价格低于持仓均价的90%,即刻清仓 pst_price = position_info["price"] if pst_price > 0 and "base_price" in sl_cfg and sl_cfg[ "base_price"] > 0 and cur_price / pst_price <= ( 1 - sl_cfg["base_price"]): sl_signals.append( xq.create_signal( xq.SIDE_SELL, 0, " 止损", "下跌了持仓均价的{:8.2%}".format(sl_cfg["base_price"]))) return sl_signals
def take_profit(self, position_info, cur_price): """ 止盈 """ tp_signals = [] if "high" not in position_info: return tp_cfg tp_cfg = self.config["risk_control"]["take_profit"] if position_info["direction"] == xq.DIRECTION_LONG: price_offset = position_info["high"] - cur_price else: price_offset = cur_price - position_info["low"] if "base_open" in tp_cfg: for bo_band in tp_cfg["base_open"]: high_profit_rate = position_info["high"] / position_info[ "price"] - 1 cur_profit_rate = cur_price / position_info["price"] - 1 fall_profit_rate = high_profit_rate - cur_profit_rate if high_profit_rate > bo_band[0]: self.log_info("base_open tp_cc 1 = %s" % self.tp_cc["base_open"]) if fall_profit_rate >= bo_band[1]: self.tp_cc["base_open"] += 1 self.log_info("base_open tp_cc 2 = %s" % self.tp_cc["base_open"]) if self.tp_cc["base_open"] >= 1: tp_signals.append( xq.create_signal( position_info["direction"], xq.CLOSE_POSITION, 0, " 止盈", "盈利回落(基于持仓价) fall rate:{:8.2%} ( {:8.2%}, {:8.2%} )" .format(fall_profit_rate, bo_band[0], bo_band[1]))) else: self.tp_cc["base_open"] = 0 break if position_info["direction"] == xq.DIRECTION_LONG: price_rate = cur_price / position_info["high"] else: price_rate = position_info["low"] / cur_price if "base_high" in tp_cfg and tp_cfg["base_high"] > 0 and price_rate < ( 1 - tp_cfg["base_high"]): tp_signals.append( xq.create_signal( position_info["direction"], xq.CLOSE_POSITION, 0, " 止盈", "盈利回落,基于最高价的{:8.2%}".format(tp_cfg["base_high"]))) return tp_signals """
def check(self, symbol): """ kdj指标,金叉全买入,死叉全卖出 """ klines = self.engine.get_klines_1day(symbol, 300) self.cur_price = float(klines[-1][4]) kdj_arr = ic.np_kdj(klines) cur_k = kdj_arr[-1][1] cur_d = kdj_arr[-1][2] cur_j = kdj_arr[-1][3] y_k = kdj_arr[-2][1] y_d = kdj_arr[-2][2] y_j = kdj_arr[-2][3] """ self.cur_price = pd.to_numeric(k1d["close"].values[-1]) ic.calc_kdj(k1d) cur_k = k1d["kdj_k"].values[-1] cur_d = k1d["kdj_d"].values[-1] cur_j = k1d["kdj_j"].values[-1] """ logging.info(" current kdj J(%f), K(%f), D(%f)", cur_j, cur_k, cur_d) check_signals = [] offset = 1 if (cur_j - offset) > cur_k > (cur_d + offset): # 开仓 # 满仓买入 check_signals.append( xq.create_signal(xq.SIDE_BUY, 1, "开仓:j-%g > k > d+%g" % (offset, offset))) elif (cur_j + offset) < cur_k < (cur_d - offset): # 平仓 # 清仓卖出 check_signals.append( xq.create_signal(xq.SIDE_SELL, 0, "平仓:j+%g < k < d-%g" % (offset, offset))) else: pass return check_signals
def stop_loss(self, position_info, cur_price): """ 止损 """ sl_signals = [] # 风控第一条:亏损金额超过额度的10%,如额度1000,亏损金额超过100即刻清仓 limit_mode = self.config["mode"] limit_value = self.value if limit_mode == 0: pass elif limit_mode == 1: limit_value += position_info["history_profit"] else: self.log_error("请选择额度模式,默认是0") sl_cfg = self.config["risk_control"]["stop_loss"] sl_td_h = ts.get_next_open_timedelta(self.now()) if "base_value" in sl_cfg and sl_cfg[ "base_value"] > 0 and limit_value * sl_cfg[ "base_value"] + position_info["floating_profit"] <= 0: sl_signals.append( xq.create_signal( position_info["direction"], xq.CLOSE_POSITION, 0, " 止损", "亏损金额超过额度的{:8.2%}".format(sl_cfg["base_value"]), sl_td_h)) # 风控第二条:当前价格低于持仓均价的90%,即刻清仓 pst_price = position_info["price"] if position_info["direction"] == xq.DIRECTION_LONG: loss_rate = 1 - (cur_price / pst_price) else: loss_rate = (cur_price / pst_price) - 1 if pst_price > 0 and "base_price" in sl_cfg and sl_cfg[ "base_price"] > 0 and loss_rate >= sl_cfg["base_price"]: sl_signals.append( xq.create_signal( position_info["direction"], xq.CLOSE_POSITION, 0, " 止损", "下跌了持仓均价的{:8.2%}".format(sl_cfg["base_price"]), sl_td_h)) return sl_signals
def risk_control(self, position_info, cur_price): """ 风控,用于止损 """ rc_signals = [] # 风控第一条:亏损金额超过额度的10%,如额度1000,亏损金额超过100即刻清仓 limit_mode = self.config["limit"]["mode"] limit_value = self.config["limit"]["value"] if limit_mode == 0: pass elif limit_mode == 1: limit_value += position_info["history_profit"] else: logging("请选择额度模式,默认是0") loss_limit = limit_value * 0.1 if loss_limit + position_info["profit"] <= 0: rc_signals.append(xq.create_signal(xq.SIDE_SELL, 0, "风控平仓:亏损金额超过额度的10%", ts.get_next_open_timedelta(self.now()))) # 风控第二条:当前价格低于持仓均价的90%,即刻清仓 pst_price = position_info["price"] if pst_price > 0 and cur_price / pst_price <= 0.9: rc_signals.append(xq.create_signal(xq.SIDE_SELL, 0, "风控平仓:当前价低于持仓均价的90%")) return rc_signals
def check(self, symbol): """ kdj指标,金叉全买入,下降趋势部分卖出,死叉全卖出 """ klines = self.engine.get_klines_1day(symbol, 300) self.cur_price = float(klines[-1][4]) kdj_arr = ic.np_kdj(klines) cur_k = kdj_arr[-1][1] cur_d = kdj_arr[-1][2] cur_j = kdj_arr[-1][3] y_k = kdj_arr[-2][1] y_d = kdj_arr[-2][2] y_j = kdj_arr[-2][3] """ k, d, j = ic.pd_kdj(klines, self.engine.get_kline_column_names()) cur_k = k.values[-1] cur_d = d.values[-1] cur_j = j.values[-1] y_k = k.values[-2] y_d = d.values[-2] y_j = j.values[-2] """ logging.info(" current kdj J(%f), K(%f), D(%f)", cur_j, cur_k, cur_d) logging.info("yestoday kdj J(%f), K(%f), D(%f)", y_j, y_k, y_d) check_signals = [] offset = 1 if cur_j - offset > cur_k > cur_d + offset: if cur_j > y_j + offset and cur_k > y_k + offset: # 上升趋势,满仓买入 check_signals.append( xq.create_signal(xq.SIDE_BUY, 1, "开仓:j-%g > k > d+%g" % (offset, offset))) elif cur_j < y_j - offset: # 下降趋势 if cur_k < y_k - offset: # j、k 同时下降,最多保留半仓 check_signals.append( xq.create_signal(xq.SIDE_SELL, 0.5, "减仓:j、k 同时下降")) elif cur_k > y_k + offset: # j 下落,最多保留8成仓位 check_signals.append( xq.create_signal(xq.SIDE_SELL, 0.8, "减仓:j 下落")) else: pass else: pass elif cur_j + offset < cur_k < cur_d - offset: # 清仓卖出 check_signals.append( xq.create_signal(xq.SIDE_SELL, 0, "平仓:j+%g < k < d-%g" % (offset, offset))) else: pass return check_signals