<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: yuan chen</title>
    <description>The latest articles on DEV Community by yuan chen (@yuan_chen_fe5f6f8182f7695).</description>
    <link>https://dev.to/yuan_chen_fe5f6f8182f7695</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3893686%2F94bde511-8a99-4712-835d-fa9a3e8c3d81.jpg</url>
      <title>DEV Community: yuan chen</title>
      <link>https://dev.to/yuan_chen_fe5f6f8182f7695</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yuan_chen_fe5f6f8182f7695"/>
    <language>en</language>
    <item>
      <title>I built an AI that reads stock charts — and made it grade its own homework</title>
      <dc:creator>yuan chen</dc:creator>
      <pubDate>Tue, 09 Jun 2026 15:50:20 +0000</pubDate>
      <link>https://dev.to/yuan_chen_fe5f6f8182f7695/i-built-an-ai-that-reads-stock-charts-and-made-it-grade-its-own-homework-4afn</link>
      <guid>https://dev.to/yuan_chen_fe5f6f8182f7695/i-built-an-ai-that-reads-stock-charts-and-made-it-grade-its-own-homework-4afn</guid>
      <description>&lt;p&gt;How KlineVision does AI technical analysis with Next.js + Gemini, draws it on the real candles, and verifies every call it makes after the fact — misses included.&lt;/p&gt;

&lt;p&gt;Most "AI stock analysis" tools confidently tell you a chart looks bullish and then never look back. I wanted the opposite: a tool that &lt;strong&gt;records every call it makes and later checks whether the market actually agreed&lt;/strong&gt; — and publishes the hit rate, misses included.&lt;/p&gt;

&lt;p&gt;That one constraint — &lt;em&gt;keep yourself honest&lt;/em&gt; — ended up shaping most of the interesting engineering. Here's how &lt;a href="https://klinevision.ai" rel="noopener noreferrer"&gt;KlineVision&lt;/a&gt; is put together.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Type a ticker (&lt;code&gt;AAPL&lt;/code&gt;, &lt;code&gt;600519.SH&lt;/code&gt;, &lt;code&gt;0700.HK&lt;/code&gt;) — or drop a chart screenshot.&lt;/li&gt;
&lt;li&gt;You get a &lt;strong&gt;structured read&lt;/strong&gt;: trend, support/resistance, candlestick + chart patterns, and 缠论 (Chan theory) structure — &lt;strong&gt;drawn directly onto the real candles&lt;/strong&gt;, not hand-waved in prose.&lt;/li&gt;
&lt;li&gt;Works across US, A-shares, and Hong Kong markets.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js (App Router)&lt;/strong&gt; on &lt;strong&gt;Vercel&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supabase&lt;/strong&gt; (Postgres + RLS) for data &amp;amp; auth&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini 3 Flash&lt;/strong&gt; for the analysis itself&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EODHD + Yahoo Finance&lt;/strong&gt; for market data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions + Vercel Cron&lt;/strong&gt; for the background jobs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PostHog&lt;/strong&gt; for product analytics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now the parts that were actually interesting to build.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. "Never analyze fake data"
&lt;/h2&gt;

&lt;p&gt;The market-data layer had a silent fallback: when a provider rate-limited, it returned &lt;strong&gt;synthetic candles&lt;/strong&gt; so the UI never broke. Great for a demo, terrible for a product whose entire value is trust — the model would write a beautiful, confident analysis of a chart &lt;strong&gt;that never existed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The fix was to make the data layer fail &lt;em&gt;honestly&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Yahoo (primary) → EODHD (fallback) → if only demo data is available → 503, no analysis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we can't get real candles, the user gets "live market data temporarily unavailable" — not a hallucinated read. For a trust tool, a silent fallback to fake data is the worst bug on the board.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Make the AI show its work
&lt;/h2&gt;

