Att skriva ”dagliga marknadsuppdateringar” låter enkelt tills du sitter och stirrar på grafer, dubbelkollar indikatorer, skriver om samma disclaimers och ändå missar ditt publiceringsfönster.
Det är här Telegram Postgres-utkast hjälper. En content lead som försöker hålla produktionen konsekvent märker det först, men investeringsanalytiker och solooperatörer av nyhetsbrev fastnar i samma loop också. Du vill ha utkast du kan godkänna på några sekunder, inte ännu ett system du måste passa.
Det här arbetsflödet skapar utkast till marknadsinlägg två gånger om dagen, skickar dem till Telegram med ”Publicera” och ”Försök igen”, och sparar varje version i PostgreSQL så att du kan söka, återanvända och granska i efterhand.
Så fungerar den här automatiseringen
Se hur detta löser problemet:
n8n Workflow Template: Telegram + PostgreSQL: börsinläggsutkast du godkänner
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:robot", form: "rounded", label: "AI Agent", pos: "b", h: 48 }
n1@{ icon: "mdi:brain", form: "rounded", label: "OpenRouter Chat Model", pos: "b", h: 48 }
n2@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n3@{ icon: "mdi:cog", form: "rounded", label: "Execute Auth Login", pos: "b", h: 48 }
n4@{ icon: "mdi:cog", form: "rounded", label: "Execute Auth Trade API", pos: "b", h: 48 }
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Telegram Trigger"]
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Ошибка публикации"]
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Успешно опубликовано"]
n8@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Get Action Type", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Exist type and id", pos: "b", h: 48 }
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/postgres.svg' width='40' height='40' /></div><br/>Get Post By Id"]
n12["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Ошибка генерации"]
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Исторические данные"]
n14["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Рассчет TA"]
n15@{ icon: "mdi:cog", form: "rounded", label: "ID Generation", pos: "b", h: 48 }
n16["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Отправка поста на валидацию"]
n17["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Публикация постав в Профите"]
n18@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Развилка", pos: "b", h: 48 }
n19["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Собираем пост"]
n20["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Send a text message"]
n21["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/postgres.svg' width='40' height='40' /></div><br/>Сохранение поста"]
n22["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Данные для анализа (тут указ.."]
n23["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Query callback"]
n0 --> n15
n0 --> n12
n15 --> n21
n11 --> n18
n9 --> n10
n2 --> n22
n5 --> n9
n5 --> n23
n18 --> n19
n18 --> n22
n10 --> n11
n10 --> n6
n14 --> n0
n3 --> n17
n1 -.-> n0
n1 -.-> n8
n4 --> n13
n8 -.-> n0
n19 --> n3
n21 --> n16
n13 --> n14
n16 --> n20
n17 --> n7
n17 --> n6
n22 --> n4
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n2,n5 trigger
class n0,n8 ai
class n1 aiModel
class n10,n18 decision
class n11,n21 database
class n13,n17 api
class n14,n19,n22 code
classDef customIcon fill:none,stroke:none
class n5,n6,n7,n11,n12,n13,n14,n16,n17,n19,n20,n21,n22,n23 customIcon
Utmaningen: dagliga marknadsinlägg som inte slukar din dag
Marknadsinnehåll har ett brutalt krav: du måste dyka upp konsekvent, även när du är upptagen, även när data är stökig, även när ditt första utkast är… ärligt talat inte publicerbart. Om du skapar inlägg manuellt slutar det med att du hoppar mellan datakällor, räknar indikatorer, skriver en sammanfattning och sedan kopierar in den i Telegram (eller där du publicerar). Ett litet misstag kan tvinga fram en omtagning. Ännu värre: du kan inte enkelt svara på enkla frågor senare som ”Vad skrev vi om SBER förra månaden?” eftersom historiken är utspridd över chattar, dokument och halvfärdiga utkast.
Det blir snabbt mycket. Här är var det oftast faller isär.
- Du lägger cirka 30–60 minuter per publiceringscykel på att hämta candles, kontrollera RSI/MACD och omvandla det till begriplig text.
- Utkast publiceras utan en andra granskning, vilket gör att ett felaktigt påstående eller ett skrivfel blir en offentlig rättelse.
- När du vill återanvända en tidigare inläggsstruktur hittar du den inte snabbt, så du skriver om från noll.
- Att försöka igen efter ett data-/API-hack är manuellt, och det händer nästan alltid vid sämsta möjliga tidpunkt.
Lösningen: AI-utkast i Telegram, publicering på ditt godkännande
Det här n8n-arbetsflödet körs enligt schema två gånger om dagen och förbereder en fördefinierad uppsättning tickers (tänk GAZP, SBER, LKOH eller din egen lista). För varje ticker hämtar det historiska marknadscandles från ett broker-API, beräknar tekniska indikatorer (RSI, glidande medelvärden, MACD, Bollinger Bands, ADX) och lämnar datan till en AI-agent som skriver ett strukturerat inläggsutkast (rubrik plus sammanfattning). Utkastet lagras i PostgreSQL med en unik identifierare och levereras sedan till Telegram med inline-knappar så att du kan godkänna det. Tryck ”Publicera” så publicerar arbetsflödet via en HTTP-förfrågan till din målfeed och bekräftar att det lyckades. Tryck ”Försök igen” så kör den om genereringen, vilket är användbart när datan är tunn eller när första utkastet inte sitter.
Arbetsflödet börjar med en schemalagd trigger och ett steg som förbereder tickers. Därefter hämtar HTTP-förfrågningar marknadsdata och ett kodsteg beräknar TA-måtten innan AI:n skriver inlägget. Till sist blir Telegram ditt modereringslager, medan PostgreSQL blir ditt långsiktiga minne.
Vad som förändras: före vs. efter
| Vad detta eliminerar | Effekten du ser |
|---|---|
|
|
Effekt i verkligheten
Säg att du bevakar 5 tickers, två gånger om dagen. Manuellt, om det tar cirka 10 minuter per ticker att hämta data, kolla indikatorer och skriva ett kort inlägg, blir det ungefär 100 minuter per dag, plus publiceringspåslag. Med det här arbetsflödet blir ”arbetet” granskningstid: kanske 2 minuter per ticker för att läsa och godkänna i Telegram (cirka 20 minuter totalt), medan genereringen sker i bakgrunden. Det är ungefär en timme tillbaka varje dag, och du får dessutom ett korrekt formaterat PostgreSQL-arkiv som du kan söka i senare.
Krav
- n8n-instans (testa n8n Cloud gratis)
- Självhostningsalternativ om du föredrar det (Hostinger fungerar bra)
- Telegram för granskning av utkast och godkännandeknappar
- PostgreSQL för att lagra utkast och publiceringshistorik
- OpenRouter- eller OpenAI-API-nyckel (hämta den från din OpenRouter- eller OpenAI-dashboard)
Svårighetsgrad: Medel. Du kopplar konton, lägger till credentials och klistrar in ett par API-värden i rätt noder.
Behöver du hjälp att implementera detta? Prata med en automationsexpert (gratis 15-minuters konsultation).
Flödet i arbetsflödet
En schemalagd körning drar igång allt. Två gånger om dagen startar arbetsflödet och förbereder din tickerlista så att en körning kan täcka flera symboler utan att du behöver röra något.
Marknadsdata hämtas och struktureras. En HTTP-förfrågan hämtar historiska candles från ditt broker-API, sedan beräknar ett kodsteg de tekniska indikatorerna (RSI, EMA/SMA, MACD, Bollinger Bands, ADX) så att AI:n får konsekventa indata.
AI:n skriver ett strukturerat utkast. En AI-agent som använder en OpenRouter/OpenAI-chatmodell tar fram en rubrik och sammanfattning i ett förutsägbart JSON-format, och en strukturerad parser validerar det. Om parsningen misslyckas får Telegram en felvarning i stället för att tyst producera skräp.
Telegram blir godkännandespärren. Utkastet lagras i PostgreSQL med ett unikt ID och skickas sedan till Telegram med inline-knappar. När du trycker ”Publicera” hämtar arbetsflödet det sparade utkastet via ID och skickar det till publicerings-endpointen. Om du trycker ”Försök igen” slussas det tillbaka in i genereringen för ett nytt försök.
Du kan enkelt ändra tickerlistan för att täcka nya symboler utifrån dina behov. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: Konfigurera triggern för schemalagd körning
Det här arbetsflödet körs enligt ett schema och reagerar även på Telegram-callback-åtgärder för manuell publicering.
- Öppna Scheduled Run Trigger och ställ in schemaregeln så att den körs kl.
11:15och18:15med hjälp av de visade tidsinställningarna för Interval. - Öppna Telegram Callback Trigger och säkerställ att Updates inkluderar
callback_query. - Autentiseringsuppgifter krävs: Anslut era telegramApi-autentiseringsuppgifter i Telegram Callback Trigger.
- Notera parallellbeteendet: Telegram Callback Trigger skickar utdata till både Extract Callback Action och Acknowledge Callback parallellt.
Steg 2: Anslut Postgres och subarbetsflöden
Arbetsflödet lagrar utkast och hämtar dem vid publiceringsåtgärder, medan subarbetsflöden tillhandahåller autentiseringstokens.
- Öppna Store Post Record och välj tabellen analytics_history i schemat public; säkerställ att kolumnerna mappas till
id,title,ticker,summaryochclassCodemed hjälp av de uttryck som redan är definierade. - Autentiseringsuppgifter krävs: Anslut era postgres-autentiseringsuppgifter i Store Post Record.
- Öppna Fetch Post by Identifier och bekräfta att Operation är
selectmed Limit satt till1och Where-värdet satt till={{ $json.id }}. - Autentiseringsuppgifter krävs: Anslut era postgres-autentiseringsuppgifter i Fetch Post by Identifier.
- Öppna Run Sub-Workflow (Configure Required) och välj arbetsflödet som returnerar åtkomsttokens för publicering till Publish to Broker Feed.
- Öppna Run Sub-Workflow (Configure Required) 2 och välj arbetsflödet som returnerar åtkomsttokens för marknadsdata; bekräfta att indata använder
={{ $json.ticker }}och={{ $json.classCode }}.
Steg 3: Konfigurera hämtning av marknadsdata och TA-bearbetning
Det här avsnittet bygger tickerlistan, hämtar candlesticks och beräknar tekniska indikatorer.
- Öppna Prepare Ticker Inputs och uppdatera standardtickers i kodblocket vid behov (för närvarande
GAZP,SBER,LKOHmedTQBR-klasskoder). - Öppna Retrieve Market Candles och verifiera att URL är
https://be.broker.ru/trade-api-market-data-connector/api/v1/candles-chart. - Bekräfta att frågeparametrarna i Retrieve Market Candles är satta till
ticker = {{ $('Prepare Ticker Inputs').item.json.ticker }},classCode = {{ $('Prepare Ticker Inputs').item.json.classCode }},timeFrame = H1,startDate = {{new Date(Date.now() - 24 * 60 * 60 * 1000 * 60).toISOString()}}ochendDate = {{new Date().toISOString()}}. - Verifiera att headern Authorization i Retrieve Market Candles använder
=Bearer {{ $('Run Sub-Workflow (Configure Required) 2').item.json.access_token }}. - Öppna Compute TA Metrics och behåll den tillhandahållna JS-koden intakt för att beräkna RSI, MACD, SMA/EMA, ADX och Bollinger Bands för varje ticker.
Steg 4: Konfigurera AI Post Composer
AI-pipelinen omvandlar TA-mått till ett strukturerat JSON-utkast.
- Öppna AI Post Composer och behåll prompten i Text som den är, inklusive uttryck som
{{ $json.context.ticker }},{{ $json.context.timeFrame }}och{{ JSON.stringify($json, null, 2) }}. - Säkerställ att AI Post Composer har Has Output Parser aktiverat så att den kan skicka resultat till Structured JSON Parser.
- Öppna Structured JSON Parser och bekräfta att Schema är satt till
{ "title": "string", "summary": "string" }med Auto Fix aktiverat. - Öppna OpenRouter Chat Engine och verifiera att Model är
openai/gpt-oss-120b. - Autentiseringsuppgifter krävs: Anslut era openRouterApi-autentiseringsuppgifter i OpenRouter Chat Engine. OpenRouter Chat Engine är ansluten som språkmodell för AI Post Composer och Structured JSON Parser, så autentiseringsuppgifter måste läggas till i OpenRouter Chat Engine, inte i undernoderna.
Steg 5: Konfigurera publicering och Telegram-granskningsflöde
Det här flödet lagrar utkast, skickar dem till Telegram för godkännande och publicerar till broker-flödet baserat på callback-åtgärder.
- Bekräfta att huvudflödet för generering går enligt Scheduled Run Trigger → Prepare Ticker Inputs → Run Sub-Workflow (Configure Required) 2 → Retrieve Market Candles → Compute TA Metrics → AI Post Composer → Create Unique ID → Store Post Record → Send Draft for Review.
- Öppna Send Draft for Review och verifiera att Text använder
={{ $json.title }}och{{ $json.summary }}; behåll inline-keyboard-callbacks=publish::{{ $('Create Unique ID').item.json.data }}och=retry::{{ $('Create Unique ID').item.json.data }}. - Autentiseringsuppgifter krävs: Anslut era telegramApi-autentiseringsuppgifter för alla Telegram-åtgärdsnoder (totalt 6 noder), inklusive Send Draft for Review, Notify Draft Failure, Publish Success Alert, Publish Error Alert, Generation Error Alert och Acknowledge Callback.
- Öppna Extract Callback Action och bekräfta att tilldelningarna tolkar callbacken med
={{ $json.callback_query.data.split('::')[0] }}och={{ $json.callback_query.data.split('::')[1] }}. - Öppna Validate Action and Id och behåll båda villkoren som använder
={{ $json.action }}och={{ $json.id }}med operatorn exists. - Öppna Route Action Decision och verifiera att reglerna routar
publishochretrymedstartsWithpå={{ $('Extract Callback Action').item.json.action }}. - Öppna Assemble Publish Payload och behåll payload-strukturen med
content: `${text}\n#Теханализ {$${ticker}}`och taggar['Теханализ']. - Öppna Publish to Broker Feed och verifiera endpointen
https://my.broker.ru/web/api/v2/newsfeed/posts, MethodPOST, body={{ $('Assemble Publish Payload').item.json.post.toJsonString() }}och header=Bearer {{ $json.access_token }}.
[YOUR_ID]-platshållare i Telegram-noder, annars skickas inga meddelanden.Steg 6: Testa och aktivera ert arbetsflöde
Validera både den schemalagda genereringsvägen och Telegram-callback-flödet för publicering innan ni går live.
- Klicka på Execute Workflow och bekräfta att Retrieve Market Candles returnerar candlestick-data och att Compute TA Metrics ger ett
context-objekt medtickerochtimeFrame. - Säkerställ att AI Post Composer producerar ett giltigt JSON-objekt med
titleochsummary, och att Store Post Record infogar en ny rad. - Verifiera att Send Draft for Review publicerar utkastet till Telegram med inline-knappar och att ett klick på Опубликовать triggar Telegram Callback Trigger.
- Bekräfta att publiceringsvägen slutförs: Fetch Post by Identifier → Route Action Decision → Assemble Publish Payload → Run Sub-Workflow (Configure Required) → Publish to Broker Feed → Publish Success Alert.
- När ni är nöjda, växla arbetsflödet till Active så att Scheduled Run Trigger körs i produktion.
Se upp för
- Telegram-credentials och botbehörigheter kan blockera callbacks. Om knappar slutar fungera, kontrollera bottoken i n8n och bekräfta att boten kan läsa callback queries i Telegram.
- Om du använder Wait-liknande fördröjningar eller externa publicerings-endpoints varierar processtiderna. Öka väntetiden (eller lägg till ett omförsök) om nedströms HTTP-noder misslyckas på tomma svar.
- Standardprompter i AI-agenten är generiska. Lägg in din tonalitet och regler för riskdisclaimer tidigt, annars kommer du att ”justera ton” i varje utkast för alltid.
Vanliga frågor
Cirka en timme om du redan har dina API:er och din Telegram-bot redo.
Ja, men någon behöver hantera de initiala API-credentials. Efter setup är modereringen bara knapptryck i Telegram.
Ja. n8n har ett gratis självhostat alternativ och en gratis provperiod på n8n Cloud. Cloud-planer börjar på 20 USD/månad för högre volym. Du behöver också räkna in OpenAI/OpenRouter-användning, som oftast ligger på några cent per batch av utkast beroende på längd.
Två alternativ: n8n Cloud (hanterat, enklast setup) eller självhostning på en VPS. För självhostning är Hostinger VPS prisvärd och hanterar n8n bra. Självhostning ger dig obegränsat antal körningar men kräver grundläggande serverhantering.
Du kan byta broker-datakälla genom att uppdatera HTTP Request-noderna som hämtar candles och sedan behålla samma ”Compute TA Metrics” och logik för AI-utkast. Vanliga justeringar är att ändra tickerlistan i kodnoden för ticker-förberedelse, justera AI-prompten i AI-agenten så att den matchar din ton och skicka godkännanden till en annan kanal genom att redigera Telegram-noden ”Send Draft for Review”.
Oftast är det en utgången eller felaktig bottoken i n8n. Det kan också vara att boten saknar behörigheter i målchatten, eller en callback/query-inställning som gör att inline-knappar inte tas emot, så kontrollera Telegram Trigger och botens åtkomst först.
På en typisk n8n Cloud-plan kan du köra detta två gånger om dagen för dussintals tickers utan problem, och PostgreSQL lagrar utan ansträngning flera års utkast. Om du självhostar beror kapaciteten mest på din server och broker-API:ets gränser. I praktiken är den långsamma delen AI-anropet och eventuella rate limits vid hämtning av candles. Om du planerar att täcka hundratals tickers per körning, lägg till batchning och backoff så att du inte slår i begränsningarna.
Ofta, ja. Det här flödet använder kod för tekniska indikatorer, strukturerad JSON-parsning, förgrening (”Publicera” vs ”Försök igen”) och databaslagring, och den typen av logik blir lätt klumpig eller dyr i Zapier/Make. n8n låter dig också självhosta för obegränsade körningar, vilket spelar roll när du utökar tickers eller lägger till fler scheman. Om dina behov bara är ”skicka ett meddelande enligt schema” är Zapier helt okej. Men godkännanden, omförsök och ett PostgreSQL-arkiv är där n8n känns som rätt verktyg. Prata med en automationsexpert om du vill ha en snabb rekommendation.
När detta är live slutar du jaga utkast och börjar godkänna dem. PostgreSQL sparar bevisen, Telegram håller dig i kontroll.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.