期货API接入与TradingView策略自动化实战指南
1. 期货API接入的核心价值与挑战在量化交易领域API接入是连接交易策略与市场的关键桥梁。以港美期货市场为例通过API实现TradingView看盘策略的自动化执行能够将技术分析优势转化为实际交易收益。但这个过程涉及多个技术环节的精密配合每个环节都可能成为潜在的绊马索。我曾在接入某香港期货公司API时因为忽略了时区转换问题导致策略在非交易时段发送订单直接触发了风控机制。这种看似简单的细节恰恰是大多数新手容易忽视的致命点。通过API接入我们主要实现三个核心功能实时行情获取特别是TradingView上的自定义指标数据账户资金与持仓监控自动化订单执行当前主流期货券商API主要分为两类协议类型REST API和WebSocket。REST API适合低频查询类操作如获取历史数据、账户信息等而WebSocket则用于需要实时性的场景比如行情推送和订单状态更新。在港美市场Interactive Brokers、Futu、Tiger Brokers等券商都提供了相对完善的API支持但接口规范差异较大。重要提示选择API时务必确认其支持的市场范围。某些号称全球接入的API可能对香港夜盘或美国小品种期货存在限制。2. TradingView数据对接方案解析TradingView作为专业级看盘工具其数据质量和技术指标库是许多量化策略的基础。但官方并未开放直接交易API我们需要通过间接方式获取信号。这里介绍三种经过实战验证的对接方法2.1 Webhook转发方案这是最稳定的对接方式。在TradingView警报设置中配置Webhook URL当策略条件触发时TradingView会向指定端点发送HTTP POST请求。我们需要搭建一个简单的Web服务器接收这些信号from flask import Flask, request import trading_executor # 自定义交易执行模块 app Flask(__name__) app.route(/webhook, methods[POST]) def webhook(): data request.get_json() if validate_signal(data): trading_executor.execute( symboldata[symbol], directiondata[side], pricefloat(data[price]), quantityint(data[qty]) ) return OK def validate_signal(data): # 实现签名验证、重复信号过滤等安全机制 return True2.2 浏览器自动化方案对于需要获取完整图表数据的场景可使用Playwright等工具模拟用户操作from playwright.sync_api import sync_playwright def get_tradingview_data(symbol): with sync_playwright() as p: browser p.chromium.launch(headlessFalse) page browser.new_page() page.goto(fhttps://www.tradingview.com/chart/?symbol{symbol}) # 等待指标加载完成 page.wait_for_selector(.chart-container) # 通过evaluate获取页面数据 data page.evaluate( () { const chart TradingView.widget; return chart.getVisibleRange(); } ) browser.close() return data2.3 Pine Script数据导出对于熟悉TradingView脚本的用户可以通过Pine Script的alertcondition()函数结合security()函数获取跨周期数据//version5 strategy(API Data Exporter, overlaytrue) // 获取4小时级别MACD [macdLine, signalLine, _] request.security(syminfo.tickerid, 240, ta.macd(close, 12, 26, 9)) alertcondition(macdLine signalLine, titleMACD Bullish, messagebullish) alertcondition(macdLine signalLine, titleMACD Bearish, messagebearish)特别注意TradingView免费账户的Webhook有每分钟1次的触发限制对于高频策略需要升级付费计划。同时浏览器自动化方案存在被检测封禁的风险建议控制请求频率。3. 期货券商API接入实战3.1 Interactive Brokers TWS API接入IBKR的API文档堪称量化界的百科全书但也是出了名的复杂。以下是Python连接示例from ibapi.client import EClient from ibapi.wrapper import EWrapper from ibapi.contract import Contract import threading class TradingApp(EWrapper, EClient): def __init__(self): EClient.__init__(self, self) def nextValidId(self, orderId): super().nextValidId(orderId) self.next_order_id orderId def error(self, reqId, errorCode, errorString): print(fError: {errorCode} {errorString}) def connect_ibkr(): app TradingApp() app.connect(127.0.0.1, 7497, clientId1) # 启动API通信线程 api_thread threading.Thread(targetapp.run) api_thread.start() # 等待连接建立 while not app.isConnected(): pass return app def create_futures_contract(symbol, exchange, currencyUSD): contract Contract() contract.symbol symbol contract.secType FUT contract.exchange exchange contract.currency currency return contract关键参数说明7497是TWS实时交易的默认端口模拟交易使用7496clientId需要保证每个连接唯一期货合约必须准确指定交易所代码如HKFE、GLOBEX3.2 Futu OpenAPI接入港股期货富途的API设计更符合国内开发者习惯但需要注意其港股期货的交易规则from futu import * def place_hk_future_order(api, code, price, qty, trd_side): :param code: 期货代码如MHI2209 :param trd_side: 交易方向 TRD_SIDE_BUY/TRD_SIDE_SELL ret, data api.place_order( priceprice, qtyqty, codecode, trd_sidetrd_side, order_typeOrderType.NORMAL, trd_envTrdEnv.REAL ) if ret RET_OK: print(f订单提交成功: {data[order_id]}) else: print(f下单失败: {data}) # 初始化连接 quote_ctx OpenQuoteContext(host127.0.0.1, port11111) trade_ctx OpenTradeContext(host127.0.0.1, port11111)3.3 通用API接入注意事项时区处理港美期货交易时间涉及不同时区必须统一转换为UTC时间处理import pytz from datetime import datetime hk_time pytz.timezone(Asia/Hong_Kong) ny_time pytz.timezone(America/New_York) def convert_to_utc(local_time, tz): return tz.localize(local_time).astimezone(pytz.UTC)合约到期处理期货合约需要定期移仓可通过API获取合约表def get_active_contracts(api, symbol): ret, data api.get_contract_list(symbol) if ret RET_OK: return [c for c in data if c[status] NORMAL] return []保证金计算不同品种的保证金要求差异很大def calculate_margin(api, symbol, qty): ret, data api.get_margin_ratio(symbol) if ret RET_OK: return qty * data[initial_margin] raise Exception(获取保证金率失败)4. 策略实现与风险管理4.1 从TradingView信号到API交易一个完整的信号处理流程应该包含以下环节graph TD A[TradingView警报触发] -- B[信号接收服务器] B -- C{信号验证} C --|通过| D[生成订单指令] D -- E[风险检查] E --|通过| F[API下单] F -- G[订单状态监控] G -- H[异常处理]对应的Python实现框架class TradingEngine: def __init__(self, api_client): self.api api_client self.position_cache {} def process_signal(self, signal): # 信号有效性验证 if not self.validate_signal(signal): return False # 生成订单参数 order self.build_order(signal) # 风险控制检查 if not self.risk_check(order): return False # 执行订单 return self.execute_order(order) def validate_signal(self, signal): 验证信号时间戳、签名等 pass def build_order(self, signal): 转换为API需要的订单格式 pass def risk_check(self, order): 检查仓位、保证金、频率等 pass def execute_order(self, order): 通过API发送订单 pass4.2 典型风险控制措施单笔最大亏损控制def check_max_loss(self, order): current_price self.get_market_price(order.symbol) if order.side BUY: loss (current_price - order.price) * order.quantity else: loss (order.price - current_price) * order.quantity return loss self.max_loss_per_trade交易频率限制from collections import deque from time import time class FrequencyLimiter: def __init__(self, max_count, period): self.max_count max_count self.period period # 秒 self.timestamps deque() def check(self): now time() while self.timestamps and now - self.timestamps[0] self.period: self.timestamps.popleft() if len(self.timestamps) self.max_count: return False self.timestamps.append(now) return True异常波动过滤def check_abnormal_volatility(self, symbol, threshold0.05): candles self.api.get_last_n_candles(symbol, n10) if len(candles) 10: return False changes [abs(c.close/c.open - 1) for c in candles] return max(changes) threshold4.3 实盘部署建议环境隔离交易系统应该与策略研究环境物理隔离避免误操作双重验证所有关键操作如大额下单应设置二次确认断线重连实现稳健的API连接状态监测和自动恢复机制def monitor_connection(self): while True: if not self.api.is_connected(): self.reconnect() time.sleep(60)日志审计记录完整的决策过程和订单生命周期import logging logging.basicConfig( levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(trading.log), logging.StreamHandler() ] )5. 性能优化与进阶技巧5.1 低延迟优化方案本地缓存设计from functools import lru_cache lru_cache(maxsize1000) def get_contract_details(symbol): return api.query_contract(symbol)批量请求处理async def batch_get_market_data(symbols): async with aiohttp.ClientSession() as session: tasks [fetch_symbol_data(session, sym) for sym in symbols] return await asyncio.gather(*tasks)TCP_NODELAY设置import socket sock socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)5.2 多账户管理策略对于需要管理多个券商账户的情况建议采用抽象层设计class BrokerAdapter(ABC): abstractmethod def place_order(self, order): pass abstractmethod def get_positions(self): pass class IBKRAdapter(BrokerAdapter): def __init__(self, config): self.client IBKRClient(config) def place_order(self, order): # 转换为IBKR特定格式 ib_order convert_to_ib_order(order) return self.client.placeOrder(ib_order) class FutuAdapter(BrokerAdapter): def __init__(self, config): self.api OpenTradeContext(config) def place_order(self, order): # 转换为Futu特定格式 futu_order convert_to_futu_order(order) return self.api.place_order(futu_order)5.3 回测与实盘一致性确保TradingView回测结果与实盘执行一致的要点滑点模拟def apply_slippage(fill_price, side, slippage0.0005): if side BUY: return fill_price * (1 slippage) return fill_price * (1 - slippage)成交量冲击模型def calculate_impact_price(base_price, quantity, liquidity): liquidity: 市场深度参数 return base_price * (1 (quantity / liquidity) ** 2)订单类型选择大单拆分使用TWAP/VWAP算法单短线交易使用立即成交或取消订单(IOC)趋势跟踪使用止损限价单5.4 监控面板开发使用Plotly Dash构建实时监控界面import dash from dash import dcc, html import plotly.graph_objs as go app dash.Dash(__name__) app.layout html.Div([ dcc.Graph(idequity-curve), dcc.Interval(idinterval, interval60*1000) ]) app.callback( Output(equity-curve, figure), Input(interval, n_intervals)) def update_graph(n): equity get_current_equity() return { data: [go.Scatter(xequity.index, yequity.values)], layout: go.Layout(title资金曲线) }6. 常见问题解决方案6.1 API连接问题排查连接超时检查防火墙设置验证IP白名单测试telnet端口连通性认证失败检查API密钥有效期验证签名算法确认时间戳同步频率限制def handle_rate_limit(response): if response.status_code 429: retry_after int(response.headers.get(Retry-After, 60)) time.sleep(retry_after) return True return False6.2 订单状态异常处理建立订单状态机监控class OrderMonitor: STATES [SUBMITTED, FILLED, CANCELLED, REJECTED] def __init__(self, api): self.api api self.pending_orders {} def check_order_status(self): for order_id in list(self.pending_orders.keys()): status self.api.get_order_status(order_id) if status in [FILLED, CANCELLED, REJECTED]: self.handle_order_completion(order_id, status) def handle_order_completion(self, order_id, status): order self.pending_orders.pop(order_id) if status REJECTED: self.handle_rejection(order)6.3 数据不一致问题当TradingView数据与券商API数据出现差异时检查数据源是否相同部分券商提供的数据是合成数据验证时间戳是否准确转换对比K线计算方法收盘价/最后成交价检查是否有除权除息未处理6.4 内存泄漏排查长期运行的交易系统需要注意资源管理import tracemalloc tracemalloc.start() # ...运行策略... snapshot tracemalloc.take_snapshot() top_stats snapshot.statistics(lineno) for stat in top_stats[:10]: print(stat)7. 硬件部署建议7.1 服务器选型地理位置优先选择靠近交易所数据中心的机房香港期货Equinix HK1芝加哥期货Aurora/NY4配置建议CPU单核性能优先如Intel i9-13900K内存32GB起步高频策略需要64GB网络低延迟专线1ms 到交易所网关系统优化# 禁用CPU节能 sudo cpupower frequency-set --governor performance # 网络缓冲区调整 sudo sysctl -w net.core.rmem_max16777216 sudo sysctl -w net.core.wmem_max167772167.2 托管环境配置安全设置禁用SSH密码登录仅使用密钥认证配置fail2ban防止暴力破解定期轮换API密钥监控方案# Prometheus配置示例 scrape_configs: - job_name: trading_server static_configs: - targets: [localhost:9100]灾备方案热备服务器实时同步自动化故障转移每日数据库快照8. 合规与风控体系8.1 合规要求账户隔离客户资金与自有资金严格分离交易审计保留完整的订单记录和决策日志风险披露向投资者充分揭示策略风险8.2 风控架构设计三层风控体系实现class RiskControlSystem: def __init__(self): self.pre_trade_checks [ PositionLimitCheck(), DailyLossLimitCheck(), ConcentrationCheck() ] self.intra_trade_monitors [ SlippageMonitor(), MarketImpactMonitor() ] self.post_trade_analyzers [ TransactionCostAnalyzer(), PerformanceAttribution() ] def check_order(self, order): for checker in self.pre_trade_checks: if not checker.validate(order): raise RiskControlError(f风控拒绝: {checker.__class__.__name__})8.3 压力测试方案历史极端行情回测如2020年3月原油暴跌行情流动性枯竭测试放大滑点参数至正常值5倍黑天鹅事件模拟随机注入极端价格波动def stress_test(strategy, scenarios): results {} for name, scenario in scenarios.items(): try: portfolio strategy.run(scenario) results[name] portfolio.drawdown except Exception as e: results[name] fFailed: {str(e)} return results9. 持续优化与迭代9.1 性能指标监控关键Metrics定义与采集from prometheus_client import Gauge class Metrics: order_latency Gauge(strategy_order_latency, Order execution latency) position_ratio Gauge(strategy_position_ratio, Current position exposure) classmethod def update_order_latency(cls, start_time): cls.order_latency.set(time.time() - start_time)9.2 A/B测试框架对比不同参数组的表现def parameter_grid_search(strategy, param_grid): from itertools import product best_params None best_perf -np.inf for params in product(*param_grid.values()): current_params dict(zip(param_grid.keys(), params)) strategy.set_params(**current_params) perf evaluate_strategy(strategy) if perf best_perf: best_perf perf best_params current_params return best_params9.3 技术债管理代码重构计划每季度专门安排技术债偿还周期测试覆盖率保持单元测试覆盖率80%文档自动化使用Sphinx自动生成API文档# 生成文档示例 sphinx-apidoc -o docs/ src/ make -C docs/ html10. 实盘过渡 checklist在从模拟交易转向实盘前建议逐项检查[ ] 所有API密钥已更新为生产环境版本[ ] 风控阈值已根据账户规模调整[ ] 监控报警系统测试完成[ ] 灾难恢复流程演练通过[ ] 法律文件签署完成[ ] 初始资金划转确认[ ] 备份交易终端准备就绪[ ] 团队成员联系方式更新首次实盘运行建议初始仓位控制在策略容量的10%以下密切监控前72小时的所有交易准备手动干预预案11. 资源推荐与社区11.1 开发资源开源项目Backtrader多功能回测框架Zipline华尔街量化标准框架vn.py国内期货交易系统数据源聚宽国内量化数据平台Quandl海外金融数据集TD Ameritrade免费美股数据API工具链JupyterLab交互式研究环境VS Code策略开发IDEDocker环境容器化11.2 学习路径基础阶段Python金融数据分析技术指标原理MACD/RSI/布林带订单簿基础知识进阶阶段市场微观结构研究算法交易策略高频交易技术专业认证CFA特许金融分析师FRM金融风险管理师CMT特许市场技术分析师11.3 社区交流技术论坛QuantConnect社区聚宽量化社区GitHub量化专题会议活动Quant Conference中国量化投资峰会全球算法交易大会协作平台Kaggle竞赛QuantInsti学习计划开源项目贡献在实际操作中我发现最有效的学习方式是将一个完整策略从研究到实盘走通整个流程。比如可以先从TradingView的简单MACD策略开始逐步加入API接入、风险控制等模块最终形成一个可稳定运行的交易系统。这个过程会遇到各种预料之外的问题但正是解决这些问题的经验构成了真正的量化交易能力。

