feat(ui): Argentina is a market in the Web UI too, with the two suffixes that were already missing (#1543)
Desktop Windows / package (push) Waiting to run
Build and Push Docker Image / validate-build (push) Waiting to run
Build and Push Docker Image / build-and-push (push) Skipped
CI / Hash lock / macOS ARM64 (push) Waiting to run
CI / Hash lock / Linux x64 (push) Waiting to run
CI / Hash lock / Windows x64 (push) Waiting to run
CI / test / Python 3.11 (push) Waiting to run
CI / test / Python 3.14 (push) Waiting to run
CI / frontend (push) Waiting to run
CI / Windows 11 ARM64 / Python 3.14 background lifecycle (push) Waiting to run
CI / Windows Server 2025 x64 / Python 3.14 background lifecycle (push) Waiting to run
CI / Windows desktop source lifecycle (push) Waiting to run

#1543 added the backend routing only, and a market here is full-stack: the
Settings source-priority list would have shown Argentina as a raw i18n key, and
a .BA position would have been grouped as "other" in a run's positions tab.
Both gaps already existed for the markets that landed earlier, so this closes
the class rather than the instance:

- `positions.ts`: `ar_equity` / `uk_equity` / `vietnam_equity` join `AssetClass`
  and the suffix map gets BA / L / VN. PositionsTab's label map is
  `satisfies Record<AssetClass, string>`, so tsc now demands a key per class.
- `api.ts`: `SectorAssetClass` is what `_detect_market` can return over the
  sector endpoint; it was missing those three and `index`.
- `SourcePrioritySettings`: labels for `ar_equity`, `uk_equity` and `index`
  (the last two have been falling back to their raw key).
- Six new keys across all nine locales.
- `EnvConfig.data` gains `MARKET_DATA_ORDER_AR_EQUITY` / `_UK_EQUITY`, and the
  test that guarded that block now derives the market list from
  `FALLBACK_CHAINS` instead of hand-listing it -- the hand list is why
  uk_equity never had a typed field.

Frontend: 656 tests pass, `tsc -b` clean.
This commit is contained in:
Haozhe Wu committed 2026-09-23 11:47:12 +08:00
1 parent 5397f230ae
commit 6000b3e61d
16 files changed
+87 -6

No files matched your search

+2
View File
@@ -235,6 +235,8 @@ class DataConfig(_EnvBase):
market_data_order_india_equity: str = Field(alias="MARKET_DATA_ORDER_INDIA_EQUITY", default="")
market_data_order_kr_equity: str = Field(alias="MARKET_DATA_ORDER_KR_EQUITY", default="")
market_data_order_ca_equity: str = Field(alias="MARKET_DATA_ORDER_CA_EQUITY", default="")
market_data_order_ar_equity: str = Field(alias="MARKET_DATA_ORDER_AR_EQUITY", default="")
market_data_order_uk_equity: str = Field(alias="MARKET_DATA_ORDER_UK_EQUITY", default="")
market_data_order_vietnam_equity: str = Field(alias="MARKET_DATA_ORDER_VIETNAM_EQUITY", default="")
market_data_order_crypto: str = Field(alias="MARKET_DATA_ORDER_CRYPTO", default="")
market_data_order_futures: str = Field(alias="MARKET_DATA_ORDER_FUTURES", default="")
+9 -6
View File
@@ -127,12 +127,15 @@ class TestEnvConfigDefaults:
assert c.data.longbridge_app_secret == ""
assert c.data.longbridge_access_token == ""
# Per-market source-order overrides default to unset (default chains).
for market in (
"a_share", "us_equity", "hk_equity", "india_equity", "kr_equity",
"ca_equity", "vietnam_equity", "crypto", "futures", "fund",
"macro", "forex", "index",
):
assert getattr(c.data, f"market_data_order_{market}") == ""
# Derived from the chains, not hand-listed: the hand-written list here
# and the field block it guarded both missed uk_equity for as long as
# that market existed, so a new market shipped without its typed field.
from backtest.loaders.registry import FALLBACK_CHAINS
for market in FALLBACK_CHAINS:
field = f"market_data_order_{market}"
assert hasattr(c.data, field), f"{field} missing from EnvConfig.data"
assert getattr(c.data, field) == ""
def test_api_defaults(self) -> None:
c = EnvConfig()
@@ -27,6 +27,9 @@ const ASSET_CLASS_LABEL_KEYS = {
us_equity: "runDetail.positions.assetClass.us_equity",
hk_equity: "runDetail.positions.assetClass.hk_equity",
ca_equity: "runDetail.positions.assetClass.ca_equity",
ar_equity: "runDetail.positions.assetClass.ar_equity",
uk_equity: "runDetail.positions.assetClass.uk_equity",
vietnam_equity: "runDetail.positions.assetClass.vietnam_equity",
kr_equity: "runDetail.positions.assetClass.kr_equity",
india_equity: "runDetail.positions.assetClass.india_equity",
crypto: "runDetail.positions.assetClass.crypto",
@@ -34,6 +34,9 @@ export function SourcePrioritySettings() {
kr_equity: t("settings.sourcePriority.markets.kr_equity"),
ca_equity: t("settings.sourcePriority.markets.ca_equity"),
vietnam_equity: t("settings.sourcePriority.markets.vietnam_equity"),
ar_equity: t("settings.sourcePriority.markets.ar_equity"),
uk_equity: t("settings.sourcePriority.markets.uk_equity"),
index: t("settings.sourcePriority.markets.index"),
crypto: t("settings.sourcePriority.markets.crypto"),
futures: t("settings.sourcePriority.markets.futures"),
fund: t("settings.sourcePriority.markets.fund"),
+6
View File
@@ -571,6 +571,9 @@
"kr_equity": "الأسهم الكورية",
"ca_equity": "الأسهم الكندية",
"vietnam_equity": "أسهم فيتنام",
"ar_equity": "الأسهم الأرجنتينية",
"uk_equity": "الأسهم البريطانية",
"index": "المؤشرات",
"crypto": "العملات الرقمية",
"futures": "العقود المستقبلية",
"fund": "الصناديق",
@@ -870,6 +873,9 @@
"crypto": "عملات رقمية",
"futures": "عقود آجلة",
"forex": "عملات أجنبية",
"ar_equity": "أسهم أرجنتينية",
"uk_equity": "أسهم بريطانية",
"vietnam_equity": "أسهم فيتنامية",
"other": "أخرى"
}
},
+6
View File
@@ -576,6 +576,9 @@
"kr_equity": "Korea-Aktien",
"ca_equity": "Kanada-Aktien",
"vietnam_equity": "Vietnam-Aktien",
"ar_equity": "Argentinien-Aktien",
"uk_equity": "UK-Aktien",
"index": "Indizes",
"crypto": "Krypto",
"futures": "Futures",
"fund": "Fonds",
@@ -875,6 +878,9 @@
"crypto": "Krypto",
"futures": "Futures",
"forex": "Devisen",
"ar_equity": "Argentinien-Aktien",
"uk_equity": "UK-Aktien",
"vietnam_equity": "Vietnam-Aktien",
"other": "Sonstige"
}
},
+6
View File
@@ -576,6 +576,9 @@
"kr_equity": "Korea Equities",
"ca_equity": "Canada Equities",
"vietnam_equity": "Vietnam Equities",
"ar_equity": "Argentina Equities",
"uk_equity": "UK Equities",
"index": "Indices",
"crypto": "Crypto",
"futures": "Futures",
"fund": "Funds",
@@ -875,6 +878,9 @@
"crypto": "Crypto",
"futures": "Futures",
"forex": "Forex",
"ar_equity": "Argentina equity",
"uk_equity": "UK equity",
"vietnam_equity": "Vietnam equity",
"other": "Other"
}
},
+6
View File
@@ -576,6 +576,9 @@
"kr_equity": "Acciones de Corea",
"ca_equity": "Acciones de Canadá",
"vietnam_equity": "Acciones de Vietnam",
"ar_equity": "Acciones de Argentina",
"uk_equity": "Acciones del Reino Unido",
"index": "Índices",
"crypto": "Cripto",
"futures": "Futuros",
"fund": "Fondos",
@@ -875,6 +878,9 @@
"crypto": "Criptomonedas",
"futures": "Futuros",
"forex": "Divisas",
"ar_equity": "Renta variable Argentina",
"uk_equity": "Renta variable Reino Unido",
"vietnam_equity": "Renta variable Vietnam",
"other": "Otros"
}
},
+6
View File
@@ -576,6 +576,9 @@
"kr_equity": "Saham Korea",
"ca_equity": "Saham Kanada",
"vietnam_equity": "Saham Vietnam",
"ar_equity": "Saham Argentina",
"uk_equity": "Saham Inggris",
"index": "Indeks",
"crypto": "Crypto",
"futures": "Futures",
"fund": "Fund",
@@ -875,6 +878,9 @@
"crypto": "Crypto",
"futures": "Futures",
"forex": "Forex",
"ar_equity": "Saham Argentina",
"uk_equity": "Saham Inggris",
"vietnam_equity": "Saham Vietnam",
"other": "Lainnya"
}
},
+6
View File
@@ -571,6 +571,9 @@
"kr_equity": "韓国株",
"ca_equity": "カナダ株",
"vietnam_equity": "ベトナム株",
"ar_equity": "アルゼンチン株",
"uk_equity": "英国株",
"index": "指数",
"crypto": "暗号資産",
"futures": "先物",
"fund": "ファンド",
@@ -870,6 +873,9 @@
"crypto": "暗号資産",
"futures": "先物",
"forex": "外国為替",
"ar_equity": "アルゼンチン株",
"uk_equity": "英国株",
"vietnam_equity": "ベトナム株",
"other": "その他"
}
},
+6
View File
@@ -571,6 +571,9 @@
"kr_equity": "한국 주식",
"ca_equity": "캐나다 주식",
"vietnam_equity": "베트남 주식",
"ar_equity": "아르헨티나 주식",
"uk_equity": "영국 주식",
"index": "지수",
"crypto": "암호화폐",
"futures": "선물",
"fund": "펀드",
@@ -870,6 +873,9 @@
"crypto": "암호화폐",
"futures": "선물",
"forex": "외환",
"ar_equity": "아르헨티나 주식",
"uk_equity": "영국 주식",
"vietnam_equity": "베트남 주식",
"other": "기타"
}
},
+6
View File
@@ -576,6 +576,9 @@
"kr_equity": "Ações da Coreia",
"ca_equity": "Ações do Canadá",
"vietnam_equity": "Ações do Vietnã",
"ar_equity": "Ações da Argentina",
"uk_equity": "Ações do Reino Unido",
"index": "Índices",
"crypto": "Criptografia",
"futures": "Futuros",
"fund": "Fundos",
@@ -875,6 +878,9 @@
"crypto": "Criptoativos",
"futures": "Futuros",
"forex": "Forex",
"ar_equity": "Ações da Argentina",
"uk_equity": "Ações do Reino Unido",
"vietnam_equity": "Ações do Vietnã",
"other": "Outro"
}
},
+6
View File
@@ -571,6 +571,9 @@
"kr_equity": "韩国股票",
"ca_equity": "加拿大股票",
"vietnam_equity": "越南股票",
"ar_equity": "阿根廷股票",
"uk_equity": "英国股票",
"index": "指数",
"crypto": "加密货币",
"futures": "期货",
"fund": "基金",
@@ -870,6 +873,9 @@
"crypto": "加密货币",
"futures": "期货",
"forex": "外汇",
"ar_equity": "阿根廷股",
"uk_equity": "英股",
"vietnam_equity": "越股",
"other": "其他"
}
},
@@ -110,6 +110,12 @@ describe("classifyAssetClass parity with backend rules", () => {
["BRK-B.US", "us_equity"],
["TD.TO", "ca_equity"],
["PNG.V", "ca_equity"],
// Argentina (#1543) plus the two suffixes that landed on the backend
// earlier and were never classified here, so they read as "other".
["GGAL.BA", "ar_equity"],
["GOOGL.BA", "ar_equity"],
["VOD.L", "uk_equity"],
["VIC.VN", "vietnam_equity"],
["005930.KS", "kr_equity"],
["035720.KQ", "kr_equity"],
["RELIANCE.NS", "india_equity"],
+4
View File
@@ -1227,6 +1227,10 @@ export type SectorAssetClass =
| "india_equity"
| "kr_equity"
| "ca_equity"
| "ar_equity"
| "uk_equity"
| "vietnam_equity"
| "index"
| "crypto"
| "futures"
| "forex";
+6
View File
@@ -9,6 +9,9 @@ export type AssetClass =
| "us_equity"
| "hk_equity"
| "ca_equity"
| "ar_equity"
| "uk_equity"
| "vietnam_equity"
| "kr_equity"
| "india_equity"
| "crypto"
@@ -42,6 +45,9 @@ const EQUITY_SUFFIX_MAP: Record<string, AssetClass> = {
US: "us_equity",
TO: "ca_equity",
V: "ca_equity",
BA: "ar_equity",
L: "uk_equity",
VN: "vietnam_equity",
KS: "kr_equity",
KQ: "kr_equity",
NS: "india_equity",