from loguru import logger
from datetime import date, datetime, timedelta
from tqsdk import TqApi, TqAuth, TqSim, TqBacktest, TargetPosTask, BacktestFinished
from czsc import Freq, RawBar
from czsc.strategies import CzscStrategyExample2 as Strategy
def format_kline(df, freq=Freq.F1):
rows = df.to_dict('records')
for i, row in enumerate(rows):
bar = RawBar(symbol=row['symbol'], id=i, freq=freq,
dt=datetime.fromtimestamp(row["datetime"] / 1e9) + timedelta(minutes=1),
open=row['open'], close=row['close'], high=row['high'],
low=row['low'], vol=row['volume'], amount=row['volume'] * row['close'])
def run_multi_main_symbol(**kwargs):
tq_user = kwargs.get("tq_user")
tq_pwd = kwargs.get("tq_pwd")
init_money = int(kwargs.get("init_money", 1000000))
sdt = kwargs.get("sdt", "20180101")
edt = kwargs.get("edt", "20230414")
sdt = pd.to_datetime(sdt).date()
edt = pd.to_datetime(edt).date()
api = TqApi(TqSim(init_money), web_gui=True, auth=TqAuth(tq_user, tq_pwd),
backtest=TqBacktest(start_dt=sdt, end_dt=edt))
symbols = ["KQ.m@DCE.i", "KQ.m@DCE.j", "KQ.m@DCE.jm", "KQ.m@SHFE.hc", "KQ.m@SHFE.rb"]
pos_multiplier = {"KQ.m@DCE.i": 3, "KQ.m@DCE.j": 1, "KQ.m@DCE.jm": 2, "KQ.m@SHFE.hc": 5, "KQ.m@SHFE.rb": 5}
metas = {symbol: {} for symbol in symbols}
tactic = Strategy(symbol=symbol)
kline = api.get_kline_serial(symbol, int(tactic.base_freq.strip('分钟')) * 60, data_length=10000, adj_type='B')
quote = api.get_quote(symbol)
raw_bars = format_kline(kline, freq=tactic.base_freq)
trader = tactic.init_trader(raw_bars, sdt=date(2017, 10, 1))
target_pos = TargetPosTask(api, quote.underlying_symbol)
"base_freq": tactic.base_freq,
"target_pos": target_pos
while api.wait_update():
for symbol, meta in metas.items():
target_pos = meta["target_pos"]
if api.is_changing(quote, "underlying_symbol"):
logger.info(f"主力换月:{quote.datetime} - {quote.underlying_symbol}")
target_pos.set_target_volume(0)
target_pos = TargetPosTask(api, quote.underlying_symbol)
if api.is_changing(kline.iloc[-1], "datetime"):
new_bars = format_kline(kline.tail(10), freq=meta['base_freq'])
new_bars = [x for x in new_bars if x.dt > trader.end_dt]
target_pos.set_target_volume(trader.get_ensemble_pos('vote') * pos_multiplier[symbol])
"base_freq": meta['base_freq'],
"target_pos": target_pos
except BacktestFinished as e:
if __name__ == '__main__':