Livres et cours multi-devises
1) Qu'est-ce que les « livres multi-devises »
Le livre (ledger) est un ledger transactionnel à double écriture (câblage bidirectionnel) qui se déroule dans plusieurs monnaies à la fois :- Wallet-book : compte du joueur (monnaie de jeu/devises).
- Livre de settlement : calculs avec PSP/acquéreur (monnaie de settlement).
- Treasury-book : comptes bancaires, conversions, transactions spéculatives.
- Livre de reporting : ensemble dans la monnaie de déclaration (par exemple, EUR) sans réévaluation rétrospective des métriques de produits.
Chaque livre fixe la monnaie de l'opération, la monnaie de présentation et le taux de change au moment de la reconnaissance.
2) Hiérarchie des monnaies et des politiques
1. Base/Reporting Currency est une monnaie de déclaration unique (par exemple, EUR).
2. Wallet Currencies - devises de portefeuille (USD/EUR/TRY/UAH, etc.).
3. Settlement Currencies - ce qui envoie PSP (par exemple USD).
4. Banque Currencies est la monnaie du compte du merchant/Trésor.
- Métriques de produits (ND/NGR/ARPPU) - selon le cours historique de l'événement (généralement "settled _ at').
- Finance/Tregery - Fixe en outre le cap sur 'funded _ at' et 'payout _ at'.
- La réévaluation « cachée » dans les vitrines alimentaires est interdite.
3) Les cours et leurs sources
Intraday référence (tick/minute) : Refinitiv/BCE/banques - pour normaliser les événements.
EOD (fin de journée) : pour la réévaluation des résidus (FX non realized).
FX efficace : du fichier PSP/banque (le fait de la conversion).
Triangulation : via l'ancre (EUR ou USD) en l'absence de cotation directe.
Quote policy: `mid` либо `bid/ask` → `mid ± spread_bps`. Le spread est stocké séparément.
Stockez : 'fx _ source', 'fx _ paire', 'fx _ rate', 'fx _ timestamp', 'quote _ type', 'spread _ bps', et la route de triangulation.
4) Points de reconnaissance et couches de cours
"authorize _ at' - nous ne fixons pas de cap (il n'y a pas de reconnaissance sans capture).
'Captured/settled _ at'est un cours historique pour la couche de produits et ND.
'funded _ at'est le taux d'entrée à la banque (realized FX pour FI/trésor).
"payout _ at'est le cours que vous payez au joueur.
'eod' est le cours de fin de journée pour la réévaluation des résidus (FX non realized).
5) Précision, arrondis, unités minimales
L'argent est une unité mineure entière (int) + 'scale' dans le répertoire des devises.
Cours - au moins 8-10 caractères après la virgule.
Arrondissements : bancaire (half-even) pour la déclaration ; dans l'IU, les règles locales.
Maintenir les champs séparés : 'amount _ original', 'amount _ wallet', 'amount _ reporting', 'amount _ efficient'.
6) Double enregistrement et carte GL (simplifiée)
Exemples de câblage :6. 1. DEPOSIT_CAPTURED (GBP, rapport - EUR)
Dt : AR : PSP (GBP)
Ct : Balance des joueurs (GBP/EUR par portefeuille)
En parallèle, nous fixons 'fx _ rate _ settle (GBP→EUR)' et 'amount _ reporting'.
6. 2. FUNDING_RECEIVED (USD par banque)
Dt : Banque USD
Ct : AR : PSP GBP (on ferme en équivalent ; différence → Realized FX).
6. 3. WITHDRAWAL_PAID (TRY)
Дт: Liability: Player (TRY)
Ct : Banque TRY (ou Banque EUR + conversion ; la différence est realized FX).
7) Architecture de données (modèle minimum)
ref. currencies (
code PK, scale, symbol, is_crypto, is_active
)
ref. fx_rates_intraday (
pair PK, ts PK, rate, quote_type, source, spread_bps, triangulation_meta
)
ref. fx_rates_eod (
pair PK, date PK, rate, source
)
ledger. entries (
entry_id PK, book, -- WALLET SETTLEMENT TREASURY REPORTING debit_account, credit_account,
amount_original, currency_original,
amount_reporting, reporting_currency,
fx_rate_at_settle, fx_source, fx_pair, fx_timestamp,
event_type, event_id, user_id, provider, method,
occurred_at, created_at, meta
)
treasury. funding_receipts (
funding_id PK, provider, bank_account,
currency, amount, fx_to_reporting, amount_reporting,
received_at, value_date, meta
)
treasury. balances (
date PK, account PK, currency PK, amount
)
dw. transactions_flat (
tx_id PK, user_id, provider, method, type, status,
amount_original, currency_original,
amount_reporting, reporting_currency, fx_rate_at_settle,
settled_at, funded_at, conversion_owner, meta
)
8) Flux de normalisation (ETL/ELT)
1. L'ingest des matières premières → la normalisation des statuts PSP.
2. Attribuer un cours historique à 'settled _ at' de 'fx _ rates _ intraday'.
3. Enregistrez le double câblage dans le bon livre (wallet/settlement).
4. Importation distincte de funding et FX efficace.
5. Resultats quotidiens par 'fx _ rates _ eod' (livre de trésor).
6. Construction de vitrines (ND/NGR/LTV) sans réévaluation rétro.
9) Rapprochement et cohérence
Tx→File : tous les captured/settled sont entrés dans le fichier PSP (par montants/devises/dates).
File→Tx : tout dans le fichier est reflété dans les livres/câblages.
FX Reference vs Effective : compter 'slippage _ bps' ; alert pour aller au-delà du seuil.
Vérification de la triangulation : 'A→B B→C' ≈ 'A→C' dans la zone bps-tolerance.
Idempotence : 'event _ id' et 'idempotency _ key' est une protection contre les prises.
10) Scénarios fréquents et comment les mener
Multi-wallet : le portefeuille du joueur peut être dans une devise différente du dépôt - effectuer une conversion interne selon votre taux de change (politique 'conversion _ owner =' MERCHANT ').
Conversion PSP : stockez 'fx _ effective', 'fx _ reference' et 'spread _ bps' pour l'analyse de marge PSP.
Crypto : évaluation par fenêtre VWAP ; le funding dans les sticks est la deuxième couche de FX.
Transfert cross-wallet : mouvement à l'intérieur de la plateforme - pas de revenu FX, juste transfert entre les livres.
11) modèles SQL
11. 1. Normalisation du montant dans la monnaie de déclaration au taux de change historique
sql
SELECT t. tx_id,
t. amount_original,
t. currency_original,
r. rate AS fx_rate_at_settle,
ROUND(t. amount_original r. rate, rep. scale) AS amount_reporting
FROM raw. transactions t
JOIN ref. fx_rates_intraday r
ON r. pair = CONCAT(t. currency_original, '/',:reporting_ccy)
AND r. ts = (
SELECT MAX(ts) FROM ref. fx_rates_intraday
WHERE pair = r. pair AND ts <= t. settled_at
)
JOIN ref. currencies rep ON rep. code =:reporting_ccy
WHERE t. settled_at BETWEEN:from AND:to;
11. 2. Mesure de l'écart PSP (effective vs reference)
sql
SELECT provider, method, DATE(settled_at) AS d,
SUM(original_amount fx_reference_rate) AS ref_in_reporting,
SUM(settlement_amount_in_reporting) AS eff_in_reporting,
10000 (SUM(settlement_amount_in_reporting) /
NULLIF(SUM(original_amount fx_reference_rate),0) - 1) AS spread_bps
FROM dw. fx_settlement_view
WHERE settled_at BETWEEN:from AND:to
GROUP BY 1,2,3;
11. 3. Réévaluation des résidus EOD (FX non realized)
sql
INSERT INTO treasury. fx_reval_ledger (date, currency, position_amount, rate_eod, amount_reporting_eod, reval_diff, type)
SELECT
:eod AS date, b. currency, b. amount,
e. rate AS rate_eod,
b. amount e. rate AS amount_reporting_eod,
b. amount (e. rate - COALESCE(l. rate_eod, e. rate)) AS reval_diff,
'UNREALIZED'
FROM treasury. balances b
JOIN ref. fx_rates_eod e
ON e. pair = CONCAT(b. currency, '/',:reporting_ccy) AND e. date =:eod
LEFT JOIN LATERAL (
SELECT rate_eod FROM treasury. fx_reval_ledger
WHERE currency=b. currency AND date=:eod - INTERVAL '1 day'
ORDER BY date DESC LIMIT 1
) l ON TRUE;
12) KPI et dashboards
FX Slippage (bps) par PSP/méthode/MID.
Realized FX P&L (funding/payout) и Unrealized FX (EOD/EOM).
Position Open FX par devises vs limites de politique.
Hit-rate « à temps » les cours reçus (stale-rates incidents).
Part du PSP-conversion vs Merchant-conversion et de son BCT.
Précision des arrondis (écarts des montants ≥ 1 unité mineure - drapeau).
13) Alertes et seuils
Taux Stale : pas de cours au moment de l'événement → fallback-source/retray.
Triangulation mismatch : divergence> X bps.
Spread spike : 'spread _ bps' est au-dessus du seuil pour les majeurs/mainers.
Ouverture de la position breach : dépassement de la limite pour n'importe quelle devise.
Reval shock : revalorisation diurne <− X σ ou> + X σ - rhubarbe.
14) Meilleures pratiques (en bref)
1. Séparez strictement la couche de produit (historique FX) et FI/trésor (funding/payout/reval).
2. Utilisez des unités mineures et stockez les cours avec une grande précision.
3. Enregistrez votre conversion_owner et mesurez votre marge PSP (effective vs reference).
4. Réalisez l'idempotence des événements et le rapprochement bilatéral (Tx→File et File→Tx).
5. Gardez la monnaie anchor pour la triangulation et validez les écarts en bps.
6. Réévaluer les résidus faire EOD procédure avec une GL distincte.
7. Prenez en compte DST/Timzones lors de l'attribution de cours sur settle/funding.
8. Testez régulièrement les arrondis (tests fondés sur la propriété aux limites de l'échelle).
15) Chèque de mise en œuvre
- Définition de la politique de reporting currency et historique FX.
- Sources de cours : intraday + EOD, fallback et mises à jour SLA.
- Modèles 'ledger. entries`, `fx_rates_`, `funding_receipts`, `balances`, витрина `transactions_flat`.
- Mécanisme de triangulation et journal de route.
- Алерты: stale-rates, spread spike, triangulation mismatch, open position breach.
- Dashboards KPI et actes de rapprochement avec PSP/banque.
- Procédures reval et séparées GL pour realized/unrealized FX.
- Jeux de tests d'arrondis et de précision de stockage.
Résumé
Les livres multi-devises sont une discipline de séparation de couches : historique FX pour le produit, réel pour la tricherie, EOD-réévaluation pour les bilans. Avec des sources de cours transparentes, un modèle de données précis, un double enregistrement et un rapprochement automatisé, vous éliminerez le « bruit de change » de l'analyse, assurerez l'audit et obtiendrez un risque FX géré lors de la monétisation mondiale.