struct Bar { open: f64, high: f64, low: f64, close: f64, volume: Option<u32>, } struct Trade { price: f64, size: u32, } struct Quote { ask: f64, ask_size: u32, bid: f64, bid_size: u32, } enum Price { Bar(Bar), Trade(Trade), Quote(Quote), } trait MarketData { fn prices(&self) -> &HashMap<&'static str, Price>; fn timestamp(&self) -> &OffsetDateTime; }
Скачать ее можно по адресу: drive.google.com/drive/folders/1SnxKojpiXD2or6begSZTkzDyDoCBla_d?usp=sharing. Т.к. компиляция производилась при помощи pyinstaller, то, скорее всего винда пожалуется на exe-шник (решение проблемы нетрудно гуглится), поэтому, и потому что люди могут сидеть не из под винды, в папке с exe-шником лежит питонячий проект. Замечание: Если хотите скачать только exe-шник, то не забудьте скачать db.json и поместить его в ту же директорию, иначе программа не запустится!
Программа качает котировки в csv файл (считайте аналог Финама) с разделителем ";".
Некоторые замечания по разработке: Изначально планировалось что все разделы (Торговая система, Рынок и т.д.) будут парсится с API, такая идея даже была осуществлена, но показала свою неэффективность, поэтому в настоящей версии парсится только период времени для которого возможно скачивание, а остальные данные берутся из db.json, которую вы можте сами дополнить (если понадабится).
При возникновении проблем связанных с интернетом (его отсутствие, отказ сервера и т.д.) в окошках «Начало периода» и «Конец периода» будут стоять даты 01.01.0001.
По любым вопросам можете писать в коментарии или ЛС. Всем добра!
Если хотите поддержать автора: Сбер — 4817 7602 2175 5865 (Емельянов Иван Д.)
import requests import datetime import pathlib SECIDs = ["GAZP", "BANEP", "LKOH"] DISK = "E" for SECID in SECIDs: from_date = "2020-05-04" to_date = "2005-01-03" while str(to_date) != from_date: to_date = str(to_date) to_date = to_date.split('-') a = datetime.date(int(to_date[0]), int(to_date[1]), int(to_date[2])) b = datetime.timedelta(days=140) to_date = a + b pathlib.Path("{}:/{}/{}".format(DISK, "Database_MOEX", SECID)).mkdir(parents=True, exist_ok=True) filename = SECID + "_" + str(to_date) + ".csv" with requests.get("http://iss.moex.com/iss/history/engines/stock/markets/shares/boards/tqbr/securities/{}.csv?date={}".format(SECID, to_date)) as response: with open("{}:/Database_MOEX/{}/{}".format(DISK, SECID, filename), 'wb') as f: for chunk in response.iter_content(): f.write(chunk)Для начала пройдемся по его плюсам и минусам. Самый главный минус, что этот парсер качает только определенный период, который уникален для каждой акции, судя по всему для увеличения этого периода надо кинуть бирже на лапу:), и то что информация предоставляется за день, теперь перейдем к плюсам: можно выкачивать историю за определенный период для нескольких инструментов сразу (их количество ограничивается лишь количеством инструментов на мосбиржи), есть возможность назначать диск для сохранения информации, быстрота выгрузки данных.