&lt;p&gt;A text blob saying "there's a double bottom" isn't credible. You have to &lt;em&gt;see&lt;/em&gt; it on the chart.&lt;/p&gt;

&lt;p&gt;So the model returns &lt;strong&gt;structured overlays&lt;/strong&gt; keyed to candle timestamps, and an isomorphic canvas renderer maps them onto the real OHLCV:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"zones"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"support"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"price_low"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;188.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"price_high"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;190.1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"trend_lines"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-02"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-06-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"neckline"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"markers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"double_bottom"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-20"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"chan"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"bi_direction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"up"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"zhongshu"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same renderer runs &lt;strong&gt;server-side&lt;/strong&gt; (for share cards / OG images) and &lt;strong&gt;client-side&lt;/strong&gt; (interactive, with layer toggles). Structuring LLM output into something a renderer can trust — and validating it hard — was most of the work here.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The honest track record (the whole point)
&lt;/h2&gt;

&lt;p&gt;This is the part I'm proudest of. Every analysis snapshots its &lt;strong&gt;Chan bi-direction call&lt;/strong&gt; (is the current move up or down?). Then a nightly cron — &lt;code&gt;verify-chan&lt;/code&gt; — does the unglamorous thing:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Wait 7 days.&lt;/li&gt;
&lt;li&gt;Re-fetch the candles.&lt;/li&gt;
&lt;li&gt;Check what actually happened.&lt;/li&gt;
&lt;li&gt;Mark the call &lt;code&gt;verified_correct&lt;/code&gt;, &lt;code&gt;verified_incorrect&lt;/code&gt;, or &lt;code&gt;expired&lt;/code&gt; (inconclusive).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The published hit rate is deliberately conservative:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;accuracy = correct / (correct + incorrect)   // 'expired' excluded
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;…and we &lt;strong&gt;don't show a percentage at all&lt;/strong&gt; until there are enough decisive samples. No small-sample theatre, no cherry-picking. A generic LLM can't offer this; a system that &lt;em&gt;remembers its own predictions and checks them&lt;/em&gt; can. It's the one moat that AI hype can't fake — you either kept the receipts or you didn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The pSEO lesson that cost me a weekend
&lt;/h2&gt;

&lt;p&gt;I generated ~&lt;strong&gt;6,300 programmatic pages&lt;/strong&gt; — every stock × every detected pattern × two locales. Google &lt;em&gt;discovered&lt;/em&gt; them and indexed about &lt;strong&gt;400&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The trap: those ~4,500 templated "does AAPL have a doji right now?" combo pages weren't just sitting unindexed — they were &lt;strong&gt;dragging the whole site's quality signal down&lt;/strong&gt;. A ~6% index rate is Google telling you the site is mostly thin content.&lt;/p&gt;

&lt;p&gt;The fix wasn't &lt;em&gt;more&lt;/em&gt; pages. It was &lt;em&gt;fewer&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cut the sitemap from &lt;strong&gt;6,322 → ~1,834&lt;/strong&gt; genuinely-differentiated URLs (pattern/indicator explainers, comparison pages, per-symbol pages).&lt;/li&gt;
&lt;li&gt;Dropped the combinatorial filler (kept the pages reachable, just stopped advertising them).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;On a young domain, crawl budget is a ceiling set by authority — not by how many URLs you shove into a sitemap.&lt;/strong&gt; Submitting 6k pages doesn't get you 6k indexed; it gets your good pages buried with the junk.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Latency honesty
&lt;/h2&gt;

