<html aria-label="message body"><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body style="overflow-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;"><div>I suppose your October 2008 claim comes from <a href="https://github.com/Gnucash/gnucash/commit/425ec8eb68254948cb03b2c152ebab05b20acb0e">https://github.com/Gnucash/gnucash/commit/425ec8eb68254948cb03b2c152ebab05b20acb0e</a> that negates shares and value if they’re reversed in the pair because the commodity isn’t the transaction currency. </div><div><br></div><div>That remained essentially unchanged until <a href="https://github.com/Gnucash/gnucash/commit/ce675eaac6b52e85cd9fe8602002f7b9d55e63ba">https://github.com/Gnucash/gnucash/commit/ce675eaac6b52e85cd9fe8602002f7b9d55e63ba</a>  on 3 May 2019 substantially reordered the function and introduced the clause that you propose to change. That would be “the culprit” I asked you for yesterday morning. That commit is titled “Refactor” but it would be more correct to call it “Complicate”. It turns two conditional branches—split commodity is or isn’t the transaction currency—into 5. I agree with you that the amounts in the last case should be negated: The commodity isn’t the transaction currency. What I’m less sure about is that it needs to be a separate case at all—or rather that the `(assoc acc-comm sublist)` test needs to exist. Changing that to a plain `else` and deleting the current `else` clause should accomplish the same thing and removes the logic change buried in what’s claimed to be a refactor.</div><div><br></div><div>Regards,</div><div>John Ralls</div><div><br></div><div><br></div><br id="lineBreakAtBeginningOfMessage"><div><br><blockquote type="cite"><div>On Aug 24, 2025, at 13:20, Sherlock Holmes <sh025622@gmail.com> wrote:</div><br class="Apple-interchange-newline"><div>

  
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  
  <div><p>John,</p><p>Yes.  I have.  And I do think I understand both algorithms and
      their evolution.</p><p>Again, assuming the sign swap was necessary for "average cost",
      when the sign swap was first effectuated 17 years ago, it does not
      appear to have been applied on the first entry.   This code has
      been rewritten multiple times since then and the issue appears to
      have been replicated time after time.  I know it seems unlikely
      but have a look at the code.  What am I missing?</p><p>Regards,</p><p>Sherlock</p><p><br>
    </p>
    <div class="moz-cite-prefix">On 8/24/25 12:43 PM, John Ralls wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:BEAFCD0F-6F95-4646-9463-826513254C3B@ceridwen.us">
      <meta http-equiv="content-type" content="text/html; charset=UTF-8">
      Sherlock,
      <div><br>
      </div>
      <div>Seems unlikely. Have you read through <a href="https://bugs.gnucash.org/show_bug.cgi?id=797796" moz-do-not-send="true" class="moz-txt-link-freetext">https://bugs.gnucash.org/show_bug.cgi?id=797796</a>, <a href="https://bugs.gnucash.org/show_bug.cgi?id=775368" moz-do-not-send="true" class="moz-txt-link-freetext">https://bugs.gnucash.org/show_bug.cgi?id=775368</a>,
        and <a href="https://bugs.gnucash.org/show_bug.cgi?id=775368" moz-do-not-send="true" class="moz-txt-link-freetext">https://bugs.gnucash.org/show_bug.cgi?id=775368</a> (the
        latter two are referenced in <a href="https://bugs.gnucash.org/show_bug.cgi?id=797796#c8" moz-do-not-send="true" class="moz-txt-link-freetext">https://bugs.gnucash.org/show_bug.cgi?id=797796#c8</a>)
        so that you thoroughly understand the problem and the design of
        the algorithm?</div>
      <div><br>
      </div>
      <div>Regards,</div>
      <div>John Ralls</div>
      <div><br>
      </div>
      <div>
        <div><br>
          <blockquote type="cite">
            <div>On Aug 24, 2025, at 12:13, Sherlock Holmes
              <a class="moz-txt-link-rfc2396E" href="mailto:sh025622@gmail.com"><sh025622@gmail.com></a> wrote:</div>
            <br class="Apple-interchange-newline">
            <div>
              <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
              <div><p>John,</p><p>Here's where I'm at:  I suspect the initial "account"
                  commodity list entry in the "average cost" algorithm
                  has been a bit off since Oct 16, 2008.  It appears the
                  share and value signs are supposed to be swapped on
                  assignment to the "account" commodity list, but are
                  not when the list is first created.  See the attached
                  patch file.</p><p>Thoughts?</p><p>Regards,</p><p>Sherlock</p><p><br>
                </p>
                <div class="moz-cite-prefix">On 8/24/25 10:21 AM,
                  Sherlock Holmes wrote:<br>
                </div>
                <blockquote type="cite" cite="mid:3a69f004-d010-4be8-9947-f36529fbec16@gmail.com">
                  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><p>John,</p><p>I'm still working it.  It appears to me that both
                    algorithms may have gone a bit awry sometime ago
                    although the "average price" may be okay. 
                    Specifically, the initial comm-list entry became an
                    else case which meant it needed to perform the
                    assignments and, in the "average cost", the sign
                    handling doesn't </p><p>My WAG was just that.  Just a quick check to see if
                    I was in the right area. </p><p><br>
                  </p><p>Regards,</p><p>Sherlock </p>
                  <div> <br class="webkit-block-placeholder">
                  </div>
                  <div class="moz-cite-prefix">On 8/24/25 9:16 AM, John
                    Ralls wrote:<br>
                  </div>
                  <blockquote type="cite" cite="mid:F631D996-F789-4651-AC34-A2CFB83EEF7A@ceridwen.us">
                    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
                    <div> Sherlock,</div>
                    <div><br>
                    </div>
                    What’s this part for? It seems irrelevant to Chang
                    Wang’s example as that doesn’t use trading accounts:
                    <div>
                      <div>-</div>
                      <div>-       ;; However skip splits in trading
                        accounts as these counterbalance</div>
                      <div>-       ;; the actual value and share amounts
                        back to zero</div>
                      <div>-       ((eqv? (xaccAccountGetType
                        (xaccSplitGetAccount (car comm-splits)))</div>
                      <div>-              ACCT-TYPE-TRADING)</div>
                      <div>-        (loop (cdr comm-splits)</div>
                      <div>-              sumlist))</div>
                      <div> </div>
                      <div>I guess you did a bisect to arrive at the
                        2019 change date. There were 8 changes to
                        gnc-commodity-utils.scm that day. Which one was
                        the culprit?</div>
                      <div><br>
                      </div>
                      <div>Regards,</div>
                      <div>John Ralls</div>
                      <div><br>
                      </div>
                      <div><br>
                        <blockquote type="cite">
                          <div>On Aug 23, 2025, at 20:18, Sherlock
                            Holmes <a class="moz-txt-link-rfc2396E" href="mailto:sh025622@gmail.com" moz-do-not-send="true"><sh025622@gmail.com></a>
                            wrote:</div>
                          <br class="Apple-interchange-newline">
                          <div>
                            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
                            <div><p>I concur.</p><p>There are significant differences in
                                the implementation between
                                gnc:get-exchange-totals and
                                gnc:get-exchange-cost-totals that I
                                believe are the root cause of the
                                issue.  These differences appear to date
                                back to May 3, 2019.    As a WAG, I
                                modified gnc:get-exchange-cost-totals to
                                match gnc:get-exchange-totals in the
                                attached patch and the issue you've
                                raised appears to be resolved.  I have
                                not done any further testing,</p><p>Regards,</p><p>Sherlock</p><p><br>
                              </p>
                              <div class="moz-cite-prefix">On 8/23/25
                                2:20 PM, Chang Wang wrote:<br>
                              </div>
                              <blockquote type="cite" cite="mid:CAGyuYwAVUyknUp=af6_31Ga8+qPh5g7xjREV+NK6iy5tmn_wYw@mail.gmail.com">
                                <meta http-equiv="content-type" content="text/html; charset=UTF-8">
                                <div dir="ltr">
                                  <div>Thanks for the reminder. I'll
                                    post to the user list in the future.</div>
                                  <div>However, in the above example,
                                    there is no gain or loss due to
                                    currency exchange as the exchange
                                    rates are set to 1 so no currency
                                    gain/loss needs to be booked. And
                                    the price source is set to be Last
                                    up through report date instead of
                                    average cost. Therefore, I think
                                    these are different issues.</div>
                                </div>
                                <br>
                                <div class="gmail_quote gmail_quote_container">
                                  <div dir="ltr" class="gmail_attr">On
                                    Sat, Aug 23, 2025 at 3:51 PM John
                                    Ralls <<a href="mailto:jralls@ceridwen.us" moz-do-not-send="true" class="moz-txt-link-freetext">jralls@ceridwen.us</a>>
                                    wrote:<br>
                                  </div>
                                  <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Oddly
                                    I just told somebody on IRC the same
                                    answer: <a href="https://bugs.gnucash.org/show_bug.cgi?id=797796" rel="noreferrer" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">https://bugs.gnucash.org/show_bug.cgi?id=797796</a><br>
                                    <br>
                                    Unless you’re willing to submit a
                                    PR, this is a user-list topic, so in
                                    the future please use gnucash-user
                                    instead of gnucash-devel.<br>
                                    <br>
                                    Regards,<br>
                                    John Ralls<br>
                                    <br>
                                    > On Aug 23, 2025, at 1:43 PM,
                                    Chang Wang <<a href="mailto:wangchang327@gmail.com" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">wangchang327@gmail.com</a>>
                                    wrote:<br>
                                    > <br>
                                    > Hi all,<br>
                                    > I noticed an issue with the
                                    Trial Balance report when using
                                    stock trading and multiple
                                    currencies. Even when transactions
                                    are balanced, the Trial Balance
                                    report appears to break due to
                                    incorrect calculation of unrealized
                                    gains.<br>
                                    > <br>
                                    > I've attached an uncompressed
                                    minimal example to illustrate the
                                    problem.<br>
                                    > <br>
                                    > Steps to reproduce:<br>
                                    > Open the attached book.<br>
                                    > Generate a Trial Balance report
                                    with reporting currency set to USD,
                                    price source set to Last up through
                                    report date, and enable Show Foreign
                                    Currencies and Exchange Rates.<br>
                                    > <br>
                                    > Observed behavior:<br>
                                    > The report shows an Unrealized
                                    Gain of $20,800, which is incorrect.<br>
                                    > <br>
                                    > Expected behavior:<br>
                                    > The Unrealized Gain should be
                                    $200.<br>
                                    > <br>
                                    > Explanation:<br>
                                    > The example contains three
                                    transactions:<br>
                                    > 1) 08/02/2025 - Buy one stock
                                    for 10,200 JPY.<br>
                                    > 2) 08/03/2025 - Exchange
                                    100,000 JPY for 100,000 USD.<br>
                                    > 3) 08/04/2025 - Buy one stock
                                    for 10,400 JPY.<br>
                                    > <br>
                                    > The JPY/USD rate is fixed at 1
                                    on all days, so there should be no
                                    realized or unrealized currency
                                    gains. Stock prices are set at 10X00
                                    JPY on 08/0X/2025, where X = 1, 2,
                                    3, 4.<br>
                                    > <br>
                                    > Therefore, in USD reporting
                                    currency, the Trial Balance should
                                    show unrealized gains as:<br>
                                    > (10,400 * 2) - 10,200 - 10,400
                                    = 200 JPY = 200 USD<br>
                                    > <br>
                                    > Notably, the Balance Sheet
                                    report does display the correct
                                    unrealized gain. And if transaction
                                    3) or transaction 2) is removed, the
                                    Trial Balance turns out to be
                                    correct.<br>
                                    > <br>
                                    > I'm not familiar with Scheme,
                                    so I wasn't able to locate the
                                    problem in the source code. I also
                                    wasn't able to file a bug on
                                    Bugzilla, since the registration
                                    function appears to be broken.<br>
                                    > <br>
                                    > Thanks for your attention,<br>
                                    > Chang<br>
                                    >
                                    <tb.gnucash>_______________________________________________</blockquote>
                                </div>
                                <br>
                              </blockquote>
                            </div>
                          </div>
                        </blockquote>
                      </div>
                    </div>
                  </blockquote>
                </blockquote>
              </div>
              <span id="cid:654B967E-1840-4CF0-8579-E94E711E68B9"><commodity-utilities.scm.patch></span></div>
          </blockquote>
        </div>
        <br>
      </div>
    </blockquote>
  </div>

</div></blockquote></div><br></body></html>