On Mon, 24 Jan 2005, David G Hamblen wrote:

Christian Stimming wrote:

Derek Atkins schrieb:

I usually use the "Nearest in Time" option; the weighted average is not particularly informative. Weighted average is, however, the default; and it appears that that it's used to determine the cost when computing the unrealized gain. Since it's calculated using absolute values, it's not even the correct number.


Hmm, then that's definitely a bug..

However, there is a particular reason to have "Weighted Average" the default for any of the multi-currency report: GnuCash has two kinds of prices. There are *explicit* prices with an entry in the Price Editor. And there are *implicit* prices whenever a transaction with multiple currencies is booked.
.........
Christian

For the stock case, weighted average would work fine (at least for my test case) if the average were computed using the algebraic rather than the absolute values (with testing for 0/0 cases). I'm not sure I understand the impact on the implicit pricings. My example was buying 100 shares at $5, selling it at a later date at $5, and then at a still later date buying 10 shares at $20. The weighted average appears to be calculated as (5*100+5*100+20*10)/(100+100+10)=$5.71/sh. I think it should be calculated as (5*100-5*100+20*10)/(100-100+10)=$20.00/sh. The individual prices are always positive, but the shares and the values can both be negative. Seems like this ought to work with the implicit prices as well. The gotcha in this is the after the second transaction I have zero shares with an undefined price ($0/0); so we need to test and skip the case where there's no current position in the asset.


Dave


I finally got things working to my satisfaction (patches below) by eliminating all the "gnc:numeric-abs" functions from scm/commodity-utilities.scm (except the one's around the timepair-dates). This created a divide-by-zero problem for commodities which I no longer own ($0.00/0.0000 shares) which I temporarily fixed by "purchasing" 0.0001 share at $1/sh. A better(??) solution was to patch the function "gnc:make-commodity-collector" in scm/report-utilities.scm to skip values with a zero denominator.

I haven't done a thorough search to see where else these functions might
be used; so I don't know if this screws up the the computations with
multiple currencies.

---------------------------------------------------------------------
--- commodity-utilities.scm-src 2004-08-18 00:43:23.000000000 -0400
+++ commodity-utilities.scm     2005-03-08 11:06:20.000000000 -0500
@@ -125,10 +125,10 @@
                                  (gnc:split-get-parent a)))
               (account-comm (gnc:account-get-commodity
                              (gnc:split-get-account a)))
-              (share-amount (gnc:numeric-abs
-                             (gnc:split-get-amount a)))
-              (value-amount (gnc:numeric-abs
-                             (gnc:split-get-value a)))
+              (share-amount
+                             (gnc:split-get-amount a))
+              (value-amount
+                             (gnc:split-get-value a))
               (transaction-date (gnc:transaction-get-date-posted
                                  (gnc:split-get-parent a)))
               (foreignlist
@@ -233,10 +233,10 @@
                                (gnc:split-get-parent a)))
             (account-comm (gnc:account-get-commodity
                            (gnc:split-get-account a)))
-            (share-amount (gnc:numeric-abs
-                           (gnc:split-get-amount a)))
-            (value-amount (gnc:numeric-abs
-                           (gnc:split-get-value a)))
+            (share-amount
+                           (gnc:split-get-amount a))
+            (value-amount
+                           (gnc:split-get-value a))
             (transaction-date (gnc:transaction-get-date-posted
                                (gnc:split-get-parent a)))
             (foreignlist
@@ -547,10 +547,10 @@
                  (account-comm (gnc:account-get-commodity
                                 (gnc:split-get-account a)))
                  ;; Always use the absolute value here.
-                 (share-amount (gnc:numeric-abs
-                                (gnc:split-get-amount a)))
-                 (value-amount (gnc:numeric-abs
-                                (gnc:split-get-value a)))
+                 (share-amount
+                                (gnc:split-get-amount a))
+                 (value-amount
+                                (gnc:split-get-value a))
                  (tmp (assoc transaction-comm sumlist))
                  (comm-list (if (not tmp)
                                 (assoc account-comm sumlist)
@@ -610,11 +610,11 @@
   (map
    (lambda (e)
      (list (car e)
-          (gnc:numeric-abs
+
            (gnc:numeric-div ((cdadr e) 'total #f)
                             ((caadr e) 'total #f)
                             GNC-DENOM-AUTO
-                            (logior (GNC-DENOM-SIGFIGS 8) GNC-RND-ROUND)))))
+                            (logior (GNC-DENOM-SIGFIGS 8) GNC-RND-ROUND))))
    (gnc:get-exchange-totals report-commodity end-date)))


--- report-utilities.scm-src 2004-08-18 00:43:23.000000000 -0400 +++ report-utilities.scm 2005-03-09 11:22:09.000000000 -0500 @@ -387,7 +387,8 @@ ;; and add it to the alist (set! commoditylist (cons pair commoditylist)))) ;; add the value - (gnc:numeric-collector-add (cadr pair) value))) + (if (not (= 0 (gnc:numeric-denom value))) ;;;dgh + (gnc:numeric-collector-add (cadr pair) value))) )

     ;; helper function to walk an association list, adding each
     ;; (commodity -> collector) pair to our list at the appropriate

--------------------------------------------------------------------
                        Dave




_______________________________________________ gnucash-devel mailing list [email protected] https://lists.gnucash.org/mailman/listinfo/gnucash-devel

Reply via email to