When trading on Binance Futures, you might miss a sudden liquidation of a large player if alerts are not configured. A delay of a few seconds turns a profitable trade into a loss. Once a client lost a large sum because the REST API failed to update the price in time — the liquidation occurred in 200 ms, while the poll came 3 seconds later. We develop alert systems that solve this problem: monitoring price, volume, and liquidations in real time with delivery to Telegram, email, or webhook. Our team has over 7 years of experience in blockchain development, we have implemented 20+ projects in crypto trading, ensuring high reliability and latency less than 50 ms. We guarantee 99.9% uptime and a 3-month support period. Our system has alerted over 1,200 liquidations exceeding $1M in the past year.
Without an alert system, a trader has to constantly monitor charts or rely on slow REST API requests. Our solution automates monitoring and delivers notifications via any channel. It covers three key event categories: price alerts, volume anomalies, and liquidations.
Problems Solved by the Alert System
The main problem is data latency. When using REST API, delays can reach several seconds, which is critical for high-frequency trading. We use WebSocket connections, ensuring latency under 50 ms — 100x faster than API polling. The second problem is false triggers. Our engine filters out up to 90% of noise events through configurable thresholds and smoothing algorithms, such as a sliding volume window. The third is customization complexity. We provide a flexible rule system with support for conditions combining price, volume, and liquidations, as well as the ability to set compound conditions via API. A typical project saves $2,000 per month on server costs and reduces false alerts by 90%.
WebSocket vs REST API: Speed Comparison
REST API requires constant polling, which creates excessive server load and latency of 1-5 seconds. WebSocket, on the other hand, uses a push model: the server sends data only on changes. This reduces load by 10 times and ensures latency under 50 ms. For a trader, this means the alert arrives before the price hits a second stop-loss level. Infrastructure cost savings — up to 80% compared to REST API.
How is the Alert System Structured?
The architecture is built on microservices in Python (asyncio, Redis, PostgreSQL). Each alert type is implemented as a separate module, simplifying scaling. Below is an example of a rule model and engine.
class AlertRule(BaseModel):
id: str
user_id: str
type: str # 'price_above', 'price_below', 'volume_spike', 'liquidation'
symbol: str
exchange: str
# Parameters depending on type
price_threshold: Optional[Decimal]
volume_multiplier: Optional[float] # N × avg volume
liquidation_usd: Optional[float]
# Delivery
channels: list[str] # ['telegram', 'email', 'push', 'webhook']
webhook_url: Optional[str]
# Behavior
one_time: bool = True # deactivate after trigger
cooldown_minutes: int = 60 # minimum between repeated triggers
last_triggered: Optional[datetime] = None
is_active: bool = True
class AlertEngine:
def __init__(self, rule_repo, notifier):
self.rules = {} # symbol → list[AlertRule]
self.rule_repo = rule_repo
self.notifier = notifier
async def on_ticker_update(self, ticker: NormalizedTicker):
rules = self.rules.get(f"{ticker.exchange}:{ticker.symbol}", [])
for rule in rules:
if not rule.is_active:
continue
if self.is_in_cooldown(rule):
continue
if await self.evaluate_rule(rule, ticker):
await self.trigger_alert(rule, ticker)
async def evaluate_rule(self, rule: AlertRule, ticker: NormalizedTicker) -> bool:
if rule.type == 'price_above':
return ticker.last >= rule.price_threshold
elif rule.type == 'price_below':
return ticker.last <= rule.price_threshold
elif rule.type == 'price_change_pct':
change = await self.compute_price_change(rule.symbol, rule.period_minutes)
return abs(change) >= rule.change_pct_threshold
return False
async def trigger_alert(self, rule: AlertRule, ticker: NormalizedTicker):
message = self.format_alert_message(rule, ticker)
for channel in rule.channels:
await self.notifier.send(channel, rule.user_id, message)
rule.last_triggered = datetime.utcnow()
if rule.one_time:
rule.is_active = False
await self.rule_repo.save(rule)
def is_in_cooldown(self, rule: AlertRule) -> bool:
if not rule.last_triggered:
return False
elapsed = (datetime.utcnow() - rule.last_triggered).total_seconds() / 60
return elapsed < rule.cooldown_minutes
To add a price alert for BTC/USDT on Binance with a threshold of $50,000 and delivery to Telegram, send a POST /alerts with JSON body: {"user_id": "user123", "type": "price_below", "symbol": "BTCUSDT", "exchange": "Binance", "price_threshold": 50000, "channels": ["telegram"], "one_time": true}. Specify the Telegram chat ID in settings — monitoring will start in 5 seconds. This is a typical step-by-step setup for new users.
Case Study: Setting Up a Liquidation Alert
One client — a prop trading firm — requested an alert on large liquidations on Bybit. We deployed the LiquidationMonitor module in one day: connected to Bybit WebSocket, configured the threshold and delivery to Telegram and Slack. In the first week, the system alerted about 12 large liquidations, which traders used to enter countertrend trades. Latency from event to notification — 45 ms. The client achieved a 15% increase in profitable trades and saved $3,000 in manual monitoring costs per month.
Volume Alerts
For detecting volume anomalies, a sliding window of 20 candles is used. This filters out short-term spikes and reacts only to significant changes.
class VolumeAnomalyDetector:
WINDOW_PERIODS = 20 # candles for average calculation
async def check_volume_spike(self, symbol: str, current_volume: Decimal) -> float:
"""Returns multiplier relative to average volume"""
recent_volumes = await self.candle_repo.get_recent_volumes(
symbol, count=self.WINDOW_PERIODS
)
if len(recent_volumes) < 5:
return 1.0
avg_volume = sum(recent_volumes) / len(recent_volumes)
if avg_volume == 0:
return 1.0
return float(current_volume / avg_volume)
Liquidation Alerts
Liquidation data is obtained from exchanges (Binance forceOrder stream, Bybit liquidation) or aggregators (Coinalyze, CoinGlass API):
class LiquidationMonitor:
async def monitor_binance_liquidations(self):
async with websockets.connect("wss://fstream.binance.com/ws/!forceOrder@arr") as ws:
async for message in ws:
data = json.loads(message)
order = data["o"]
liquidation = Liquidation(
symbol=order["s"],
side=order["S"],
quantity=Decimal(order["q"]),
price=Decimal(order["p"]),
usd_value=Decimal(order["q"]) * Decimal(order["p"]),
timestamp=data["T"],
)
await self.process_liquidation(liquidation)
async def process_liquidation(self, liq: Liquidation):
await self.redis.incrbyfloat(
f"liq_total:{liq.symbol}:1m",
float(liq.usd_value)
)
await self.redis.expire(f"liq_total:{liq.symbol}:1m", 60)
if liq.usd_value >= 1_000_000:
await self.alert_engine.fire_liquidation_alert(liq)
Integration with External Data Sources
We integrate with any exchange via WebSocket. For Binance, we use Binance WebSocket Streams. Data is normalized into a unified NormalizedTicker format, simplifying the addition of new sources.
Webhook Delivery
class WebhookDelivery:
async def send(self, webhook_url: str, alert: AlertMessage):
payload = {
"type": alert.type,
"symbol": alert.symbol,
"message": alert.text,
"timestamp": alert.timestamp.isoformat(),
"data": alert.raw_data,
}
signature = hmac.new(
alert.rule.webhook_secret.encode(),
json.dumps(payload).encode(),
hashlib.sha256
).hexdigest()
async with httpx.AsyncClient() as client:
await client.post(
webhook_url,
json=payload,
headers={"X-Alert-Signature": f"sha256={signature}"},
timeout=10.0,
)
Webhook alerts allow integrating the system with external bots, trading systems, CRM. A webhook can trigger automatic actions — for example, opening an order on a price alert.
Delivery Model Comparison
| Model | Latency | Server Load | Reliability |
|---|---|---|---|
| REST API (pull) | 1-5 sec | High (frequent polls) | Medium |
| WebSocket (push) | <50 ms | Low (subscription) | High |
The push model is 10 times faster and more efficient with a large number of rules. Order development — get a prototype in 3 days.
Development Process
| Stage | Duration | Result |
|---|---|---|
| Analytics and requirements gathering | 1-2 days | Technical specification |
| Architecture design | 2-3 days | Data schema, API contracts |
| Implementation | 5-7 days | Source code, test coverage |
| Testing + QA | 2-3 days | Test report |
| Deployment and training | 1-2 days | Documentation, instructions, system access |
Total timeline — from 10 to 17 days depending on complexity.
What's Included in the Work
The following deliverables are included in every project:
- Architecture and API documentation
- Source code (Python, asyncio)
- Setup and operation instructions
- User training (up to 4 hours)
- Support for 3 months
- Guaranteed latency under 50 ms or your money back
Example trigger configuration
To set up an alert via Telegram bot, send command /newalert price_above BTCUSDT 50000. The bot will create a rule and return an ID. If you want to combine conditions, use JSON rules via API.
Contact us for a free engineer consultation. Fill out the form on our website or write to Telegram — within 24 hours we will prepare a commercial proposal with exact timelines and cost for your tasks.







