SciFi
SciFi личный блог
03 июня 2017, 14:48

Парсер отчета брокера "Отрытие" на Питон

Я много времени тратил на заполнение торгового журнала. Главная трудность была в том, что при исполнении достаточно крупной заявки создается множество мелких сделок. Также каждый день на долларовых активах менялась стоимость пункта цены. Проще брать объемы сделок из отчета брокера, а не вычислять самому. 

Написал парсер отчета брокера «Отрытие» в формате xml, который суммирует такие мелкие сделки по объему и количеству и кроме этого выдает список сделок в нужном мне формате. Особенно это касается даты, точности цены и порядка данных. 

Итак, получается примерно такое:
26.05.2017;23:41:05;BR-6.17;Продажа;52,18;13;382208
29.05.2017;11:20:21;BR-7.17;Продажа;52,44;13;384112
29.05.2017;11:20:29;ED-6.17;Купля;1,1194;5;315361
29.05.2017;12:58:30;ED-6.17;Продажа;1,1198;5;315473
29.05.2017;11:16:23;GOLD-6.17;Продажа;1268,0;5;357225
29.05.2017;12:58:53;GOLD-6.17;Купля;1269,0;5;357506
29.05.2017;11:15:18;RTS-6.17;Продажа;107500,0;3;363422
29.05.2017;12:59:15;RTS-6.17;Купля;107480,0;3;363354
Формат можете откорректировать под себя. Такие строки затем очень легко вставляются в Excel или Google spreadsheets, которыми я пользуюсь, через импорт.

Идея скрипта простая. Мы парсим xml, проходимся по всем сделкам, суммируем мелкие сделки, создаем форматированные строки, затем все полученные строки записываем в файл. 

Файл с результатами создается в папке скрипта.
Файл отчета нужно переименовать в report.xml и положить в папку скрипта.

# Copyright SciFi, 2017
# -*- coding: utf-8 -*-

import xml.etree.ElementTree as ET
from datetime import datetime

# Создаем файл, в который будем писать, открываем его с правами на запись
f = open('result.txt', 'w')

# Считываем файл отчета report.xml и парсим его
tree = ET.parse('report.xml')
root = tree.getroot()
common_deal = root.find('common_deal')

prev_date = ''
prev_price = 0
total_quantity = 0

# Массив строк
lines = []

# Проходимся по всем сделкам и суммируем их, мелкие сделки затем удаляем, суммарные сделки сохраняем в массив lines
for child in common_deal:
    deal_date = child.get('deal_date')
    security_code = child.get('security_code')
    deal_symbol = child.get('deal_symbol')
    price = child.get('price')
    roundto = child.get('roundto')
    quantity = int(child.get('quantity'))
    price_rur = child.get('price_rur')

    # Сделка считается мелкой сделкой в составе крупной, если совпадают даты и код инструмента
    if deal_date == prev_date and security_code == prev_security_code :
        total_quantity = total_quantity + quantity

        # Удаление строки с мелкой сделкой из массива
        lines.pop()

    else :
        total_quantity = quantity

    # Форматирование данных для строки
    price_round = round(float(price), int(roundto))
    if deal_symbol == 'B': deal_symbol = 'Купля'
    else : deal_symbol = 'Продажа'
    volume = float(price_rur) * total_quantity
    volume_string = '%.f' % volume
    datetime_object = datetime.strptime(deal_date, '%Y-%m-%dT%H:%M:%S')
    date_string = datetime_object.strftime('%d.%m.%Y')
    time_string = datetime_object.strftime('%H:%M:%S')
    price_string = str(price_round)
    price_string = price_string.replace('.',',')
    quantity_string = str(total_quantity)

    # Формирование строки
    line = date_string + ';' \
              + time_string + ';' \
              + security_code + ';' \
              + deal_symbol + ';' \
              + price_string + ';' \
              + quantity_string + ';'\
              + volume_string \
              + '\n'

    # Добавление строки в массив
    print line
    lines.append(line)

    prev_date = deal_date
    prev_security_code = security_code

# Запись строк в файл
f.writelines(lines)


5 Комментариев
  • EZ
    03 июня 2017, 14:54
    Я похожую балалайку для отчётов Альфы написал на R.
  • Я не пью!
    03 июня 2017, 15:45
    Спасибо. Как раз собирался его написать, а тут такой подарок :)
  • Replikant_mih
    03 июня 2017, 16:27
    Да, всё-таки питончиком приятно автоматизировать какую-нить рутину, сам такое люблю)
  • Чёрный Трейдер
    03 июня 2017, 23:16
    О! Прям сначала подумал, что ошибся и зашёл не на Смартлаб, а на Хабрахабр. :)
  • day0markets.ru
    05 июня 2017, 14:32
    через BeatifullSoup, наверное, красивей бы было. 

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

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