{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "bba1c8da-0573-48b8-8d4a-4ec5b9fd4b26",
      "name": "Every 15 Minutes",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -624,
        48
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "minutes",
              "minutesInterval": 15
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "cb1c8499-9a64-428b-822d-d64ee3b71f6b",
      "name": "Bloomberg Markets Feed",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        -288,
        -128
      ],
      "parameters": {
        "url": "https://feeds.bloomberg.com/markets/news.rss",
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "3c790b7e-63ed-4636-90c7-27b63b6c4b16",
      "name": "CNBC Breaking News",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        -288,
        48
      ],
      "parameters": {
        "url": "https://www.cnbc.com/id/100003114/device/rss/rss.html",
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "e6ffacb5-0fd4-43d2-9e92-65fb0479c0e4",
      "name": "Reuters Business",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        -288,
        224
      ],
      "parameters": {
        "url": "https://feeds.reuters.com/reuters/businessNews",
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "279a49ac-4be5-405b-8bfd-edef40e1d6ec",
      "name": "Aggregate News Sources",
      "type": "n8n-nodes-base.merge",
      "position": [
        -32,
        48
      ],
      "parameters": {
        "mode": "combine",
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "27ed15f2-8487-4726-8d39-50b96b1bb376",
      "name": "Filter & Extract Signals",
      "type": "n8n-nodes-base.code",
      "position": [
        224,
        48
      ],
      "parameters": {
        "jsCode": "const items = $input.all();\nconst now = new Date();\nconst oneHourAgo = new Date(now - 60 * 60 * 1000);\n\n// Filter recent articles and extract keywords\nconst filtered = items\n  .filter(item => {\n    const pubDate = new Date(item.json.pubDate || item.json.isoDate);\n    return pubDate > oneHourAgo;\n  })\n  .map(item => ({\n    json: {\n      title: item.json.title,\n      link: item.json.link,\n      pubDate: item.json.pubDate || item.json.isoDate,\n      content: item.json.contentSnippet || item.json.content || '',\n      source: item.json.link.includes('bloomberg') ? 'Bloomberg' : \n              item.json.link.includes('cnbc') ? 'CNBC' : 'Reuters',\n      \n      // Extract potential stock tickers and keywords\n      tickers: extractTickers(item.json.title + ' ' + (item.json.contentSnippet || '')),\n      keywords: extractKeywords(item.json.title + ' ' + (item.json.contentSnippet || ''))\n    }\n  }));\n\nfunction extractTickers(text) {\n  const tickerPattern = /\\b[A-Z]{1,5}\\b/g;\n  const matches = text.match(tickerPattern) || [];\n  return [...new Set(matches)].filter(t => t.length >= 2).slice(0, 5);\n}\n\nfunction extractKeywords(text) {\n  const keywords = ['earnings', 'acquisition', 'merger', 'bankruptcy', 'profit', 'loss', \n                    'revenue', 'growth', 'decline', 'surge', 'plunge', 'rally', 'crash',\n                    'innovation', 'AI', 'crypto', 'Fed', 'interest', 'inflation'];\n  return keywords.filter(k => text.toLowerCase().includes(k.toLowerCase()));\n}\n\nreturn filtered;"
      },
      "typeVersion": 2
    },
    {
      "id": "7c96b18c-e5bb-4739-9b9c-2ce34a6341b0",
      "name": "AI Sentiment Analysis",
      "type": "n8n-nodes-base.openAi",
      "position": [
        464,
        -96
      ],
      "parameters": {
        "prompt": {
          "messages": [
            {
              "role": "system",
              "content": "You are a financial analyst AI. Analyze news articles and provide: 1) Market Sentiment (Bullish/Neutral/Bearish/Crisis), 2) Impact Level (Low/Medium/High/Critical), 3) Affected Sectors (list), 4) Trading Signal (Strong Buy/Buy/Hold/Sell/Strong Sell), 5) Confidence Score (0-100), 6) Key Catalyst (brief explanation), 7) Risk Factors. Return as JSON only."
            },
            {
              "content": "Article: {{ $json.title }}\n\nContent: {{ $json.content }}\n\nSource: {{ $json.source }}\nDetected Tickers: {{ $json.tickers.join(', ') }}\nKeywords: {{ $json.keywords.join(', ') }}"
            }
          ]
        },
        "options": {
          "maxTokens": 800,
          "temperature": 0.2
        },
        "resource": "chat",
        "requestOptions": {}
      },
      "typeVersion": 1.1
    },
    {
      "id": "28a0f4d8-eb77-4974-aa81-6d0052ef4b7c",
      "name": "Fetch Stock Data",
      "type": "n8n-nodes-base.code",
      "position": [
        464,
        240
      ],
      "parameters": {
        "jsCode": "// Fetch stock data from Yahoo Finance API\nconst ticker = $input.first().json.tickers[0] || 'SPY';\nconst url = `https://query1.finance.yahoo.com/v8/finance/chart/${ticker}?interval=1d&range=5d`;\n\ntry {\n  const response = await fetch(url, {\n    method: 'GET',\n    headers: {\n      'User-Agent': 'Mozilla/5.0'\n    }\n  });\n  \n  if (!response.ok) {\n    // If API fails, return mock data to keep workflow running\n    return {\n      json: {\n        chart: {\n          result: [{\n            indicators: {\n              quote: [{\n                close: [100, 101, 102, 103, 104],\n                volume: [1000000, 1100000, 1050000, 1200000, 1150000]\n              }]\n            }\n          }]\n        }\n      }\n    };\n  }\n  \n  const data = await response.json();\n  return { json: data };\n  \n} catch (error) {\n  // Fallback with mock data if fetch fails\n  return {\n    json: {\n      chart: {\n        result: [{\n          indicators: {\n            quote: [{\n              close: [100, 101, 102, 103, 104],\n              volume: [1000000, 1100000, 1050000, 1200000, 1150000]\n            }]\n          }\n        }]\n      },\n      error: error.message\n    }\n  };\n}"
      },
      "typeVersion": 2
    },
    {
      "id": "948371be-eb9a-4bc3-8e09-ad113eb95f92",
      "name": "Synthesize Intelligence Report",
      "type": "n8n-nodes-base.code",
      "position": [
        720,
        48
      ],
      "parameters": {
        "jsCode": "const newsData = $('Filter & Extract Signals').first().json;\nconst aiAnalysis = JSON.parse($('AI Sentiment Analysis').first().json.choices[0].message.content);\nconst stockData = $input.first().json;\n\n// Calculate technical indicators\nconst prices = stockData?.chart?.result?.[0]?.indicators?.quote?.[0]?.close || [];\nconst volumes = stockData?.chart?.result?.[0]?.indicators?.quote?.[0]?.volume || [];\n\nconst latestPrice = prices[prices.length - 1];\nconst previousPrice = prices[prices.length - 2];\nconst priceChange = latestPrice && previousPrice ? ((latestPrice - previousPrice) / previousPrice * 100).toFixed(2) : 0;\n\n// Simple Moving Average\nconst sma5 = prices.slice(-5).reduce((a, b) => a + b, 0) / 5;\nconst trend = latestPrice > sma5 ? 'Uptrend' : 'Downtrend';\n\n// Volume analysis\nconst avgVolume = volumes.reduce((a, b) => a + b, 0) / volumes.length;\nconst latestVolume = volumes[volumes.length - 1];\nconst volumeRatio = (latestVolume / avgVolume).toFixed(2);\n\nreturn {\n  json: {\n    timestamp: new Date().toISOString(),\n    \n    // News Data\n    headline: newsData.title,\n    source: newsData.source,\n    link: newsData.link,\n    tickers: newsData.tickers,\n    keywords: newsData.keywords,\n    \n    // AI Analysis\n    sentiment: aiAnalysis.market_sentiment || aiAnalysis.sentiment,\n    impact: aiAnalysis.impact_level || aiAnalysis.impact,\n    sectors: aiAnalysis.affected_sectors || [],\n    signal: aiAnalysis.trading_signal || aiAnalysis.signal,\n    confidence: aiAnalysis.confidence_score || 0,\n    catalyst: aiAnalysis.key_catalyst || '',\n    risks: aiAnalysis.risk_factors || '',\n    \n    // Technical Data\n    ticker: newsData.tickers[0] || 'N/A',\n    current_price: latestPrice,\n    price_change_pct: priceChange,\n    trend: trend,\n    sma_5d: sma5.toFixed(2),\n    volume_ratio: volumeRatio,\n    \n    // Composite Score\n    composite_score: calculateCompositeScore(aiAnalysis, priceChange, volumeRatio),\n    actionable: (aiAnalysis.confidence_score > 70 && Math.abs(priceChange) > 2) || \n                aiAnalysis.impact_level === 'Critical'\n  }\n};\n\nfunction calculateCompositeScore(ai, priceChange, volRatio) {\n  const signalScores = {\n    'Strong Buy': 100, 'Buy': 75, 'Hold': 50, 'Sell': 25, 'Strong Sell': 0\n  };\n  const signalScore = signalScores[ai.trading_signal] || 50;\n  const momentumScore = priceChange * 5; // Price change weight\n  const volumeScore = volRatio > 1.5 ? 20 : 0; // Volume spike bonus\n  const confidenceWeight = ai.confidence_score / 100;\n  \n  return Math.round((signalScore * confidenceWeight + momentumScore + volumeScore) * 0.85);\n}"
      },
      "typeVersion": 2
    },
    {
      "id": "1c37bcc0-cb6b-4aa4-ad31-567a36071f93",
      "name": "Filter Actionable Signals",
      "type": "n8n-nodes-base.switch",
      "position": [
        976,
        48
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "",
                    "rightValue": ""
                  }
                ]
              }
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "4e938d32-00de-4ffd-976c-2f2bc5948c16",
      "name": "Send Trading Alert",
      "type": "n8n-nodes-base.slack",
      "position": [
        1216,
        -128
      ],
      "parameters": {
        "text": "\ud83d\udea8 *MARKET SIGNAL DETECTED*\n\n*{{ $json.ticker }}* | {{ $json.signal }} Signal\n*Confidence:* {{ $json.confidence }}% | *Impact:* {{ $json.impact }}\n\n\ud83d\udcf0 *Headline:* {{ $json.headline }}\n*Source:* {{ $json.source }}\n\n\ud83d\udcca *Technical Analysis*\n\u2022 Price: ${{ $json.current_price }} ({{ $json.price_change_pct }}%)\n\u2022 Trend: {{ $json.trend }}\n\u2022 Volume Spike: {{ $json.volume_ratio }}x average\n\n\ud83c\udfaf *AI Analysis*\n\u2022 Sentiment: {{ $json.sentiment }}\n\u2022 Sectors: {{ $json.sectors.join(', ') }}\n\u2022 Catalyst: {{ $json.catalyst }}\n\u2022 Composite Score: {{ $json.composite_score }}/100\n\n\u26a0\ufe0f *Risks:* {{ $json.risks }}\n\n\ud83d\udd17 <{{ $json.link }}|Read Full Article>",
        "otherOptions": {
          "mrkdwn": true
        },
        "authentication": "oAuth2"
      },
      "typeVersion": 2.3
    },
    {
      "id": "5bd4ef56-2dc2-4f4a-af96-3f7a34cdbaae",
      "name": "Mobile Notification",
      "type": "n8n-nodes-base.telegram",
      "position": [
        1216,
        240
      ],
      "parameters": {
        "text": "\ud83c\udfaf *{{ $json.signal }}*\n\n*{{ $json.ticker }}* - ${{ $json.current_price }} ({{ $json.price_change_pct }}%)\n\n{{ $json.headline }}\n\nConfidence: {{ $json.confidence }}%\nComposite Score: {{ $json.composite_score }}\n\n{{ $json.link }}",
        "chatId": "YOUR_TELEGRAM_CHAT_ID",
        "additionalFields": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "81a9974d-686d-4e1c-b205-2943f996a1f6",
      "name": "Log Signal Database",
      "type": "n8n-nodes-base.airtable",
      "position": [
        1472,
        48
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "id",
          "value": "appMARKETINTEL001"
        },
        "table": {
          "__rl": true,
          "mode": "id",
          "value": "tblSignals"
        },
        "columns": {
          "value": {
            "Link": "={{ $json.link }}",
            "Risks": "={{ $json.risks }}",
            "Trend": "={{ $json.trend }}",
            "Impact": "={{ $json.impact }}",
            "Signal": "={{ $json.signal }}",
            "Source": "={{ $json.source }}",
            "Ticker": "={{ $json.ticker }}",
            "Sectors": "={{ $json.sectors.join(', ') }}",
            "Catalyst": "={{ $json.catalyst }}",
            "Headline": "={{ $json.headline }}",
            "Sentiment": "={{ $json.sentiment }}",
            "Timestamp": "={{ $json.timestamp }}",
            "Actionable": "={{ $json.actionable }}",
            "Confidence": "={{ $json.confidence }}",
            "Price_Change": "={{ $json.price_change_pct }}",
            "Volume_Ratio": "={{ $json.volume_ratio }}",
            "Current_Price": "={{ $json.current_price }}",
            "Composite_Score": "={{ $json.composite_score }}"
          },
          "mappingMode": "defineBelow"
        },
        "options": {},
        "operation": "create"
      },
      "typeVersion": 2.1
    },
    {
      "id": "8dc3c119-fa23-4e48-a780-a79f2a44537a",
      "name": "Track Performance Log",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1712,
        48
      ],
      "parameters": {
        "columns": {
          "value": {
            "Date": "={{ $json.timestamp.split('T')[0] }}",
            "Time": "={{ $json.timestamp.split('T')[1].split('.')[0] }}",
            "Price": "={{ $json.current_price }}",
            "Score": "={{ $json.composite_score }}",
            "Change": "={{ $json.price_change_pct }}",
            "Signal": "={{ $json.signal }}",
            "Source": "={{ $json.source }}",
            "Ticker": "={{ $json.ticker }}",
            "Sentiment": "={{ $json.sentiment }}",
            "Confidence": "={{ $json.confidence }}"
          },
          "mappingMode": "defineBelow"
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "id",
          "value": "gid=0"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "1MARKET_INTELLIGENCE_SHEET_ID"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "74d91e79-8bea-4de4-862b-342009e364fa",
      "name": "Generate Trading Strategy",
      "type": "n8n-nodes-base.openAi",
      "position": [
        1968,
        48
      ],
      "parameters": {
        "prompt": {
          "messages": [
            {
              "role": "system",
              "content": "You are a portfolio strategist. Based on the trading signal and market conditions, provide: 1) Position sizing recommendation (% of portfolio), 2) Entry strategy (market/limit/staged), 3) Stop loss level, 4) Take profit targets, 5) Time horizon. Return as JSON."
            },
            {
              "content": "Signal: {{ $json.signal }}\nTicker: {{ $json.ticker }}\nPrice: ${{ $json.current_price }}\nConfidence: {{ $json.confidence }}%\nVolatility: {{ $json.price_change_pct }}%\nSentiment: {{ $json.sentiment }}\nRisks: {{ $json.risks }}"
            }
          ]
        },
        "options": {
          "maxTokens": 600,
          "temperature": 0.4
        },
        "resource": "chat",
        "requestOptions": {}
      },
      "typeVersion": 1.1
    },
    {
      "id": "631bf7c1-f310-47a9-ad21-c64d377aa359",
      "name": "Store Trading Plan",
      "type": "n8n-nodes-base.airtable",
      "position": [
        2224,
        48
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "id",
          "value": "appMARKETINTEL001"
        },
        "table": {
          "__rl": true,
          "mode": "id",
          "value": "tblSignals"
        },
        "columns": {
          "value": {
            "Record_ID": "={{ $('Log Signal Database').item.json.id }}",
            "Trading_Strategy": "={{ JSON.stringify(JSON.parse($json.choices[0].message.content)) }}"
          },
          "mappingMode": "defineBelow"
        },
        "options": {},
        "operation": "update"
      },
      "typeVersion": 2.1
    },
    {
      "id": "ae0f76b7-7260-4583-a084-c54cc58a9ea0",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -656,
        -64
      ],
      "parameters": {
        "width": 176,
        "height": 96,
        "content": "Triggers the workflow automatically every 15 minutes."
      },
      "typeVersion": 1
    },
    {
      "id": "5bb5dbb8-27e6-4069-be92-abdf9278600d",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -320,
        -240
      ],
      "parameters": {
        "width": 176,
        "height": 96,
        "content": "Fetches latest market news via RSS."
      },
      "typeVersion": 1
    },
    {
      "id": "d679ce10-9a8c-4236-941f-49b0be6c4d92",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -64,
        -64
      ],
      "parameters": {
        "width": 176,
        "height": 96,
        "content": "Combines all fetched RSS feeds into one stream."
      },
      "typeVersion": 1
    },
    {
      "id": "16b60dfb-0068-4a59-9828-2908d456ee75",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        192,
        -64
      ],
      "parameters": {
        "width": 176,
        "height": 96,
        "content": "Filters recent news, extracts tickers and keywords."
      },
      "typeVersion": 1
    },
    {
      "id": "d520509e-3f0d-49de-953c-b828c49042d5",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        432,
        -208
      ],
      "parameters": {
        "width": 176,
        "height": 96,
        "content": "Uses AI to analyze market sentiment and impact."
      },
      "typeVersion": 1
    },
    {
      "id": "bca74330-48fc-49da-8503-9aa91ef85c57",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        432,
        384
      ],
      "parameters": {
        "width": 176,
        "height": 96,
        "content": "Pulls stock prices and volumes from Yahoo Finance."
      },
      "typeVersion": 1
    },
    {
      "id": "929da30d-9159-4d8c-a7ae-b819eb2dc4dc",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        688,
        -64
      ],
      "parameters": {
        "width": 176,
        "height": 96,
        "content": "Merges AI and stock data into insights."
      },
      "typeVersion": 1
    },
    {
      "id": "569db511-28b4-4552-bc59-70bf2a7706ef",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        944,
        -64
      ],
      "parameters": {
        "width": 176,
        "height": 96,
        "content": "Keeps only strong or high-confidence trade signals."
      },
      "typeVersion": 1
    },
    {
      "id": "ee078f26-d8df-48b9-9589-545feda57844",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1168,
        -240
      ],
      "parameters": {
        "width": 176,
        "height": 96,
        "content": "Sends detailed trading alerts to Slack channel."
      },
      "typeVersion": 1
    },
    {
      "id": "e5d5df96-20e1-4472-8852-d06a5a71316d",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1168,
        400
      ],
      "parameters": {
        "width": 176,
        "height": 96,
        "content": "Sends condensed trade alerts to Telegram mobile app."
      },
      "typeVersion": 1
    },
    {
      "id": "31c50d0c-e788-49ca-a8c4-95107f4c79bf",
      "name": "Sticky Note10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1440,
        -64
      ],
      "parameters": {
        "width": 176,
        "height": 96,
        "content": "Stores analyzed signals in Airtable database."
      },
      "typeVersion": 1
    },
    {
      "id": "545bcd58-562a-495d-8777-215cf8a749c9",
      "name": "Sticky Note11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1680,
        -64
      ],
      "parameters": {
        "width": 176,
        "height": 96,
        "content": "Logs each trade\u2019s data into Google Sheets."
      },
      "typeVersion": 1
    },
    {
      "id": "14ed3ab8-de50-4098-81fb-43a54d3ea1d4",
      "name": "Sticky Note12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1936,
        -64
      ],
      "parameters": {
        "width": 176,
        "height": 96,
        "content": "Creates AI-driven strategy with entry and exit plan."
      },
      "typeVersion": 1
    },
    {
      "id": "c470e944-df2b-4483-b274-07a8c054c70e",
      "name": "Sticky Note13",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2192,
        -64
      ],
      "parameters": {
        "width": 176,
        "height": 96,
        "content": "Updates Airtable record with full trading strategy JSON."
      },
      "typeVersion": 1
    },
    {
      "id": "8fe136bc-dbbc-4e6d-a8a7-c8adb6dee954",
      "name": "Sticky Note14",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1328,
        -192
      ],
      "parameters": {
        "width": 608,
        "height": 496,
        "content": "# \ud83e\udde0 AI-Powered Market Intelligence & Trading Signal Workflow\n\nThis automated workflow continuously monitors financial news sources \u2014 Bloomberg, CNBC, and Reuters \u2014 every 15 minutes. It aggregates market data, filters relevant stories, and extracts stock symbols and market-moving keywords using NLP.\n\nThe system then runs **AI sentiment analysis** on the filtered headlines to assess potential market impact. It cross-references this information with **real-time stock data** from Yahoo Finance to identify actionable trading opportunities.\n\nEach insight is compiled into a structured **intelligence report**, logged in Airtable and Google Sheets for tracking performance. When a strong signal appears, the system instantly sends alerts to **Slack** (detailed summary) and **Telegram** (mobile notification), ensuring no key move is missed.\n\nFinally, it generates a dynamic, AI-driven **trading strategy** that includes suggested entry and exit points \u2014 updating automatically as new data comes in.\n\n\n\ud83d\udcbc **Connect with me on LinkedIn:** [Daniel Shashko](https://www.linkedin.com/in/daniel-shashko)\n"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Every 15 Minutes": {
      "main": [
        [
          {
            "node": "Bloomberg Markets Feed",
            "type": "main",
            "index": 0
          },
          {
            "node": "CNBC Breaking News",
            "type": "main",
            "index": 0
          },
          {
            "node": "Reuters Business",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Stock Data": {
      "main": [
        [
          {
            "node": "Synthesize Intelligence Report",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "CNBC Breaking News": {
      "main": [
        [
          {
            "node": "Aggregate News Sources",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Send Trading Alert": {
      "main": [
        [
          {
            "node": "Log Signal Database",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log Signal Database": {
      "main": [
        [
          {
            "node": "Track Performance Log",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Mobile Notification": {
      "main": [
        [
          {
            "node": "Log Signal Database",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Sentiment Analysis": {
      "main": [
        [
          {
            "node": "Synthesize Intelligence Report",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Track Performance Log": {
      "main": [
        [
          {
            "node": "Generate Trading Strategy",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate News Sources": {
      "main": [
        [
          {
            "node": "Filter & Extract Signals",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Bloomberg Markets Feed": {
      "main": [
        [
          {
            "node": "Aggregate News Sources",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter & Extract Signals": {
      "main": [
        [
          {
            "node": "AI Sentiment Analysis",
            "type": "main",
            "index": 0
          },
          {
            "node": "Fetch Stock Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Actionable Signals": {
      "main": [
        [
          {
            "node": "Send Trading Alert",
            "type": "main",
            "index": 0
          },
          {
            "node": "Mobile Notification",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Trading Strategy": {
      "main": [
        [
          {
            "node": "Store Trading Plan",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Synthesize Intelligence Report": {
      "main": [
        [
          {
            "node": "Filter Actionable Signals",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}