EMA pair
The script draws two readable lines. Its code stays unchanged.
You are signed in. Before you start, we need the same two answers everyone gives when they sign up.
Every other platform makes you choose: trade somewhere sterile, or socialize somewhere that treats you like a liability. NEXUS refuses the tradeoff — real charts, real markets, and a community that isn't throttled by arbitrary corporate policy, all in one place.
Free expression within the law. Serious market tools with a soul. A community funded by tipping (OCN) instead of ads that sell you out.
And the chain is open by design. O-Coin is MIT-licensed; the platform you're reading this on is not. The chain's source is public — read it, run it, fork it — and what you can verify today is on the chain itself: the genesis premine was burned, there's no founder stash, and anyone can mine it or run a node. The more independent hands on it, the less any one person — including us — can control it. That's the whole idea.
The script draws two readable lines. Its code stays unchanged.
Built from the indicator settings. No fork and no rewrite.
The marker and the numbers use the same rule over the bars on the chart.
{
"strategy": "EMA pair",
"symbol": "BTCUSDT",
"action": "long",
"signalId": "ema:14:00:long"
}
History keeps the response. A failed webhook can be retried without repeating a paper action.
Sign in to set up a hosted bot.
⟳
Open positions keep their safety stop. Check your positions and orders at Hyperliquid, fix what is wrong, then clear the hold. The bot stays paused afterwards until you start it.
Your bot's past trades are off the chart.
Loading bots…
Loading…
Leverage multiplies the size of each trade, and how fast it gains or loses.
Once a trade is this far ahead, a stop follows the best price at this distance.
Every position gets a stop order held by Hyperliquid itself.
After a safety stop closes a trade, the bot waits this long before trading that market again.
Enter a whole percent from 1 to 100.
The bot limit is a ceiling, not a deposit: the most margin the bot's positions may use at once, as a share of your Hyperliquid account value.
Settings can be changed while the bot is paused.
Engage saves your settings and starts the bot on its next fresh signal. Tap Engaged to pause: open positions keep their stops. Don’t trade the bot’s markets by hand while it runs.
Bot limit is a ceiling, not a deposit: the most margin the bot’s positions may use at once. Changing it never places an order; the bot uses new room on its next signal, or you can add to a position below. Here the limit is a fixed dollar amount that stays put as account value changes (the slider and buttons just work out dollars from today’s value), and it can never be more than the account is worth. It does not cap losses; the stops do that.
Connect an account to see the available margin.
No markets yet.
0xA85f…2016), so bridged wOCN is already swappable for USDC.bridgeBurn — the bridge watches for it automatically.See what Nexus queued, every attempt it made, and what still needs attention.
Until the NEXUS fee is set up, a hosted bot comes with a paid plan.
NEXUS provides professional-quality trading tools for a modest cost. Until the NEXUS fee is set up, a hosted bot comes with a paid plan. Once it is, a bot can be paid for instead by a small NEXUS fee on each order it places to open a position, which Hyperliquid adds to that order and pays to NEXUS through its builder-fee system, with no card. Closes and stop orders never carry it. Either way, it pays for the shared always-on worker your bot runs on, market data, monitoring, security and support, so users will not need their own Render accounts. Hyperliquid's own trading fees are separate. The rate is shown on this page before you approve it.
The bot trades through a dedicated Hyperliquid API wallet: a key that can place and cancel orders on your account but cannot withdraw. It is not the O-Coin wallet on your NEXUS profile. Never enter your main-wallet key or seed phrase.
Hosted bots add a fee of — of the order's value (reward badges pay less) to each order that opens a position, paid through Hyperliquid's builder-fee system to the NEXUS builder address —. Closes and stop orders never carry it. Your main wallet approves the standard rate once, which also covers the reduced rate; you can revoke it at Hyperliquid at any time, and then the bot stops opening new trades.
Create an API wallet on Hyperliquid · How API wallets work. Disconnecting removes our copy; also revoke the wallet at Hyperliquid.
Choose the bot, its aggressiveness and its stops in the chart's trading panel → Hosted bot.
You do not need an exchange key. Test the whole path with paper trading, or paste one HTTPS webhook URL supplied by your bot service.
Your Hyperliquid API wallet, the bot fee approval, webhooks and exchange hookups live on the Automation page.
action: "test" and X-Nexus-Test: true. It cannot fire a paper trade or exchange order.Chat, rooms, forums and profiles sit beside the chart rather than on another site, and the point of them is that they are worth being in. NEXUS Chat for Chrome brings those conversations into a browser side panel. Moderation is for what is genuinely harmful or illegal — not opinions, not jokes, and not people who disagree with you. Nobody is sold anything and there are no sponsored calls.
It is also where the learning happens: indicators are shared as readable code, a script’s page is its own discussion, and paper trading lets you practise at real prices with nothing at stake. Somebody picking this up and somebody who has done it for years are on the same page, using the same tools, with the same view of the market.
And what gets said about the market can be put on the record — settled by the market rather than by a vote — so a room full of opinions still has a way of telling which of them held.
Anything here can be built again by somebody else. What cannot is the depth: every day of book and tape recorded on this site is a day nobody who starts tomorrow will ever have, and every study that reads it gets longer with it. That is the part that compounds, and it is why the recording runs whether or not anyone is watching.
NEXUS Chat keeps public market conversations, direct messages, groups and Calls on the Record close while you browse. Open the side panel with the extension icon; there is no chart tab to keep open.
NEXUS Chat is on the Chrome Web Store. Public chat is on NEXUS too, without installing anything.
NEXUS Chat is a companion to the NEXUS site. It does not restore chat on another platform, follow the market on another chart, or read the pages you visit. The extension requests access to NEXUS and its sign-in service.
Your extension sign-in is separate from your session on the NEXUS website. Calls made in the side panel use the price observed by the NEXUS server. For a call with a chart snapshot, open the full NEXUS chart.
Install NEXUS Chat from the Chrome Web Store and click its toolbar icon. Choose Public to read a channel, or sign in for messages, groups and calls. You can use the public channels without an account.
Charts and forums are here; the day-to-day conversation is on Discord. Ask questions, report bugs, argue about candles, or watch the O-Coin chain get built in public.
Join the DiscordEvery other platform makes you choose: trade somewhere sterile, or socialize somewhere that treats you like a liability. NEXUS refuses the tradeoff — a place to study markets, paper trade, argue, meme, post, and build, with far fewer arbitrary rules about what you're allowed to say than the trading apps and social giants that came before.
Free expression within the law. Real markets. A community funded by tipping (OCN) instead of ads that sell you out. That's the whole idea.
NEXUS is operated by PosiQuant Labs LLC, a limited liability company registered in Pennsylvania, United States. The Terms, Privacy Policy and Risk Disclosure are here.
And the chain is open by design. O-Coin is a personal project, not owned or controlled by PosiQuant Labs LLC, which operates this website. O-Coin is MIT-licensed; the platform that hosts it is not. The chain's source is public on GitHub, so the consensus code behind every claim below is there to be read. What you can check today is on the chain itself — O-Coin is a fair-launch chain whose genesis premine was burned to a provably keyless address, with no founder stash, and a network anyone can join without permission. It gets stronger the more independent people run it, so if you're technical: mine the live chain or spin up your own node. The more hands on it, the less any one person (including us) can control it — which is the point.
NEXUS is free and ad-free. Hosting is not. If it is useful to you and you want to chip in, this address is the whole mechanism — no account, no processor, no name required.
not configured yet
Emoji art: Twemoji by Twitter, Inc. and other contributors, licensed under CC-BY 4.0.
What you are looking at. Every few seconds NEXUS records the whole order book for this market and keeps it. Each horizontal bar is one price, drawn across the time it was actually there — so a bar that reaches the right edge is size resting there right now, and one that stops partway is size that went. Where a bar changes colour is where that level grew or thinned.
Why most of the book is not drawn. Near the current price almost every increment holds something, so painting all of it fills the screen and leaves nothing for a real level to stand out against. The Threshold control keeps the levels worth the name — ranked by size weighted by how long each held, the same rule the list below uses. Drag it to 0 to see the entire book, or to 1.00 for only the largest thing that stayed put.
A word on the colours. The ramp is in ten steps rather than a smooth fade, and each bar is shaded from the median of the few minutes around it. Raw, a resting level jitters every poll and the map reads as static. The hover always reports the size that was actually recorded, never the smoothed one. The two accumulating layers need none of that — a running total cannot fall, so there is no jitter to filter.
Resting size is an intention; traded volume is evidence. An order in the book can be withdrawn the moment price approaches, and measured here across three days of BTC it did not say where price would go: a wall that absorbed heavy volume held 48% of the time against a base rate of 49%, and every other way of splitting it landed in the same place. Volume that has already gone through a price cannot be taken back, which is why Traded exists beside Resting rather than instead of it — the book still shows you what somebody is willing to do, it just should not be read as a forecast.
What the Liquidation layer is, exactly. Every other number on this page was recorded. This one is inferred, and the inference is worth stating plainly: aggressive buying is treated as longs being opened and aggressive selling as shorts, a position opened at a price with leverage L is assumed to liquidate near P × (1 − 1/L) for a long and P × (1 + 1/L) for a short, four common leverage settings are weighted equally because nobody outside the exchange knows the real distribution, and a cluster is removed once price has reached it. Each of those is an assumption that can be wrong. Treat the layer as a map of where pressure would sit if the assumptions hold, never as a record of anything.
Why persistence is the point. A single fat order tells you very little — it can be pulled the instant price approaches. A level that stays lit across many stripes is one somebody keeps replacing, which is a much stronger claim about where they are willing to trade. That is why Levels that held ranks by size weighted by how long it lasted rather than by size alone, and why the Held column exists at all.
Reading the columns. Price is the level. Dist is how far it sits from the current mid, as a percentage — useful because a level 0.05% away and one 2% away mean very different things. Avg size is the mean resting size across the whole window, not its peak, so a brief spike does not flatter it. Held is the share of recorded snapshots the level was present for.
What this is NOT. This is not a liquidation heatmap. Coinglass and similar tools estimate where leveraged positions would be forcibly closed, modelled from open interest and assumptions about leverage — those levels are inferred, and nobody has actually placed an order at them. What you see here is the opposite: real limit orders genuinely resting on Hyperliquid right now. The styling is borrowed because it is the language people read for this kind of view; the data is not the same thing, and reading one as the other will mislead you.
Limits worth knowing. Recording starts when you open the page, so a fresh view has no history — it fills in as it goes. The window holds roughly the last 45 minutes. Only orders currently on the book are visible: anything already filled or cancelled is gone, and hidden or iceberg size never appears at all.
CVD is the running total of aggressive buying minus aggressive selling. Aggressive means the side that crossed the spread — the trader who wanted it enough to pay. Rising CVD means buyers have been lifting offers; falling means sellers have been hitting bids.
Read it against price, not alone. Price and CVD rising together is a move being paid for. Price making a new high while CVD does not is the interesting case: the market went up without buyers having to chase it, which is a thinner move than the candle suggests. The reverse — price flat while CVD climbs hard — means someone is absorbing everything being bought.
The footprint splits each bar's volume by price and by aggressor: sell-side left of centre, buy-side right. The yellow line is the point of control, the price that traded most in that bar. A bar that closed up on mostly sell-side aggression is a very different animal from one that closed up on buying, and a candlestick cannot tell them apart.
Limits. Recording starts when a market is first asked for, so a fresh view fills in rather than showing history. Only trades the venue publishes are counted, and a market stops being recorded a few minutes after nobody is looking at it.
O-Coin (OCN) is a hybrid proof-of-work / proof-of-stake blockchain. It has no company behind it, no allocation held back for a team, and no genesis supply left in anyone's hands — the 5,000,000,000 OCN minted at block 0 was permanently burned to a provably keyless address on 19 July 2026. Every coin that has existed since was produced by mining or staking under rules anyone can run. This page is the specification and the roadmap. Everything in it is checkable against the live chain, and where a claim can be checked, the link to check it is included.
A blockchain is a shared list of transactions that no single participant controls. O-Coin is one of those, written from scratch in Python, running right now across independent nodes that check each other's work. It keeps a running balance for every address, and it agrees on new entries roughly every fifteen seconds.
It was built in the spirit of Dogecoin's early years — fast, cheap, casual transfers, a tipping culture, and a chain that is interesting to read rather than impressive to market. It is a real chain doing real cryptography, and it is also a hobby project by one person. Both of those are true and neither is hidden.
That has not changed now that a company exists. PosiQuant Labs LLC operates the NEXUS website — which provides a wallet, a faucet, tipping and a bridge to this chain — and does not own or control the chain itself. The consensus code is MIT-licensed and public, the genesis premine was burned, and anyone may run a node without asking.
The very first block created 5 billion OCN and put them in a single address. That is a premine, and it is the mechanism behind most of what people mean when they say a coin is a scam: whoever holds that supply can sell it into whatever demand later shows up, and everyone who bought is the other side of that sale.
Those coins were sent to an address that has no private key and cannot have one. O-Coin addresses are normally the SHA-256 hash of a public key. The burn address is instead the SHA-256 hash of a fixed public string, OCN:BURN:GENESIS-PREMINE. To spend from it you would have to find a public key whose hash collides with that value, which is not something anyone can do. You can reproduce the address yourself in two lines of Python, and you can watch the coins sit in it:
One honest detail, because someone will find it and it is better said here first: the original founder address is not frozen and is not empty. It has gone on mining like any other address, so its balance grows. None of that is premine — it is block rewards earned under the same rules available to anyone with a computer. The thing that was permanently removed is the genesis allocation, and the burn address is where you check that.
Two ways, and only two. Mining means your computer repeatedly hashes a candidate block until it finds one whose hash lands below a difficulty target; the network accepts it and pays a block reward. Staking means the chain gives an address a chance, proportional to its balance, to produce a block without doing that work, for a much smaller reward. There is no other mint. No one can create OCN by editing a database, and a node that tried would simply be rejected by every other node.
The block reward starts at 100 OCN and shrinks smoothly and permanently — about 3% of its distance above a floor of 0.5 OCN each year, chosen because 3% is roughly the long-run historical average rate of US consumer-price inflation. It approaches that floor forever without ever reaching it, so there is no fixed maximum supply and no halving cliff. This is a design choice with a real trade-off, stated plainly: miners are always paid something, so the chain never has to survive on transaction fees alone, and in exchange the supply has no hard cap.
This document makes no claim about what OCN is worth or will be worth, and it will not make one. There is no treasury, no founder allocation, and nobody whose position depends on other people arriving. That is the entire offer.
O-Coin is published as a technical project under the MIT licence: you can read all of it, run all of it, change it, and fork it without asking. That is the entire offer. Every rule stated on this page is a line in that repository, and every number is one you can read off the running chain — so nothing here has to be taken on trust.
It is also unfinished in specific, documented ways. Part 3 lists them. A project that tells you what it has not built yet is easier to evaluate than one that only lists what it has.
Every constant below is a named value in blockchain.py in the O-Coin repository. Current live values are readable at /status.
Account-based, not UTXO. The chain maintains a balance index keyed by (address, asset), rebuilt from history at load and updated per block. Multi-asset from the ground up: OCN is the native asset, with additional assets (notably the staking receipt stOCN) tracked on the same ledger.
| Signature scheme | ECDSA over SECP256k1 — the same curve Bitcoin uses |
| Address derivation | sha256(public_key_bytes).hexdigest()[:40] |
| Address length | 160 bits, 40 hexadecimal characters |
Truncation to 160 bits is for a shorter, friendlier address, the same reasoning Bitcoin and Ethereum both hash a public key down rather than using it directly. Whoever holds the private key is the only party who can authorise a spend; the node software cannot move coins from an address it does not hold a key for, and neither can its operator.
A transaction is signed over a canonical JSON serialisation, keys sorted, of exactly these fields: sender, recipient, amount, fee, timestamp — plus op and op_data when the transaction carries an operation (asset transfer, staking pool deposit or withdrawal, liquidity add or remove, swap).
Two properties of that list are deliberate. The fee is inside the signed message, so a transaction cannot be intercepted in flight and have its fee rewritten before a miner sees it. And op/op_data are omitted entirely when unset, so a plain transfer produces byte-identical output to what it produced before those fields existed — every signature ever made on this chain still verifies. The signature and public key are excluded from the signed message, since signing over your own signature is circular.
Coinbase transactions (block rewards) use sender = "0", carry no signature, and are rejected if they attempt to carry an operation.
| Hash function | Scrypt, N=1024, r=1, p=1 — Litecoin and Dogecoin's parameters |
| Hashed header | index, timestamp, merkle_root, previous_hash, target, nonce |
| Target block time | 15 seconds |
Scrypt rather than plain SHA-256 because it is memory-hard: each attempt has to allocate and shuffle a real working buffer, which narrows the advantage purpose-built mining hardware holds over an ordinary computer. The hash function is defined in exactly one module, pow_hash.py, imported by both the node's validator and the standalone miner — they previously held separate copies, which drifted apart once during development and produced a miner whose every submission was silently rejected.
A block commits to its transaction set through a Merkle root, so altering any transaction in a mined block invalidates its hash, and with it every block after.
| Retarget interval | every 10 blocks |
| Maximum adjustment | 4× harder or easier per retarget |
| Easiest permitted target | 2256 / 28 |
| Initial target | 2256 / 213 |
Every 10 proof-of-work blocks, the chain compares how long that batch actually took against how long it should have taken and adjusts. The 4× clamp is standard anti-whiplash protection: a large amount of hashpower arriving or leaving at once moves difficulty quickly but not catastrophically.
| Base reward | 100 OCN |
| Floor | 0.5 OCN — approached asymptotically, never reached |
| Decay | 3% of the distance above the floor per year of blocks |
| Maximum supply | none — emission continues indefinitely at the floor |
Not a halving. The reward decays exponentially and continuously, so it is always slightly smaller than it was, which keeps it responsive rather than letting it flatten into a step function. The 3% figure is tied to the long-run historical average of US CPI inflation rather than an arbitrary constant — a judgment call, kept as a single named constant precisely so it can be revisited against real data.
Consensus code cannot use floating-point exponentiation. Library implementations of transcendental functions are not guaranteed bit-identical across platforms, so two honest nodes could compute two different "correct" rewards for the same height and fork over nothing at all. O-Coin derives the per-block decay ratio once, offline, bakes it in as a fixed integer literal, and every node then performs only integer multiplication and shifts — fixed-point exponentiation by squaring in Q0.64, the same approach on-chain compound-decay maths uses in Solidity. A startup self-check refuses to run if that literal is ever left stale relative to the constants it was derived from.
| Stake weight | an address's current balance, floored to whole coins |
| Difficulty | an entirely separate target with its own retargeting |
| Retarget interval | every 10 PoS blocks |
| Block reward | 10% of the proof-of-work reward at that height |
Peercoin-style, adapted to an account-based ledger. Sub-1-OCN balances carry no stake weight — a deliberate simplification that keeps a float out of a consensus decision. Proof of stake keeps its own difficulty target because PoW and PoS timings measure two unrelated quantities (hashpower against total actively-staking balance), and mixing their timestamps into one retarget window would corrupt both signals.
The reward asymmetry is the point. Proof-of-work rewards have to cover real electricity and hardware, and that cost is what makes attacking the chain expensive. Staking costs almost nothing, so paying it equally would dilute the chain's actual security spend without buying any security in return.
| Fee | flat, 0.01 OCN minimum — not a percentage |
| Mempool capacity | 5,000 transactions |
| Block filling | highest fee first |
A flat fee because the cost a miner bears including one more transaction does not depend on the amount being sent, so charging a percentage punishes larger transfers for nothing. When the mempool is full, an incoming transaction displaces the lowest-fee pending one only if it pays strictly more — the same fee priority the block builder already applies. The cap exists because transaction submission is a public route: anything anyone can call without an account has to be bounded.
The longest valid chain wins, with two hard limits. Checkpointing: blocks deeper than 20 are permanent regardless of how long or how validly-mined a competing chain is — the standard mitigation for a small chain's exposure to an attacker who rents more hashpower than it has. Replay protection: a signed transaction can be honoured exactly once, enforced both at submission and independently re-checked inside block validation, so a node cannot be tricked by a replayed transaction even if it accepts a block from a peer.
Worth being precise about what a majority of hashpower could and could not do: it could contest which valid history wins, by producing a longer chain. It could never forge a transaction, because that is blocked by signature verification no matter how much hashpower is behind it.
Nodes persist one database row per block, so writing a block is a constant-time append rather than a rewrite of the whole chain. New blocks are gossiped to peers immediately on acceptance rather than waiting for anyone to poll, with /nodes/resolve as the fallback longest-valid-chain sync.
The network is permissionless. Syncing the chain, submitting a transaction, receiving gossip and mining all work without credentials of any kind — verified in July 2026 by having someone with no prior access join the live network from their own machine. There is no shared secret gating participation, and the read routes the explorer on this site uses are the node's own public routes, which means this site is a convenience and never a required intermediary.
Staking and the OCN:stOCN automated market maker are native chain operations rather than contracts, addressed by the same provably keyless construction the burn address uses — sha256("STAKE_POOL:OCN") and siblings. A lock-and-mint bridge to wOCN on Ethereum's Sepolia testnet exists and has been exercised in both directions, with replay protection and an immutable daily mint cap.
A BFT finality gadget (HotStuff-derived, in the family Hyperliquid's HyperBFT belongs to) is implemented and has its own test suites, but is inert. It holds exactly one reach into consensus — a veto against reorganising away a block a committee has finalised — and until a committee actually finalises something, every reorg decision behaves precisely as it always has. Block production, rewards, emission and both consensus mechanisms are untouched by its presence. Activation waits on choosing a real cross-machine validator committee, which is a decision about people, not code.
Ordered roughly by what it would make sense to tackle first. The gap between "a real chain that works" and what Bitcoin, Litecoin or Dogecoin actually run in production is real, and this section is where it is written down rather than glossed.
The chain lives in its own repository, separate from this site, MIT licensed, and neither needs the other to run. Its documentation covers the burn (BURN.md) and the opening of the network to independent nodes (DECENTRALIZATION.md, including its honest caveats). This site's own source is not public and is not MIT — only the chain is.
Check anything here against the explorer, or against the node directly at o-coin.onrender.com/status. If a claim on this page and the chain disagree, the chain is right and this page is a bug.
NEXUS is built in working layers. This page shows what is usable now, what is being hardened next, and what stays tucked away until its data, safety and product states are ready.
Read the code, see its version and discussion, add it to your chart, favorite it, or tip the person who made it. Any indicator with lines can become a signal system from its chart settings.
These Oak scripts publish signals directly. Read the code, review them on your chart, discuss them in public, then choose whether to attach a closed-bar alert. A shared script is someone's own code, so it runs in your browser: its alert fires while a chart with it is open.
Oak is the scripting layer on NEXUS, similar to native scripts like TradingView’s Pine Script: an indicator or a strategy is a short piece of plain JavaScript over the candles, run in a sandbox in your own browser. If you have written Pine, you already know most of it. This page maps the concepts, migrates one strategy end to end, and says plainly what Oak does not do.
Have a Pine script already? Press From Pine… in the Oak editor and paste it. A Pine Script v4, v5 or v6 indicator or strategy is converted for you, in your browser: the Pine never leaves the page. The Oak it writes walks the bars one at a time the way Pine runs, so close[1], var and every ta.* call keep their own history and give the numbers Pine gives. Boxes, lines and labels (box.new, line.new, label.new, and moving or deleting them afterwards) come across as what is standing after the last bar; so do tables, and a linefill between two level lines. Anything it cannot convert — another symbol or timeframe through request.security, arrays, polylines, and the stops and targets of strategy.exit — is listed by its Pine line number, so a partial conversion says it is partial. The rest of this page is for writing Oak by hand, which is shorter and easier to read than what the converter writes.
A function body. It receives three things and hands back one object:
//@oakversion=1
// candles: [{ t, open, high, low, close, volume }, ...] oldest first
// params: { fast: 9, slow: 21 } whatever you declared, as numbers
// ta: sma, ema, rsi, stdev, close, high, low, open, volume
const c = ta.close(candles);
return {
pane: "overlay", // or "separate"
lines: [{ name: "EMA", data: ta.ema(c, params.length), color: "#00f5ff" }],
histogram: undefined, // { name, data, up, down }
patterns: undefined, // [{ kind, points: [{ i, price }], label }]
signals: undefined, // [{ i, side: "long"|"short"|"flat", price?, note? }]
boxes: undefined, // [{ from, to, top, bottom, color?, label?, open? }]
segments: undefined, // [{ from, to, price, price2?, color?, label?, style?, open? }]
labels: undefined, // [{ i, price, text, color?, below? }]
events: undefined, // [{ i, text, kind?, price? }] not drawn: what "Alert on events" fires on
tables: undefined, // [{ position: "top_right", bg?, cells: [{ col, row, text, color?, bg? }] }]
};
The first line, //@oakversion=1, is the version of the Oak contract the script was written for — what //@version=5 is to Pine. It is a comment, so it costs nothing; the editor adds it if it is missing, and a script that declares a version this site does not run is refused with a sentence rather than failing inside.
Every series is an ordinary array the same length as candles, with null where a value does not exist yet (an EMA of length 20 is null for the first 19 bars). There is no hidden time series type, no [1] history operator, no var persistence — you index the arrays yourself, and a loop is a loop.
The sandbox is the point. A script runs in a Web Worker inside a null-origin frame with fetch, XMLHttpRequest, WebSocket, storage and importScripts removed from the prototype chain, a fresh scope per run, a 2-second budget, a 64 KB source limit and a 200,000-point output cap. That is why a script written by a stranger is fine to add to your chart: it can reach the bars it is given and nothing else — not the page, not your wallet, not the network. The server never runs a script.
| Pine Script | Oak | Note |
|---|---|---|
//@version=5 | //@oakversion=1 | The first line. Names the contract the script was written for; the editor adds it if you forget. |
indicator("EMA", overlay=true) | return { pane: "overlay", lines: [...] } | Where it draws is in the returned object. |
strategy("Cross") | return { ..., signals: [...] } | A strategy is an indicator that also produces signals. |
len = input.int(20, "Length") | params.length | Declared in the editor's params box as {"length": 20}; each becomes a settings field. |
close, high, volume | ta.close(candles), ta.high(candles), ta.volume(candles) | Plain arrays, oldest first. Also ta.open, ta.low, ta.hl2, ta.hlc3, ta.ohlc4. |
close[1] | c[i - 1] | Index the array. Check i > 0. |
ta.ema(close, 20) | ta.ema(c, 20) | Same for sma, wma, rsi, stdev, highest, lowest, change. Warm-up is null, not na. |
ta.atr(14), ta.tr | ta.atr(candles, 14), ta.tr(candles) | Over the candles, not a series: they need high, low and the previous close. Wilder-smoothed, as ATR is. |
na, nz(x, 0) | null, x == null ? 0 : x | |
bar_index | i | Your loop variable. |
plot(ema, color=color.blue) | lines: [{ name: "EMA", data: ema, color: "#3b82f6" }] | Any CSS colour. Up to 8px width; style is "solid", "dashed" or "dotted". |
plot(ema, color = close > ema ? color.green : color.red) | lines: [{ name: "EMA", data: ema, color: "#089981", colors: c.map((x, i) => x > ema[i] ? "#089981" : "#f23645") }] | A line whose colour changes bar by bar: colors has one colour per bar, null for the line's own color. A bar's colour draws the stretch of line from that bar to the next. Each colour can be changed in the indicator's settings. The converter does this for a plot whose color changes; there an na colour hides that stretch, as in Pine. |
hline(70), hline(30) | levels: [{ value: 70, label: "Overbought" }, { value: 30 }] | Horizontal lines in the indicator's pane, dashed unless a style says otherwise. Up to 16. |
fill(p1, p2, color) | fills: [{ between: ["Upper", "Lower"], color: "rgba(0,245,255,0.1)" }] | A band between two of your lines, by name. colorBelow gives a second colour for where the first line is under the second (a cloud). |
plot(h, style=plot.style_histogram) | histogram: { name, data, up, down } | One histogram per script; per-bar colors optional. |
ta.crossover(a, b) | ta.crossover(a, b)[i] | An array of booleans, one per bar; b may be a number. ta.crossunder likewise. |
strategy.entry("L", strategy.long) | signals.push({ i, side: "long", price: c[i] }) | "short" and "flat" (exit) likewise. One per bar; the last wins. |
strategy.close("L") | signals.push({ i, side: "flat" }) | |
alertcondition(cond, ...) | Alert on signals… in the indicator's settings | Fires once per closed bar with a signal. Webhooks → |
plotshape(cond, style=shape.triangleup) | a signal | Drawn as a triangle under (long) or over (short) the bar; a note beside it. |
label.new(...) | labels: [{ i, price, text }], or note on a signal, or label on a pattern, box or segment | Up to 24 characters on a shape, 40 on a signal or pattern. Up to 400 labels. |
line.new(x1, y1, x2, y2) | patterns: [{ kind: "xabcd", points: [{ i, price }, ...] }] | 2 to 8 points, up to 64 patterns. For one straight line use segments: [{ from, to, price, price2 }], up to 400. |
table.new(position, ...), table.cell(t, col, row, text) | tables: [{ position: "top_right", cells: [{ col, row, text, color, bg }] }] | Pinned to a corner of the chart; Oak sizes the cells. Up to 4 tables of 200 cells. The converter carries table.new, table.cell, the cell_set_* setters and table.clear across. |
linefill.new(line1, line2, color) | a box | When both lines are level, the converter makes it a shaded box over the bars both lines cover. Between sloped lines there is no Oak shape for it, and it is not drawn. |
box.new(left, top, right, bottom) | boxes: [{ from, to, top, bottom, color, label }] | from and to are bar indices. open: true runs it to the right edge. Up to 200. |
request.security(sym, "60", close) | — | Not available. One series per run: the chart's. See §4. |
var, varip | a local variable in your loop | Nothing persists between runs by design. |
strategy.position_size | track it yourself (let inLong = false) | The stats line in settings walks your signals for you. |
The EMA cross, in Pine:
//@version=5
strategy("EMA cross", overlay=true)
fast = input.int(9, "Fast")
slow = input.int(21, "Slow")
f = ta.ema(close, fast)
s = ta.ema(close, slow)
plot(f, color=color.aqua)
plot(s, color=color.red)
if ta.crossover(f, s)
strategy.entry("L", strategy.long)
if ta.crossunder(f, s)
strategy.entry("S", strategy.short)
The same thing in Oak — this is the library's own EMA cross strategy, unchanged, with {"fast": 9, "slow": 21} in the params box:
//@oakversion=1
// Long when the fast EMA crosses above the slow one, short when it crosses
// below. One decision per cross, made on the bar that closed the cross.
const c = ta.close(candles);
const fast = ta.ema(c, params.fast), slow = ta.ema(c, params.slow);
const signals = [];
for(let i = 1; i < c.length; i++){
if(fast[i] == null || slow[i] == null || fast[i-1] == null || slow[i-1] == null) continue;
if(fast[i-1] <= slow[i-1] && fast[i] > slow[i]) signals.push({ i, side: "long", price: c[i] });
if(fast[i-1] >= slow[i-1] && fast[i] < slow[i]) signals.push({ i, side: "short", price: c[i] });
}
return { pane: "overlay", lines: [
{ name: "Fast", data: fast, color: "#00f5ff" },
{ name: "Slow", data: slow, color: "#ff2d78" },
], signals };
Paste it into the Oak editor under the chart (the Oak tab), press Run on chart, and the two lines and the triangles appear. Save keeps it under My scripts in the indicator picker; Share… puts it in a Stack and in the picker's Community group for everyone.
var.Share… from the editor or from an indicator's settings posts the script — name, code, inputs, params, pane — to a Stack thread with the chart as it was, and lists it in the picker's Community group. Anyone can read the code, add it to their chart (it runs in their sandbox, and their chart measures its own checks), star it, fork it from the editor, and see which version they run when you publish a new one. Every version's text is kept.
For a strategy, Alert on signals… in its settings window delivers each closed-bar signal to a webhook, a paper trade, Discord and email. The details are on the webhooks page.
Nothing on this page is a claim about what any script will do on a market. A strategy's numbers in its settings window are a plain walk over the bars on screen, and say so.
A strategy on your chart can tell your bot when it signals. Three steps: put a strategy on the chart, set an alert with your bot's URL and a message in the shape your bot expects, and receive it — signed, once per closed bar. Strategies, and the webhooks and signal feed they deliver to, come with a paid plan: Essential runs 3 at a time and Pro 5. The webhook is the signed instruction; your receiving bot decides whether to place an order. Direct exchange connection inside Nexus remains locked during review.
signals (how). Triangles appear at its signals.application/json; otherwise as text. Transient failures retry with the same delivery and signal IDs, so your receiver can safely recognize a repeat.The message is a template, the way TradingView's alert message is. Placeholders are replaced when the alert fires; a number renders as a number, a string is escaped for JSON but not quoted (the template holds the quotes), and an unknown placeholder is left as written so a typo shows up in your bot's log rather than as a silent blank.
| Placeholder | Value | Example |
|---|---|---|
{{strategy}} | the strategy's name | EMA cross strategy |
{{symbol}} | the market, internal form | BTCUSDT, ETHUSDT |
{{timeframe}} | the chart's timeframe | 5m, 1h |
{{action}} | long, short or flat | long |
{{price}} | the signal's price, or the bar's close | 76097.28 |
{{barTime}} | the closed bar's open time, Unix ms | 1789611300000 |
{{signalId}} | unique per alert, bar and action | oak_17…:1789611300000:long |
{{text}} | the sentence the in-app notification shows | EMA cross strategy on BTC/USD 5m: long at 76097.28 |
The default message:
{"source":"nexus","strategy":"{{strategy}}","symbol":"{{symbol}}","timeframe":"{{timeframe}}",
"action":"{{action}}","price":{{price}},"barTime":{{barTime}},"signalId":"{{signalId}}"}
Your bot wants a different shape? Write it. A token your bot checks can go straight in: {"token":"your-long-random-token","side":"{{action}}"}. A one-line text message works too: {{action}} {{symbol}} @ {{price}}.
This receiver checks the timestamp-bound signature, rejects messages older than five minutes, and writes each delivery to a durable inbox once. It responds quickly; a separate worker can process only rows whose state is pending and use the delivery ID as its venue idempotency key. Synthetic tests are stored as test, never pending.
import hmac, hashlib, json, sqlite3, time
from flask import Flask, request, abort
SECRET = b"the secret you typed into the alert"
DB = "nexus-inbox.db"
app = Flask(__name__)
with sqlite3.connect(DB) as db:
db.execute("""create table if not exists inbox (
delivery_id text primary key, body text not null,
received_at integer not null, state text not null)""")
@app.post("/hook")
def hook():
body = request.get_data()
header = request.headers.get("X-Nexus-Signature-V2", "")
parts = dict(p.split("=", 1) for p in header.split(",") if "=" in p)
stamp, supplied = parts.get("t"), parts.get("v1", "")
try:
fresh = stamp and abs(int(time.time()) - int(stamp)) <= 300
except ValueError:
fresh = False
if not fresh:
abort(401)
want = hmac.new(SECRET, stamp.encode() + b"." + body, hashlib.sha256).hexdigest()
if not hmac.compare_digest(supplied, want):
abort(401)
json.loads(body) # reject a malformed JSON message
delivery = request.headers.get("X-Nexus-Delivery", "")
if not delivery:
abort(400)
state = "test" if request.headers.get("X-Nexus-Test") == "true" else "pending"
with sqlite3.connect(DB) as db:
row = db.execute("insert or ignore into inbox values (?,?,?,?)",
(delivery, body.decode(), int(time.time()), state))
return ("queued" if row.rowcount else "duplicate"), 200
The URL must be https and reachable from the internet: a server of your own, or a tunnel (Cloudflare Tunnel, ngrok) in front of a machine at home. Our server will not post to localhost, private addresses or anything that resolves to them — that is a safety rule on our side, not a setting. Redirects are not followed; each request has a ten-second timeout. Network failures, 408, 425, 429 and 5xx responses retry with backoff. Other non-2xx answers are recorded as terminal failures in Automation.
Discord is a different door: set a Discord webhook once under Alerts and your price and book alerts land in that channel as a sentence, and so do a strategy’s signals while a chart with it is open (signals the server fires with your browser closed go to the app, your webhook and paper, not to Discord). A trading bot should use the alert's own webhook, above.
Tick Paper trade it on the alert and each signal also trades your paper BTC account: long buys the share of your paper USD you chose, short and flat sell all the paper BTC held. The trade appears in your paper record with source: oak:<strategy>, and in your public receipts if you publish them. Paper trading is BTC only; on any other market the checkbox says so.
A webhook is NEXUS sending to your bot, so your bot needs an address the internet can reach. A bot on your own computer usually has none, and NEXUS will not send to localhost or a home-network address. The signal feed turns that round: your bot asks NEXUS for new signals every few seconds, the way it asks an exchange for prices. Nothing has to reach your computer, so there is no tunnel or server to set up.
next, and no signals. Pass next back as after every time and nothing is missed or sent twice. A bot that loses its place starts again from now, not from history.Retry-After in seconds: wait that long and ask again with the same after. Nothing is lost, because your place only moves when you pass a new next.import time, requests
KEY = "nxf_your_key"
URL = "https://nexuspolydex.com/signals/feed"
after = None # keep this on disk to survive a restart
while True:
params = {} if after is None else {"after": after}
r = requests.get(URL, params=params, headers={"Authorization": "Bearer " + KEY}, timeout=15)
if r.status_code == 200:
page = r.json()
for s in page["signals"]: # oldest first
print(s["action"], s["symbol"], s["timeframe"], s["price"], s["strategy"])
# place your order here; s["signal_id"] is unique, so remember the
# ones you acted on and skip any you see again
after = page["next"]
time.sleep(page.get("poll_seconds", 15))
elif r.status_code == 503: # a moment's hiccup: same after, nothing lost
time.sleep(int(r.headers.get("Retry-After", 15)))
else:
time.sleep(60) # a bad key, or asking too often
Each signal has action (long, short or flat), symbol, timeframe, price (the close of the signal bar), bar_time (that bar's open, in milliseconds), strategy, alert_id and signal_id. Check bar_time before you act: a signal your bot only sees an hour late is an hour old.
A signal is a script's decision about the bars it saw. It is not advice, and nothing about it is a claim about what a market will do. What you connect to the other end of the webhook, and with what money, is entirely yours.
Market structure, order blocks, fair value gaps and liquidity sweeps are common trading vocabulary with no single agreed definition: two charts drawing "order blocks" on the same candles will often disagree. So this page states the exact rule each NEXUS tool follows. Every one is an Oak script you can open and read (the Code button in its settings), and what is written here is what that script does.
One rule holds every tool on this page. A mark appears only once the bars that prove it have closed, and once drawn it is never moved or taken back. A zone can end; it cannot change shape or vanish from the past.
This matters because the easy way to draw these concepts looks better than it is. A swing high is only a swing high once later bars have failed to exceed it. A tool that marks it the moment it forms is reading bars that had not happened yet, and its history shows marks that were never there when the bar was live. Ours appear late instead, and stay.
What is drawn is often anchored in the past: a zone starts at the candle that made it, which may be several bars back. That is where it belongs. It still only appears once it is known.
Four of the tools are built on swings, and they all use the same definition.
N bars before it and the N bars after it. A tie is not a swing.N bars each side.N is the Swing length setting, 5 by default. A larger number finds fewer, larger swings.N bars late. With a swing length of 5, a swing is marked when the fifth bar after it closes, and not before.Stop orders tend to rest just beyond swing highs and lows. This tool tracks the last 20 swing highs and the last 20 swing lows that price has not yet traded beyond.
The highest high and the lowest low of the last 50 bars, and the midpoint between them (the "equilibrium"). The upper half is called premium and the lower half discount. It says where price sits inside its own recent range, and nothing more: it is not built on swings and involves no judgement.
The high, low and close of the previous day, week or month, drawn across the current one. Periods are UTC, because these markets do not close; a week starts on Monday. Nothing is drawn for the first period on the chart, since there is no period before it.
Six of these tools also report events: the moment something on this page became known. In a tool's settings, ⚡ Alert on events tells you when one happens, for any event or one kind.
| Tool | Events it reports |
|---|---|
| Market Structure | BOS up, BOS down, CHoCH up, CHoCH down |
| Order Blocks | Bull order block, Bear order block, Order block ended |
| Fair Value Gaps | Bullish gap, Bearish gap, Gap filled |
| Liquidity Sweeps | Sweep of highs, Sweep of lows, Equal highs, Equal lows |
| Support and Resistance | Level confirmed, Level broken |
| Previous High / Low / Close | Close above prior high, Close below prior low |
Every rule above is a setting or a line of code you can change. Open a tool's settings, press Code, and edit your own copy; the Oak reference covers the boxes, segments, labels and events these scripts return.
The charts, every market, the order book, the live tape and the community are free. Strategies, and the webhooks and signal feed they deliver to, come with a paid plan, along with Market Depth, Order Flow and more room: more indicators on a chart, more alerts waiting and more recorded history.
Paid plans are not on sale yet. The prices below are planned. There is no checkout on NEXUS today and nobody is charged anything. When there is a way to pay, it will be named on this page before anything is charged. If you would pay, add yourself to the list further down: plans start when enough people have.
Everything you need to read the market and practise. No card, no deposit.
Planned price · not on sale yet
Strategies that run while the tab is shut, and room to work.
Planned price · not on sale yet
More strategies, and the deepest data this site records.
When hosted bots open, a bot comes with a paid plan. Later, once the NEXUS fee is set up, a fee on the orders a bot opens can pay for it instead.
Today only the site’s owner and a few invited testers trade real money from NEXUS, each with their own funds.
Paid plans start when enough people ask for them, because their subscriptions are what pay for the servers. Add yourself and you are counted, once, however often you change your answers. Nothing is charged and nothing is promised. When plans open you will hear it on NEXUS first, and you can take yourself off the list whenever you like.
| Feature | Free | Essential | Pro |
|---|---|---|---|
| Charts and markets | |||
| Every market listed on NEXUS | ✓ | ✓ | ✓ |
| Timeframes from 1 minute to 1 month | ✓ | ✓ | ✓ |
| 15-second and 30-second candles | — | — | ✓ |
| Nine chart types, Renko to Point & Figure | ✓ | ✓ | ✓ |
| Indicators on one chart | 3 | 6 | 12 |
| Drawing tools, bar replay, up to four charts at once | ✓ | ✓ | ✓ |
| Order book and flow | |||
| Order book ladder beside the chart | ✓ | ✓ | ✓ |
| Market Depth and Order Flow, and the chart's liquidity colouring | — | ✓ | ✓ |
| Recorded order book history, up to: in Market Depth, and when testing a book alert (BTC keeps 90 days; another market 2, from when it was first watched) | 7 days | 30 days | 90 days |
| TPO profile and volume profile on the chart | ✓ | ✓ | ✓ |
| Alerts | |||
| Price and book alerts waiting at once | 5 | 25 | 50 |
| Alerts fire with the browser closed | ✓ | ✓ | ✓ |
| Test a book alert against recorded history | ✓ | ✓ | ✓ |
| Oak scripting | |||
| Write, read and run indicators and strategies on the chart | ✓ | ✓ | ✓ |
| Pine Script converter | ✓ | ✓ | ✓ |
| Strategy Tester | ✓ | ✓ | ✓ |
| Strategies running at once (alerts, paper, webhooks) | — | 3 | 5 |
| Webhooks and a signal feed for your own bot | — | ✓ | ✓ |
| Published scripts | 50 | 50 | 50 |
| Trading | |||
| Paper wallets | 10 | 10 | 10 |
| Hosted bots | — | Not open yet | Not open yet |
| Community | |||
| Chat, Stacks, messages and profiles | ✓ | ✓ | ✓ |
| Calls on the record | ✓ | ✓ | ✓ |
To start, yes. Everything in the Free column is free, with no card and no deposit, and the chart works without an account. Strategies need a paid plan, and Market Depth and Order Flow are for members: anyone with a badge, or on Essential or Pro.
Essential runs strategies, 3 at a time, delivering to your webhooks and the signal feed as well as the app and paper, opens Market Depth and Order Flow, and adds room: 6 indicators on a chart, 25 alerts waiting and 30 days of Market Depth history. Pro runs 5 strategies, holds 12 indicators and 50 alerts, shows 90 days of Market Depth and adds 15-second and 30-second candles. Every market and every chart type is on every plan.
You cannot yet. There is no checkout on NEXUS. When there is a way to pay, this page will name it before anything is charged. If you would pay, add yourself to the list above: paid plans start when enough people have.
Yearly is cheaper by the month: Essential $17 instead of $19.99, Pro $20 instead of $25. Both are planned prices; neither is on sale yet.
Nothing is deleted. Alerts you already set keep waiting; you cannot add more past your plan’s number. Strategies past your plan’s number stay saved and wait, while the ones running longest keep running; on Free, none run. A chart keeps the indicators it has, and you cannot add more past your plan’s number.
No. Every market on NEXUS is on every plan. Prices, candles, the order book and the tape come from Hyperliquid’s and Kraken’s public APIs.
At first, yes. Hosted bots are not open to the public yet, and when they open a bot comes with a paid plan. Later, once the NEXUS fee is set up, a fee on the orders a bot opens can pay for it instead, with no plan. The Questions page explains the fee.
No. Market data is information, a paper trade is a simulation, and a strategy is a set of rules somebody wrote. Nothing on NEXUS is a recommendation to buy or sell anything.
GRAM is a perpetual on Hyperliquid, charted on NEXUS. This page is what we have stored about it: the figures the venue publishes, and what our own recording holds. Market data is information. Nothing here is a recommendation, NEXUS is not an exchange and it holds no funds.
From the market directory as this page was served. Read from memory, never fetched while you wait, so it is as fresh as the last directory refresh.
| Price | 1.1095 | mark price |
|---|---|---|
| 24h change | -3.73% | |
| 24h volume | $8.3M | notional, both sides |
| Open interest | $15.8M | size currently held open |
| Funding, hourly | -0.01161% | paid between longs and shorts; flips sign |
| Funding, 8h | -0.0929% | the same rate restated |
| Funding, 24h | -0.2787% | the same rate restated |
| Max leverage | 5x | the venue's limit |
Our indicator sweep covers the 40 most liquid markets and has not reached this one, so there is nothing measured to show. Open it on the chart and the same indicators run there, on the same closed bars.
Who it is not offered to. Hyperliquid's own terms exclude people residing or located in the United States or Ontario, or in a sanctioned jurisdiction. NEXUS does not offer trading on this market to anyone that excludes, and nothing on this page is an offer to trade it — it is a record of what the market did and what we recorded of it.
Those exclusions include places no internet address can identify, so where it matters we ask rather than guess.
Chart, indicators and alerts · Market Depth — the book over time (members) · Order Flow — tape, CVD and footprint (members) · What NEXUS is for
BTC · ETH · NVDA (XYZ) · HYPE · XYZ100 (XYZ) · ZEC · SP500 (XYZ) · BTC/USD spot · SOL · SOXL (XYZ) · SKHX (XYZ) · SNDK (XYZ)
This NEXUS address does not point to a current workspace.
python wallet.py > prints an address + private key — keep the key secret, it's the only way to spend from that address
python --version — if it prints a version number, you're set.cmd, and press Enter — a terminal opens already pointed at that folder.pip install -r requirements.txt
python wallet.py — it prints an address and a private key. Copy the address (you'll need it in the next step) and keep the private key secret — it's the only way anyone can ever spend from that address.<your address> below with the address from step 5, then run it:
python miner.py --address <your address>
python node.py --stake <address>), with its own independently-retargeted difficulty so it never competes with mining for the same blocks.--stake is still an option if you would rather stake solo.node --version — if it prints a version number, you're set..env and fill it in (next steps)BASE_RPC_URL in the next step.).env file — rename .env.example to .env, then fill in the private key of the MetaMask account that should receive rewards (MetaMask: Account details → Show private key). Use a dedicated account for this, never your main wallet — this key goes on your own computer only, never uploaded anywhere. CONTRACT_ADDRESS is already filled in for you.Start Mining.bat (it installs dependencies automatically the first time, which can take a minute). Prefer the command line? npm install then npm start does the same thing.mine(nonce) automatically and prints the confirmed block once mined. Close the window (or Ctrl+C) any time to stop.challengeNumber and miningTarget that update every time someone mines successfully (an on-chain difficulty retarget, same idea as O-Coin's own retargeting, just implemented in Solidity instead of Python). The mining reward decays on a fixed schedule written into the contract, so it shrinks predictably instead of halving in cliffs.mine() function, anyone can point their own script at it — the version above is just this project's own reference miner, not the only way to mine SPEEP. The current contract is 0x3Ad4…42a9E1 on Base; an older v1 is still sitting on the Sepolia testnet, but it is superseded and its token has no pool and no value./app/terms, /app/privacy and
/app/risk, readable by anyone signed in or not, and new
accounts agree to them at sign-up. This tab is the working copy with the
operator tokens left unfilled — the real name and jurisdiction come
from the server environment, not from this repository.
Changing the text means bumping TERMS_VERSION, which asks
every existing account to accept again.
The full readiness plan lives in the repo, not here.