相关新闻

AI编程助手豆包实战评测:优势场景与使用边界全解析

AI编程助手豆包实战评测:优势场景与使用边界全解析

1. 从“豆包”到“豆包编程”:一个AI助手的多面性最近在技术社区和开发者圈子里,“豆包”这个词的热度持续攀升。如果你去搜索,会发现大量关联词条:从“豆包清理C盘教程”到“豆包API”,从“豆包网页版”到“豆包编程”…

2026/10/3 12:08:33 阅读更多 →
Gemini 1.5 Flash逆袭:小模型如何通过MoE架构与精准优化实现性能超越

Gemini 1.5 Flash逆袭:小模型如何通过MoE架构与精准优化实现性能超越

1. 项目概述:一场意料之外的技术“反杀”最近谷歌I/O大会上的一个消息,在AI圈子里激起了不小的波澜。主角是Gemini家族的两个成员:新发布的Gemini 1.5 Flash模型,和之前被定位为“旗舰”的Gemini 1.0 Pro。官方数据和社区实测都指…

2026/10/7 23:12:22 阅读更多 →
【2027最新】基于SpringBoot+Vue的智慧图书管理系统管理系统源码+MyBatis+MySQL

【2027最新】基于SpringBoot+Vue的智慧图书管理系统管理系统源码+MyBatis+MySQL

