Блог им. Mixashow

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

Всем привет!

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

Есть способы сделать это через 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()

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


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

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

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



______________________________________

П.С.

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

______________________________________

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

 

 

 

 

★2
11 комментариев
«есть, наверное через quik или какой либо другой сторонний сервис. Я буду делать через Python» возникает вопрос зачем?
Капиталист, потому что я не знаю как сделать через квик и не знаю бесплатных сервисов, которые это сделают 
Михаил Titov, в квике это галочку поставить, а до этого парой кнопок мыши кликнуть, но это сложно, у нас ведь питон есть )
Капиталист, Буду рад если скажите куда галочки ставить
Михаил Titov, у меня сейчас квика нет перед глазами, на память правой кнопкой на графике, там выбираем параметры диаграммы прайс, там во вкладках поставить галочку, что показывать, сделки, заявки, стопы
Капиталист, нашел, завтра попробую, сейчас не работает, возможно потому что выходной, спасибо

Капиталист, Привет, я так понял сделки отображаются только за торговую сессию.

1) Сделки которые показывает квик.

2)То что показывает программа



Ага, от вечернего клиринга до вечернего, как впрочем и таблицу сделок
Капиталист, тогда это не очень прикольно, поэтому я прогу и сделал 
Михаил Titov, не прога, конечно хорошо, просто дальше чем клиринг эти стрелочки впринципе и не нужны, а вот сделки, реально неприкольно
а как сделать импорт всех сделок за год  
в эксель 
avatar

теги блога Михаил Titov

....все тэги



UPDONW
Новый дизайн