Я много времени тратил на заполнение торгового журнала. Главная трудность была в том, что при исполнении достаточно крупной заявки создается множество мелких сделок. Также каждый день на долларовых активах менялась стоимость пункта цены. Проще брать объемы сделок из отчета брокера, а не вычислять самому.
Написал парсер отчета брокера «Отрытие» в формате 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)