博主介绍:💼 毕业设计解决方案 构建完整的毕业设计生态支撑体系,为学生提供从选题到交付的全链路技术服务: 技术选题库 微信小程序生态:精选100个符合市场趋势的前沿选题 Java企业级应用:汇集500个涵盖主流…

2026/10/2 11:15:13 阅读更多 →

最新新闻

Android Kitchen 实战:从解包到打包的 ROM 定制全流程

Android Kitchen 实战:从解包到打包的 ROM 定制全流程

简介:面向Android发烧友与ROM定制初学者的Android Kitchen V0.223定制工具包,由光头佬开发,用批处理脚本把解压、修改、打包、签名、刷写等繁琐步骤集成到菜单式操作,适合刷机玩家、ROM移植者和入门开发者。版本内置大量机型配置与…

2026/10/14 9:10:51 阅读更多 →
k8s v1.23.4 ARM离线包部署指南:从镜像导入到集群初始化

k8s v1.23.4 ARM离线包部署指南:从镜像导入到集群初始化

简介:面向银河麒麟Server-V10与ARM架构服务器的Kubernetes v1.23.4完整离线部署资源,适用于无法连接外网或安全要求较高的机房、内网及国产化替代等场景,可帮助运维与研发人员完成容器集群的快速准备与部署。压缩包共118个文件,整…

