当前位置:首页>python>利用Python脚本实现监控QMT持仓个股冲高回落卖出

利用Python脚本实现监控QMT持仓个股冲高回落卖出

  • 2026-03-26 08:27:22
利用Python脚本实现监控QMT持仓个股冲高回落卖出

    起因是A 股短线交易中,个股冲高后快速回落是高频场景,“上班族”没有时刻盯盘,手动输入不仅效率低下,还容易错过最佳止盈时机。而每个券商app中基本有条件单的设置,我的想法就源于冲高回落卖出的条件单。

这个是以同花顺为例的界面:

缺点是要挨个输入,有点麻烦。

    所以我按这个思路写了脚本,盘中监控全部持仓个股。主要实现2个功能:1.如果个股当日最高价涨幅≥7%,从高点回撤≥2% 卖出半仓;2.监控持仓中涨停的个股封单强度,封单不足时提前卖出一半止盈。

这是昨天礼拜五的实盘效果:

这是冲高回落卖出的两个个股。

下面我主要介绍下我的思路。各位网友也帮我想下,有啥功能补充。

、策略核心逻辑

这个方案主要针对短线反转策略持仓设计做辅助的中长线的票要卖飞

1.交易时段:在A 股交易时间(9:30-11:30、13:00-15:00)运行

2.监控触发:持仓个股当日最高价相对昨日收盘价涨幅>7%,加入监控列表

3.卖出条件1(回撤止盈):从当日最高价回撤≥2%,卖出半仓

4.卖出条件2(涨停风控):个股涨停,但买一封单<2 万手,卖出半仓

5.卖出后写入日志,然后企业微信推送过来消息。

6.冷却机制:卖出后移入冷却区,当股价创新高时重新监控,循环上面的卖出机制。

二、监控流程图

三、脚本缺陷及改进方向

1.无盈亏判断无论持仓是盈利还是亏损,只要触发条件就卖出。(我请教过同事,也问过老股名,有人告诉我应该关注成本,也有人跟我讲成本不应该是你卖股票的原因)。但是这里我觉得改进的方向应该留一个开关,供大家自己选择。“是否允许亏损卖出”False/True。

