r20265 - gnucash/trunk/src/optional/python-bindings/example_scripts - Bug #640347: Adding Example Skripts for historic Stock Quotes

Christian Stimming cstim at code.gnucash.org
Thu Feb 10 14:37:24 EST 2011


Author: cstim
Date: 2011-02-10 14:37:23 -0500 (Thu, 10 Feb 2011)
New Revision: 20265
Trac: http://svn.gnucash.org/trac/changeset/20265

Added:
   gnucash/trunk/src/optional/python-bindings/example_scripts/get_quotes.pl
   gnucash/trunk/src/optional/python-bindings/example_scripts/quotes_historic.py
Log:
Bug #640347: Adding Example Skripts for historic Stock Quotes

This patch adds the example skripts from
http://wiki.gnucash.org/wiki/Stocks/get_prices
to the directory python-bindings/example_scripts.

Patch by Christoph Holtermann.

Added: gnucash/trunk/src/optional/python-bindings/example_scripts/get_quotes.pl
===================================================================
--- gnucash/trunk/src/optional/python-bindings/example_scripts/get_quotes.pl	                        (rev 0)
+++ gnucash/trunk/src/optional/python-bindings/example_scripts/get_quotes.pl	2011-02-10 19:37:23 UTC (rev 20265)
@@ -0,0 +1,41 @@
+#!/usr/bin/perl -w
+
+# get_quotes.pl -- Addition to example Script quotes_historc.py. Reads online stock quotes to file INTC.
+#
+ 
+##  @file
+#   @brief Addition to example Script quotes_historic.py. Reads online stock quotes to file INTC.
+#   @author Peter Holtermann
+#   @date January 2011
+#   @ingroup python_bindings_examples
+#  
+#   Call this script before calling @code 
+#   python quotes_historic.py
+#   @endcode 
+# 
+#   For explanation of use have a look at the wiki:
+#   http://wiki.gnucash.org/wiki/Stocks/get_prices
+#
+#   @cond PERL
+
+use Finance::QuoteHist;
+print "Will get stock quotes of $ARGV[0] and save it into the file $ARGV[0]\n";
+$fname = $ARGV[0];
+   open (MYFILE, ">$fname");
+   $q = Finance::QuoteHist->new
+      (
+       symbols    => [($ARGV[0])],
+       start_date => '01/01/2000',
+       end_date   => 'today',
+      ); 
+
+
+print "name,date, open, high, low, close, volume\n";
+foreach $row ($q->quotes()) {
+       ($name,$date, $open, $high, $low, $close, $volume) = @$row;
+       print MYFILE "$name,$date, $open, $high, $low, $close, $volume\n";
+   }
+
+close(MYFILE);
+
+## @endcond

Added: gnucash/trunk/src/optional/python-bindings/example_scripts/quotes_historic.py
===================================================================
--- gnucash/trunk/src/optional/python-bindings/example_scripts/quotes_historic.py	                        (rev 0)
+++ gnucash/trunk/src/optional/python-bindings/example_scripts/quotes_historic.py	2011-02-10 19:37:23 UTC (rev 20265)
@@ -0,0 +1,110 @@
+#!/usr/bin/env python
+
+# quotes_historic.py -- Example Script to read historic quote data into gnucash
+#
+ 
+##  @file
+#   @brief Example Script to read historic stock data into gnucash
+#   @author Peter Holtermann
+#   @date January 2011
+#   @ingroup python_bindings_examples
+#  
+#   Call the perl-script @code 
+#   ./get_quotes.pl INTC 
+#   @endcode first to achieve data into file INTC which can thereafter be imported to GnuCash using this script.
+# 
+#   For explanation of use have a look at the wiki:
+#   http://wiki.gnucash.org/wiki/Stocks/get_prices
+#
+
+from gnucash import Session, Account, Split
+import gnucash
+import datetime
+from fractions import Fraction
+
+# Function definition from Christoph Holtermann
+def findAccount(account,name,account_list=None):
+  """Searches full names of account and descendents
+
+  returns a list of accounts which contain name."""
+
+  if not account_list:
+    account_list=[]
+
+  for child in account.get_children():
+     child=Account(instance=child)
+     account_list=findAccount(child,name,account_list)
+  
+  Account_name=account.GetName()
+  if name in Account_name:
+    account_list.append(account)
+  
+  return account_list
+
+FILE = "./test.gnucash"
+url = "xml://"+FILE
+
+# Read data from file
+f = open('INTC')
+data = []
+while 1:
+    tmp = f.readline()
+    if(len(tmp)<2):
+        break
+    
+    data.append(tmp)
+
+f.close()
+
+stock_date = []
+stock_price = []
+for i in range(1,len(data)):
+    year = int(data[i].rsplit(',')[1].rsplit('/')[0])
+    month = int(data[i].rsplit(',')[1].rsplit('/')[1])
+    day = int(data[i].rsplit(',')[1].rsplit('/')[2])
+    stock_date.append(datetime.datetime(year,month,day))
+    stock_price.append(float(data[i].rsplit(',')[5]))
+
+# Initialize Gnucash session
+session = Session(url, True, False, False)
+root = session.book.get_root_account()
+book = session.book
+account = book.get_root_account()
+pdb = book.get_price_db()
+comm_table = book.get_table()
+ac = findAccount(account,'Intel')[0] 
+
+stock = ac.GetCommodity()
+# Add the prices
+pdb = book.get_price_db()
+if len(ac.GetSplitList())<1:
+  print 'Need at least one Split to get currency info ... '
+  raise SystemExit
+cur = ac.GetSplitList()[0].GetParent().GetCurrency()
+
+# Get stock data
+pl = pdb.get_prices(stock,cur)
+if len(pl)<1:
+  print 'Need at least one database entry to clone ...'
+  raise SystemExit
+
+pl0 = pl[0]
+for i in range(1,len(pl)):
+  pdb.remove_price(pl[i])
+
+for i in range(0,len(stock_date)):
+  p_new = pl0.clone(book)
+  p_new = gnucash.GncPrice(instance=p_new)
+  print 'Adding',i,stock_date[i],stock_price[i]
+  p_new.set_time(stock_date[i])
+  v = p_new.get_value()
+  v.num = int(Fraction.from_float(stock_price[i]).limit_denominator(100000).numerator)
+  v.denom = int(Fraction.from_float(stock_price[i]).limit_denominator(100000).denominator)
+  p_new.set_value(v)
+  p_new.set_source("Finance::Quotes::Historic")
+  pdb.add_price(p_new)
+
+# Clean up
+session.save()
+session.end()
+session.destroy()



More information about the gnucash-changes mailing list