I template di alert personalizzati ti permettono di controllare esattamente quali informazioni compaiono nei tuoi messaggi Telegram, nei payload webhook o nelle notifiche email quando un segnale di arbitraggio corrisponde ai tuoi criteri. I template usano una sintassi semplice con segnaposto, loop e logica condizionale — nessuna esperienza di programmazione richiesta.
Come Funzionano i Template
Quando un segnale soddisfa i filtri dell'alert, il sistema prende il testo del template salvato e sostituisce ogni segnaposto con il valore reale del segnale prima di inviare la notifica.
- {variable} — sostituito con un singolo valore
- {% for %} — ripete un blocco per ogni step di trading
- {% if %} — mostra testo diverso in base a una condizione
Variabili del segnale
| Segnaposto | Descrizione | Esempio |
|---|---|---|
{signalId} | ID numerico univoco del segnale | 4821 |
{signalType} | Ex1 = tutti gli step sullo stesso exchange · Ex2 = cross-exchange | Ex2 |
{coinType} | Ciclo di trading: A-B-A (2 coppie) o A-B-C-A (3 coppie) | A-B-C-A |
{profitPercent} | Profitto lordo in percentuale | 1.85 |
{feePercent} | Commissione totale stimata in percentuale | 0.30 |
{netProfit} | Profitto netto dopo le commissioni (profit − fee) | 1.55 |
{volume} | Volume del primo step (principale) | 0.5 |
{lifetime} | Età del segnale in secondi dalla creazione | 312 |
{createdAt} | Timestamp del primo rilevamento del segnale | 2025-03-11 14:02:10 |
{updatedAt} | Timestamp dell'ultimo aggiornamento del segnale | 2025-03-11 14:07:22 |
{freeSignal} | 1 se è un segnale gratuito (pubblico), altrimenti 0 | 0 |
| Segnaposto | Descrizione | Esempio |
|---|---|---|
{coin_path} | Percorso completo della coin da quote a quote | USDT → BTC → ETH → USDT |
{symbol_steps} | Lista separata da virgole di tutte le coppie di trading | BTCUSDT, ETHBTC, ETHUSDT |
{exchanges_list} | Exchange coinvolti senza duplicati (separati da virgola) | Binance, KuCoin |
{signal_cards} | Blocco riepilogativo pre-formattato del segnale | (multi-line) |
| Segnaposto | Descrizione | Esempio |
|---|---|---|
{exchanges[i]} | Nome dell'exchange allo step i | Binance |
{symbols[i]} | Simbolo completo della coppia allo step i | BTCUSDT |
{baseSymbols[i]} | Asset base della coppia | BTC |
{quoteSymbols[i]} | Asset quote della coppia | USDT |
{directions[i]} | Direzione: 1 = Acquisto, -1 = Vendita | 1 |
{prices[i]} | Prezzo di esecuzione allo step i | 42318.57 |
{volumes[i]} | Volume scambiato allo step i | 0.01182 |
{i+1} | Numero step a partire da 1 (leggibile dall'uomo) | 1, 2, 3 |
| Segnaposto | Descrizione |
|---|---|
{symbolStats[exchanges[i]+'_'+symbols[i]].minBid} | Prezzo bid minimo nell'order book |
{symbolStats[exchanges[i]+'_'+symbols[i]].maxBid} | Prezzo bid massimo nell'order book |
{symbolStats[exchanges[i]+'_'+symbols[i]].minAsk} | Prezzo ask minimo nell'order book |
{symbolStats[exchanges[i]+'_'+symbols[i]].maxAsk} | Prezzo ask massimo nell'order book |
{symbolStats[exchanges[i]+'_'+symbols[i]].bidQty} | Quantità totale disponibile sul lato bid |
{symbolStats[exchanges[i]+'_'+symbols[i]].askQty} | Quantità totale disponibile sul lato ask |
Sintassi del Template
I segnali hanno 2 step (A-B-A) o 3 step (A-B-C-A). Il loop si esegue automaticamente una volta per ogni step.
{% for i in 0..symbols.length-1 %}
Step {i+1}: {symbols[i]} on {exchanges[i]}
{% endfor %}
Output per un segnale a 3 step:
Step 1: BTCUSDT on Binance
Step 2: ETHBTC on Binance
Step 3: ETHUSDT on KuCoin
Usa {% if %}...{% else %}...{% endif %} per mostrare testo diverso in base a un valore. Funziona sia dentro che fuori dai loop.
Direzione Acquisto/Vendita:
{% if directions[i] == 1 %}BUY{% else %}SELL{% endif %}
Tipo di exchange:
{% if signalType == 'Ex2' %}Cross-Exchange{% else %}Same-Exchange{% endif %}
Tipo di ciclo coin:
{% if coinType == 'A-B-C-A' %}Triangular{% else %}Simple{% endif %}
Badge segnale gratuito:
{% if freeSignal == 1 %}🆓 Free Signal{% endif %}
| Segnaposto | Descrizione | Esempio |
|---|---|---|
== | Uguale a | directions[i] == 1 |
!= | Diverso da | signalType != 'Ex1' |
> | Maggiore di | profitPercent > 2 |
< | Minore di | feePercent < 0.5 |
Template Predefiniti
Questi sono gli stessi template disponibili nel menu a tendina nel modal degli alert. Usali così come sono o come punto di partenza per il tuo template personalizzato.
🚀 Arbitrage Alert [{signalType}] - {coinType}
📊 Profit: +{profitPercent}% | Fee: {feePercent}% | Net: +{netProfit}%
🔀 Path: {coin_path}
🏦 {exchanges_list}
⏱ Lifetime: {lifetime}
🚀 *Arbitrage Signal* [{signalType} | {coinType}]
━━━━━━━━━━━━━━━━━━━━
💰 *Profit:* +{profitPercent}%
💸 *Fee:* {feePercent}%
📈 *Net:* +{netProfit}%
📦 *Volume:* {volume}
🔀 *Path:* {coin_path}
🏦 *Exchanges:* {exchanges_list}
📋 *Steps:*
{% for i in 0..symbols.length-1 %}
[{i+1}] {exchanges[i]} | {symbols[i]}
↳ {% if directions[i] == 1 %}🟢 Buy{% else %}🔴 Sell{% endif %} @ {prices[i]}
↳ Vol: {volumes[i]}
{% endfor %}
⏱ *Lifetime:* {lifetime}
🕐 *Updated:* {updatedAt}
🚀 *Arbitrage Signal* #️⃣{signalId}
━━━━━━━━━━━━━━━━━━━━
📌 *Type:* {signalType} ({coinType})
{% if signalType == 'Ex2' %}🔁 *Cross-Exchange*{% else %}🔄 *Same-Exchange*{% endif %}
💰 *Profit:* +{profitPercent}%
💸 *Fee:* -{feePercent}%
📈 *Net Profit:* +{netProfit}%
📦 *Volume:* {volume}
🔀 *Coin Path:* {coin_path}
📍 *Symbols:* {symbol_steps}
🏦 *Exchanges:* {exchanges_list}
━━━━━━━━━━━━━━━━━━━━
📋 *STEP DETAILS*
━━━━━━━━━━━━━━━━━━━━
{% for i in 0..symbols.length-1 %}
[STEP {i+1}]
Exchange: {exchanges[i]}
Pair: {symbols[i]} ({baseSymbols[i]}/{quoteSymbols[i]})
Action: {% if directions[i] == 1 %}🟢 BUY{% else %}🔴 SELL{% endif %}
Price: {prices[i]}
Volume: {volumes[i]}
Order Book:
Bid → min: {symbolStats[exchanges[i]+'_'+symbols[i]].minBid} max: {symbolStats[exchanges[i]+'_'+symbols[i]].maxBid} qty: {symbolStats[exchanges[i]+'_'+symbols[i]].bidQty}
Ask → min: {symbolStats[exchanges[i]+'_'+symbols[i]].minAsk} max: {symbolStats[exchanges[i]+'_'+symbols[i]].maxAsk} qty: {symbolStats[exchanges[i]+'_'+symbols[i]].askQty}
{% endfor %}
━━━━━━━━━━━━━━━━━━━━
⏱ Lifetime: {lifetime}
🕐 Created: {createdAt}
🔄 Updated: {updatedAt}
{% if freeSignal == 1 %}🆓 Free Signal{% endif %}
Esempi Avanzati
Invia dati strutturati al tuo endpoint o all'applicazione C#.
{
"id": {signalId},
"type": "{signalType}",
"coinType": "{coinType}",
"profit": {profitPercent},
"fee": {feePercent},
"netProfit": {netProfit},
"volume": {volume},
"path": "{coin_path}",
"exchanges": "{exchanges_list}",
"lifetime": {lifetime},
"createdAt": "{createdAt}",
"steps": [
{% for i in 0..symbols.length-1 %}
{
"step": {i+1},
"exchange": "{exchanges[i]}",
"symbol": "{symbols[i]}",
"base": "{baseSymbols[i]}",
"quote": "{quoteSymbols[i]}",
"direction": {% if directions[i] == 1 %}"buy"{% else %}"sell"{% endif %},
"price": {prices[i]},
"volume": {volumes[i]},
"orderBook": {
"minBid": {symbolStats[exchanges[i]+'_'+symbols[i]].minBid},
"maxBid": {symbolStats[exchanges[i]+'_'+symbols[i]].maxBid},
"minAsk": {symbolStats[exchanges[i]+'_'+symbols[i]].minAsk},
"maxAsk": {symbolStats[exchanges[i]+'_'+symbols[i]].maxAsk},
"bidQty": {symbolStats[exchanges[i]+'_'+symbols[i]].bidQty},
"askQty": {symbolStats[exchanges[i]+'_'+symbols[i]].askQty}
}
}{% endfor %}
]
}
Aggiungi un marcatore visivo quando il profitto netto supera una soglia.
{% if netProfit > 1.5 %}🔥 HIGH PROFIT{% else %}🚀 Signal{% endif %} [{signalType}] {coinType}
Net: +{netProfit}% | Path: {coin_path}
{% if signalType == 'Ex2' %}⚡ Cross-exchange — check transfer fees!{% endif %}
Signal #{signalId} — {coinType} — Net +{netProfit}%
{% for i in 0..symbols.length-1 %}
▸ Step {i+1} · {exchanges[i]} · {symbols[i]}
{% if directions[i] == 1 %}BUY{% else %}SELL{% endif %} @ {prices[i]} (vol: {volumes[i]})
Bid {symbolStats[exchanges[i]+'_'+symbols[i]].minBid} – {symbolStats[exchanges[i]+'_'+symbols[i]].maxBid} qty {symbolStats[exchanges[i]+'_'+symbols[i]].bidQty}
Ask {symbolStats[exchanges[i]+'_'+symbols[i]].minAsk} – {symbolStats[exchanges[i]+'_'+symbols[i]].maxAsk} qty {symbolStats[exchanges[i]+'_'+symbols[i]].askQty}
{% endfor %}
Consigli ed Errori Comuni
- Chiudi sempre loop e condizioni. Ogni
{% for %}necessita di un{% endfor %}corrispondente e ogni{% if %}di un{% endif %}. - Le variabili order book funzionano solo dentro un loop. La chiave
exchanges[i]+'_'+symbols[i]richiede cheisia definito da un blocco{% for %}. - I confronti stringa richiedono le virgolette. Usa
signalType == 'Ex2'(con virgolette singole), nonsignalType == Ex2. - I confronti numerici non richiedono virgolette. Usa
directions[i] == 1onetProfit > 1.5. - Lifetime è in secondi. Un valore di
312significa 5 minuti e 12 secondi. Formattalo nel messaggio se necessario. - Grassetto Markdown Telegram. Racchiudi il testo con
*asterischi*per il grassetto in Telegram (parse mode MarkdownV1). - Non usare parentesi graffe
{}nude per nulla al di fuori dei segnaposto — verranno interpretate come tag template e potrebbero rompere il rendering.
| Variabile | Tipo | Note |
|---|---|---|
{signalId} | Integer | Sicuro da usare in JSON senza virgolette |
{profitPercent}, {feePercent}, {netProfit} | Decimal | Fino a 4 decimali |
{prices[i]}, {volumes[i]} | Decimal | Fino a 8 decimali |
{directions[i]} | Integer | 1 o -1 |
{freeSignal} | Integer | 0 o 1 |
{lifetime} | Integer | Secondi (es. 312) |
{createdAt}, {updatedAt} | String | Formato: YYYY-MM-DD HH:MM:SS |
| Variabili di percorso e riepilogo | String | Racchiudi tra virgolette nei payload JSON |