Тимофей Мартынов
Тимофей Мартынов личный блог
07 июня 2016, 17:55

нужен технический совет по котировкам Мосбиржи

Привет всем! Нужна помощь техспецов. Хочу на смартлабе сделать вот такую табличку:

http://quote.rbc.ru/exchanges/demo/micex.0/intraday
 

Эта табличка у квоты обновляется автоматом раз в 5 сек.
Насколько я понял по API интерфейсу биржи, собирается она из вот таких запросов: 

http://moex.com/iss/engines/stock/markets/shares/securities.xml?securities=GAZP 

Как это лучше реализовать технически на стороне сервера?

На чем писать серверную часть? Как сделать так, чтобы это минимально грузило сервак и выполняло расчеты параметров по каждой бумаге?

+ я хочу ещё сохранять данные раз в 5-10 минут и делать с таким же интервалом определенные вычисления… результат которых будет в этой же табличке + сделать фильтры, по которым можно будет показывать бумаги

p.s. договор с биржей подписал
нужен технический совет по котировкам Мосбиржи

44 Комментария
  • D.G.
    07 июня 2016, 18:03

    habrahabr.ru/company/dnevnik_ru/blog/167307/

    nodeguide.ru/doc/modules-you-should-know/socketio/

    На сервере делается пулинг данных с биржи, отслеживаются изменения в данных и по веб сокетам или другому транспорту отсылаются изменения клиентам. На клиенте можно использовать angular, backbone или react js. Серверная реализация может быть на .net + signalR или на node.js + socket.io, исходя из возможностей хостинга.

  • togovse
    07 июня 2016, 18:10
    • На чем писать серверную часть?
      на чём угодно, я думаю это можно делать не на сервере, а на клиенте. Желательно чтобы данные с моекс приходили в json формате.
    • Как сделать так, чтобы это минимально грузило сервак и выполняло расчеты параметров по каждой бумаге?
      Минимизировать запросы к серверу моекс, стараться все данные выкачивать одним запросом.  
    • еще, если моекс поддерживает отправку данных по вебсокетам, то вообще хорошо будет.
  • vlad1024
    07 июня 2016, 18:18
    Просто слать запросы параллельно потом агрегировать, на чем слать впринципе все равно, основная проблема это нагрузка на сервер биржи после которой она будет давать отлуп. На чем писать — на чем умеете, из скриптовых(Python, PHP) все равно, они по производительности равнозначны. Надо посчитать нагрузку, если ее придется снижать то писать стоит на Java/Go. Но лучше начать с простого решения — написать на том же языке что и сайт.
      • togovse
        07 июня 2016, 18:35
        Тимофей Мартынов, вариант делать на клиенте хороший, но и на серверной части большой проблемы быть не должно, не обязательно с сокета качать херово кол-во раз, достаточно ограниченное кол-во хранить в очереди и на клиент отдавать из неё, в худшем случае будет небольшая задержка
      • Евгений Черных
        07 июня 2016, 20:15
        Тимофей Мартынов, Поставь на сервак квик и тяни котировки оттуда :)
        • Михаил Пиписькин
          07 июня 2016, 20:16
          kbrobot.ru, или можно smartcom или transaq у них как раз огромные задержки, даже буфер не нужен будет.
          • Евгений Черных
            07 июня 2016, 20:52
            Тимофей Мартынов, Мне кажется оно проще. Хотя я по вебу не сильный спец
      • Глыба Денег
        07 июня 2016, 18:36
        Тимофей Мартынов, я думаю, раз в минуту отсылать вполне нормально. Все равно задержка 15 минут.
      • vlad1024
        07 июня 2016, 20:29
        Тимофей Мартынов, у меня получилось 7 гбайт за сутки если скачивать каждые 5 секунд. В общем, смотри есть два варианта, либо есть какие-то push уведомления от сервера биржи(что обновить), либо придется скачивать все, с фиксированной частототй. Тут было предложение уменьшить частоту, и это впринципе разумно. По поводу того на чем писать, можно на ПХП только пустить его мимо сайта. То есть примерно это должно работать следующим образом:
        По таймеру дергается скрипт, он параллельно в несколько потоков, закачиват данные с сервера майсекса, агрегирует их и засовывает в базу, либо сразу генерит страничку которую можно отдать.
        Далее ПХП на уровне функционала сайта, отдает эту страничку либо строит ее из базы.
          • vlad1024
            07 июня 2016, 21:43
            Тимофей Мартынов, 
            >помнишь, как ты на меня обижался?:)
            Последний раз когда я на тебя «обижался» это было в ноябре 2012 года, когда выпилили Феникса. Просто времени в основном нет, чтобы зависать на смарт-лабе. А так я время от времени читаю, изредка коментрую, и даже посты пишут если есть чем поделится интересным.
    • MyProfit
      07 июня 2016, 22:09
      vlad1024, для снижения нагрузки на сервер не лучше на C# писать серверную часть, вместо PHP и Java?
      • vlad1024
        07 июня 2016, 22:14
        MyProfit, C#/Java равнозначны по производительности, практически, можно еще попробовать на Go написать, он тоже шустрый и более «скриптовый».
  • Игорь Рябушкин
    07 июня 2016, 18:52
    Я бы делал так.

    1. На SQL Server создал таблицу (скорее группу таблиц). 
    2. На SQL Server создал Stored procedure (на t-sql) которая делает нужные вычисления на базе таблиц из п.1
    3. На .NET написал процедуру которая 
    3.1. Запрашивает данные по HTTP в формате XML
    3.2. Парсит XML документ и записывает данные в таблицу из п.1
    3.3. Вызывает процедуру из п.2
    4. Создал задание по расписанию (на сервере) которое регулярно с заданной частотой выполняет процедуру п.3.


    К подобного класса задачам лучше подходить обдуманно. Обдумывать максимально будущую систему в рамках которой будет работать данное решение. Фундаментальный вопрос тут — реляционная модель базы данных. Остальное — вторично. Модель данных — должна проектироваться исходя из модели семантического уровня. Несколько заумно может показаться, но делать лучше так.
      • Игорь Рябушкин
        07 июня 2016, 19:11
        Тимофей Мартынов, если нужно больше деталей — обращайся. Решаю такие задачки регулярно.
          • SciFi
            08 июня 2016, 16:45
            Тимофей Мартынов, я бы на твоем месте пошел по нестандартному пути, предложенному kbrobot. А именно, выгружал бы данные из терминала (только не QUIK, а Metatrader) с помощью робота (опять же не на Lua, а на MQL5, так как быстрее). И потом эти текстовые файлы использовал для обновления базы данных сервера. Причем лучше это делать не на скриптовом PHP языке, а на чем-нибудь более быстром, вроде C# / C++ / Python. На счет Python не уверен, но он вроде компилируемый. Почему так? Потому что так ты 1. сэкономишь на договоре с биржей. 2. у тебя данные будут быстрее обновляться, чем через 15 минут. 3. ты сможешь выгрузить больше данных, чем дает биржа, или меньше — только то, что тебе реально нужно. 4.терминал получает данные более быстро за счет оптимизированного протокола (там не HTTP используется), чем ты будешь их получать по HTTP/HTTPS в виде JSON. Но от PHP для данной задачи я тебе советую отказаться ибо он для этого не предназначен, он хорош для генерации веб-страниц. А базу надо наполнять чем-то более шустрым.
  • Михаил Пиписькин
    07 июня 2016, 19:56
    в чем проблема данные с плазы брать?
    • Oleg Vazhnev
      07 июня 2016, 20:12
      Александр, я думаю стандартная лицензия вряд ли позволяет «перенаправлять» данные с плазы. считай как перепродаёшь то, на что у биржи эксклюзивные права на продажу :) логин быстро отключат скорее всего.
      • Михаил Пиписькин
        07 июня 2016, 20:13
        ovazhnev, тимофей задержку сделает.
      • flextrader
        08 июня 2016, 09:54
        ovazhnev, думаешь будут отслеживать, что фидер берет их не ч/з хттп?)) и ... 
      • Investment Manager
        07 июня 2016, 21:43
        Тимофей Мартынов,  так, по моему у всех, финам например рт дает только своим зарегистрированным пользователям.
      • Михаил Пиписькин
        07 июня 2016, 23:59
        Тимофей Мартынов, ну сделай буфер на 15 минут. в интернете обычно так: ты парсишь тебя парсят. вообще кому нужны такие таблицы? на бирже сделано вполне удобно.
  • Investment Manager
    07 июня 2016, 21:40
    P.s. Кстати смарт-лаб открывается быстро с российских айпишников, а если айпишники иностранные часто даже главную страницу не грузит… что-то у хостера с каналами связи…
  • croc
    07 июня 2016, 21:57
    Если бы речь шла о виндовом сервере — я бы на нем сделал windows service который вытягивает данные с биржи, обрабатывает и сохраняет в БД.
    Котировки меняются часто. все равно задержка 15 минут. Поэтому кмк нет необходимости городить пуш уведомления по каждому чиху, клиент должен получать все данные разом. Проще всего написать на клиенте скрипт который с определённой периодичностью получает с сервера данные в виде json и обновляет их на странице.
    (сугубо моё имхо как виндовс программера)
  • Жадный Яша
    07 июня 2016, 23:40
    1) фидер 2) парсер 3) агрегатор 4) форматтер
    всего 4 потока, серверу ни холодно ни жарко, хули тут делать
    а вообще взяли бы в эластик загнали и получили бы в готовом виде все, осталось бы только клиентам разослать по вебсокетам или аналогичным транспортом
  • Leo
    08 июня 2016, 03:40

    На MySQL (и прочих SQL) слишком дорого и бестолково по ресурсам, нужна специализированная база данных, типа InfluxDB
    influxdata.com/

  • ddyner
    08 июня 2016, 08:27
    Запрашиваю котировки по этой ссылке: www.micex.ru/issrpc/marketdata/stock/shares/daily/short/result.json?boardid=TQBR&lang=ru&secid=GAZP Возвращает json, трафика на порядок меньше, чем в xml-формате
  • Андрей К
    08 июня 2016, 11:22
    тут программисты еще не подрались?
    • Алексей К
      08 июня 2016, 15:14
      Тимофей Мартынов, 
      1. По запросу. Запрашивать в json все за раз.
      Вроде оно? moex.com/iss/engines/stock/markets/shares/securities.json
      2. Чем запрашивать. Любым способом. Да хоть wget по крону.
      3. Где хранить. Странно, что тут еще Оракл не предложили. :) Сиквел — это медленно и дорого. Бесплатная монга для такой задачи более чем подходит. Если уж так охота именно реляционную БД, то постгре на край. Хотя я, так понял, у тебя MySql используется? Можно и в нем хранить, если цель использовать то, что есть. Но NoSQL будет эффективнее (та же монга) В общем, тут нужны требования.
      4. По трафику. Откуда гигабайты? У меня получилось ~150мб/сутки несжатого трафика при запросе раз в 5 минут (0,5х12х24)
      5. По нагрузке. Раз в 5 минут 0.5мб. Это большая нагрузка на биржу? Думаю, нет

      Если есть вопросы, обращайся!
  • Тимофей помоему совсем не услышал пожеланий посетителей. Зачем вся эта портянка нужна?

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн