Hi Martin,

Thanks so much for the very thorough responses. I'm glad (?) I could help
you find some issues to fix. I'll sit down and digest your solutions in
more depth this evening and follow the tickets in case I need them. I'm
sure I'll be able to get things moving with the information you've provided.

(I was vaguely aware of plaintext accounting but I only properly discovered
it this weekend and I'm excited by the possibilities. I'm a Python dev so
hopefully once I've got my head around the conceptual stuff I hope I'll be
able to contribute back in some way).

Thanks again for you time!

Dave

On Tue, 13 Jun 2017 at 13:26 Martin Blais <bl...@furius.ca> wrote:

> One more thing: If you disambiguate the cost currency in your reducing
> transaction, the FIFO method is working fine:
>
>
> 2013-11-27 open Assets:AU:Coinjar:BTC  BTC "FIFO"
> ...
> 2014-01-05 * "Deposit Cold storage"
>   Assets:AU:ColdStorage:BTC                     1.0 BTC {}
>   Assets:AU:Coinjar:BTC                        -1.0 BTC {AUD}
>
>
> Or if you don't care about the cost basis in ColdStorage (you lose it):
>
> 2013-11-27 open Assets:AU:Coinjar:BTC  BTC "FIFO"
> ...
> 2014-01-05 * "Deposit Cold storage"
>   Assets:AU:ColdStorage:BTC                     1.0 BTC @
>   Assets:AU:Coinjar:BTC                        -1.0 BTC {AUD}
>
> This also works:
>
> 2014-01-05 * "Deposit Cold storage"
>   Assets:AU:ColdStorage:BTC                     1.0 BTC @ AUD
>   Assets:AU:Coinjar:BTC                        -1.0 BTC {}
>
>
> Both of these do what you'd expect them to, that is, it gets translated to
> this transaction:
>
> Hash:c33deeb52a4546640770ddbe49eeb805
> Location: /home/blais/r/q/beancount-data/user/smile/smile1.beancount:25
>
> ------------ Balances before transaction
>
>   Assets:AU:ColdStorage:BTC
>
>   Assets:AU:Coinjar:BTC      0.14161 BTC {1059.247228303085940258456324
> AUD, 2013-11-27}
>   Assets:AU:Coinjar:BTC      0.118776 BTC {1262.881390179834309961608406
> AUD, 2013-11-29}
>   Assets:AU:Coinjar:BTC      0.149156 BTC {1005.658505189197886776261096
> AUD, 2013-12-10}
>   Assets:AU:Coinjar:BTC      0.673358 BTC {742.5470552068884605217432629
> AUD, 2013-12-17}
>   Assets:AU:Coinjar:BTC      0.230398 BTC {651.0473181190808947994340229
> AUD, 2013-12-19}
>
>
> ------------ Transaction
>
> 2014-01-05 * "Deposit Cold storage"
>   Assets:AU:ColdStorage:BTC   1.000000 BTC @ 888.4428491233489466227474835
> AUD  ;  888.4428491233489466227474835 AUD
>   Assets:AU:Coinjar:BTC      -0.141610 BTC {1059.25 AUD, 2013-11-27}
>      ; -150.0000000000000000000000000 AUD
>   Assets:AU:Coinjar:BTC      -0.118776 BTC {1262.88 AUD, 2013-11-29}
>      ; -150.0000000000000000000000000 AUD
>   Assets:AU:Coinjar:BTC      -0.149156 BTC {1005.66 AUD, 2013-12-10}
>      ; -150.0000000000000000000000000 AUD
>   Assets:AU:Coinjar:BTC      -0.590458 BTC {742.55 AUD, 2013-12-17}
>       ; -438.4428491233489466227474835 AUD
>
>
> Tolerances: BTC=0.000005
> Basis: (-888.4428491233489466227474835 AUD)
>
> ------------ Balances after transaction
>
> * Assets:AU:ColdStorage:BTC                                            1.0
> BTC
>
> * Assets:AU:Coinjar:BTC      0.082900 BTC {742.5470552068884605217432629
> AUD, 2013-12-17}
>   Assets:AU:Coinjar:BTC      0.230398 BTC {651.0473181190808947994340229
> AUD, 2013-12-19}
>
>
>
> And the following one succeeds just fine.
>
> I think this is the best solution of all ofthose, just
> - make sure you use cost basis consistently
> - clearly indicate the cost currency when you're using automatic matching
> / inference
>
> I'll fix the tickets anyhow, but if you do this, nothing should change.
>
>
>
>
>
> On Mon, Jun 12, 2017 at 11:17 PM, Martin Blais <bl...@furius.ca> wrote:
>
>> (Apologies for the long response, you've triggered an interesting corner
>> case which may require a fix.)
>>
>> The error you made here (deducting 1.0 BTC from the account with existing
>> positions without specifying the cost basis) brings up an interesting
>> corner case.
>>
>>
>> The following is sufficient to trigger the error:
>>
>>
>> 2013-11-27 open Assets:AU:Coinjar:BTC  BTC
>> 2013-11-27 open Assets:AU:Coinjar:Cash AUD
>> 2013-11-27 open Assets:AU:ColdStorage:BTC BTC
>>
>> 2014-01-05 * "Deposit Cold storage"
>>   Assets:AU:ColdStorage:BTC                     1.0 BTC
>>   Assets:AU:Coinjar:BTC                        -1.0 BTC
>>
>> 2014-01-28 * "Buy BTC"
>>   Assets:AU:Coinjar:BTC                         0.162288 BTC
>> {924.2827565808932268559597752 AUD}
>>   Assets:AU:Coinjar:Cash                     -150.00 AUD
>>
>>
>> What's happening is that after the first transaction the Coinjar:BTC
>> account contains a negative number of units of BTC:
>>
>> bean-doctor context smile1.beancount 6
>> Hash:f7a2fba6639dd0ec5d52abce3788f32d
>> Location: /home/blais/r/q/beancount-data/user/smile/smile1.beancount:5
>>
>> ------------ Balances before transaction
>>
>>   Assets:AU:ColdStorage:BTC
>>
>>   Assets:AU:Coinjar:BTC
>>
>>
>> ------------ Transaction
>>
>> 2014-01-05 * "Deposit Cold storage"
>>   Assets:AU:ColdStorage:BTC   1.0 BTC
>>   Assets:AU:Coinjar:BTC      -1.0 BTC
>>
>>
>> Tolerances: BTC=0.05
>>
>> ------------ Balances after transaction
>>
>> * Assets:AU:ColdStorage:BTC
>>  1.0 BTC
>>
>> * Assets:AU:Coinjar:BTC
>> -1.0 BTC
>>
>>
>> "Adding" BTC to this negative inventory essentially means a "reduction"
>> of the negative number of BTC (you're reducing the short position).
>> Since the second transaction is providing a cost basis and it has only a
>> single lot with no cost basis, it cannot find a lot that matches, so you
>> get an error.
>> This is WAI.
>> (But it does beg the question regarding whether lots without a cost basis
>> should be treated distinctly; so far I'm not convinced that they should, I
>> don't have a great use case for that, so they're not.)
>>
>>
>>
>> If I leave all the previous transactions, one gets into a slightly
>> different case:
>>
>> bean-doctor context smile1.beancount 27
>> Hash:f7a2fba6639dd0ec5d52abce3788f32d
>> Location: /home/blais/r/q/beancount-data/user/smile/smile1.beancount:26
>>
>> ------------ Balances before transaction
>>
>>   Assets:AU:ColdStorage:BTC
>>
>>   Assets:AU:Coinjar:BTC      0.14161 BTC {1059.247228303085940258456324
>> AUD, 2013-11-27}
>>   Assets:AU:Coinjar:BTC      0.118776 BTC {1262.881390179834309961608406
>> AUD, 2013-11-29}
>>   Assets:AU:Coinjar:BTC      0.149156 BTC {1005.658505189197886776261096
>> AUD, 2013-12-10}
>>   Assets:AU:Coinjar:BTC      0.673358 BTC {742.5470552068884605217432629
>> AUD, 2013-12-17}
>>   Assets:AU:Coinjar:BTC      0.230398 BTC {651.0473181190808947994340229
>> AUD, 2013-12-19}
>>
>>
>> ------------ Transaction
>>
>> 2014-01-05 * "Deposit Cold storage"
>>   Assets:AU:ColdStorage:BTC   1.000000 BTC
>>   Assets:AU:Coinjar:BTC      -1.000000 BTC
>>
>>
>> Tolerances: BTC=0.05
>>
>> ------------ Balances after transaction
>>
>> * Assets:AU:ColdStorage:BTC
>>  1.0 BTC
>>
>>   Assets:AU:Coinjar:BTC      0.14161 BTC {1059.247228303085940258456324
>> AUD, 2013-11-27}
>>   Assets:AU:Coinjar:BTC      0.118776 BTC {1262.881390179834309961608406
>> AUD, 2013-11-29}
>>   Assets:AU:Coinjar:BTC      0.149156 BTC {1005.658505189197886776261096
>> AUD, 2013-12-10}
>>   Assets:AU:Coinjar:BTC      0.673358 BTC {742.5470552068884605217432629
>> AUD, 2013-12-17}
>>   Assets:AU:Coinjar:BTC      0.230398 BTC {651.0473181190808947994340229
>> AUD, 2013-12-19}
>> * Assets:AU:Coinjar:BTC
>> -1.0 BTC
>>
>>
>> Here, in theory (excluding the last transaction), there are enough BTC to
>> cover the -1.0 reduction and keep the balance positive:
>>
>> bean-query smile1.beancount "select account, sum(units(position)) group
>> by 1"
>>          account          sum_units_positi
>> ------------------------- ----------------
>> Assets:AU:Coinjar:BTC         0.313298 BTC
>> Assets:AU:Coinjar:Cash    -1100.00     AUD
>> Assets:AU:ColdStorage:BTC     1.0      BTC
>>
>>
>> The real problem is that the transaction removing -1.0 BTC from the
>> Coinjar:BTC should have failed and raised an error message. It's a bug that
>> it did not (I'll have to address that; I'm quite surprised this wasn't
>> covered by my unit tests - thanks for bringing up that question).
>>
>> Ticket:
>>
>> https://bitbucket.org/blais/beancount/issues/167/reductions-without-a-cost-basis-should
>>
>> Now, with the default booking method (STRICT) If you reduce an existing
>> position, you should have to provide the cost basis you want to book
>> against. Given the frequency with which those transactions appear to occur,
>> explicitly selecting each of the lots to reduce in order to move your 1.0
>> BTC to cold storage would be a pain in the butt. I think you'll want
>> something easier.
>>
>> Normally, you can set that account's booking algorithm to something else,
>> e.g. "FIFO", which would select the lots for you:
>>
>> 2013-11-27 open Assets:AU:Coinjar:BTC  BTC  "FIFO"
>> ...
>> 2014-01-05 * "Deposit Cold storage"
>>   Assets:AU:ColdStorage:BTC                     1.0 BTC
>>   Assets:AU:Coinjar:BTC                        -1.0 BTC {}
>>
>>
>> But this appears to trigger another bug!
>> Congratulations, you've found two at once (finding one is reasonably rare
>> these days).
>>
>> Tickets:
>>
>> https://bitbucket.org/blais/beancount/issues/168/fifo-without-a-cost-currency-appears-to
>>
>>
>> I'm going to fix those, but in any case, you shouldn't be able to reduce
>> an inventory with lots with -1.0 BTC.
>> Either you'll have to select the lots explicltly, or let one of the
>> automatic booking methods do it for you.
>> In any case, you should probably never mix operations at cost (with
>> {...}) with those not at cost (without {...}) on a single account.
>>
>> In the meantime, you can disable the booking algorithm by setting the
>> method to "NONE":
>>
>> 2013-11-27 open Assets:AU:Coinjar:BTC  BTC  "NONE"
>> ...
>> 2014-01-05 * "Deposit Cold storage"
>>   Assets:AU:ColdStorage:BTC                     1.0 BTC
>>   Assets:AU:Coinjar:BTC                        -1.0 BTC
>>
>> This effectively replicates the Ledger model. The resulting inventory
>> will have all the transactions in it, and you can sum up the resulting
>> number of UNITS() or COST() and these numbers will be correct. However, the
>> detailed contents of the inventory will appear messy. But it works.
>>
>> I think the way forward is for me to fix the two bugs and for you to use
>> the FIFO method thereafter.
>>
>> Or... it's also possible that you're not attempting to track cost basis.
>> If that's the case you can just use price conversions (with @ ...).
>> If you used price conversions, there are no lots (well, just a single lot
>> with no cost basis).
>>
>> I hope this helps,
>>
>>
>>
>>
>>
>> On Mon, Jun 12, 2017 at 12:48 AM, <sm...@davethehappysinger.com> wrote:
>>
>>> Hi there,
>>>
>>> I'm new to beancount and I'm trying to use it to bring sanity to some
>>> old Bitcoin transactions.
>>>
>>> I start off making the odd purchase of BTC in Australian dollars using
>>> the Coinjar service with one beancount account for BTC and one for AUD.
>>>
>>> However, once I move 1.0 BTC out of my Coinjar BTC account into a paper
>>> wallet, subsequent purchases throw an error in bean-check:
>>>
>>> No position matches "Posting(account='Assets:AU:Coinjar:BTC',
>>> units=0.162288 BTC,
>>> cost=CostSpec(number_per=Decimal('924.2827565808932268559597752'),
>>> number_total=None, currency='AUD', date=None, label=None, merge=False),
>>> price=None, flag=None, meta={'lineno': 24, 'filename':
>>> '/home/dave/fin/accounts/bitcoin-test.beancount'})" against balance (-1.0
>>> BTC, 0.230398 BTC {651.0473181190808947994340229 AUD, 2013-12-19}, 0.673358
>>> BTC {742.5470552068884605217432629 AUD, 2013-12-17}, 0.149156 BTC
>>> {1005.658505189197886776261096 AUD, 2013-12-10}, 0.14161 BTC
>>> {1059.247228303085940258456324 AUD, 2013-11-27}, 0.118776 BTC
>>> {1262.881390179834309961608406 AUD, 2013-11-29})
>>>
>>> But of course no existing position matches; this is a new lot I'm
>>> purchasing. Here's a simple sample file to reproduce. Could someone perhaps
>>> clarify where I've gone wrong? Thanks for your time; I've read the
>>> documentation on booking trades several times but I'm afraid I can't make
>>> sense of this error.
>>>
>>>
>>> 2013-11-27 open Assets:AU:Coinjar:BTC  BTC
>>> 2013-11-27 open Assets:AU:Coinjar:Cash AUD
>>> 2013-11-27 open Assets:AU:ColdStorage:BTC BTC
>>>
>>>
>>> 2013-11-27 * "Buy BTC"
>>>   Assets:AU:Coinjar:BTC                         0.14161 BTC
>>> {1059.247228303085940258456324 AUD}
>>>   Assets:AU:Coinjar:Cash                     -150.00 AUD
>>> 2013-11-29 * "Buy BTC"
>>>   Assets:AU:Coinjar:BTC                         0.118776 BTC
>>> {1262.881390179834309961608406 AUD}
>>>   Assets:AU:Coinjar:Cash                     -150.00 AUD
>>> 2013-12-10 * "Buy BTC"
>>>   Assets:AU:Coinjar:BTC                         0.149156 BTC
>>> {1005.658505189197886776261096 AUD}
>>>   Assets:AU:Coinjar:Cash                     -150.00 AUD
>>> 2013-12-17 * "Buy BTC"
>>>   Assets:AU:Coinjar:BTC                         0.673358 BTC
>>> {742.5470552068884605217432629 AUD}
>>>   Assets:AU:Coinjar:Cash                     -500.00 AUD
>>> 2013-12-19 * "Buy BTC"
>>>   Assets:AU:Coinjar:BTC                         0.230398 BTC
>>> {651.0473181190808947994340229 AUD}
>>>   Assets:AU:Coinjar:Cash                     -150.00 AUD
>>> 2014-01-05 * "Deposit Cold storage"
>>>   Assets:AU:ColdStorage:BTC                     1.0 BTC
>>>   Assets:AU:Coinjar:BTC                        -1.0 BTC
>>> ; The following tx now throws an error though it is syntactically
>>> identical to the
>>> ; purchases above. Why?
>>> 2014-01-28 * "Buy BTC"
>>>   Assets:AU:Coinjar:BTC                         0.162288 BTC
>>> {924.2827565808932268559597752 AUD}
>>>   Assets:AU:Coinjar:Cash                     -150.00 AUD
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Beancount" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to beancount+unsubscr...@googlegroups.com.
>>> To post to this group, send email to beancount@googlegroups.com.
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/beancount/2beb84b0-8f10-4c40-b6d5-abfa2b77cda5%40googlegroups.com
>>> <https://groups.google.com/d/msgid/beancount/2beb84b0-8f10-4c40-b6d5-abfa2b77cda5%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>
> --
> You received this message because you are subscribed to a topic in the
> Google Groups "Beancount" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/beancount/Qvbcq-Sk5NY/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> beancount+unsubscr...@googlegroups.com.
> To post to this group, send email to beancount@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/beancount/CAK21%2BhOkq9PG746Ru2X-VQaZ9BRRTDgm%2B5Z0h2Z2UvLH_nbGbQ%40mail.gmail.com
> <https://groups.google.com/d/msgid/beancount/CAK21%2BhOkq9PG746Ru2X-VQaZ9BRRTDgm%2B5Z0h2Z2UvLH_nbGbQ%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Beancount" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to beancount+unsubscr...@googlegroups.com.
To post to this group, send email to beancount@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/beancount/CAHkYY6X5h%2Bo-sVad2QirragiTG_wJEMnbyYDYZ_TbvhPg6n1ug%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to