今天星球同学提了一个问题, 平时用 通达信选股有个自选股池, 怎么借助miniqmt监听股票池个股 价格、成交量 变化。 实际需求肯定比这个复杂, 这里就以 类似的场景为例,写一个例子。监听通达信自选股, 通过miniqmt获取 昨日的成交量, 以及实时监听今日的成交量, 如果今日 成交量>昨日的成交量,则打印。 有些同学希望做爆量逻辑,比如9点40分之前 成交量爆量, 量价起升, 就可以用类似的思路。 这里只是提供技术思路和代码, 至于是否用于实际场景,自己评估, 亏钱了不要找我。1、我们先找到通达信自选股的路径,我这里设置的 D:\new_tdx\T0002\blocknew\zxg.blk , 你需要改成自己的路径。举个例0002165 、1600727, 我们可以知道0 开头是 深圳深股, 1开头是上海沪股。我们需要把自选股 改成miniqmt是识别的 002165.SZ, 600727.SH 这类的代码。 这些代码我只是举例3、利用xtdata.get_market_data 获取 日线数据获取昨日的成交量4、利用订阅xtdata.subscribe_whole_quote 获取股票今日的价格、成交量。5、自己的量化逻辑处理后,就可以直接借助order_stock下单。 通过miniqmt下单可以参考下 我封装的 交易常见操作封装类方法。如果你有miniqmt 开户需求,可以找我私聊,门槛低, 费率优惠。最后附上完整代码,需要的自取。 备注:如果发现格式有多余的特殊字符,用普通浏览器打开复制应该没问题。import osimport timeimport pandas as pdfrom xtquant import xtdatafrom xtquant.xttrader import XtQuantTraderdefconvert_blk_to_qmt(blk_codes): valid_codes = [] for code in blk_codes: code = code.strip() iflen(code) 7: continue prefix_char = code[0] stock_num = code[1:].lstrip('0').zfill(6) if prefix_char == '0': valid_codes.append(f"{stock_num}.SZ") elif prefix_char == '1': valid_codes.append(f"{stock_num}.SH") elif prefix_char == '9': valid_codes.append(f"{stock_num}.BJ") return valid_codesdefload_block_stocks(block_path): """读取.blk文件并转换为标准代码""" try: withopen(block_path, 'r', encoding='utf-8') as f: raw_codes = [line.strip() for line in f if line.strip()] return convert_blk_to_qmt(raw_codes) except Exception as e: print(f"读取自选股文件失败: {e}") return []block_path = r"D:\new_tdx\T0002\blocknew\zxg.blk"last_volume = {} monitored_stocks = set() trader = XtQuantTrader("", 123456) subscribe_seq = None defon_data(datas): global last_volume, monitored_stocks for stock_code, data in datas.items(): if stock_code notin monitored_stocks: continue realtime_vol = data.get('volume', 0) ifisinstance(realtime_vol, pd.Series): realtime_vol = realtime_vol.iloc[-1].item() prev_vol = last_volume.get(stock_code, 0) ifisinstance(prev_vol, pd.Series): prev_vol = prev_vol.iloc[-1].item() if realtime_vol > prev_vol and prev_vol > 0: print(f"[信号] {stock_code} 实时成交量({realtime_vol}) > 昨日成交量({prev_vol})") defmain(): global last_volume, monitored_stocks, subscribe_seq last_mtime = 0 stocks = load_block_stocks(block_path) monitored_stocks = set(stocks)
print(f"初始监控列表: {monitored_stocks}") for stock in monitored_stocks: df = xtdata.get_market_data(stock_list=[stock], period='1d', count=1) if df isnotNone and'volume'in df: volume_data = df['volume'].iloc[-1] ifhasattr(volume_data, '__len__') andlen(volume_data) > 1: last_volume[stock] = volume_data[0] else: last_volume[stock] = volume_data print(f"初始化 {stock} 昨日成交量: {last_volume[stock]}") else: print(f"警告:无法获取 {stock} 的昨日成交量") subscribe_seq = xtdata.subscribe_whole_quote(list(monitored_stocks), callback=on_data) print(f"订阅序列号: {subscribe_seq}") whileTrue: try: current_mtime = os.path.getmtime(block_path) if current_mtime != last_mtime: print("检测到自选股文件变化,重新加载...") new_stocks = set(load_block_stocks(block_path)) added = new_stocks - monitored_stocks for stock in added: df = xtdata.get_market_data(stock_list=[stock], period='1d', count=1) if df isnotNoneandnot df.empty and'volume'in df: last_volume[stock] = df['volume'].iloc[-1].item() print(f"新增 {stock} 昨日成交量: {last_volume[stock]}") else: print(f"警告:无法获取 {stock} 的昨日成交量") if subscribe_seq isnotNone: xtdata.unsubscribe_quote(subscribe_seq) subscribe_seq = xtdata.subscribe_whole_quote(list(new_stocks), callback=on_data) monitored_stocks = new_stocks last_mtime = current_mtime print(f"更新后监控列表: {monitored_stocks}") time.sleep(5) except Exception as e: print(f"监控循环异常: {e}") time.sleep(10)if __name__ == "__main__": main()
如果我的分享对你投资有所帮助,不吝啬给个点赞关注呗。
如果对每日复盘感兴趣,欢迎关注我另外一个号。重在市场理解(大盘情绪、 热门概念板块、 热门个股), 技术只是辅助。