Михаил Titov
Михаил Titov личный блог
11 мая 2020, 14:43

Отобразить сделки на графике(Сбербанк Брокер)

Всем привет!

В этом топике напишу способ, как можно отобразить свои сделки на графике у брокера сбербанк.

Есть способы сделать это через Excel, есть, наверное через quik или какой либо другой сторонний сервис. Я буду делать через Python, так как по сравнению с экселем, питон будет давать нам актуальные данные, а эксель придется забивать руками(да я знаю, что можно и в него авто подгрузку вкрутить, но это на мой взгляд еще сложнее чем на python).

Коротко:

На входе нам нужен файл с тикерами(смотри на яндекс диске https://yadi.sk/d/hpfgtS1BEiVRiQ) и история сделок с сайта сбербанка.

На выходе мы получим вот такую вот карикатуруОтобразить сделки на графике(Сбербанк Брокер)
Да, тут кривой текст, и нет столбиков объема, которые я так бы хотел, но кому и в таком формате пойдет, тот может читать дальше, а если тут есть добрые люди, то возможно, они смогут в комментариях кинуть исправленный фрагмент кода, чтобы была картинка по круче, особенно столбики объема добавить, как ни корячился, не допер, ибо опыт программирования у меня = школьный паскаль.

Собственно по факту у нас будет 2 программы. Первая создает базу с котировками для режима торгов, вторая программа по файлу со сделками и базе с котировками строит график.

Первая программа:

import requests<br />import apimoex<br />import pandas as pd<br />import pathlib<br />from datetime import datetime, date<br /><br />board = 'TQBR'<br /><br />#Открываем файл с тикерами<br />with open("C:/PYEX/TICK.txt", "r") as TICKs:<br />    TICKs = [line.rstrip() for line in TICKs]<br /><br />#Дату лучше не менять иначе ошибка в последнем цикле<br />DATE = date(2013, 1, 1)<br />i=0<br /><br />#Создание основного фрейма и заполнение первой колонки сквозной датой<br />maindate = pd.DataFrame()<br />datei = datetime.toordinal(DATE)<br />for datei in range(datetime.toordinal(DATE), datetime.toordinal(datetime.now())):<br />    maindate = maindate.append({'TRADEDATE':datei}, ignore_index=True)<br /><br />#Скачивание котировок и заполнение фрейма<br />process = 0<br />for TICK in TICKs:<br />    process = process + 1<br />    print((process / len(TICKs))*100,' %') #Прогресс выполнения<br />    data = apimoex.get_board_history(requests.Session(), TICK, board=board) #Получение данных с биржи<br />    if data == []: #Пропуск если по данному тикеру нет данных<br />        continue<br />    df = pd.DataFrame(data) #Перенос данных с биржи во фрейм<br />    maindate[TICK] = None #На всякий случай предварительно создаем столбик тикера и заполняем пустыми значениями<br />    j=0<br />    for i in range(0,datetime.toordinal(datetime.now())-datetime.toordinal(DATE)): #Пробег по датам основного фрейма<br />        if maindate['TRADEDATE'][i] == datetime.toordinal(datetime.strptime(df['TRADEDATE'][j], '%Y-%m-%d')): #Если дата основного фрейма и базы с биржи совпадают, то в столбик тикера записывается цена закрытия<br />            maindate.loc[maindate.TRADEDATE == maindate['TRADEDATE'][i], TICK] = df['CLOSE'][j] #Собственно запись цены закрытия в строчку совпадения столбик тикера<br />            j=j+1<br />            if j == (len(df.index)-1): #чтобы не выходить за размер данных с биржи в случае если инструмент до наших дней не дожил<br />                break<br /><br /><br />#запись базы в эксель<br />pathlib.Path("C:/PYEX/Database").mkdir(parents=True, exist_ok=True)<br />maindate.to_excel("C:/PYEX/Database/{}.xlsx".format(board), index=False)


Вторая программа:

import pandas as pd<br />import matplotlib.pyplot as plt<br />from matplotlib.ticker import (AutoMinorLocator)<br />from datetime import datetime<br /><br /><br />print("Введите ТИКЕР акции(например SBER)")<br />TICK = input()<br />print("Введите режим торгов для акций (TQBR), для etf (TQTF)")<br />board = input()<br />i=0<br /><br />#подготовка баз<br />trade=pd.DataFrame()<br />tradeBUY=pd.DataFrame()<br />tradeSELL=pd.DataFrame()<br />main = pd.read_excel("C:/PYEX/Database/{}.xlsx".format(board), sheet_name=0)<br />tr = pd.read_excel("C:/PYEX/Trade.xlsx", sheet_name=0)<br />for i in range(0, len(tr['Дата заключения'])):<br />    trade = trade.append({'INDEX':i}, ignore_index=True)<br />    tradeBUY = trade.append({'INDEX':i}, ignore_index=True)<br />    tradeSELL = trade.append({'INDEX': i}, ignore_index=True)<br /><br />#построение массива<br />j=0<br />for i in range(0,len(tr['Код финансового инструмента'])):<br />    if TICK == tr['Код финансового инструмента'][i]:<br />        if tr['Операция'][i] == 'Покупка':<br />            tradeBUY.loc[tradeBUY.INDEX == tradeBUY['INDEX'][j], TICK] = tr['Код финансового инструмента'][i]<br />            tradeBUY.loc[tradeBUY.INDEX == tradeBUY['INDEX'][j], 'TRADEDATE'] = int(datetime.toordinal(tr['Дата заключения'][i]))<br />            tradeBUY.loc[tradeBUY.INDEX == tradeBUY['INDEX'][j], 'PRICE'] = (tr['Цена'][i])<br />            tradeBUY.loc[tradeBUY.INDEX == tradeBUY['INDEX'][j], 'CV'] = tr['Количество'][i]<br />            tradeBUY.loc[tradeBUY.INDEX == tradeBUY['INDEX'][j], 'TYPE'] = tr['Операция'][i]<br />            tradeBUY.loc[tradeBUY.INDEX == tradeBUY['INDEX'][j], 'VOLUME'] = tr['Операция'][i] * tr['Количество'][i]<br />            j = j + 1<br />        else:<br />            tradeSELL.loc[tradeSELL.INDEX == tradeSELL['INDEX'][j], TICK] = tr['Код финансового инструмента'][i]<br />            tradeSELL.loc[tradeSELL.INDEX == tradeSELL['INDEX'][j], 'TRADEDATE'] = datetime.toordinal(tr['Дата заключения'][i])<br />            tradeSELL.loc[tradeSELL.INDEX == tradeSELL['INDEX'][j], 'PRICE'] = tr['Цена'][i]<br />            tradeSELL.loc[tradeSELL.INDEX == tradeSELL['INDEX'][j], 'CV'] = tr['Количество'][i]<br />            tradeSELL.loc[tradeSELL.INDEX == tradeSELL['INDEX'][j], 'TYPE'] = tr['Операция'][i]<br />            tradeSELL.loc[tradeSELL.INDEX == tradeSELL['INDEX'][j], 'VOLUME'] = tr['Операция'][i] * tr['Количество'][i]<br />            j=j+1<br /><br />#Дата из цифрового формата в нормальный<br />for i in range(0, len(main['TRADEDATE'])):<br />    main.loc[main.TRADEDATE == main['TRADEDATE'][i], 'TRADEDATE'] = datetime.fromordinal(main['TRADEDATE'][i])<br /><br />#построение графика<br />x1 = main['TRADEDATE']<br />y1 = main[TICK]<br />x2 = tradeBUY['TRADEDATE']<br />y2 = tradeBUY['PRICE']<br />x3 = tradeSELL['TRADEDATE']<br />y3 = tradeSELL['PRICE']<br />fig, ax = plt.subplots(figsize=(5, 1))<br />tradeBUY.apply(lambda x: ax.annotate(x['CV'],xy = (x['TRADEDATE'], x['PRICE']), color='green', fontsize=11,arrowprops=(dict(color='green'))), axis=1)<br />tradeSELL.apply(lambda x: ax.annotate(x['CV'], (x['TRADEDATE'], x['PRICE']), color='red', fontsize=11,arrowprops=(dict(color='red',headlength = - 10 ))), axis=1)<br />ax.plot(x1, y1)<br />ax.xaxis.set_minor_locator(AutoMinorLocator())<br />ax.yaxis.set_minor_locator(AutoMinorLocator())<br />ax.tick_params(which='major', length=10, width=2)<br />ax.tick_params(which='minor', length=5, width=1)<br />ax.set_xlabel('ДАТА')<br />ax.set_ylabel('ЦЕНА')<br />ax.set_title(TICK)<br />plt.grid()<br />plt.show()

Не забывайте проверять путифайлов!


Теперь нужно с помощью первой программы получить или обновить котировки по режиму торгов, а потом через вторую программу нам просто остается вписывать интересующий нас тикер и режим торгов в котором он торгуется и получаем график со сделками.

Отобразить сделки на графике(Сбербанк Брокер)

 Если кто не понимает что происходит, смотрите видео, постарался объяснить:



______________________________________

П.С.

Не кидайте камнями за кривой код, я не программист, просто карантин — время попробовать что-то новое :)

______________________________________

Не забывайте добавить в избранное чтобы не потерять и нажать ХОРОШО! :)

 

 

 

 

11 Комментариев
  • Капиталист
    11 мая 2020, 14:46
    «есть, наверное через quik или какой либо другой сторонний сервис. Я буду делать через Python» возникает вопрос зачем?
      • Капиталист
        11 мая 2020, 14:50
        Михаил Titov, в квике это галочку поставить, а до этого парой кнопок мыши кликнуть, но это сложно, у нас ведь питон есть )
          • Капиталист
            11 мая 2020, 14:54
            Михаил Titov, у меня сейчас квика нет перед глазами, на память правой кнопкой на графике, там выбираем параметры диаграммы прайс, там во вкладках поставить галочку, что показывать, сделки, заявки, стопы
              • Капиталист
                12 мая 2020, 17:52
                Ага, от вечернего клиринга до вечернего, как впрочем и таблицу сделок
                  • Капиталист
                    12 мая 2020, 17:59
                    Михаил Titov, не прога, конечно хорошо, просто дальше чем клиринг эти стрелочки впринципе и не нужны, а вот сделки, реально неприкольно
  • mail22
    29 мая 2020, 11:54
    а как сделать импорт всех сделок за год  
    в эксель 

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

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