Учебник по двойной записи
Двойная бухгалтерия — это сложно. Особенно, когда вы используете несколько валют. Мы сделаем это легко.
Представьте, что вы добыли немного биткойнов, получили вознаграждение и хотите его обменять. Вы решили, что BTC мертв, а XRP летит на Луну, поэтому вы нашли приятную маленькую арбитражную возможность, торгуя несколькими символами, и, ей-богу, вы собираетесь воспользоваться этими проклятыми «эффективными» рынками. .
Для целей этой иллюстрации мы просто предположим, что ваши добытые средства имеют нулевую стоимость и не имеют налогового бремени. Но власти захотят увидеть свою долю, как только вы ее обменяете!
Мы также собираемся перевести средства с нашей биржи в наш холодный кошелек, потому что мы не кучка лохов, которые доверяют биржам, чтобы не потерять свои деньги.
Пример сделок
{ EXCHANGE }{ WALLET }
BTC => ETH => BAT => XRP => XRP
own buy buy buy buy
Довольно просто начать, не так ли? Все, что нам нужно сделать, это записать несколько покупок для каждой транзакции. Мы собираемся перевести BTC в ETH, затем в BAT, затем в XRP-обмен на XRP-кошелек.
Первоначальные заказы
{ id: "A", fromSymbol: "BTC", toSymbol: "ETH", long: true, ... }, { id: "B", fromSymbol: "ETH", toSymbol: "BAT", long: true, ... }, { id: "C", fromSymbol: "BAT", toSymbol: "XRP", long: true, ... }, { id: "D", fromSymbol: "XRP", toSymbol: "XRP", long: true, ... }
{ EXCHANGE }{ WALLET } BTC => ETH => BAT => XRP => XRP own buy buy buy buy A B C D
Но это только первая половина нашей работы. Для каждой покупки также должна быть соответствующая продажа. Мы записали только наши покупки на каждой базовой учетной записи; нам также необходимо зарегистрировать продажу на каждом котируемом счете.
Реальность торговли
{ EXCHANGE }{ WALLET }
BTC => ETH => BAT => XRP => XRP
own sell buy sell buy sell buy sell buy
Закрытие заказов
{ id: "W", fromSymbol: "ETH", toSymbol: "BTC", long: false, ... }, { id: "X", fromSymbol: "BAT", toSymbol: "ETH", long: false, ... }, { id: "Y", fromSymbol: "XRP", toSymbol: "BAT", long: false, ... }, { id: "Z", fromSymbol: "XRP", toSymbol: "XRP", long: false, ... }
{ EXCHANGE }{ WALLET } BTC => ETH => BAT => XRP => XRP own sell buy sell buy sell buy sell buy W A X B Y C Z D
Теперь, когда мы создали обе стороны каждой транзакции в нашей книге, нам нужно соединить их друг с другом. Мы собираемся создать много! Многое — это просто lotId и childId. Вот и все! Его единственная цель — подключение транзакций.
Соединение лотов
{ lotId: "W", childId: "A" },
{ lotId: "X", childId: "B" },
{ lotId: "Y", childId: "C" },
{ lotId: "Z", childId: "D" }
Но подождите, мы не подключили все транзакции! Наша цепочка неполная.
Незавершенная цепочка аудита
{ EXCHANGE }{ WALLET }
BTC => ETH => BAT => XRP => XRP
own---sell--buy sell--buy sell--buy sell--buy
W A X B Y C Z D
Посмотрите на эти пробелы! Также нам нужно подключать транзакции после того, как мы заходим в монету и до того, как выходим. Это позволит нам отслеживать наши затраты и налогооблагаемую прибыль вплоть до нашей первой транзакции.
Много работы!
{ lotId: "W", childId: "A" }, { lotId: "A", childId: "X" }, { lotId: "X", childId: "B" }, { lotId: "B", childId: "Y" }, { lotId: "Y", childId: "C" }, { lotId: "C", childId: "Z" }, { lotId: "Z", childId: "D" }
{ EXCHANGE }{ WALLET } BTC => ETH => BAT => XRP => XRP own---sell--buy---sell--buy---sell--buy---sell--buy W A X B Y C Z D
Довольно круто, верно? Но что, если у нас есть частичное исполнение по некоторым сделкам? Как правило, вы можете просто использовать агрегированные суммы из исходного заказа, но мы работаем в условиях высокого риска и строгого соблюдения требований. Записывайте все!
Давайте представим, что наша сделка ETH/BAT на самом деле состояла из трех частичных исполнений.
{ EXCHANGE }{ WALLET }
BTC => ETH => BAT => XRP => XRP
BAT
BAT
own---sell--buy---sell--buy---sell--buy---sell--buy
W A X BA Y C Z D
BB
BC
Думаете, вы знаете, как связать покупки BAT с соответствующими продажами?
Много движущихся частей
{ id: "W", fromSymbol: "ETH", toSymbol: "BTC", long: false, ... }, { id: "A", fromSymbol: "BTC", toSymbol: "ETH", long: true, ... }, { id: "X", fromSymbol: "BAT", toSymbol: "ETH", long: false, ... }, { id: "BA", fromSymbol: "ETH", toSymbol: "BAT", long: true, ... }, { id: "BB", fromSymbol: "ETH", toSymbol: "BAT", long: true, ... }, { id: "BC", fromSymbol: "ETH", toSymbol: "BAT", long: true, ... }, { id: "Y", fromSymbol: "XRP", toSymbol: "BAT", long: false, ... }, { id: "C", fromSymbol: "BAT", toSymbol: "XRP", long: true, ... }, { id: "Z", fromSymbol: "XRP", toSymbol: "XRP", long: false, ... }, { id: "D", fromSymbol: "XRP", toSymbol: "XRP", long: true, ... }
{ lotId: "W", childId: "A" }, { lotId: "A", childId: "X" }, { lotId: "X", childId: "BA" }, { lotId: "X", childId: "BB" }, { lotId: "X", childId: "BC" }, { lotId: "BA", childId: "Y" }, { lotId: "BB", childId: "Y" }, { lotId: "BC", childId: "Y" }, { lotId: "Y", childId: "C" }, { lotId: "C", childId: "Z" }, { lotId: "Z", childId: "D" }
{ EXCHANGE }{ WALLET } BTC => ETH => BAT => XRP => XRP BAT BAT own---sell--buy---sell--buy---sell--buy---sell--buy W-----A-----X-----BA----Y-----C-----Z-----D |-----BB----| \----BC---/
Хорошо, а теперь самое сложное. Давайте представим, что у нас уже есть некоторые НДТ, которые мы купили на пике рынка, и мы хотим продать эти НДТ вместо только что купленных, чтобы мы могли потребовать убыток по нашим налогам.
Назовем первоначальную покупку BAT из пиковой транзакции P.
В США это разрешено правилом под названием «конкретная идентификация». Мы можем определить монеты, которые хотим продать, если примем решение в течение двух недель после размещения сделки. В противном случае мы должны придерживаться принципа «первым пришел — первым вышел» или «последний пришел — первым вышел». Мы не можем выбирать!
{ EXCHANGE }{ WALLET }
BTC => ETH => BAT => XRP => XRP
BAT
BAT
own---sell--buy---sell--buy---sell--buy---sell--buy
W-----A-----X-----BA Y-----C-----Z-----D
|-----BB
|-----BC
...>---------------------P
Итак, мы решили, что предпочтем заявить о наших убытках по транзакции P. Мы удалили наши идентификаторы лотов для лотов, связывающих B-покупки с Y-продажами. Итак, теперь мы можем искать наши потерянные участки без идентификатора лота, и мы можем связать те, которые мы найдем, с P.
Тяжелая жизнь
{ lotId: "W", childId: "A" }, { lotId: "A", childId: "X" }, { lotId: "X", childId: "BA" }, { lotId: "X", childId: "BB" }, { lotId: "X", childId: "BC" }, { lotId: "BA", childId: "Y" } -> { lotId: "P", childId: "Y" }, { lotId: "BB", childId: "Y" } -> { lotId: "BC", childId: "Y" } -> { lotId: "BC", childId: "Y" }, { lotId: "Y", childId: "C" }, { lotId: "C", childId: "Z" }, { lotId: "Z", childId: "D" }
{ EXCHANGE }{ WALLET } BTC => ETH => BAT => XRP => XRP BAT BAT own---sell--buy---sell--buy---sell--buy---sell--buy W-----A-----X----BA Y-----C-----Z-----D |----BB | \---BC-----| ...>--------------------P-----/
ВОЗ. Что там с БК? Что ж, похоже, у нас не осталось достаточно средств в P, чтобы покрыть все три сделки. Поэтому мы просто повторно подключили Y к BC, чтобы покрыть остальные средства. Итак, теперь и BC, и P являются родителями Y.
Мы проверим, что все учетные записи обнулены, прежде чем сохранить их в базе данных. Этого можно добиться, вытащив всю цепочку лотов и их дочерних элементов, а затем сложив вместе длинные суммы toSymbol и короткие суммы toSymbol.
Для каждой цепочки транзакций, где эта сумма не равна нулю, запишите оставшуюся сумму и символ. Затем проверьте текущий баланс на всех ваших адресах. Оставшееся значение должно равняться всем вашим балансам!
И это в значительной степени покрывает все крайние случаи. Думаете, вы готовы сами создать свою собственную бухгалтерскую книгу с двойной записью?