VeighNa量化社区
你的开源社区量化交易平台
Member
离线
11 帖子
声望: 0

港股如何获取价格跳动(price tick)呢?
看futu_gateway中query_contract返回的pricetick是固定的0.001,显然是不对的?
请问大侠,特别是futu里哪个api可以返回正确的pricetick呢?

上面应该确实是我理解有误。抱歉。
限价单不是这么用的!

嗯,回测画图后明白了。
intra_trade_high 从高点跌下来的时候,会触发止盈。
intra_trade_low 从低点上涨后,同样会触发止盈

` def add_parameter_list(
self,
name: str,
value_list: List[float]
) -> Tuple[bool, str]:
self.params[name] = value_list

    return True, f"列表参数添加成功,数量{len(value_list)}"

def add_constrait(self, constraint: Callable[[dict], bool]):
    self.constraint = constraint

def generate_settings(self) -> List[dict]:
    """"""
    keys: dict_keys = self.params.keys()
    values: dict_values = self.params.values()
    products: list = list(product(*values))

    settings: list = []
    for p in products:
        setting: dict = dict(zip(keys, p))
        if self.constraint is None or self.constraint(setting) is True:
            settings.append(setting)

    print(f"generate_settings: {len(settings)}/{len(products)}")

    return settings

`

使用例子

         opt_setting.add_parameter_list("signal_window", [15, 30, 60, 120])
            opt_setting.add_parameter("short_entry_window", 10, 40, 2)
            opt_setting.add_parameter("short_exit_window", 6, 30, 2)
            # opt_setting.add_parameter("keltner_dev", 0, 3, 0.5)

            # opt_setting.add_parameter("long_entry_window", 20, 60, 2)
            # opt_setting.add_parameter("long_exit_window", 10, 40, 2)

            opt_setting.add_parameter("cci_window", 8, 30, 2)
            opt_setting.add_parameter("cci_signal", 8, 40, 4)
            opt_setting.add_parameter("n_window", 10, 30, 2)
            opt_setting.add_parameter("unit_limit", 1, 6, 1)
            # opt_setting.add_parameter("trading_size", 1, 4, 1)

            # opt_setting.add_parameter("pnl_filter", True,
            # opt_setting.add_parameter("price_add", 0.2, 2, 0.2)

            opt_setting.add_constrait(lambda params: params["short_exit_window"] < params["short_entry_window"])

            # %%
            engine.run_ga_optimization(opt_setting, max_workers=max_workers)

没有指定datafeed。
需要在设置中配置有效的datafeed

在atr_rsi_strategy策略中,只有止损出场?
怎么处理止盈呢?
只有止损没有处理止盈,怎么会有盈利呢?

` def on_bar(self, bar: BarData):
"""
Callback of new bar data update.
"""
self.cancel_all()

    am = self.am
    am.update_bar(bar)
    if not am.inited:
        return

    atr_array = am.atr(self.atr_length, array=True)
    self.atr_value = atr_array[-1]
    self.atr_ma = atr_array[-self.atr_ma_length:].mean()
    self.rsi_value = am.rsi(self.rsi_length)

    if self.pos == 0:
        self.intra_trade_high = bar.high_price
        self.intra_trade_low = bar.low_price

        if self.atr_value > self.atr_ma:
            if self.rsi_value > self.rsi_buy:
                self.buy(bar.close_price + 5, self.fixed_size)
            elif self.rsi_value < self.rsi_sell:
                self.short(bar.close_price - 5, self.fixed_size)

    elif self.pos > 0:
        self.intra_trade_high = max(self.intra_trade_high, bar.high_price)
        self.intra_trade_low = bar.low_price

        long_stop = self.intra_trade_high * \
            (1 - self.trailing_percent / 100)
        self.sell(long_stop, abs(self.pos), stop=True)

    elif self.pos < 0:
        self.intra_trade_low = min(self.intra_trade_low, bar.low_price)
        self.intra_trade_high = bar.high_price

        short_stop = self.intra_trade_low * \
            (1 + self.trailing_percent / 100)
        self.cover(short_stop, abs(self.pos), stop=True)

`

这个是ctastrategy的log:

description

而下面的是portfoliostrategy修改后的log:

description

结果也是一模一样的(否则结果完全不一样),所以是portfoliostrateg的backtesting计算有问题吗?
description

此外,update_trade也需要做相应修改:

description

以及calculate_pnl也需要做相应修改:

description

是不是需要添加put_event来触发更新ui呢

上面写的有个小错误,重新提交下。

在尝试吧atr_rsi_strategy转成portfoliostrategy的过程中。发现ctastrategy使用停止单来平仓。但是portfoliostrategy只有限价单,所以需要使用限价单来模拟停止单。
通过log对比,发现portfoliostrategy的rebalance_portfolio应该有bug,是错误的!不知道是我理解有误,还是确实有bug呢?

核心修改如下,也就是说需要使用sell来代替cover来卖平对应的short买开,使用cover来代替sell来买平对应的buy买开

description

在尝试吧atr_rsi_strategy转成portfoliostrategy的过程中。发现ctastrategy使用停止单来平仓。但是portfoliostrategy只有限价单,所以需要使用限价单来模拟停止单。
通过log对比,发现portfoliostrategy的rebalance_portfolio应该有bug,是错误的!不知道是我理解有误,还是确实有bug呢?

核心修改如下,也就是说需要使用sell来代替cover来卖平对应的short买开,使用cover来代替sell来买平对应的buy买开

description

© 2015-2022 微信 18391752892
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】