2.涨停监控简陋仅判断卖盘是否为空,买一有封单,无涨停价校验,容易误判。(我找到,想不到好的判断涨停的方法,难道要根据市场5%,10%,20%,30%判断吗?get_full_tick()里面是没有涨停价格的

3.冲高,回落,都应该改成变量参数可设置。

4.涨停个股如果是“烂板”,反复震荡的话,仓位很快被卖空。逻辑上应该优化下。

附脚本代码

    冲高回落止卖出的脚本根据自己的交易习惯,调整涨幅阈值、回撤阈值、封单阈值,适配不同市场环境(牛市/ 震荡市 / 熊市)。

import timeimport datetimeimport pandas as pdfrom collections import defaultdictfrom threading import Lockfrom loguru import loggerfrom xtquant.xttrader import XtQuantTrader, XtQuantTraderCallbackfrom xtquant.xttype import StockAccountfrom xtquant import xtconstantimport xtquant.xtdata as xtdata# ========== 企业微信日志配置 ==========from Logger_wx import init_loginit_log('企业微信机器人id')# ========== 全局配置区(用户可修改) ==========PATH = 'D:/QMT实盘-交易端/userdata_mini/'  # 极简版QMT的路径ACCOUNT_ID = '券商账号'  # 券商客户号HUADIAN = 0.01  # 滑点(元)# 监控配置MONITOR_INTERVAL = 3  # 监控间隔(秒)# 交易时间配置AM_START = datetime.time(930)AM_END = datetime.time(1130)PM_START = datetime.time(130)PM_END = datetime.time(150)  # 15:00结束监控# 涨停封单阈值(股)LIMIT_UP_BID_VOL_THRESHOLD = 200_0000  # 2万手 = 200万股# ========== 交易回调类 ==========class MyXtQuantTraderCallback(XtQuantTraderCallback):    # 状态码映射    ORDER_STATUS_MAP = {        48'未报',        49'待报',        50'已报',        51'已报待撤',        52'部成待撤',        53'部撤',        54'已撤',        55'部成',        56'已成',        57'废单',        255'未知'    }    def _get_stock_name(self, code):        """获取股票名称"""        try:            detail = xtdata.get_instrument_detail(code)            if detail:                return detail.get('InstrumentName', code)        except:            pass        return code    def on_disconnected(self):        logger.warning("⚠️ QMT连接断开")    def on_stock_order(self, order):        name = self._get_stock_name(order.stock_code)        status_str = self.ORDER_STATUS_MAP.get(order.order_status, str(order.order_status))        logger.debug(f"委托回报: {order.stock_code}{name}, 状态:{status_str}({order.order_status}), 系统号:{order.order_sysid}")    def on_stock_trade(self, trade):        name = self._get_stock_name(trade.stock_code)        logger.info(f"成交回报: {trade.stock_code}{name}, 价格:{trade.traded_price}, 数量:{trade.traded_volume}")    def on_order_error(self, order_error):        logger.error(f"下单失败: 订单号:{order_error.order_id}, 错误码:{order_error.error_id}, 信息:{order_error.error_msg}")    def on_cancel_error(self, cancel_error):        logger.error(f"撤单失败: 订单号:{cancel_error.order_id}, 错误码:{cancel_error.error_id}, 信息:{cancel_error.error_msg}")# ========== 持仓监控管理器 ==========class PositionMonitor:    def __init__(self, xt_trader, account):        self.xt_trader = xt_trader        self.account = account        self.lock = Lock()        # 监控状态: code -> {        #   'high_price': float,      # 当日最高价(从tick数据获取)        #   'high_gain_pct': float,   # 最高价涨幅%(相对昨日收盘价)        #   'pre_close_price': float, # 昨日收盘价        #   'cost_price': float,      # 持仓成本价        #   'triggered': bool,        # 是否已触发卖出        #   'start_time': datetime    # 开始监控时间        # }        self.monitoring = {}  # 正在监控的股票(满足最高价涨幅条件且未触发卖出)        # 冷却区改为dict,记录触发时的高点信息        # cooled_down: code -> {        #   'trigger_high_price': float,    # 触发卖出时的最高价        #   'trigger_high_gain_pct': float, # 触发卖出时的最高价涨幅%(相对昨日收盘价)        #   'trigger_pre_close_price': float, # 触发时的昨日收盘价        #   'trigger_time': datetime,       # 触发时间        #   'cost_price': float             # 成本价        # }        self.cooled_down = {}  # 已触发卖出、等待创新高的股票(冷却期)        # 当日已卖出的股票记录        self.sold_records = defaultdict(list)        logger.info("=" * 60)        logger.info("✅ 持仓监控管理器初始化完成")        logger.info("📊 策略参数: 最高价涨幅阈值=7.0%, 回撤阈值=2.0%")        logger.info("=" * 60)    def get_position_info(self):        """获取当前持仓信息"""        positions = self.xt_trader.query_stock_positions(self.account)        if positions is None:            return {}        pos_dict = {}        for pos in positions:            if pos.volume > 0:                pos_dict[pos.stock_code] = {                    'volume': pos.volume,                    'can_use_volume': pos.can_use_volume,                    'open_price': pos.open_price,                    'market_value': pos.market_value                }        return pos_dict    def get_stock_name(self, code):        """获取股票名称"""        try:            detail = xtdata.get_instrument_detail(code)            if detail:                return detail.get('InstrumentName', code)        except:            pass        return code    def is_limit_up(self, tick_data):   #这个判断涨停的函数要改        """        判断股票是否涨停        涨停判断:卖1价格为0或数量为0,且买1价格>0        """        try:            ask_prices = tick_data.get('askPrice', [])            ask_vols = tick_data.get('askVol', [])            bid_prices = tick_data.get('bidPrice', [])            sell_1_empty = (len(ask_prices) == 0 or ask_prices[0] == 0 or                            len(ask_vols) == 0 or ask_vols[0] == 0)            buy_1_valid = len(bid_prices) > 0 and bid_prices[0] > 0            return sell_1_empty and buy_1_valid        except Exception as e:            logger.error(f"涨停判断出错: {e}")            return False    def calculate_sell_volume(self, can_use_volume):        """计算卖出数量(一半),按100股取整"""        half = can_use_volume // 2        sell_vol = (half // 100) * 100        if sell_vol < 100:            return can_use_volume        else:            return sell_vol    def sell_half_position(self, code, name, price, reason, tick_data=None):        """        卖出半仓        reason: 'drawback'(回撤) 或 'limit_up'(涨停开板)        """        try:            position = self.xt_trader.query_stock_position(self.account, code)            if not position or position.can_use_volume <= 0:                logger.warning(f"⚠️ {code} 无可卖持仓,跳过卖出")                return False, -1            sell_volume = self.calculate_sell_volume(position.can_use_volume)            if sell_volume <= 0:                return False, -1            if reason == 'drawback':                # 回撤卖出:卖1价格 - 滑点                if tick_data:                    ask_prices = tick_data.get('askPrice', [])                    base_price = ask_prices[0if len(ask_prices) > 0 and ask_prices[0] > 0 else price                else:                    base_price = price                final_price = max(base_price - HUADIAN, 0.01)                price_type = xtconstant.FIX_PRICE                order_remark = f"回撤2%止盈_滑点{HUADIAN}"            else:  # limit_up                # 涨停开板卖出:买1价格                if tick_data:                    bid_prices = tick_data.get('bidPrice', [])                    base_price = bid_prices[0if len(bid_prices) > 0 and bid_prices[0] > 0 else price                else:                    base_price = price                final_price = base_price - HUADIAN                price_type = xtconstant.FIX_PRICE                order_remark = f"涨停开板_封单不足{LIMIT_UP_BID_VOL_THRESHOLD // 10000}万手"            logger.info(f"📝 准备卖出 {name}({code}): 价{final_price:.3f}, 量{sell_volume}, 因:{reason}")            order_id = self.xt_trader.order_stock(                account=self.account,                stock_code=code,                order_type=xtconstant.STOCK_SELL,                order_volume=sell_volume,                price_type=price_type,                price=final_price,                strategy_name='DynamicTP',                order_remark=order_remark            )            success = order_id != -1            if success:                self.sold_records[code].append({                    'time': datetime.datetime.now(),                    'price': final_price,                    'volume': sell_volume,                    'reason': reason,                    'order_id': order_id                })                logger.success(f"✅ {name}({code}) 卖出委托成功,订单:{order_id}, 价:{final_price:.3f}, 量{sell_volume}")            else:                logger.error(f"❌ {name}({code}) 卖出委托失败")            return success, order_id        except Exception as e:            logger.error(f"❌ 卖出异常 {code}{e}")            return False, -1    def update_monitoring_list(self, positions, tick_data_dict):        """        更新监控列表        核心逻辑:        1. 计算当日最高价涨幅 = (当日最高价 - 昨日收盘价) / 昨日收盘价 * 100%        2. 最高价涨幅 > 7.0% 则加入监控(不再判断浮盈)        3. 监控中的股票,从最高价回撤 > 2% 则卖出半仓,移入冷却区        4. 冷却区的股票,必须创新高(新的最高价 > 触发时的高点)才可重新监控        """        current_time = datetime.datetime.now()        with self.lock:            # 步骤1:检查cooled_down中的股票是否创新高,可以重新监控            reactivated = []            for code in list(self.cooled_down.keys()):                if code not in positions:                    del self.cooled_down[code]                    continue                tick = tick_data_dict.get(code)                if not tick:                    continue                current_price = tick.get('lastPrice'0)                cost_price = positions[code]['open_price']                today_high = tick.get('high', current_price)                pre_close_price = tick.get('lastClose'0)                if pre_close_price <= 0:                    continue                # 获取触发卖出时记录的高点信息                cooled_info = self.cooled_down[code]                trigger_high = cooled_info['trigger_high_price']                trigger_gain_pct = cooled_info['trigger_high_gain_pct']                trigger_pre_close = cooled_info.get('trigger_pre_close_price', pre_close_price)                # 计算当前最高价涨幅(相对昨日收盘价)                current_high_gain_pct = (today_high - pre_close_price) / pre_close_price * 100                # 重新激活条件:必须严格创新高(新的最高价 > 触发时的最高价)                # 且新的最高价涨幅 > 触发时的最高价涨幅(不再判断浮盈)                is_new_high = today_high > trigger_high                is_higher_gain = current_high_gain_pct > trigger_gain_pct                if is_new_high and is_higher_gain:                    reactivated.append(code)                    del self.cooled_down[code]                    self.monitoring[code] = {                        'high_price': today_high,                        'high_gain_pct': current_high_gain_pct,                        'pre_close_price': pre_close_price,                        'cost_price': cost_price,                        'triggered'False,                        'start_time': current_time                    }                    name = self.get_stock_name(code)                    logger.info(                        f"🔄 {name}({code}) 重新激活监控: "                        f"新高点{today_high:.3f}(+{current_high_gain_pct:.2f}%, 昨收{pre_close_price:.3f}) > "                        f"原高点{trigger_high:.3f}(+{trigger_gain_pct:.2f}%)"                    )                else:                    # 记录调试信息,说明为什么没有激活                    name = self.get_stock_name(code)                    if current_time.minute % 5 == 0 and current_time.second < 3:                        logger.debug(                            f"⏸️ {name}({code}) 仍在冷却: "                            f"当前高{today_high:.3f}(+{current_high_gain_pct:.2f}%, 昨收{pre_close_price:.3f}) vs "                            f"触发高{trigger_high:.3f}(+{trigger_gain_pct:.2f}%), "                            f"新高{is_new_high}, 更高涨幅{is_higher_gain}"                        )            # 步骤2:检查monitoring中的股票,更新最高价或触发卖出            triggered_codes = []            for code in list(self.monitoring.keys()):                if code not in positions:                    del self.monitoring[code]                    continue                tick = tick_data_dict.get(code)                if not tick:                    continue                current_price = tick.get('lastPrice'0)                info = self.monitoring[code]                cost_price = info['cost_price']                pre_close_price = tick.get('lastClose'0)                # 更新当日最高价(从tick数据获取)                today_high = tick.get('high', current_price)                if today_high > info['high_price']:                    old_high = info['high_price']                    info['high_price'] = today_high                    if pre_close_price > 0:                        info['high_gain_pct'] = (today_high - pre_close_price) / pre_close_price * 100                    name = self.get_stock_name(code)                    logger.debug(                        f"📈 {name}({code}) 更新最高价: {old_high:.3f} -> {today_high:.3f}, "                        f"涨幅:{info['high_gain_pct']:.2f}%(昨收{pre_close_price:.3f})")                # 检查触发条件                high_price = info['high_price']                drawdown_pct = (high_price - current_price) / high_price * 100 if high_price > 0 else 0                name = self.get_stock_name(code)                # 条件A:从最高价回撤超过2%(不再判断浮盈)                if drawdown_pct >= 2.0:                    logger.info(                        f"🎯 {name}({code}) 触发回撤卖出: "                        f"最高{high_price:.3f}, 当前{current_price:.3f}, "                        f"回撤{drawdown_pct:.2f}%(阈值2.0%)"                    )                    success, order_id = self.sell_half_position(code, name, current_price, 'drawback', tick)                    if success:                        triggered_codes.append(code)                        info['triggered'] = True                    continue                # 条件B:涨停且封单不足(不再判断浮盈)                if self.is_limit_up(tick):                    bid_vols = tick.get('bidVol', [])                    buy_1_vol = bid_vols[0if len(bid_vols) > 0 else 0                    if buy_1_vol < LIMIT_UP_BID_VOL_THRESHOLD:                        limit_up_price = tick.get('bidPrice', [current_price])[0]                        logger.info(                            f"🎯 {name}({code}) 触发涨停开板: "                            f"买1封单{buy_1_vol / 10000:.1f}万手 < 阈值{LIMIT_UP_BID_VOL_THRESHOLD / 10000:.0f}万手"                        )                        success, order_id = self.sell_half_position(code, name, limit_up_price, 'limit_up', tick)                        if success:                            triggered_codes.append(code)                            info['triggered'] = True            # 步骤3:将触发卖出的股票移出monitoring,放入cooled_down(记录触发时的高点)            for code in triggered_codes:                if code in self.monitoring:                    trigger_info = self.monitoring[code]                    self.cooled_down[code] = {                        'trigger_high_price': trigger_info['high_price'],                        'trigger_high_gain_pct': trigger_info['high_gain_pct'],                        'trigger_pre_close_price': trigger_info.get('pre_close_price'0),                        'trigger_time': current_time,                        'cost_price': trigger_info['cost_price']                    }                    del self.monitoring[code]                    name = self.get_stock_name(code)                    logger.info(                        f"🧊 {name}({code}) 移入冷却区: "                        f"记录高点{trigger_info['high_price']:.3f}(+{trigger_info['high_gain_pct']:.2f}%), "                        f"等待创新高后重新监控"                    )            # 步骤4:检查新持仓,加入监控            for code, pos in positions.items():                # 已经在监控中或冷却区,跳过                if code in self.monitoring or code in self.cooled_down:                    continue                tick = tick_data_dict.get(code)                if not tick:                    continue                current_price = tick.get('lastPrice'0)                cost_price = pos['open_price']                today_high = tick.get('high', current_price)                pre_close_price = tick.get('lastClose'0)                if pre_close_price <= 0 or cost_price <= 0:                    continue                # 关键指标计算:最高价涨幅 = (当日最高价 - 昨日收盘价) / 昨日收盘价 * 100                high_gain_pct = (today_high - pre_close_price) / pre_close_price * 100                current_profit_pct = (current_price - cost_price) / cost_price * 100                # 监控条件:最高价涨幅 > 7.0%(不再判断浮盈)                if high_gain_pct > 7.0:                    name = self.get_stock_name(code)                    self.monitoring[code] = {                        'high_price': today_high,                        'high_gain_pct': high_gain_pct,                        'pre_close_price': pre_close_price,                        'cost_price': cost_price,                        'triggered'False,                        'start_time': current_time                    }                    logger.info(                        f"🔍 新增监控 {name}({code}): "                        f"昨收{pre_close_price:.3f}, 最高{today_high:.3f}, "                        f"当日最高涨幅{high_gain_pct:.2f}%, 当前盈亏{current_profit_pct:.2f}%"                    )        return len(self.monitoring)    def get_status_report(self):        """获取当前状态报告"""        with self.lock:            return {                'monitoring_count'len(self.monitoring),                'cooled_down_count'len(self.cooled_down),                'monitoring_stocks': [                    f"{code}(最高涨幅{info['high_gain_pct']:.1f}%)"                    for code, info in self.monitoring.items()                ],                'cooled_down_stocks': [                    f"{code}(高点{info['trigger_high_price']:.2f}/+{info['trigger_high_gain_pct']:.1f}%)"                    for code, info in self.cooled_down.items()                ],                'today_sold_count'sum(len(v) for v in self.sold_records.values())            }# ========== 时间检查函数 ==========def is_in_trading_time():    """检查当前是否在交易时间内(9:30-11:30, 13:00-15:00)"""    now = datetime.datetime.now().time()    if AM_START <= now <= AM_END:        return True    if PM_START <= now <= PM_END:        return True    return Falsedef should_stop_trading():    """检查是否应该停止交易(15:00之后)"""    now = datetime.datetime.now().time()    return now > PM_END# ========== 主程序 ==========def main():    """主程序入口"""    logger.info("=" * 70)    logger.info("🚀 QMT动态止盈策略 V260318 启动")    logger.info(f"📁 QMT路径: {PATH}")    logger.info(f"💳 资金账号: {ACCOUNT_ID}")    logger.info(f"📊 滑点: {HUADIAN}元")    logger.info(f"🎯 策略参数: 最高价涨幅≥7.0%, 回撤≥2.0% 卖出")    logger.info(f"⏰ 交易时段: 9:30-11:30, 13:00-15:00")    logger.info("=" * 70)    # 初始化QMT    session_id = int(datetime.datetime.now().timestamp()) % 100000    xt_trader = XtQuantTrader(PATH, session_id)    callback = MyXtQuantTraderCallback()    xt_trader.register_callback(callback)    xt_trader.start()    connect_result = xt_trader.connect()    if connect_result != 0:        logger.error(f"❌ QMT连接失败: {connect_result}")        return    logger.info("✅ QMT连接成功")    account = StockAccount(ACCOUNT_ID)    subscribe_result = xt_trader.subscribe(account)    if subscribe_result != 0:        logger.error(f"❌ 账号订阅失败: {subscribe_result}")        return    logger.info(f"✅ 账号订阅成功: {ACCOUNT_ID}")    monitor = PositionMonitor(xt_trader, account)    last_status_time = None    running = True    try:        while running:            now = datetime.datetime.now()            # 检查是否到达结束时间            if should_stop_trading():                logger.info("⏰ 到达15:00,结束监控")                status = monitor.get_status_report()                logger.success(                    f"📊 交易结束统计:\n"                    f"  - 今日监控过: {status['monitoring_count'] + status['cooled_down_count']}只\n"                    f"  - 冷却区: {status['cooled_down_count']}只\n"                    f"  - 今日总卖出: {status['today_sold_count']}次"                )                running = False                break            # 检查是否在交易时间            if not is_in_trading_time():                if last_status_time is None or (now - last_status_time).seconds >= 180:                    logger.debug(f"⏳ 非交易时间 {now.strftime('%H:%M:%S')},等待...")                    last_status_time = now                time.sleep(10)                continue            # 交易时间内执行监控            try:                positions = monitor.get_position_info()                if not positions:                    logger.debug("📭 当前无持仓")                    time.sleep(MONITOR_INTERVAL)                    continue                # 获取全推数据                stock_list = list(positions.keys())                tick_data = xtdata.get_full_tick(stock_list)                if not tick_data:                    logger.warning("⚠️ 获取tick数据失败")                    time.sleep(MONITOR_INTERVAL)                    continue                # 更新监控                monitoring_count = monitor.update_monitoring_list(positions, tick_data)                # 定期输出状态(每2分钟)                if now.minute % 2 == 0 and now.second < 3:                    status = monitor.get_status_report()                    logger.info(                        f"📊 状态 [{now.strftime('%H:%M:%S')}]: "                        f"监控{status['monitoring_count']}{status['monitoring_stocks']}, "                        f"冷却{status['cooled_down_count']}{status['cooled_down_stocks']}, "                        f"已卖{status['today_sold_count']}次"                    )                    last_status_time = now                time.sleep(MONITOR_INTERVAL)            except Exception as e:                logger.error(f"❌ 监控循环异常: {e}")                time.sleep(MONITOR_INTERVAL)    except KeyboardInterrupt:        logger.info("🛑 用户中断")    except Exception as e:        logger.error(f"❌ 主程序异常: {e}")    finally:        logger.info("🧹 执行清理...")        try:            xt_trader.stop()            logger.info("✅ QMT已停止")        except:            pass        logger.info("👋 程序已退出")if __name__ == '__main__':    main()

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-03-27 13:23:42 HTTP/2.0 GET : https://f.mffb.com.cn/a/481818.html
  2. 运行时间 : 0.081060s [ 吞吐率:12.34req/s ] 内存消耗:4,939.47kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=99cbbee373dbf2ee8785127a72de53cb
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000516s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000908s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000285s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000259s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000514s ]
  6. SELECT * FROM `set` [ RunTime:0.000197s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000598s ]
  8. SELECT * FROM `article` WHERE `id` = 481818 LIMIT 1 [ RunTime:0.000611s ]
  9. UPDATE `article` SET `lasttime` = 1774589022 WHERE `id` = 481818 [ RunTime:0.000795s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000222s ]
  11. SELECT * FROM `article` WHERE `id` < 481818 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000401s ]
  12. SELECT * FROM `article` WHERE `id` > 481818 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000374s ]
  13. SELECT * FROM `article` WHERE `id` < 481818 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.003770s ]
  14. SELECT * FROM `article` WHERE `id` < 481818 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.003614s ]
  15. SELECT * FROM `article` WHERE `id` < 481818 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002017s ]
0.082749s