Блог им. SciFi

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

    • 03 июня 2017, 14:48
    • |
    • SciFi
  • Еще
Я много времени тратил на заполнение торгового журнала. Главная трудность была в том, что при исполнении достаточно крупной заявки создается множество мелких сделок. Также каждый день на долларовых активах менялась стоимость пункта цены. Проще брать объемы сделок из отчета брокера, а не вычислять самому. 

Написал парсер отчета брокера «Отрытие» в формате 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)


★8
5 комментариев
Я похожую балалайку для отчётов Альфы написал на R.
avatar
Спасибо. Как раз собирался его написать, а тут такой подарок :)
avatar
Да, всё-таки питончиком приятно автоматизировать какую-нить рутину, сам такое люблю)
avatar
О! Прям сначала подумал, что ошибся и зашёл не на Смартлаб, а на Хабрахабр. :)
через BeatifullSoup, наверное, красивей бы было. 
avatar

теги блога SciFi

....все тэги



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