Skip to content

Commit 2ec074b

Browse files
committed
Quote downloader for Borsa Italiana was implemented
1 parent b0896b0 commit 2ec074b

File tree

3 files changed

+50
-4
lines changed

3 files changed

+50
-4
lines changed

jal/constants.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,14 +193,15 @@ class AssetData:
193193
class MarketDataFeed(PredefinedList, QObject):
194194
NA = -1
195195
FX = 0
196-
RU = 1
196+
RU = 1 # MOEX
197197
US = 2
198198
EU = 3
199199
CA = 4
200200
GB = 5
201-
FRA = 6
201+
FRA = 6 # Frankfurt Borse
202202
SMA_VICTORIA = 7
203203
COIN = 8
204+
MILAN = 9 # Borsa Italiana, Milan Stock Exchange
204205

205206
def __init__(self):
206207
super().__init__()
@@ -214,7 +215,8 @@ def __init__(self):
214215
self.GB: self.tr("LSE"),
215216
self.FRA: self.tr("Frankfurt Borse"),
216217
self.SMA_VICTORIA: self.tr("Victoria Seguros"),
217-
self.COIN: self.tr("Coinbase")
218+
self.COIN: self.tr("Coinbase"),
219+
self.MILAN: self.tr("Borsa Italiana")
218220
}
219221

220222

jal/net/downloader.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,8 @@ def download_asset_prices(self, start_timestamp, end_timestamp, sources_list):
163163
MarketDataFeed.GB: self.YahooLSE_Downloader,
164164
MarketDataFeed.FRA: self.YahooFRA_Downloader,
165165
MarketDataFeed.SMA_VICTORIA: self.Victoria_Downloader,
166-
MarketDataFeed.COIN: self.Coinbase_Downloader
166+
MarketDataFeed.COIN: self.Coinbase_Downloader,
167+
MarketDataFeed.MILAN: self.EuronextMilan_DataReader
167168
}
168169
assets = JalAsset.get_active_assets(start_timestamp, end_timestamp)
169170
assets = [(x['asset'], x['currency']) for x in assets if x['asset'].quote_source(x['currency']) in sources_list]
@@ -527,6 +528,39 @@ def Euronext_DataReader(self, asset, currency_id, start_timestamp, end_timestamp
527528
close.sort_index(inplace=True)
528529
return close
529530

531+
# noinspection PyMethodMayBeStatic
532+
def EuronextMilan_DataReader(self, asset, currency_id, start_timestamp, end_timestamp):
533+
suffix = "ETF" if asset.type() == PredefinedAsset.ETF else "MTA"
534+
url = "https://charts.borsaitaliana.it/charts/services/ChartWService.asmx/GetPricesWithVolume"
535+
params = {
536+
"request": {
537+
"SampleTime":"1d",
538+
"TimeFrame":None,
539+
"RequestedDataSetType":"ohlc",
540+
"ChartPriceType":"price",
541+
"Key": asset.symbol() + "." + suffix,
542+
"OffSet":0,
543+
"FromDate":start_timestamp,
544+
"ToDate":end_timestamp,
545+
"UseDelay":False,
546+
"KeyType":"Topic",
547+
"KeyType2":"Topic",
548+
"Language":"en-US"
549+
}
550+
}
551+
self._request = WebRequest(WebRequest.POST_JSON, url, params=params, headers={'Accept': 'text/csv'})
552+
self._wait_for_event()
553+
json_content = json.loads(self._request.data())
554+
if 'd' not in json_content:
555+
return None
556+
data = pd.DataFrame(json_content['d'], columns=["Date", "Unk", "O", "H", "L", "Close", "V"])
557+
data = data.drop(columns=["Unk", "O", "H", "L", "V"], errors='ignore')
558+
data['Date'] = pd.to_datetime(data['Date'], unit='ms', utc=True)
559+
data['Close'] = data['Close'].astype('str').apply(Decimal)
560+
close = data.set_index("Date")
561+
close.sort_index(inplace=True)
562+
return close
563+
530564
# noinspection PyMethodMayBeStatic
531565
def TMX_Downloader(self, asset, _currency_id, start_timestamp, end_timestamp):
532566
url = 'https://app-money.tmx.com/graphql'

tests/test_downloaders.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,16 @@ def test_Euronext_downloader(prepare_db):
242242
quotes_downloaded = downloader.Euronext_DataReader(JalAsset(4), 3, d2t(230412), d2t(230414))
243243
assert_frame_equal(quotes, quotes_downloaded)
244244

245+
def test_EuronextMilan_DataReader(prepare_db):
246+
create_assets([('MINT', 'Pimco Us Dollar Short Maturity Ucits Etf', 'IE00B67B7N93', 3, PredefinedAsset.ETF, 0)]) # ID = 4
247+
quotes = pd.DataFrame({'Close': [Decimal('95.20'), Decimal('95.02'), Decimal('94.80')],
248+
'Date': [d2dt(241203), d2dt(241204), d2dt(241205)]})
249+
quotes = quotes.set_index('Date')
250+
251+
downloader = QuoteDownloader()
252+
quotes_downloaded = downloader.EuronextMilan_DataReader(JalAsset(4), 3, d2t(241203), d2t(241205))
253+
assert_frame_equal(quotes, quotes_downloaded)
254+
245255

246256
def test_TMX_downloader(prepare_db):
247257
create_stocks([('RY', '')], currency_id=3) # id = 4

0 commit comments

Comments
 (0)