12. 综合实战:自动化量化与舆情双轨大盘

💡 一键体验:不想从零开始连线?您可以直接下载我们准备好的成品案例文件: 📥 点击下载《自动化量化与舆情双轨大盘》完整示例 (stock.mldoc.zip)

下载后,双击文件或将其拖入 MindLogic 客户端即可直接运行测试。

在本章中,我们将把 MindLogic 的核心杀手锏——网络请求插件AI 大模型插件强大的复合图表引擎——完美融合在一起,构建一个极具视觉冲击力的真实业务场景:《自动化加密货币/股票量化与舆情监控看板》

这个工作流完全自动化,一键运行后,原始数据流将向下分叉,进入“纯数学计算”与“AI 语义分析”的两条支线,最后汇合成直观的动态大盘与投资决策。


1. 架构概览

我们将创建一个包含 6 个核心节点的网络(形成完美的对称流水线结构):

  1. 数据源抓取 (根节点):抓取价格与新闻数据。
  2. 数据流分支 A (技术面):数据源 -> 交易量柱状图节点 -> 价格折线图节点。
  3. 数据流分支 B (消息面):数据源 -> AI 舆情打分节点 -> 情绪热力图节点。
  4. 最终决策中枢:汇合价格大盘与情绪热力图,输出 [BUY], [HOLD], [SELL] 信号。

2. 节点一:数据源抓取 (HTTP Request 插件)

首先,我们创建一个节点,并利用官方内置的 HTTP Request 插件去抓取 Yahoo Finance 开放的无鉴权市场数据 API。由于 MindLogic 底层的 JavaScript 引擎不支持原生的浏览器 fetch 函数,所有网络请求必须通过专属插件系统(支持代理、重试与沙盒隔离)来安全完成。

  1. 选择插件:选中新建的节点,在右侧属性面板底部展开“Plugin (插件)”,在下拉菜单中选择 HTTP Request
  2. 配置参数:在出现的插件输入框中,将 API URL 填入 Yahoo Finance 行情接口地址: https://query1.finance.yahoo.com/v8/finance/chart/BTC-USD?interval=1d&range=7d
  3. 编写清洗脚本:插件在后台请求成功后,会自动将获取到的原始数据存入当前节点的 outputs['response'] 变量中。为了把这段晦涩的嵌套数组转换为标准的 JSON 对象供下游图表使用,我们在节点最下方的自定义脚本 (Entity Script) 中填入以下清洗逻辑:
// 1. 获取 HTTP 插件拉取并自动存在 response 变量里的原始 JSON 字符串
let rawDataStr = node.outputs['response'];
if (!rawDataStr) return;

let json = JSON.parse(rawDataStr);
let result = json.chart.result[0];
let timestamps = result.timestamp;
let quotes = result.indicators.quote[0];

// 2. Yahoo Finance 返回 timestamps + quotes 数组,映射为带命名 Key 的 JSON
let history = timestamps.map((ts, i) => {
    let dateObj = new Date(ts * 1000);
    let dateStr = (dateObj.getMonth() + 1) + "-" + dateObj.getDate();
    
    return {
        date: dateStr,
        price: Math.round(quotes.close[i] * 100) / 100,
        volume: Math.round(quotes.volume[i])
    };
});

// 3. 模拟一些同期的相关新闻标题(实际应用中可通过接入 NewsAPI 节点获取)
let mockNews = [
    "SEC delays ETF decision, market panics.",
    "Large holder sells 10k BTC on exchange.",
    "Fed indicates rate hikes, crypto bleeds.",
    "Market stabilization, fear remains high.",
    "Institutions buying the dip secretly.",
    "Major bank announces Bitcoin integration!",
    "Bull market resumes, retail FOMO kicks in."
];
for(let i=0; i<history.length; i++) {
    if (mockNews[i]) history[i].news = mockNews[i];
}

// 4. 将清洗后的结果作为当前节点的数据载荷向下传递
outputs.history = history;
outputs.news = mockNews;
node.title = 'get stock data';

这段代码执行时,系统会先调度 HTTP 插件发起真实的底层网络请求,紧接着再执行上面的清洗脚本。Yahoo Finance API 无需鉴权,全球可直接访问。最终干净的结构化 JSON 数据会自动向下游节点输出。


3. 支线 A 节点一:交易量柱状图

从最初的“数据源”节点引出第一条下级连线,创建一个专门用于渲染交易量的节点。由于它处于数据流水线的中游,我们在画完图后需要将原始数据透传给下游。

  1. 将节点内容类型 (Content Type) 设置为 Chart (图表)
  2. 实体脚本如下:
