Beispiel #1
0
    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
        """
Beispiel #2
0
    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
Beispiel #3
0
    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
        """
Beispiel #4
0
    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
Beispiel #5
0
    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
Beispiel #6
0
    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
Beispiel #7
0
    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