Files
chan.py/Debug/strategy_demo6.py
T
2025-06-10 01:16:09 +08:00

78 lines
2.2 KiB
Python

import json
from typing import Dict, TypedDict
import xgboost as xgb
from strategy_demo5 import stragety_feature
from BuySellPoint.BS_Point import CBS_Point
from Chan import CChan
from ChanConfig import CChanConfig
from ChanModel.Features import CFeatures
from Common.CEnum import AUTYPE, DATA_SRC, KL_TYPE
from Common.CTime import CTime
class T_SAMPLE_INFO(TypedDict):
feature: CFeatures
is_buy: bool
open_time: CTime
def predict_bsp(model: xgb.Booster, last_bsp: CBS_Point, meta: Dict[str, int]):
missing = -9999999
feature_arr = [missing] * len(meta)
for feat_name, feat_value in last_bsp.features.items():
if feat_name in meta:
feature_arr[meta[feat_name]] = feat_value
feature_arr = [feature_arr]
dtest = xgb.DMatrix(feature_arr, missing=missing)
return model.predict(dtest)
if __name__ == "__main__":
"""
本demo主要演示如何在实盘中把策略产出的买卖点,对接到demo5中训练好的离线模型上
"""
code = "BTC/USDT"
begin_time = "2023-11-30"
end_time = None
data_src = DATA_SRC.CCXT
lv_list = [KL_TYPE.K_DAY]
config = CChanConfig({
"trigger_step": True, # 打开开关!
})
chan = CChan(
code=code,
begin_time=begin_time,
end_time=end_time,
data_src=data_src,
lv_list=lv_list,
config=config,
autype=AUTYPE.QFQ,
)
model = xgb.Booster()
model.load_model("model.json")
meta = json.load(open("feature.meta", "r"))
treated_bsp_idx = set()
for chan_snapshot in chan.step_load():
# 策略逻辑要对齐demo5
last_klu = chan_snapshot[0][-1][-1]
bsp_list = chan_snapshot.get_bsp()
if not bsp_list:
continue
last_bsp = bsp_list[-1]
cur_lv_chan = chan_snapshot[0]
if last_bsp.klu.idx in treated_bsp_idx or cur_lv_chan[-2].idx != last_bsp.klu.klc.idx:
continue
last_bsp.features.add_feat(stragety_feature(last_klu)) # 开仓K线特征
# 买卖点打分,应该和demo5最后的predict结果完全一致才对
print(last_bsp.klu.time, predict_bsp(model, last_bsp, meta))
treated_bsp_idx.add(last_bsp.klu.idx)