API quick start
Credit price: $0.001 (1000 free credits on sign-up). Base URL https://api.marketapi.app/v1. Send your key in the Authorization header. Keys in URLs are rejected.
curl -H "Authorization: Bearer $KEY" "https://api.marketapi.app/v1/prices/latest?symbols=EURUSD,XAUUSD&require_live=true"
curl -H "Authorization: Bearer $KEY" "https://api.marketapi.app/v1/bars?symbol=EURUSD&timeframe=M1&from=2026-09-01T00:00:00Z&to=2026-09-02T00:00:00Z"
curl -H "Authorization: Bearer $KEY" "https://api.marketapi.app/v1/symbols/EURUSD"
EURUSD and XAUUSD are only examples: put the ticker you want in their place, written exactly as on the price list (grouped by market: forex, metals, indices, stocks, energies, crypto, with a search) or in the ticker list (CSV). Several tickers are separated by commas.
Two products, one API key. The market price API below serves prices to apps, bots and dashboards. The on-chain price oracle serves the same prices as signed reports that smart contracts verify on-chain.
Endpoints
| Endpoint | Cost |
|---|---|
GET /prices/latest?symbols= | 1 credit per symbol returned |
GET /ticks?symbol=&from=&to= | 1 credit per started 1000 rows |
GET /bars?symbol=&timeframe=&from=&to= | 1 credit per started 1000 rows |
GET /symbols, /symbols/{symbol}, /symbols/{symbol}/properties/history | Free |
GET /market-status, /account, /cost-preview | Free |
WSS /stream (subscribe to live quotes) | 1 credit per ticker per started minute |
GET /oracle/report?symbols=&chain_id= (signed report for smart contracts) | 5 credits per signed report |
GET /oracle/feeds, /oracle/catalog | Free |
How far back candles go: M1 7 days · M2–M6 30 days · M10–M30 3 months · H1 12 months · H2–H12 3 years · D1–MN1 5 years (as far as the market's own history reaches).
On-chain price oracle (for smart contracts)
Use the same forex, gold, index and stock prices inside smart contracts, for DeFi lending, tokenized assets (RWA), on-chain FX, stablecoin payments and synthetic assets. Your app fetches a signed price report; your contract passes it to our verifier contract, which checks the signature on-chain. The price cannot be forged in transit, and nobody has to trust the messenger.
- Fetch a report with your API key:
curl -H "Authorization: Bearer $KEY" "https://api.marketapi.app/v1/oracle/report?symbols=XAUUSD&chain_id=10" - Submit its
reportandsignatureto the verifier'ssubmit()in your transaction. - Read the verified price with
getPriceNoOlderThan(feedId, maxAge). It only returns a live price (market OPEN) younger thanmaxAge.
Every report states the market status (OPEN, CLOSED, HALTED) and the bid-ask spread, and expires about a minute after signing. Feeds have fixed IDs (keccak256("XAUUSD")), circuit breakers stop abnormal jumps, and a Chainlink-compatible adapter (latestRoundData) is available. Prices our relayer has already stored on-chain can be read for free.
Oracle documentation Feeds, networks and contracts
Free tier (no key)
Try the API without an account: 10 requests per minute and 1000 per day per IP address, up to 5 symbols per request.
curl "https://api.marketapi.app/v1/free/prices/latest?symbols=EURUSD"
curl "https://api.marketapi.app/v1/free/symbols"
curl "https://api.marketapi.app/v1/free/market-status?symbols=EURUSD"
Need more? Create an account for full access with your own API key.
Price status
Every price carries a status that says only one thing: how current the price is.
| Status | Meaning |
|---|---|
LIVE | Current: the price is recent and still moving. |
STALE | The market should be open, but no new price has arrived recently. Treat it as the last known price. |
MARKET_CLOSED | Outside the instrument's trading hours; the price is the last one before the close. |
UNKNOWN | Not validated yet, for example right after a restart. Usually clears within seconds. |
UNAVAILABLE | The source has stopped quoting this instrument. |
Add require_live=true to receive only LIVE prices; excluded symbols are not billed.
Every requested ticker appears in exactly one list: data (has a price), no_data (known ticker, no price yet) or unknown (not offered).
Trading hours. Forex, metals and most indices trade from Sunday evening to Friday evening (UTC). Share and ETF CFDs follow their exchange's regular session in local time, with daylight saving: New York 09:30–16:00, London 08:00–16:30, Frankfurt and Paris 09:00–17:30. Exchange holidays (NYSE, LSE, Xetra, Euronext) count as closed. Outside these hours a price is MARKET_CLOSED, not STALE; if the source quotes anyway (for example before the open), the price is LIVE.
Instrument specifications
GET /v1/symbols/{symbol} returns the instrument's complete specification as reported by the source, including currencies, contract size, tick size and volume limits, together with its trading sessions. GET /v1/symbols/{symbol}/properties/history lists every change to it. The ticker list (CSV) includes the main specification fields.
Safe retries
Send an Idempotency-Key header to make retries safe: repeating a request with the same key within 24 hours returns exactly the first answer again, without charging (answers up to 2 MB). For current data, send a new key; a key whose answer is no longer kept gets 409 idempotency_key_used.
Real-time prices (trading bots, dashboards)
Two ways to get the freshest price. Both deliver the same quotes; choose by how your program works.
REST: GET /prices/latest | WebSocket: /stream | |
|---|---|---|
| How | You ask, you get the latest quote | Quotes are pushed to you the moment they change |
| Best for | Occasional checks, scripts, spreadsheets | Trading bots, live dashboards |
| Billing | 1 credit per symbol returned | 1 credit per symbol per started minute |
How fresh is a price?
Symbols you are streaming, or have requested via /prices/latest in the last 5 minutes, are refreshed from the source about every second (up to such symbols across all customers at a time). All other symbols are refreshed continuously in the background, less often. So: request or subscribe to the symbols you trade, and they become fast.
Every quote carries time, the moment the source produced it (UTC), and a status. A trading program should always check both:
- Use
require_live=trueon REST calls: onlyLIVEprices are returned (others are listed separately and not billed). - Compare
timewith your clock and ignore quotes older than your strategy tolerates. Markets can be quiet: a price may legitimately not change for a while.
REST example
curl -H "Authorization: Bearer $API_KEY" \
"https://api.marketapi.app/v1/prices/latest?symbols=EURUSD,XAUUSD&require_live=true"
{"data": [{"symbol": "EURUSD", "bid": "1.12946", "ask": "1.12967", "last": null,
"time": "2026-10-02T09:15:42.381Z", "status": "LIVE"}],
"not_live": [], "unknown": [], "no_data": []}
Polling faster than once per second gains nothing: that is how often the source is read for active symbols.
WebSocket protocol
Connect to /stream with the header Authorization: Bearer <your key> (scope read:latest). Then send JSON messages:
> {"action": "subscribe", "symbols": ["EURUSD", "XAUUSD"]}
< {"type": "subscribed", "symbols": ["EURUSD", "XAUUSD"], "rejected": []}
< {"type": "quote", "symbol": "EURUSD", "bid": "1.12946", "ask": "1.12967", "last": null,
"time": "2026-10-02T09:15:42.381Z", "status": "LIVE"}
> {"action": "unsubscribe", "symbols": ["XAUUSD"]}
< {"type": "error", "code": "...", "detail": "..."}
Limits: up to 50 symbols per connection. Close codes: 4401 invalid key, 4402 balance used up (top up, then reconnect), 4429 too many open connections. The server sends pings every 20 seconds; most WebSocket libraries answer them automatically.
Python example (pip install "websockets>=14")
import asyncio, json, os, websockets
async def main():
url = "/stream"
headers = {"Authorization": "Bearer " + os.environ["API_KEY"]}
while True: # reconnect with backoff
try:
async with websockets.connect(url, additional_headers=headers) as ws:
await ws.send(json.dumps({"action": "subscribe", "symbols": ["EURUSD"]}))
async for raw in ws:
msg = json.loads(raw)
if msg["type"] == "quote" and msg["status"] == "LIVE":
print(msg["symbol"], msg["bid"], msg["ask"], msg["time"])
except websockets.ConnectionClosed as e:
if e.code in (4401, 4402): # wrong key / no balance: retrying will not help
raise
await asyncio.sleep(5)
asyncio.run(main())
Node.js example (npm install ws)
const WebSocket = require("ws");
const ws = new WebSocket("/stream", { headers: { Authorization: "Bearer " + process.env.API_KEY } });
ws.on("open", () => ws.send(JSON.stringify({ action: "subscribe", symbols: ["EURUSD"] })));
ws.on("message", (raw) => {
const m = JSON.parse(raw);
if (m.type === "quote" && m.status === "LIVE") console.log(m.symbol, m.bid, m.ask, m.time);
});
ws.on("close", (code) => console.log("closed", code)); // reconnect after a few seconds unless 4401/4402
Keep your API key on your server or in your bot. Never put it in web pages or apps that other people can open: anyone who has the key can spend your balance.
Good to know
- Prices are the source's own bid and ask;
price_basisin/symbolsstates which price the bars are built from. They are indicative market data, not an execution venue: your orders are filled at your own broker's prices. - Times are always UTC. Decimals are strings with the instrument's own precision, so no rounding is lost.
- For history (bars and ticks) see the endpoints above; real-time and history share the same symbols and keys.
Charts, indicators, drawing tools and price alerts (website)
Every ticker has a free interactive chart at /price/<ticker>, for example /price/EURUSD. These are website features: they use no API credits, and you need an account only to save analyses and set alerts.
| Feature | What you get |
|---|---|
| Chart | All 21 timeframes (M1 to MN1: the common ones as buttons, all of them in the drop-down); candles, Heikin Ashi or line; the last candle follows the live price, and the live bid (solid) and ask (dotted) are drawn across the chart with their prices on the price scale, in every timeframe; the live bid, ask and spread are also shown above the chart and the 52-week range, typical daily range and 1-month and 1-year change next to it. Zoom and scroll with the + − ‹ › buttons (made for phones), or drag, Ctrl + scroll and Shift + scroll on a computer; ⟲ returns to the latest candles. Times are UTC. |
| Chart widget for your website | Brokers and partners can show a live chart of any ticker on their own website: <iframe src="https://app.marketapi.app/price/EURUSD/embed?tf=H1" width="100%" height="520">. The widget is the full chart (indicators, drawing tools, wizard). Allowed websites are set by us: active partners' websites automatically, others on request (contact us). |
| Full screen | The Full screen button (or F) turns the chart into a dashboard that fills the screen, with indicators in panes below it; on Android phones it also turns the screen sideways, on iPhone it fills the window. On small screens the toolbar shows every timeframe in one drop-down and icon buttons, so nothing hides behind the edge. Esc leaves it. |
| 71 indicators | All the classic indicators, calculated with their standard definitions: moving averages (SMA, EMA, SMMA, LWMA), AMA, DEMA, TEMA, FrAMA, VIDYA, Bollinger Bands, Envelopes, Ichimoku, Parabolic SAR, ADX and ADX Wilder, Standard Deviation, ATR, Bears and Bulls Power, CCI, Chaikin Oscillator, DeMarker, Force Index, MACD, Momentum, OsMA, RSI, RVI, Stochastic, TRIX, Williams' %R, Accumulation/Distribution, Money Flow Index, On Balance Volume, Volumes, and Bill Williams' Accelerator, Alligator, Awesome Oscillator, Fractals, Gator and Market Facilitation Index. Plus ZigZag and widely used extras: VWAP, SuperTrend, Keltner and Donchian channels, Hull MA, pivot points, Stochastic RSI, Aroon, Chaikin Money Flow, Ultimate Oscillator and Choppiness Index. And more: VWMA, ZLEMA, ALMA, McGinley Dynamic, Least Squares MA, Chandelier Exit, Rate of Change, Chande Momentum, True Strength Index, PPO, Detrended Price Oscillator, Know Sure Thing, Vortex, Ease of Movement, Mass Index, Coppock Curve, Historical Volatility, Fisher Transform, Squeeze Momentum, Connors RSI and Price Volume Trend. Every setting can be changed; oscillators get their own pane. |
| Chart types | Candles, Heikin Ashi and line, plus (under More types) Renko bricks, Range bars, Line break and Point & Figure, built from the candles of the timeframe on screen. Box size: automatic (the average true range, rounded) or your own (⚙ on the chart-type chip), Point & Figure reversal and Line break lines too. Indicators, drawings, alerts on the chart and replay work on the bricks and columns; the settings are saved with an analysis. |
| 51 drawing tools | The classic analysis objects: trend line, ray, extended and arrowed lines, horizontal and vertical lines, trend by angle, cycle lines; equidistant, standard-deviation and regression channels, Andrews' pitchfork; Gann line, fan and grid; Fibonacci retracement, time zones, fan, arcs, channel and expansion; Elliott impulse (1-2-3-4-5, with a check of the three Elliott rules and the wave ratios), correction (A-B-C), triangle (A-B-C-D-E), double (W-X-Y) and triple (W-X-Y-X-Z) combinations; rectangles, triangles, ellipses, text, price labels, arrows and buy/sell signs. Plus harmonic XABCD patterns with the leg ratios and automatic recognition of Gartley, Bat, Alternate Bat, Butterfly, Crab, Deep Crab and Cypher, AB=CD, three drives, head and shoulders, price, date and price/time measuring tools, an anchored VWAP and a fixed range volume profile (from tick volume), and long/short position boxes with risk/reward. Pattern tools draw what the pattern projects: harmonics, AB=CD, three drives and head and shoulders show the targets (T1, T2) in green and the stop in red; Elliott waves show where wave 5 or wave C is likely to end and the correction targets after a full five; while you place the last point, dotted lines show where it would complete the pattern. "Show targets" in the drawing's settings hides them. |
| Editing | Pick a tool and click its points (or press and drag). Click a drawing to select it, drag it or its points, and change colour, width, style, extension, label or levels. Delete removes it, Ctrl + Z undoes, Esc cancels. Magnet snaps points to open, high, low or close. Drawings are tied to time and price, so they stay in place when you change the timeframe. |
| Price scale | ↕+ stretches the candles and ↕− flattens them, leaving room above and below for drawings and targets; you can also drag the price scale on the right up or down. ⟲ (or a double-tap on the price scale) returns to the automatic scale. |
| Drawing on a phone | Touch the chart, slide your finger to aim (a round magnifier above your finger shows the chart under it, the exact point and its price) and lift to place each point. Tap a drawing to select it, then drag it or its handles; while nothing is selected, swiping the chart scrolls the page as usual. |
| Saved analyses | Save stores the drawings, indicators, timeframe, chart type and the period on screen in your account with a title and description; whoever opens it (you, club members or a secret-link visitor) sees that same period, even when it is older than the candles normally loaded (the chart then says "Showing the chart up to …" with a Back to now button); My analyses opens them again on any device. Without an account, drawings stay in your browser. All of them are listed under Dashboard → Charts & alerts. |
| Ask AI | ✦ Ask AI on the chart (or in a drawing's settings): tick the drawings you want an opinion on (or all of them) and choose ChatGPT, Claude, Perplexity, Gemini or DeepSeek. A written summary opens there ready to send in your own account: the ticker, timeframe and live price, the latest candle and recent range, the indicators with their latest values, and for each drawing its points (price and time), Fibonacci levels, harmonic ratios, risk/reward and the pattern's projected targets. Indicators can be ticked one by one. A pattern you kept from the pattern wizard (Keep as my drawing) brings its analysis along: its quality, larger-wave context, suggested trade (entry, stop, targets and R:R), the rules met and missed, and its track record (trades, win rate against break-even, result per trade, 95% intervals and whether the edge is statistically significant); patterns you did not keep are not sent. On Android phones the assistant's app opens when it is installed (otherwise its website); on iPhones the link opens the app; Share to an app… sends the summary to any app on the phone. Your question comes last. Assistants that cannot be filled in from a link open empty and the summary is copied for you to paste; Copy works for any other assistant. We send nothing to the AI services ourselves. |
| Learn | Every indicator and drawing tool has a plain-language guide at /learn: the idea behind it, how it is calculated, how to read it, an example and its history. The ↗ links in the indicator list, the drawing menus and a drawing's settings open the matching guide in a new tab. |
| Alerts | 🔔 Alerts on the chart: Price (rises to, falls to, or crosses a level, up, down or either way), Indicator (RSI, Stochastic or CCI crossing or above/below a level; MACD crossing its signal line or zero; the price crossing a simple or exponential moving average or a Bollinger Band, on the chart's timeframe, as it happens or only on closed candles) and, from any drawing's 🔔 Alert button, Drawing: tick the levels you want, one alert each (a position's take profit, stop loss and entry, every Fibonacci level, pattern targets and stops, a rectangle's edges), or, for a trend line, ray, extended or arrowed line or horizontal ray, the line itself (it keeps its slope into the future exactly as on the chart). Alerts can carry a picture of the chart as it was when you set them: it is in the e-mail with the drawing's levels (target, take profit, stop loss), sent to Telegram, and shown in browser notifications where the browser supports it. Each alert fires once and switches off, or with Repeat stays on (at most every 10 minutes; indicator alerts once per candle). They go by e-mail, Telegram, browser notifications and/or your webhook: connect them under Dashboard → Charts & alerts → Where alerts go. Webhooks receive a JSON POST signed with your secret (X-Alert-Signature: sha256=HMAC-SHA256 of timestamp + "." + body, timestamp in X-Alert-Timestamp). Checked about every 15 seconds; never while a market is closed. Up to 50 active alerts; a confirmed e-mail address is required. |
New to charts? Learn every indicator and drawing tool in plain words: the idea, the formula, how to use it and an example.
Watchlists, compare, multi-chart and the screener (website)
| Feature | What you get |
|---|---|
| Watchlists | Your own lists of tickers with the live bid and ask, today's, 1-week and 1-month change and the daily RSI, at /watchlist. ☆ Add to watchlist on any chart or in the screener adds a ticker; drag ⠿ to change the order. Up to 20 lists of 100 tickers; visitors without an account see a list of popular tickers. |
| Beside the chart | The Watchlist button (or W) opens your list next to the chart, also in full screen. Click a ticker to open its chart in the timeframe you are looking at; the chart also remembers the last timeframe you used. |
| Bar replay | Replay on the chart, then click the candle where it starts (or pick a date): the later candles disappear and indicators see only what was known then. ▶ Play brings the candles back one by one (0.5 to 10 candles a second), Next candle (or →) steps, Space plays and pauses, ⏮ picks another start. Changing the timeframe continues at the same moment with the candles that had closed by then. While replaying, Trade practises on the replay: buy or sell at the candle close with a stop loss and take profit (checked on every new candle's high and low; the stop first if a candle touches both); the result is shown when you leave the replay. Works without an account; nothing is saved. |
| Paper trading | Trade on the chart: practise with $100000 of virtual money at live prices. Market, limit and stop orders, sized in lots (1 lot = the ticker's contract size: 100,000 units of a forex pair, 100 ounces of gold …) or in units; buys fill at the ask and sells at the bid, so the spread counts as in real trading. Stop loss and take profit (in the panel, or drag their lines on the chart; pending orders can be dragged too). Edit changes everything of a pending order (buy or sell, limit, stop or market, price, size, stop loss and take profit); on an open position it changes the stop loss and take profit and can make the size smaller (that part closes at the live price). The pattern wizard's position size can fill in an order for you. Profits in other currencies are converted to dollars at the live rate; leverage 1:30, and an account whose equity reaches zero is stopped out. Orders, stops and targets are checked every few seconds while a chart is open and every 15 seconds otherwise. Your account, history and results (win rate, profit factor, average win and loss): Dashboard → Paper trading, where you can also start again. Needs a free account. |
| Compare | Compare on the chart adds up to 4 other tickers as coloured lines. They start together at the left edge of the chart, so you see at a glance which market moved more; their % change since the left edge is on each line and in the chips above the chart (at the cursor when you hover). Scrolling or zooming starts the comparison again from the new left edge. The comparison is kept per ticker in your browser, and saved with an analysis. |
| Multi-chart | /multichart: 1, 2, 3, 4 or 6 live charts on one screen (side by side, stacked, one large with two small, 2 × 2, 3 × 2). Every cell is a complete chart with all indicators, drawing tools, Compare, Ask AI and saving. Click a cell's ticker to change it; "Same timeframe in every chart" keeps all cells on one timeframe (change it in any cell or for all at once). The layout is remembered in your browser, and Copy link shares it, e.g. /multichart?l=4&s=EURUSD,XAUUSD,US500,BTCUSD&tf=H1. "Open in multi-chart" on a watchlist opens its first tickers. |
| Screener | /screener: every ticker with its live price, change over 1 hour, today, 1 week, 1, 3 and 12 months, RSI (14) on the daily and hourly candles, ATR as % of the price, distance from the 52-week high and low and the trend against the 50- and 200-day averages. Ready-made screens (top gainers and losers, oversold, overbought, near the 52-week high or low, up- and downtrends, most volatile), a market filter, search, up to five filters of your own ("RSI daily below 30", "1 month % above 5") and sorting by any column. Links keep the screen, e.g. /screener?preset=oversold&market=Forex. |
| How the figures are made | Prices are live. The other figures come from the stored daily and hourly candles, recomputed every few minutes, with the live price as the latest close (so RSI, change and the 52-week range move with the market). Not investment advice. |
Trading ideas, profiles and following (website)
| Topic | How it works |
|---|---|
| Publish an idea | On any chart, draw your analysis and press Publish: a title, your reasoning, a direction (long, short or neutral) and, if you like, a strategy from the tester that anyone can run. A picture of the chart goes with it, and viewers can open your exact drawings, indicators and period on the live chart. You can change the title, text and direction later, never the chart. Up to 5 ideas a day. |
| Ideas | /ideas: Popular (likes and comments, newer ideas first), Latest and Following, filtered by ticker or direction. Every idea shows how the price moved since it was published, in its favour or against it. Each ticker page lists its latest ideas. |
| Profiles | Your page /u/your-handle lists your ideas with your followers, likes received and a short bio and picture. Choose your display name and handle under Dashboard → Profile & ideas. Your e-mail address is never shown. |
| Follow, like, comment | Follow people to see their ideas under Following and, if you want, in a daily e-mail. ♥ likes an idea (not your own). Comments are plain text; you can remove your own during their first 15 minutes, and authors can remove comments on their ideas. Anyone can report an idea or comment with ⚑; our team reviews reports. |
Mobile app (iPhone and Android)
Sign in with your account to get your watchlists with live prices, the full chart (every indicator, drawing tool and the pattern wizard, with your saved analyses), price alerts as phone notifications (tick push on an alert; switch notifications on under Account in the app) and the community's ideas. Two-factor sign-in works as on the website. Every phone you sign in on is listed under Account, where you can sign it out; a new password signs out every phone. Plans and top-ups are managed on this website. You can delete your account in the app or under Account here.
Invite friends (referrals)
Under Dashboard → Invite friends you find your personal link (/r/your-code; add ?next=/premium or any page of this site to send people there). Someone who opens it and creates an account within 30 days is linked to you. For 12 months after their sign-up, every top-up they pay (crypto on the main networks or card, at least $5) earns you 20%. Cashback waits 14 days in case of a refund, then it is added to your balance: spend it on API credits, plans or Chart Premium. You can also have it paid out (stablecoins or PayPal) from $50, confirmed by e-mail and checked by our team. Inviting yourself or a second account of your own does not count, and there is a monthly limit per inviter.
Partner programme (brokers and educators)
Businesses give their clients Chart Premium: apply under Dashboard → Partner; once approved you get a partner ID and 5 free trial seats (14 days of Pro each). Seats are bought in packs (10, 50, 250) at 30% off, for Pro or Pro+ and 1, 3, 6 or 12 months each, from your balance. Each seat becomes a one-time activation code, made on the partner page or through the partner API, optionally with your own client reference (kept masked). Unused codes can be cancelled and give their seat back. Clients enter the code on the Premium page.
Pattern wizard (website)
✦ Wizard on the chart scans the candles of the timeframe on screen and lists what it finds, with the rules each finding passed, a suggested trade and drawings you can show on the chart or keep as your own. It is automatic analysis of past prices, not investment advice. How to read a finding, its track record, confidence intervals and significance: the pattern wizard guide.
| Topic | How it works |
|---|---|
| What it finds | Harmonic patterns (Gartley, Bat, Alternate Bat, Butterfly, Crab, Deep Crab, Cypher, Shark, 5-0, three drives and AB=CD), complete or still forming; Elliott waves: impulses (complete, wave 3 under way, wave 5 under way), ending diagonals, corrections (zigzag A-B-C, flat, expanded flat, and wave C under way) and contracting triangles (A-B-C-D-E); head and shoulders and its inverse; double and triple tops and bottoms; ascending, descending and symmetrical triangles and rising and falling wedges; rectangles (trading ranges); bull and bear flags and pennants; cups with handles and their inverted form; reversal candles (engulfing, hammer, shooting star, morning and evening star, piercing line, dark cloud cover, tweezers, three soldiers or crows) at support and resistance; Fibonacci pullbacks and extensions of the last big swing; Andrews pitchforks; Gann fans (1×1, 1×2, 2×1 angles); parallel channels; support and resistance levels (prices the market turned at several times) and trend lines. Each pattern is also placed in the larger waves around it (one and two degrees up), finished or failed patterns are listed apart, and back-tests show how each strategy did on the ticker's history, with confidence intervals and significance at 90, 95 and 99%. |
| How swings are found | A fine ZigZag whose minimum move is a multiple of the Average True Range, so it suits each market's volatility; every point sits exactly on the high or low of its candle. Harmonic and Elliott patterns are searched over every combination of these swings joined by clean legs (no candle in between goes beyond the leg's ends), so a pattern may have one large leg and several small ones, at any size. Classic chart patterns use ZigZags at three sizes. Only recent patterns are shown: their last point is one of the latest swings. |
| The rules | Harmonics use Scott Carney's ratios with tight windows (for example a Gartley needs AB = 0.588–0.648 × XA and D = 0.766–0.806 × XA). Elliott impulses must meet every rule (wave 2 never beyond the start of wave 1, wave 3 never the shortest, wave 4 never in wave 1's territory, wave 5 beyond wave 3) and are scored on the guidelines (wave 2 at 38.2–78.6%, wave 3 ≥ 1.618 × wave 1, wave 4 at 23.6–50%, alternation, wave 5 = wave 1, 0.618 × wave 1 or 0.618 × waves 1–3). A diagonal is the one five-wave shape where wave 4 may overlap wave 1: its waves must shrink and its lines converge. Corrections are told apart by wave B: a zigzag's B retraces 38.2–88.6% of A, a flat's about 100%, an expanded flat's 105–138%. A ratio just outside its window (by at most 0.015) is still accepted, with a lower score and a note. Why under each finding lists every check, passed or not. |
| Completion zone | For a harmonic pattern still forming (X, A, B and C in place), the wizard shades the zone where D should complete: where the XA ratio and the projection of BC agree, narrowed to where an AB=CD and further BC projections meet as well (the more measures agree, the higher the score). The expected D is drawn at the time the last leg should take at the speed of the leg before it. The same zone appears while you draw X, A, B and C yourself. |
| Suggested trade | Direction, entry (at the market, a limit order in a zone, or a stop order on a breakout), stop loss and take profits (harmonics: 38.2% and 61.8% of AD; head and shoulders, double tops, triangles: the measured move; after five Elliott waves: 38.2%, 50% and 61.8% corrections and wave 4's end), each with its risk/reward. Only trades with the stop on the right side are suggested; patterns that already failed or reached their last target are left out. |
| Candle confirmation | For every suggested trade the wizard checks the last three candles at the entry (within ¾ of an ATR): a reversal candle in the trade's direction confirms it and raises the score; a real reversal candle against it is shown as a caution and lowers the score; a breakout entry is confirmed by a strong close beyond its level. Candles smaller than half an ATR are ignored. Breakouts are also checked against volume where the market reports it. Details: candle confirmation. |
| Indicators | Suggested from the market's state: in a strong trend (ADX above 25) a 50 EMA, SuperTrend, ADX and MACD; in a range (ADX below 20) Bollinger Bands, RSI and Stochastic; in a squeeze (unusually narrow bands) Squeeze Momentum and Keltner Channels; when volatility is high ATR and Chandelier Exit. Add puts one on the chart. |
| Track record | Each finding shows how that strategy did on past prices: trades, win rate against the break-even win rate its reward to risk needs, the expected return per trade in multiples of the risk (R) and in percent of the price, 90/95/99% confidence intervals for the win rate and the expected return, and significance at 90, 95 and 99% (an exact binomial test of the win rate against break-even, and a t-test and a bootstrap of the expected return against zero; all must agree, corrected for the many strategies tested at once). The most used tickers are back-tested automatically on every new candle. Details: reading the track record. |
| Market scan | Market scan runs the wizard over every ticker of the markets you choose and lists only the setups at their entry now (confirmed by a candle), significant at your level (90, 95 or 99%) in both win rate and expected return, best first. You choose how many patterns, the timeframe, the markets and the direction. It uses your computing time for pattern scans, counted only while it runs; if the time runs out mid-scan, it pauses and finishes after the reset. When more pass the filters than you asked for, “Load 10 more” and “Reveal all” show them at no extra cost. Choose “Any” significance to list every setup at its entry. Details: the guide. |
| How often | Each scan counts against a rolling allowance (shown under the Scan button; for visitors and free accounts 5 every 12 hours by default). Scans are queued so the site stays fast; the panel shows your place in the queue. Everyone who scans the same ticker and timeframe during the same candle shares one result. |
Chart Premium (website)
The charts are free. Chart Premium adds more of the heavy tools for 1, 3, 6 or 12 months, paid from the same prepaid balance as the API (longer periods cost less per month).
| Topic | How it works |
|---|---|
| Plans | Pro and Pro+. Press the plan's button on the Premium page: the price is taken from your balance and the plan starts at once. Buying the plan you already have adds the new period after the current one. |
| Renewal | At the end of the period the plan renews from your balance. If the balance is too low, we e-mail you 3 days before; without enough balance the plan ends and the charts stay free. Switch renewal off any time on the Premium page: the plan runs until its end date. |
| Moving up | Going from Pro to Pro+ starts Pro+ at once; the unused part of Pro is taken off the price (if it is worth more than the price, it adds days instead). |
| Locks | A tool marked 🔒 is part of Pro or Pro+ and opens once you have that plan (clicking it shows the plans). Saved charts and analyses that use a locked tool open without it. |
| Fair use | Pattern scans and the market scan use computing time instead of a number of scans: it is counted only while a scan runs, never while it waits in the queue or when the result comes from the shared cache. Each plan has a short window (it starts with your first scan and resets 5 hours later) and a weekly limit (it resets on the weekday and time you signed up). A scan that reaches the limit is not lost: it finishes after the reset. A small ring next to the wizard shows the time used, the time left and the next reset. Other heavy tools have a rolling allowance. |
| Activation codes | A code (like K7QM-3XTP-9RWA-FD2H) from a partner or a promotion gives a plan for a number of days: enter it on the Premium page under Have an activation code? (signed in). Each code works once. |
| Tasks | Long work (such as a scan of many markets) waits in a queue so the site stays fast. Dashboard → Tasks shows each task's place in the queue, the expected wait and the result, and the dashboard's overview lists the ones still running; plans go first. If a task cannot finish, it is retried by itself and you are told if it still fails. A task that is stuck, or has been going for 30 minutes, can be cancelled there; nothing it would have charged at the end is charged. |
Strategy tester (website)
Strategy on the chart tests a trading strategy on past candles of the timeframe on screen and shows every trade on the chart, the profit, the drawdown, the win rate and an equity curve against buy and hold. Pick a built-in strategy and change its inputs, or write your own in JavaScript. Signed in, you can test on up to 20,000 candles and save up to 50 strategies. Your script runs only in your browser, in a sandbox that cannot reach the internet, your account or this site.
The complete backtest console guide explains every setting and result, the whole script reference (including all 71 indicators in code) and 11 ready-to-run examples.
| Topic | How it works |
|---|---|
| Built-in strategies | Moving average crossover, RSI reversal (with stop and target in %), Bollinger Bands mean reversion, MACD signal cross, Donchian breakout (turtle, with an ATR stop) and SuperTrend. View code shows exactly what each one does; Edit a copy turns it into your own script. |
| How trades are filled | Orders placed on a candle are filled at the next candle's open, so a strategy never trades on a price it could not have known. Stop loss and take profit are checked inside each candle with its high and low; when both could have been hit in the same candle, the stop counts (the cautious assumption); a gap through a stop fills at the open. One position at a time: a long order while short reverses it. A trade still open at the end is closed at the last close. |
| Settings | Starting capital, order size (% of equity or a fixed number of units), commission (% of the traded value, each side), slippage / spread (added against every fill, in price; the candles are bid prices) and whether short trades are allowed (off: a short signal only closes a long). Amounts are in the price's currency. |
| Results | Net profit and %, buy and hold over the same candles, maximum drawdown, number of trades and % won, profit factor (gross profit ÷ gross loss), average trade, Sharpe ratio (annualised from the candle returns), time in the market, long and short separately, the largest win and loss and the longest losing streak. Trades lists every trade (click one to see it on the chart, or download a CSV); Equity curve plots the account against buy and hold. |
| Your own script | The top of the script runs once; function onBar(i) { … } runs for every candle, oldest first. Example:
|
| Candles and inputs | open, high, low, close, volume, time (UTC seconds) are arrays, oldest first; bars, symbol and timeframe describe them. Inside onBar(i) reading a candle after i stops the test with an error (no peeking into the future). input("Name", 14, { min, max, step }) or input("Mode", "EMA", { options: ["SMA", "EMA"] }) adds a field above the results; its value is saved with the strategy. |
| Series | ta.sma, ta.ema, ta.wma, ta.rma (Wilder), ta.rsi, ta.stdev, ta.highest, ta.lowest, ta.change, ta.roc take (series, length); ta.atr(14), ta.tr(); ta.macd(close, 12, 26, 9) → {macd, signal, hist}; ta.bb(close, 20, 2) → {upper, middle, lower}; ta.stoch(14, 3, 3) → {k, d}; ta.supertrend(10, 3) → {line, dir}. ind("adx", { period: 14 }) gives any of the chart's 71 indicators (the first line; the others in .lines). Values are null until there are enough candles. |
| Signals and orders | ta.crossover(a, b, i), ta.crossunder(a, b, i), ta.cross(a, b, i) (b may be a number), ta.rising(s, n, i), ta.falling(s, n, i). long(), short(), exit("reason"), with options { sl, tp } (prices), { slPct, tpPct } (% from the fill), { qty } (units) and { comment }; stopLoss(price) and takeProfit(price) move the open trade's stops. position (1, −1 or 0), positionSize, entryPrice, entryBar, equity and cash are current inside onBar. |
| Output | plot(series, "Name", "#hex") draws a line on the price chart (up to 12); log("text", value) writes to the Log tab (up to 200 lines). Errors show the line of your script. A test that runs longer than 20 seconds is stopped. |
| Limits | Past results do not guarantee future results. Back-tests ignore swaps, financing and changing spreads, and a strategy tuned to fit the past usually does worse on new data: check it on another period or ticker. This is not investment advice. |
Sharing analyses and clubs
Share one analysis with a link, or work together in a club: a shared work area with a chat and a shelf of chart analyses.
| Topic | How it works |
|---|---|
| Secret link | On a chart, My analyses → Share → Create a secret link. Anyone with the link sees the analysis on its chart, without an account, and cannot change it; signed-in viewers can save their own copy. The link reveals nothing about your account, and Switch the link off stops it at once. |
| Clubs | Clubs come in two kinds. A private club is a joint project for a team, friends or students: invisible to everyone else, joined with the club's secret invite link (admins can replace or switch it off) or a personal e-mail invitation (works once, for 14 days, only for that address). A public club is a community anyone can read and anyone with a confirmed e-mail can join. Each customer can create up to 10 clubs of up to 10000 members. |
| Shared analyses | Share → Share in the club puts a copy into the club, with a message in the chat that opens it on the chart; your original stays private. In a joint project every member can open and improve the club's analyses (the club shows who edited them last); the owner can limit editing to the author and the admins. |
| Replies, mentions and hashtags | Reply on a message quotes it above yours; clicking the quote jumps back to the original, however far up it is. Type @ and the first letters of a member's name to mention them (pick from the list), or press @ on their message. Mentions and replies to you are highlighted, counted on the club list and e-mailed to you at most once an hour per club (switch this off under You on the club page). Tag a topic with #, e.g. #EURUSD or #elliott: tags become buttons that list every message with that tag, and the club's most used tags of the month appear above the chat. |
| Chat | New messages appear within seconds. You can remove your own message during its first 15 minutes; after that it stays, so conversations cannot be rewritten later. Club admins can remove any message. Up to 12 messages a minute per member. |
| Roles | Owner: settings, picture, admins, handing the club over, deleting it. Admins: invitations, removing and blocking members, removing messages, handling reports, the club picture. Members: chat and shared analyses. Everyone appears under a nickname they choose, never their e-mail address. |
| Protection against bots | Creating a club and writing in a chat are checked by reCAPTCHA (invisible; a tick box only when Google is unsure, then not again for 30 minutes of chatting). New accounts can create clubs after a short wait and get smaller message allowances on their first day; messages per minute and per day, repeated identical messages, new clubs per network address and site-wide floods are all limited. |
| Moderation | Anyone can report a message with ⚑. Reports appear to the club's admins under Reported messages (remove it, or keep it) and to the site's staff. Admins can block a member from posting (they can still read) and allow it again later, or remove a member, optionally for good. |
| Club picture | Owners and admins upload a PNG, JPEG, WebP or GIF up to 3 MB; it is cut to a square and shown on the club page and in the club list. Once there are enough public clubs, the three most active appear on the home page. |
| Privacy | Private clubs are visible to members only; no club page is offered to search engines. Leaving a club removes your access to its analyses and chat. Messages and analyses are members' opinions, not investment advice. |
Where alerts go: e-mail, Telegram, phone, browser and webhooks
| Channel | How to switch it on |
|---|---|
| On for every confirmed e-mail address, with a picture of the chart when the alert has one. | |
| Telegram | Dashboard → Charts & alerts → Where alerts go → Connect Telegram opens our bot; press Start and it is linked. Disconnect there or block the bot. |
| Browser notifications | Same place → Turn on in this browser (once per browser and device). |
| Phone | Sign in to the mobile app and allow notifications; alerts with push ticked reach the phone. |
| Webhook | An https address of your own server (public internet only). Each alert is a JSON POST with X-Alert-Timestamp and X-Alert-Signature: sha256=… (HMAC-SHA256 of timestamp + "." + body with your webhook secret). Send a test shows the answer of your server. |
# Python: check that a webhook really comes from us (Flask example)
import hashlib, hmac, time
from flask import Flask, request, abort
SECRET = b"your-webhook-secret"
app = Flask(__name__)
@app.post("/alerts")
def alerts():
ts = request.headers.get("X-Alert-Timestamp", "")
sig = request.headers.get("X-Alert-Signature", "").removeprefix("sha256=")
good = hmac.new(SECRET, ts.encode() + b"." + request.get_data(), hashlib.sha256).hexdigest()
if not hmac.compare_digest(sig, good) or abs(time.time() - int(ts or 0)) > 300:
abort(401)
alert = request.get_json()
print(alert) # your trading bot, Slack, a spreadsheet…
return "ok"
Limits and errors (price API)
| Rate limits | Per API key: 600 requests a minute and 20000 an hour; the free endpoints without a key: 10 a minute and 1000 a day per IP address, up to 5 tickers per request. Monthly plans can raise the key limits. Every answer carries X-RateLimit-Limit, X-RateLimit-Remaining and, when you are over, 429 with Retry-After. |
| Errors | Errors are JSON (application/problem+json) with status, a stable code (for example unauthenticated, insufficient_balance, insufficient_scope, ip_not_allowed, unknown_symbol, rate_limited), a readable detail and a request_id. Quote the request ID when you contact support. All codes: Developers → Errors. |
| Safe retries | Retry 429 and 5xx after a pause (the SDKs do it for you); never retry 4xx without changing the request. |
| Website errors | If a page of the website ever fails, it shows a short error page with a reference. Quote it in a support ticket: it lets us find exactly what happened. |
Your account: API keys, security and teams
| API keys | Dashboard → API keys: create as many as you need, each with only the scopes it needs (read:latest, read:history, read:ohlcv, read:symbols, read:metadata, read:oracle) and, if you like, locked to your server's IP addresses. The key is shown once; we keep only a fingerprint. Revoke a key at once if it leaks. Test keys (mdp_test_…) are for trying your code: they cannot call paid endpoints and never spend credits. |
| Two-factor sign-in | Account → Security: an authenticator app (Google Authenticator, Microsoft Authenticator, 1Password…) plus recovery codes. Strongly recommended; required for staff. |
| Phones and sessions | Every phone signed in to the app is listed under Account, with Sign out for one or all. Changing your password signs out every phone. |
| Teams | Dashboard → Team: invite colleagues to work on your account (your balance, keys and usage) as Admin, Developer (keys, usage, docs) or Billing (top-ups, plans, receipts). Each person signs in with their own password and two-factor. |
| Usage | Dashboard → Usage: requests and credits per day, key and endpoint. A low-balance e-mail warns you before the credits run out. |
| Delete your account | Under Account (or in the app): you are signed out at once and your personal data is erased after 7 days. Payment records stay, anonymised, as the law requires. |
Credits, top-ups and plans
| Credits | The API is paid with prepaid credits ($1 per 1,000): 1 credit per latest price returned, 1 credit per 1000 history rows, 1 credit per ticker per minute of streaming. 1000 free credits come with every new account and are always used first. Charts, alerts and the community are free. |
| Top up with crypto | Dashboard → Billing: USDT or USDC on Ethereum, BNB Smart Chain, Arbitrum, Optimism, Base or Solana, from $5. Scan the QR code with your wallet; the balance updates by itself once the payment is final, and you get a receipt. |
| Top up by card | Where card payments are switched on, Pay by card on the billing page. |
| Monthly plans | Pricing: a monthly allowance of credits for less than pay-as-you-go, plus higher rate limits. While a plan runs, requests use only its credits and never your balance: when they run out, add credits to the month or upgrade on the billing page. When a plan ends, your balance is not used until you renew or choose pay as you go. Cancel any time. |
| Chart Premium | Separate from the API: Pro and Pro+ for heavy chart users (see Chart Premium). |
| Receipts | Every top-up and plan payment has a receipt with a QR code under Billing. |
Tasks
Heavy work (pattern scans, large batches of codes, long reports) waits in a fair queue instead of slowing the site. Dashboard → Tasks shows each one with its place in the queue and the expected time; you can leave the page, and you are told on the dashboard (and by e-mail for long ones) when it is done. A task that fails is retried automatically and never disappears silently.
Help and support
- Support tickets: write to us from your dashboard (with screenshots); answers arrive by e-mail and on the ticket.
- Ask AI (the chat button at the bottom right) answers questions about the platform at any time.
- Learn explains every indicator and drawing tool; the blog has tutorials; the changelog lists what is new.
- Status of a price:
GET /v1/prices/latestsays LIVE, STALE or MARKET_CLOSED for every quote (see Price status).
Indicators and drawings are calculated in your browser. Charts, indicators and alerts are information, not investment advice.