2026/10/14 9:10:51 阅读更多 →
肺类器官技术:构建与应用全解析

肺类器官技术:构建与应用全解析

1. 肺类器官技术:从基础研究到转化医学的革命性工具 作为一名长期从事干细胞与类器官研究的科研人员,我见证了肺类器官技术如何从实验室的探索性研究逐步发展成为转化医学的重要平台。肺类器官之所以能引起如此广泛的关注,关键在于它完美解决…

2026/10/14 9:10:51 阅读更多 →
Unity光照模型:从Phong到PBR的演进与优化

Unity光照模型:从Phong到PBR的演进与优化

1. 光照模型概述:从经验到物理的进化之路在Unity引擎中,光照系统的发展经历了从经验模型(Emperical Models)到物理模型(Physically Based Models)的演变过程。早期游戏开发中,我们主要依赖Phong和Blinn-Phong这类经验模型,它们通过…

2026/10/14 9:10:51 阅读更多 →
物联网设备管理实战:批量 OTA、远程配置与设备生命周期

物联网设备管理实战:批量 OTA、远程配置与设备生命周期

IoT 系列第 6 篇。第 4 篇讲了设备影子,第 5 篇讲了给"穷设备"用的 CoAP/LwM2M。这一篇把视角从"一台设备"拉到"一万台设备":当你有 1000 台设备散在全国,发现一个 bug,总不能一台台寄回来刷吧&…

2026/10/14 9:10:51 阅读更多 →
SpringBoot+Vue构建高效办公管理系统实战

SpringBoot+Vue构建高效办公管理系统实战

1. 项目背景与核心价值 办公管理系统作为企业数字化转型的基础设施,正在从传统的C/S架构向B/S架构快速迁移。这个基于SpringBootVue的前后端分离项目,完美契合了现代企业对高效协同、移动办公和低维护成本的核心需求。 我去年为一家中型科技公司实施类似…

2026/10/14 9:09:51 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →