Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions api/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ NGNMARKET_API_BASE_URL=https://api.ngnmarket.com/v1/
NGNMARKET_API_KEY=value
RAPID_API_BASE_URL=https://tradingview-data1.p.rapidapi.com/
RAPID_API_KEY=value
NGXPULSE_API_BASE_URL=https://www.ngxpulse.ng
NGXPULSE_API_KEY=value

# Scheduler
SCHEDULER_ENABLED=true
Expand Down
2 changes: 2 additions & 0 deletions api/.env.prod.example
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ NGNMARKET_API_BASE_URL=https://api.ngnmarket.com/v1/
NGNMARKET_API_KEY=value
RAPID_API_BASE_URL=https://tradingview-data1.p.rapidapi.com/
RAPID_API_KEY=value
NGXPULSE_API_BASE_URL=https://www.ngxpulse.ng
NGXPULSE_API_KEY=value

# Scheduler
SCHEDULER_ENABLED=true
Expand Down
25 changes: 21 additions & 4 deletions api/adapters/inbound/http/asset_routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from sqlalchemy.ext.asyncio import AsyncSession

from adapters.outbound.market_data.ngnmarket_adapter import NgnMarketAdapter
from adapters.outbound.market_data.ngxpulse_adapter import NgxPulseAdapter
from adapters.outbound.market_data.tiingo_adapter import TiingoAdapter
from adapters.outbound.market_data.tradingview_adapter import TradingviewAdapter
from adapters.outbound.market_data.yfinance_adapter import YFinanceAdapter
Expand All @@ -25,7 +26,7 @@ def _normalize_provider(provider: str) -> str:
normalized = (provider or "yfinance").strip().lower()
return (
normalized
if normalized in {"yfinance", "tiingo", "ngnmarket", "tradingview"}
if normalized in {"yfinance", "tiingo", "ngnmarket", "ngxpulse", "tradingview"}
else "yfinance"
)

Expand All @@ -48,7 +49,9 @@ async def _fetch_fx_history(from_ccy: str, start: date, end: date) -> dict[date,
rate = item.get("rate")
if date_str and rate is not None:
try:
result[date.fromisoformat(date_str)] = round(float(rate) * 100)
result[date.fromisoformat(date_str)] = round(
float(rate) * 100
)
except Exception:
pass
if result:
Expand All @@ -60,14 +63,20 @@ async def _fetch_fx_history(from_ccy: str, start: date, end: date) -> dict[date,
t = yf.Ticker(f"{from_ccy}USD=X")
data = t.history(start=start, end=end)
if not data.empty:
return {idx.date(): round(float(row["Close"]) * 100) for idx, row in data.iterrows()}
return {
idx.date(): round(float(row["Close"]) * 100)
for idx, row in data.iterrows()
}
except Exception:
pass
try:
t = yf.Ticker(f"USD{from_ccy}=X")
data = t.history(start=start, end=end)
if not data.empty:
return {idx.date(): -round(float(row["Close"]) * 100) for idx, row in data.iterrows()}
return {
idx.date(): -round(float(row["Close"]) * 100)
for idx, row in data.iterrows()
}
except Exception:
pass
return {}
Expand Down Expand Up @@ -96,6 +105,7 @@ async def get_price_history_batch(
tiingo = TiingoAdapter()
tradingview = TradingviewAdapter()
ngnmarket = NgnMarketAdapter()
ngxpulse = NgxPulseAdapter()

def _pick_adapter(ticker: str):
provider = _normalize_provider(provider_map.get(ticker.upper(), "yfinance"))
Expand All @@ -105,6 +115,8 @@ def _pick_adapter(ticker: str):
return tiingo
if provider == "ngnmarket":
return ngnmarket
if provider == "ngxpulse":
return ngxpulse
return yfinance

async def _fetch(ticker: str):
Expand Down Expand Up @@ -196,6 +208,9 @@ async def validate_ticker(
elif selected == "ngnmarket":
adapter = NgnMarketAdapter()
metadata = await adapter.get_asset_metadata(ticker, currency, asset_class)
elif selected == "ngxpulse":
adapter = NgxPulseAdapter()
metadata = await adapter.get_asset_metadata(ticker, currency, asset_class)
elif selected == "tradingview":
adapter = TradingviewAdapter()
metadata = await adapter.get_asset_metadata(ticker, currency)
Expand Down Expand Up @@ -236,6 +251,8 @@ async def get_price_history(
adapter = TiingoAdapter()
elif provider == "ngnmarket":
adapter = NgnMarketAdapter()
elif provider == "ngxpulse":
adapter = NgxPulseAdapter()
else:
adapter = YFinanceAdapter()

Expand Down
Loading
Loading