港股如何获取价格跳动(price tick)呢?
看futu_gateway中query_contract返回的pricetick是固定的0.001,显然是不对的?
请问大侠,特别是futu里哪个api可以返回正确的pricetick呢?
` 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)
在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)
`
在尝试吧atr_rsi_strategy转成portfoliostrategy的过程中。发现ctastrategy使用停止单来平仓。但是portfoliostrategy只有限价单,所以需要使用限价单来模拟停止单。
通过log对比,发现portfoliostrategy的rebalance_portfolio应该有bug,是错误的!不知道是我理解有误,还是确实有bug呢?
核心修改如下,也就是说需要使用sell来代替cover来卖平对应的short买开,使用cover来代替sell来买平对应的buy买开