Проблемы при интерпретации торговых записей местной биржи криптовалют #Foxbit

В этой статье предполагается, что вы понимаете основы торговли на биржах криптовалют. Поскольку пользователь совершает несколько сделок, покупая и продавая, биржа будет хранить записи. Как правило, эти записи предоставляются для загрузки и полезны для целей бухгалтерского учета или налогообложения.

Формат этих записей не стандартизирован. Поэтому решение о формате и его структуре принимает биржа. В следующих разделах вы будете следовать шагам, чтобы понять, как одна конкретная биржа организовала свою торговую историю с помощью файла CSV.

Наша цель - понять файловую структуру, а затем мы перейдем к синтаксическому анализу данных и созданию вывода JSON, который является более гибким форматом файла для манипуляций с помощью программного обеспечения.

Понимание файла CSV и его структурированного формата

Следующие разделы и сопутствующий пример относятся к Foxbit - бразильской криптовалютной бирже.

Я не спрашивал их, почему CSV, но могу предположить, что они это сделали, потому что а) CSV является текстовым и б) каждая строка может отображать несколько значений, разделенных запятой . Простота этого формата позволяет, например, любому пользователю импортировать его в популярные системы электронных таблиц. Foxbit опубликовал практическую статью, в которой объясняется, как импортировать CSV в электронную таблицу. Давайте отметим, как выглядит этот CSV-файл, если вы импортируете его в электронную таблицу:

Определение каждой сделки (описывается тройкой)

Ниже приводится небольшой фрагмент файла CSV, который вы найдете в разделе ссылок. Рассмотрим первые пять строк, которые относятся к строке заголовка, депозиту и одной сделке (выделены полужирным шрифтом), описанным тремя строками:

data,descricao,moeda,valor,taxa,saldo,dados
03/09/2020 16:41:28,Depósito,BRL,"5000,00000000","0,00000000","5006,46000000",BRASIL PLURAL
03/09/2020 16:44:26,Trade,BTC,"0,08673929","0,00000000","0,08706877","Preço do Ativo: R$ 57625,57"
03/09/2020 16:44:26,Trade,BRL,"-4998,40000000","0,00000000","8,06000000","Preço do Ativo: R$ 57625,57"
03/09/2020 16:44:26,Comissão no Trade,BTC,"0,00000000","-0,00043370","0,08663507",

Первая строка - это просто заголовок - она ​​пытается объяснить, о чем каждая строка. Данные - дата, descricao - описание, moeda - тип актива, valor - стоимость, таксоны - комиссия, saldo - баланс, а data - поле для дополнительных комментариев.

data,descricao,moeda,valor,taxa,saldo,dados

Удалив это, вы получите следующую строку, которая показывает депозит. В 16:41, что означает, что на бирже была зачислена сумма в 5000,00 BRL, общий баланс вырос до 5006,46 BRL. Таким образом, эти данные показывают, что в учетной записи пользователя уже было 6,46 реалов.

03/09/2020 16:41:28,Depósito,BRL,"5000,00000000","0,00000000","5006,46000000",BRASIL PLURAL

Следующие три строки объясняют сделку - одна обработана в 16:44. Слово «торговля» может сбивать с толку. Это больше похоже на побочную операцию, которая является частью сделки.

03/09/2020 16:44:26,Trade,BTC,"0,08673929","0,00000000","0,08706877","Preço do Ativo: R$ 57625,57"
03/09/2020 16:44:26,Trade,BRL,"-4998,40000000","0,00000000","8,06000000","Preço do Ativo: R$ 57625,57"
03/09/2020 16:44:26,Comissão no Trade,BTC,"0,00000000","-0,00043370","0,08663507",

Первая строка означает, что было куплено 0,08673929 BTC, а новый баланс стал 0,08706877 BTC. Следовательно, до этого события в этой учетной записи пользователя было (0,08706877–0,08673929) BTC. Обратите внимание, что пятый атрибут, атрибут платы, не используется. Да, сбивает с толку то, что он показывает значение «0,00000000». Вы можете игнорировать это. Я бы предпочел, чтобы в поле было что-то вроде «NA» вместо «0,00000000». Вы все равно увидите, что комиссия описана в третьей строке.

Вторая строка относится к оплате в бразильских реалах. Он говорит нам, что -4998,40 BRL было снято с учетной записи пользователя, в результате чего баланс составил 8,06 BRL. Этот пример может сбивать с толку (зачем оставлять там 8.06), но такое бывает. Я не сужу данные в этой статье.

В третьей строке указана фактическая комиссия в размере 0,0004337 BTC, примененная в данной транзакции. Эта комиссия была основана на общей сумме события покупки, равной 0,08706877 BTC из первой строки, в результате чего получился баланс 0,08663507 BTC.

Организация мероприятий

