Cărți și cursuri multicurrency
1) Ce sunt „cărțile multicurrency”
Registru - un registru de tranzacții cu intrare dublă (postări bidirecționale) menținut în mai multe valute în același timp:- Wallet-book: contul jucătorului (monedă de joc/valute).
- Registre de decontare: decontări cu PSP/achizitor (moneda de decontare).
- Trezorerie: conturi bancare, conversii, oferte de gard viu.
- Registru de raportare: rezumat în moneda de raportare (de exemplu, EUR) fără reevaluarea retrospectivă a măsurătorilor produselor.
Fiecare carte înregistrează moneda tranzacției, moneda de prezentare și rata la momentul recunoașterii.
2) Ierarhia valutelor și a politicilor
1. Moneda de bază/raportare - moneda unică de raportare (de exemplu, EUR).
2. Valute portofel - valute pungă (USD/EUR/TRY/UAH, etc.).
3. Valute de decontare - ceea ce PSP trimite (de exemplu, USD).
4. Valute bancare - valuta contului de comerciant/trezorerie.
- Măsurarea produsului (ND/NGR/ARPPU) - la rata istorică a evenimentului (de obicei "settled _ at').
- Finanțe/trezorerii - fixați în plus cursul pe „finanțat _ la” și „plată _ la”.
- Reevaluarea „ascunsă” în afișajele alimentare este interzisă.
3) Cursuri și sursele lor
Referință intraday (bifă/minut): Refinitiv/BCE/bănci - pentru normalizarea evenimentelor.
EOD (sfârșitul zilei): pentru FX nerealizat.
FX eficient: din fișierul PSP/bancă (conversie efectivă).
Triangulare: printr-o ancoră (EUR sau USD) în absența unei cotații directe.
Politica de cotare: „mid' либо” bid/ask „→” mid ± spread_bps'. Răspândirea este stocată separat.
Store: 'fx _ source', 'fx _ pair', 'fx _ rate', 'fx _ timestamp', 'citat _ type', 'spread _ bps' şi traseu de triangulaţie.
4) Puncte de recunoaștere și straturi de curs
'authorize _ at' - nu fixăm cursul (nu există recunoaștere fără capturare).
'captured/settled _ at' - curs istoric pentru stratul de produs și ND.
'funded _ at' - curs de schimb pe bancă (realizat FX pentru FI/trezorerie).
'payout _ at' - rata când este plătită jucătorului.
'eod' este rata de sfârșit de zi pentru FX nerealizat.
5) Precizie, rotunjire, unități minime
Bani - unități minore întregi (int) + „scară” în directorul valutar.
Cursuri - cel puțin 8-10 zecimale.
Rotunjire: bancă (pe jumătate uniformă) pentru raportare; în UI - reguli locale.
Mențineți câmpuri separate: 'sound _ original', 'sound _ wallet', 'sound _ reporting', 'sound _ effective'.
6) Intrare dublă și carte GL (simplificată)
Exemple de postări:6. 1. DEPOSIT_CAPTURED (GBP, raportare - EUR)
JT: AR: PSP (GBP)
Ct: Soldul jucătorului (GBP/EUR prin portofel)
În paralel, fixați 'fx _ rate _ settle (GBP→EUR)' și 'sound _ reporting'.
6. 2. FUNDING_RECEIVED (USD per bancă)
Dt: Banca USD
Ct: AR: PSP GBP (aproape de echivalent; diferență → Realizat FX).
6. 3. WITHDRAWAL_PAID (TRY)
Дт: Răspundere: Jucător (TRY)
Ct: Banca TRY (sau Banca EUR + conversie; diferență - realizat FX).
7) Arhitectura datelor (model minim)
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) Fluxul de normalizare (ETL/ELT)
1. Materia primă ingerează → normalizarea stării PSP.
2. Atribuirea ratei istorice la 'settled _ at' de la' fx _ rates _ intraday '.
3. Scrieți o tranzacție dublă în registrul dorit (portofel/decontare).
4. Finanțare separată a importurilor și FX efectivă.
5. Revalorizarea zilnică a soldurilor prin 'fx _ rates _ eod' (trezorerie-carte).
6. Construcția ferestrelor de magazin (ND/NGR/LTV) fără reevaluare retro.
9) Reconciliere și consecvență
Tx→File: toate capturate/decontate au fost în fișierul PSP (pe sume/valute/date).
File→Tx: totul în fișier se reflectă în cărți/tranzacții.
FX Reference vs Effective: count 'slippage _ bps'; alertă pentru a depăşi pragul.
Verificarea triangulației: „ ” „ ” în cadrul unui bps-toleran.
Idempotency: 'event _ id' și' idempotency _ key '- protecție împotriva duplicatelor.
10) Scenarii frecvente și cum să le conducă
Multi-portofel: portofelul jucătorului poate fi în altă monedă decât depozitul - faceți o conversie internă la rata dvs. ('conversion _ owner =' MERCHANT 'policy).
Conversie PSP: stocați 'fx _ effective', 'fx _ reference' și 'spread _ bps' pentru analiza marjei PSP.
Crypto: scorul ferestrei VWAP; finanțarea în grajduri este al doilea strat de FX.
Transfer de portofel: mișcare în cadrul platformei - fără venituri FX, doar transfer între cărți.
11) Șabloane SQL
11. 1. Normalizarea sumei la moneda de raportare la cursul istoric
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. Măsurarea răspândirii PSP (eficientă vs referință)
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. FX nerealizat
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 și tablouri de bord
FX Slippage (bps) prin PSP/Metodă/MID.
Realizat FX P&L (finanțare/plată) и FX nerealizat (EOD/EOM).
Deschideți poziția FX în funcție de limitele politicii valutare vs.
Hit-rate „la timp” cursuri (incidente rate vechi).
Cota de PSP-conversie vs Merchant-conversie și TCO sale.
Precizia rotunjirii (abateri de cantități ≥ 1 unitate minoră - pavilion).
13) Alerte și praguri
Rata de vechi: nici o rată la momentul evenimentului → sursă de rezervă/retray.
Neconcordanță de triangulație: divergență> X bps.
Spread spike: 'spread _ bps' deasupra pragului în majors/majors.
Încălcarea poziției deschise: depășirea limitei pentru orice monedă.
Reval shock: reevaluare zilnică <− X σ sau> + X σ - recenzie.
14) Cele mai bune practici (scurt)
1. Separați strict stratul produsului (istoric FX) și FI/trezorerie (finanțare/plată/revalorizare).
2. Utilizați unități minore și păstrați cursuri cu precizie ridicată.
3. Conectați conversion_owner și măsurați marja PSP (referință efectivă vs).
4. Implementarea idempotenței evenimentelor și a reconcilierii bidirecționale (Tx→File și File→Tx).
5. Țineți valuta de ancorare pentru triangulare și validați discrepanțele în bps.
6. Reevaluarea soldurilor cu o procedură EOD cu o LG separată.
7. Luați în considerare DST/fusul orar atunci când atribuiți cursuri pentru a stabili/finanțare.
8. Testați în mod regulat testele bazate pe proprietăți pe limitele scării.
15) Lista de verificare a implementării
- Raportarea monedei și politica istorică FX definită.
- Surse de curs: intraday + EOD, actualizări de rezervă și SLA.
- Models' ledger. intrări ',' fx _ rate _ ',' finanțare _ încasări ',' solduri ', витрина' tranzacții _ flat '.
- Mecanism de triangulare și jurnal de traseu.
- Алерты: rate vechi, spread spike, neconcordanță de triangulație, încălcare a poziției deschise.
- Tablouri de bord KPI și rapoarte de reconciliere PSP/bancă.
- proceduri de revalorizare și GL-uri separate pentru FX realizate/nerealizate.
- Seturi de încercare de rotunjire și precizie de stocare.
Rezumat
Cărțile multicurrency sunt o disciplină de separare a straturilor: FX istoric pentru un produs, real pentru o trejerie, reevaluare EOD pentru bilanțuri. Cu surse de rate transparente, un model de date precis, dublă intrare și reconciliere automată, veți elimina „zgomotul valutar” din analiză, veți oferi audit și veți obține un risc FX gestionat în monetizarea globală.