let history = inputs[0].history;
outputs.history = history; // 关键:将数据透传给下游的折线图节点

let series = [];

for (let i = 0; i < history.length; i++) {
    let day = history[i];
    
    // 专门画交易量柱状图
    series.push({
        x: day.date,
        y: day.volume,
        category: "Volume",
        type: "bar"
    });
}

node.contentType = 'chart';
node.contentPayload = {
    chartType: "bar",
    series: series
};

4. 支线 A 节点二:纯价格折线图 (接力透传)

从刚才的“交易量柱状图”节点引出连线,创建“价格大盘”节点。 得益于上个节点的透传,这里依然能拿到完整的 history 数据。我们将剔除为 0 的交易量干扰,纯粹画价格折线,完美激活底层的自适应 Y 轴缩放,让微小的波动趋势一目了然。

  1. 同样设置 Content Type 为 Chart (图表)
  2. 脚本代码:
// 获取上游(交易量节点)透传过来的历史数据
let history = inputs[0].history;

let series = [];
let sumPrice = 0;

for (let i = 0; i < history.length; i++) {
    let day = history[i];
    sumPrice += day.price;
    
    // 仅仅保留主轴:价格折线图
    series.push({
        x: day.date,
        y: day.price,
        category: "Price",
        type: "line"
    });
}

// 计算 7 日均线
let averagePrice = sumPrice / history.length;
outputs.averagePrice = averagePrice;
outputs.latestPrice = history[6].price;

// 添加基准参考线
series.push({
    x: "10-07", // 参考线横跨整个图表,x轴可以随意指定一个存在的值
    y: averagePrice,
    category: "7-Day Moving Average",
    type: "rule"
});

// 构建标准图表 Payload
node.contentPayload = {
    chartType: "line", // 默认图表类型
    series: series
};

执行后,画布上将展现出波澜壮阔的价格走势图。


5. 支线 B 节点一:AI 舆情打分 (LLM 插件)

回到最初的“数据源”节点,引出另一条全新的连线,创建“AI 舆情”节点。

  1. 绑定 AI 插件:在节点上绑定大语言模型插件。
  2. 构建 Prompt:在插件的 User Prompt 中填入:
请分析以下过去 7 天的新闻数据:
{ news }

为每天的市场情绪打分(范围 -10 到 10,-10为极度恐慌,10为极度贪婪)。
你必须严格输出一个 JSON 数组格式,不要包含任何 markdown 标记或其他解释文字。格式示例如下:
[
  {"date": "10-01", "score": -8},
  {"date": "10-02", "score": 5}
]

6. 支线 B 节点二:舆情热力图

从刚才的“AI 舆情”节点引出下级连线,用于将大模型输出的纯 JSON 数据解析并渲染成热力图:

// 获取上游大模型节点生成的 JSON 字符串
let resultText = inputs[0].result;
if (!resultText) return;

// 正则清洗可能存在的 markdown 标记
let jsonMatch = resultText.match(/\[.*\]/s);
if (!jsonMatch) return;

let sentimentScores = JSON.parse(jsonMatch[0]);

let series = sentimentScores.map(item => ({
    x: item.date,
    y: item.score,
    category: "Sentiment"
}));

// 渲染热力图
node.contentType = "chart";
node.contentPayload = {
    chartType: "heatmap",
    series: series
};

// 提取最新一天的情绪得分,继续透传给最终的决策节点
outputs.Sentiment = sentimentScores[6].score;

执行后,红绿相间的热力图直观地展示了市场情绪的倒转。


7. 最终决策中枢 (逻辑判断)

最后,我们将两条支线的末端节点——即**“价格大盘”“舆情热力图”**——同时连线到一个最终节点:“投资决策”。

let ma7 = averagePrice;
let latestSentiment = Sentiment;

if (latestPrice < ma7 && latestSentiment < -5) {
    node.title = "🟢 [BUY SIGNAL] 价格处于均线下方,且市场极度恐慌,出现黄金坑。";
} else if (latestPrice > ma7 && latestSentiment > 5) {
    node.title = "🔴 [SELL SIGNAL] 价格高估,市场极度贪婪,建议落袋为安。";
} else {
    node.title = "⚪ [HOLD SIGNAL] 趋势不明朗,建议观望。";
}

node.contentType = 'markdown';

总结

这就是 MindLogic 最核心的威力:将死板的文字节点,变成了能够拉取网络数据、召唤 AI 推理、处理复杂数学分支,并最终渲染成极具商业级质感可视化大盘的超级引擎。