С точки зрения бухгалтерского учета, три значимых события произошли одновременно. Для более содержательного повествования изменим порядок:

  • СОБЫТИЕ A: со счета было снято 4998,00 BRL для покупки BTC, в результате чего на балансе осталось 8,06 BRL - 09.03.2020 16:44:26, Trade, BRL, «-4998,40000000», «0,00000000», «8,06000000», «Preço do Ativo: 57625,57 реалов»
  • СОБЫТИЕ B, 0,08673929 BTC было приобретено, в результате получилось 0,08706877 BTC - 09.03.2020 16:44: 26, Trade, BTC, '0,08673929', '0,00000000 ',' 0,08706877 ',' Preço do Ativo: 57625,57 бразильских реалов '
  • СОБЫТИЕ C: Взята комиссия в BTC, рассчитанная на основе полученной суммы (0,08673929 BTC), в результате чего 0,00043370 BTC будет вычтено из общего баланса 0,08706877 BTC, в результате чего на счету пользователя будет 0,08663507 BTC. - 09.03.2020 16:44:26, Comissão no Trade, BTC, ”0,00000000 ',” - 0,00043370', ”0,08663507 ',

Задачи для анализа каждой сделки (необязательно)

Вы можете отказаться здесь, но мне пришлось столкнуться с трудностями при анализе этих сделок, если вам интересно. Мое первоначальное предположение заключалось в том, что приказ был строгим с тремя строчками, описывающими сделку: Торговая операция, Торговая операция, Комиссионное вознаграждение. Я называю этот заказ заказом TTC.

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

Решение - буферизация строк до тех пор, пока не будет выполнен критерий

Возможное решение - читать строки, пока не появятся ожидаемые строки. После обнаружения двух торговых операций и одной комиссии, когда все условия созданы, пора подготовить данные о сделке.

К нашей цели

Наша цель - получить максимально информативный вывод о каждой сделке. При этом рассмотрим следующие основные дескрипторы:

  • «От» - представляет актив, который был отдан.
  • «К» - представляет актив, который был взят.
  • «Гонорар» - представляет собой комиссию, взимаемую после проведения операции.

Чтобы понять направление, покупать или продавать, я узнал, когда применяется торговая комиссия. Комиссия взимается после совершения операции. Поэтому, например, если вы покупаете BTC за BRL, комиссия взимается с BTC. Аналогичным образом, если вы продаете BTC, комиссия снимается с вашего баланса BRL.

Следовательно, информация о направлении может поступать из строки комиссии. В следующем примере строка комиссии указывает, что операция использовала BRL для покупки BTC:

  • 16:44: 26, Comissão no Trade, BTC, ”0,00000000 ',” - 0,00043370', ”0,08663507 ',

Следовательно, объект «от» может быть сформирован из торговой операции с инструментом BRL. И наоборот, объект «Кому» формируется из другой операции. Другими словами, порядок больше не имеет значения, как показывает код:

if(tradeCurrent.out.fee.instrument == tradeCurrent.in.csvLineTradeTmp1Instrument) {
tradeCurrent.out.from = parseInstrument(tradeCurrent.in.csvLineTradeTmp2);
tradeCurrent.out.to =  parseInstrument(tradeCurrent.in.csvLineTradeTmp1);
} else {
tradeCurrent.out.from = parseInstrument(tradeCurrent.in.csvLineTradeTmp1);
tradeCurrent.out.to =  parseInstrument(tradeCurrent.in.csvLineTradeTmp2);
}

Наш JSON

В целях подотчетности я решил сохранить необработанные данные внутри объекта JSON. Для каждой сделки наш выходной объект делится на две части. "И из". «In» содержит собранные строки из CSV. Объект «out» - это заполнитель для нашей структуры результата.

Вывод

Я надеюсь, что этот обзор может быть вам полезен, если вы заинтересованы в обработке файлов записей, связанных с сделками. Хотя это преобразование не является сложным проектом, моей целью было выявить идеи, которые помогут понять, как данные обычно структурируются и передаются на биржах. Теперь, взяв это отсюда, разработчики могут производить вычисления на основе данных, таких как средняя цена покупки; и двигаться к более сложным решениям.

использованная литература

Приложение 1 - Пример кода основного преобразователя

Пожалуйста, проверьте github.com/taboca/article-sample-code-parsing-svg-trades-record-foxbit-2020, чтобы увидеть полный исходный код, основанный на 4 различных входных тестовых файлах. Эти входные тестовые файлы были созданы на основе реальных проблем, которые я обнаружил.

Заключительные замечания

Эта статья была составлена ​​на основе учебных занятий и рабочего времени, когда я учился получать доступ к биржам с помощью их API. Я знаю, что это немного, это маленький шаг на пути к бухгалтерской работе. Это должно помочь с расчетом налогов. Моей целью было охватить проблемы и дать представление о том, как структурированы сделки. Я никоим образом не связан с Foxbit. Личное примечание: эта статья была создана на основе моих собственных встреч с идентификаторами: c09cc72e-71d4–4e33–8976–2d6ec1825242, 3799397b-b1b9–4a1c-9160-c0ff8196cb45, bf33a32c-322a-4000-bd4ca-8ca7e 0f60dd1b-a6e2–42e3–9fbb-97b90b0d2037.

Спасибо Caio Calderine за помощь в понимании файла CSV. Спасибо Фабрицио Зуарди за экспертную оценку.