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=Decim >> al('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/ms >> gid/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 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/CAK21%2BhOkq9PG746Ru2X-VQaZ9BRRTDgm%2B5Z0h2Z2UvLH_nbGbQ%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.