&lt;p&gt;A full Gemini analysis takes ~&lt;strong&gt;70 seconds&lt;/strong&gt; (it's doing multi-step technical + Chan reasoning). Running that synchronously during SSR meant a blank tab and gateway-timeout risk for the first visitor to an uncached symbol.&lt;/p&gt;

&lt;p&gt;So the daily pages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Serve a &lt;strong&gt;fresh cache instantly&lt;/strong&gt; when one exists (refreshed nightly for popular symbols).&lt;/li&gt;
&lt;li&gt;For cold symbols, fall back to a &lt;strong&gt;non-blocking client loader&lt;/strong&gt; with staged progress ("fetching market data → running technical analysis → detecting Chan structure → drawing the chart"), then cache the result for the day.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Slow is fine if it's honest about being slow. A spinner with real status beats a frozen page every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it (and the obligatory disclaimer)
&lt;/h2&gt;

&lt;p&gt;You can use the assistant &lt;strong&gt;free, no sign-up&lt;/strong&gt; — type a ticker and see what it reads. It's at &lt;strong&gt;&lt;a href="https://klinevision.ai" rel="noopener noreferrer"&gt;klinevision.ai&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And to keep with the theme: this is an &lt;strong&gt;analysis aid, not investment advice&lt;/strong&gt;. Past performance doesn't predict future results — which is exactly why the track record verifies itself instead of asking you to take its word for it.&lt;/p&gt;




&lt;p&gt;I'd genuinely love feedback from devs who've wrestled with &lt;strong&gt;structuring LLM output&lt;/strong&gt;, &lt;strong&gt;programmatic SEO at scale&lt;/strong&gt;, or &lt;strong&gt;financial data pipelines&lt;/strong&gt; — those were the three hardest parts. What would you have done differently?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>nextjs</category>
      <category>showdev</category>
    </item>
    <item>
      <title>An AI-Powered K-Line Chart Analyzer — Upload a Screenshot, Get Structured Technical Analysis</title>
      <dc:creator>yuan chen</dc:creator>
      <pubDate>Thu, 23 Apr 2026 07:19:56 +0000</pubDate>
      <link>https://dev.to/yuan_chen_fe5f6f8182f7695/an-ai-powered-k-line-chart-analyzer-upload-a-screenshot-get-structured-technical-analysis-gnp</link>
      <guid>https://dev.to/yuan_chen_fe5f6f8182f7695/an-ai-powered-k-line-chart-analyzer-upload-a-screenshot-get-structured-technical-analysis-gnp</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Every trader has been here: you're staring at a candlestick chart, trying to figure out if that's a Head and Shoulders forming or just noise. You flip between three indicator panels, check RSI, squint at the MACD histogram, and still aren't sure.&lt;/p&gt;

&lt;p&gt;I wanted a tool where I could just &lt;strong&gt;screenshot a chart and get a structured breakdown&lt;/strong&gt; — patterns detected, trend direction, confidence scores, and what to watch next. No manual drawing, no subjective interpretation.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://klinevision.ai" rel="noopener noreferrer"&gt;KlineVision&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Does
&lt;/h2&gt;

&lt;p&gt;Upload any K-line (candlestick) chart screenshot — A-shares, US stocks, crypto, anything — and KlineVision returns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Classic Pattern Detection&lt;/strong&gt; — Head &amp;amp; Shoulders, Bullish Engulfing, Morning Star, Flags, Triangles, and 70+ more patterns with confidence scores&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chan Theory Analysis (缠论)&lt;/strong&gt; — Bi (笔), Duan (线段), Zhongshu (中枢), and Beichi (背驰) structure detection. If you trade Chinese markets, you know how powerful this is&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trend Judgment&lt;/strong&gt; — Bullish / Bearish / Sideways with strength and confidence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trading Signals&lt;/strong&gt; — Contextual buy/sell/watch signals with risk notes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bilingual Output&lt;/strong&gt; — Full analysis in both English and Chinese&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The analysis is powered by Google Gemini's vision model with a carefully crafted prompt that enforces structured JSON output.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tech Stack
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Next.js 16 (App Router, TypeScript)
├── EODHD + Tushare (market data)
├── Supabase (auth + PostgreSQL)
├── Stripe (subscriptions)
├── SVG K-line renderer (server-side, zero deps)
└── 11-locale i18n (en/zh/ja/ko/es/fr/de/pt/ru/ar/hi)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few things I'm proud of:&lt;/p&gt;

&lt;h3&gt;
  
  
  Pure SVG K-Line Renderer
&lt;/h3&gt;

&lt;p&gt;Server-rendered candlestick charts that crawlers can see (no Canvas/WebGL). I wrote a &lt;a href="https://klinevision.ai/patterns/bullish-engulfing/" rel="noopener noreferrer"&gt;pure TypeScript SVG string generator&lt;/a&gt; — zero native dependencies, works in Vercel Serverless. It draws candlesticks, MA lines, volume bars, pattern highlights, and annotations, all as SVG XML strings.&lt;/p&gt;

&lt;p&gt;Each page has real data — historical win rates, T+5/10/20 return statistics, recent detection cases — not LLM-generated fluff. The pattern detection runs a rule-based engine on actual OHLCV data from EODHD and Tushare.&lt;/p&gt;

&lt;h3&gt;
  
  
  11-Language Support
&lt;/h3&gt;

&lt;p&gt;Every page renders in 11 languages with proper &lt;code&gt;hreflang&lt;/code&gt; tags. Entity content (pattern names, descriptions, FAQs) is stored as &lt;code&gt;L10n&lt;/code&gt; objects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;en&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bullish&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Engulfing"&lt;/span&gt;
  &lt;span class="na"&gt;zh&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;看涨吞没"&lt;/span&gt;
  &lt;span class="na"&gt;ja&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;強気の包み足"&lt;/span&gt;
  &lt;span class="na"&gt;ko&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;상승&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;장악형"&lt;/span&gt;
  &lt;span class="c1"&gt;# ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Translation is done via Gemini batch API (~$0.15 for all entities × 9 languages).&lt;/p&gt;

&lt;p&gt;The prompt is the secret sauce — it forces Gemini to output a strict JSON schema with confidence scores, bilingual explanations, and explicit "what I can't determine from this image" sections. No hallucinated price targets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pattern Detection Pipeline
&lt;/h2&gt;

&lt;p&gt;Beyond the screenshot analysis, there's a daily data pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fetch&lt;/strong&gt; — Pull OHLCV data from EODHD (US/A-shares) and Tushare (HK)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Detect&lt;/strong&gt; — Rule-based engine scans for 10 candlestick patterns (Hammer, Engulfing, Doji, Morning/Evening Star, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backfill&lt;/strong&gt; — Calculate T+5/10/20 returns for historical detections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compute&lt;/strong&gt; — MACD, RSI, Bollinger Bands snapshots for each stock&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aggregate&lt;/strong&gt; — Win rate statistics at global/market/symbol level&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Upload a chart&lt;/strong&gt;: &lt;a href="https://klinevision.ai" rel="noopener noreferrer"&gt;klinevision.ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browse patterns&lt;/strong&gt;: &lt;a href="https://klinevision.ai/patterns" rel="noopener noreferrer"&gt;klinevision.ai/patterns&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check a stock&lt;/strong&gt;: &lt;a href="https://klinevision.ai/stocks/us/AAPL" rel="noopener noreferrer"&gt;klinevision.ai/stocks/us/AAPL&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scan for patterns&lt;/strong&gt;: &lt;a href="https://klinevision.ai/scanner/doji/us" rel="noopener noreferrer"&gt;klinevision.ai/scanner/doji/us&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The core analysis feature is free. I'd love feedback from anyone who trades or is interested in technical analysis.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;More chart patterns in the rule engine (currently 10, targeting 30+)&lt;/li&gt;
&lt;li&gt;Multi-timeframe confirmation (daily + 4h + 1h)&lt;/li&gt;
&lt;li&gt;Real-time pattern alerts via Telegram&lt;/li&gt;
&lt;li&gt;Hong Kong market expansion (Tushare rate limits are... fun)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>nextjs</category>
      <category>jellyfin</category>
    </item>
  </channel>
</rss>
