Documentation Index
Fetch the complete documentation index at: https://uncoded.ch/docs/llms.txt
Use this file to discover all available pages before exploring further.
What the SignalEditor does for you
The SignalEditor is two tools in one container — and that’s the entire point. It’s both:- A visual strategy authoring environment — a node-graph canvas where you compose strategies by clicking and connecting blocks.
- A live strategy evaluator — once you “Start” a strategy, the same engine that powered your preview now runs against live data on a schedule, posting webhook signals to the SignalsBot when triggers fire.
Visual strategy authoring
Live preview against history
Same engine for preview and live
Per-strategy scheduler
Per-trigger webhook routing
No code required
Strategies are JSON files
Re-anchorable to any symbol
BTCUSDT can be re-pointed at ETHUSDT, SOLUSDT, or any other symbol by editing one field — no rewrite needed.The full block catalog
The SignalEditor’s catalog is broad because real-world strategies need real-world building blocks. Here’s the complete map.136 indicators across 9 categories
136 indicators across 9 categories
1m price node and on a 1d price node produces independent values.41 condition types across 9 categories
41 condition types across 9 categories
greater-than, less-than, equal-to, greater-than-or-equal, less-than-or-equal, crossover, crossunder. The foundation. Use crossover and crossunder for the classic signal-on-cross patterns; use the inequalities for thresholds and breakouts.Range — within-range, outside-range, between (two indicator values). Useful for “RSI between 30 and 70” or “price within 2 ATR of EMA.”Trend — rising (over N bars), falling (over N bars), flat (over N bars). For confirming directional context before acting on faster signals.Pattern — higher-highs, lower-lows, double-bottom, breakout-above-resistance, breakdown-below-support. Pre-built versions of the most-used chart patterns.Logic — AND, OR, NOT, XOR. Compose multiple conditions into one. The most common pattern: a “trend filter” condition (long-period MA rising) AND an “entry trigger” condition (RSI oversold + price below short-period MA).Time — within-window (e.g., 09:00–17:00), after-time, before-time. Disable trading during illiquid hours, news windows, or weekends. Critical for venues with thin off-hours liquidity.Volume — above-average, surge (N-multiple of average), dry-up (below threshold). For volume-confirmation patterns.Volatility — within-band, outside-band, contracting, expanding. Bollinger-squeeze setups, volatility-regime detection.Statistical — z-score-above, z-score-below, percentile-threshold. Rigorous mean-reversion thresholds tied to actual recent distribution.4 trigger modes
4 trigger modes
once— fire once for the lifetime of the strategy run. Use for “the first time the condition is true after I start the strategy, signal once, then never again.” Rare; useful for one-shot setups.once_per_bar— fire at most once per candle. Useful when you want to reset firing eligibility on each new bar, but want intra-bar firing if the condition flips quickly.once_per_bar_close— fire only on bar-close. The most-used mode for clean, predictable behaviour. Most operators default here. No intra-bar noise; one decision per closed candle.once_per_minute— fire at most once per minute, regardless of how many bars passed. Useful when you want very-frequent firing rate-limited (e.g., a 1-minute timeframe strategy where you want at most one signal per real minute).
15 timeframes
15 timeframes
1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 3d, 1w, 1M.A single strategy is one timeframe — to combine signals from multiple timeframes (e.g., daily trend filter + 15-minute entry), you compose them as separate strategies that talk to the same downstream consumer (or use multi-strategy patterns described below).Common strategy patterns
The most-asked question from new SignalEditor users: “what should I build first?” Here are the patterns operators have validated and turned into reliable production strategies.RSI mean-reversion (the textbook starter)
RSI mean-reversion (the textbook starter)
15m price node. Condition: RSI < 30. Trigger: once_per_bar_close. Sends a “buy signal” webhook.Optional refinement: AND price < EMA(50) (only buy when price is also below its medium-term mean — avoids buying RSI dips during a fast falling knife).Strengths: intuitive, well-tested, works in choppy and ranging markets.Weaknesses: can fire repeatedly during sustained downtrends. The trend-filter AND condition mitigates this.Capital recommendation: pair with a mode that can absorb 3–5 consecutive entry signals (BasicMode’s 7-split buy ladder works well).EMA crossover (the trend-following classic)
EMA crossover (the trend-following classic)
1h price node. Condition: crossover of EMA(20) over EMA(50). Trigger: once_per_bar_close. Sends a “buy signal” webhook on the cross-up; optionally sends a “sell signal” webhook on the cross-down.Strengths: well-known, easy to reason about, works in trending markets.Weaknesses: late entries (the cross happens after the move has started), whipsaws in chop.Refinement: add an ADX > 25 condition (only act on the cross when the trend is strong enough). This filters out chop-driven false crosses.Bollinger squeeze breakout
Bollinger squeeze breakout
1h price node. Condition: width is in the bottom 20th percentile of the last 100 bars (a percentile-threshold condition). Combined AND with a price crossover of the upper band.Trigger: once_per_bar_close.Strengths: identifies low-volatility setups before they break out. When the breakout happens, you’re already positioned.Weaknesses: false breakouts. The condition needs to be strict (high enough percentile) to filter noise.Mode pairing: works well with FullBullMarket if the breakout is to the upside; less so with a fixed sell-ladder mode.Multi-timeframe trend + entry
Multi-timeframe trend + entry
15m entry trigger (RSI oversold). Conditioned on the trend-filter flag being ON. Only fires when both timeframes agree.Strengths: faster entry timing without giving up trend context.Weaknesses: more moving parts. Requires custom webhook handling for the flag pattern.Operator effort: this is a “level 2” SignalEditor pattern. Master the single-strategy patterns first.Volume-confirmed breakout
Volume-confirmed breakout
breakout-above-resistance (where resistance is, e.g., the 20-bar Donchian high) AND volume surge (current volume is 2x the 20-bar average).Trigger: once_per_bar_close.Strengths: filters out unconfirmed breakouts (price moves up but with no volume — usually fakeouts).Weaknesses: misses fast breakouts that happen on average volume.Time-of-day filter
Time-of-day filter
within-window time condition.Why: many crypto markets have predictable liquidity patterns. London open, US open, US close — these are higher-liquidity moments. Asian overnight (for some symbols) is thinner, more prone to wicks.Operators who add a time filter typically gate trading to high-liquidity windows. The filter prevents over-aggressive bot behaviour during low-liquidity hours when slippage is higher.The 'do not trade' filter
The 'do not trade' filter
< 15 (low trend strength) AND ATR is rising (volatility expanding). When both hold, write canBuy: false to the affected modes via webhook. When conditions return to normal, write canBuy: true.This is the “operator rule, automated” pattern — most experienced operators have a rule like “don’t buy during major news,” “don’t buy when VIX is high,” etc. The SignalEditor lets you encode that rule and let it run automatically.How a strategy flows through the SignalEditor
Author on the canvas
RSI < 30 AND price < EMA(50)). Add a Trigger node with the firing mode you want.Preview against history
Iterate based on preview
- Tighten conditions (RSI threshold from
30to25) when firing rate is too high. - Loosen conditions when firing rate is zero.
- Add a trend filter when chop is producing false signals.
- Add a time-of-day window when low-liquidity hours are causing bad fills.
15m candles), so iterate freely.Configure the webhook target
{{action}}, {{price}}, {{symbol}}, {{timestamp}}. The default template produces the standard JSON shape the SignalsBot expects.Save and start
Inspect live behavior
Forward-test on small capital
What the SignalEditor does NOT do
What “live evaluation” actually does
When you start a strategy, the SignalEditor’s scheduler creates a periodic job for it. On each scheduled tick:- Load the strategy graph from disk (so any saved edits propagate immediately).
- Fetch the latest market data for the price node’s symbol and timeframe.
- Evaluate every indicator node against the fresh data.
- Evaluate every condition node using the indicator outputs.
- For every trigger node, decide whether the upstream conditions justify firing under the trigger’s mode.
- For each fired trigger, POST a webhook to the configured URL with the templated payload.
- Update the strategy’s
last_checktimestamp; if any trigger fired, alsolast_signal.
Strategy lifecycle management
A strategy has a lifecycle that’s worth being explicit about — most operator confusion comes from blurring stages.Draft — work in progress, never started
Draft — work in progress, never started
Previewed — validated against history
Previewed — validated against history
Started — running live, may emit signals
Started — running live, may emit signals
last_check and last_signal timestamps.Starting is reversible — you can stop at any time. Already-emitted signals don’t un-emit, but no further signals will fire after stop.Stopped — paused, can be restarted
Stopped — paused, can be restarted
Archived — no longer in use, file kept
Archived — no longer in use, file kept
archive/ subdirectory of the strategies volume. They’re not visible in the canvas listing but the JSON files are kept for reference.Useful when a strategy worked for a regime that’s now passed — you might want it back later, but you don’t want it cluttering your active strategy list.Deleted — gone forever
Deleted — gone forever
Operational footprint
Resource cost
300–500 MB RAM for the backend and scheduler. Frontend is static assets — sub-percent CPU at idle. Each running strategy adds modest CPU during evaluation ticks.Network calls
Data storage
Failure mode
Concurrency
5–10 running strategies are well within normal envelope.Frontend exposure
Common questions
Do I need to run the SignalEditor to use unCoded?
Do I need to run the SignalEditor to use unCoded?
Can I share or export a strategy?
Can I share or export a strategy?
What happens if my strategy fires too often?
What happens if my strategy fires too often?
once_per_minute to once_per_bar_close, and your strategy will fire only on closed candles — usually a 5-100x reduction in firing rate.The SignalsBot also has rate limits — if it’s flooded with signals from a misconfigured strategy, it will start rejecting them (and the Dashboard will show the rejections). This is a safety net, not a substitute for tuning your trigger correctly.Can I evaluate the same strategy on multiple symbols?
Can I evaluate the same strategy on multiple symbols?
BTCUSDT, ETHUSDT, SOLUSDT, you create three separate strategies — typically by duplicating the first and changing only the price node’s symbol.This is intentional: it makes per-symbol behavior individually inspectable. If BTCUSDT is firing oddly but ETHUSDT is fine, you can disable just the misbehaving one.Some operators write small scripts to bulk-duplicate a strategy across many symbols. This is a normal pattern — a “template strategy” duplicated 10 times for 10 symbols.Can I write my own indicator?
Can I write my own indicator?
Can the SignalEditor make me trade automatically?
Can the SignalEditor make me trade automatically?
enabledForBuy = true). The TradingBot then acts on configuration.So yes — a fully automated pipeline is possible: strategy fires → webhook → configuration update → TradingBot trades. But the chain has validated checkpoints, and you remain the operator who started the strategy in the first place.What about backtesting?
What about backtesting?
What's the relationship between strategies and modes?
What's the relationship between strategies and modes?
BTCUSDT.” It doesn’t replace the mode — it controls when the mode is allowed to act.A common pattern: run BasicMode (Mode 4) on BTCUSDT continuously, with canBuy: false by default, and let a SignalEditor strategy flip canBuy to true only when its conditions hold. This way you get BasicMode’s clean execution with custom entry timing.How fast do strategies evaluate?
How fast do strategies evaluate?
1m strategy evaluates approximately every minute. A 1h strategy approximately every hour. A 1d strategy approximately every day.Inside each evaluation, the actual computation is fast — typically milliseconds per evaluation. The cadence, not the speed, is the dominant timing factor.Can I have a strategy that uses indicators from multiple symbols?
Can I have a strategy that uses indicators from multiple symbols?
What if my strategy disagrees with itself across previews?
What if my strategy disagrees with itself across previews?
Can I version-control my strategies?
Can I version-control my strategies?
- History of every change to every strategy.
- The ability to roll back a strategy edit that performed worse than the prior version.
- A backup that survives VPS loss.
.gitignore for any sensitive fields if your strategy configuration accidentally embeds credentials.