home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / lib / python2.4 / site-packages / invest / chart.py < prev    next >
Encoding:
Python Source  |  2006-08-30  |  5.6 KB  |  222 lines

  1. #!/usr/bin/env python
  2.  
  3. import gtk, gtk.gdk, gtk.glade
  4. import gobject
  5. import egg.trayicon
  6. import gnomevfs
  7. import os
  8. import invest
  9. from gettext import gettext as _
  10. from invest import *
  11. import sys
  12. from os.path import join
  13.  
  14. # p:
  15. #  eX = Exponential Moving Average
  16. #  mX = Moving Average
  17. #  b = Bollinger Bands Overlay
  18. #  v = Volume Overlay
  19. #  p = Parabolic SAR overlay
  20. #  s = Splits Overlay
  21. # q:
  22. #  l = Line
  23. #  c = Candles
  24. #  b = Bars
  25. # l:
  26. #  on = Logarithmic
  27. #  off = Linear
  28. # z:
  29. #  l = Large
  30. #  m = Medium
  31. # t:
  32. #  Xd = X Days
  33. #  Xm = X Months
  34. #  Xy = X Years
  35. # a:
  36. #  fX = MFI X days
  37. #  ss = Slow Stochastic
  38. #  fs = Fast Stochastic
  39. #  wX = W%R X Days
  40. #  mX-Y-Z = MACD X Days, Y Days, Signal
  41. #  pX = ROC X Days
  42. #  rX = RSI X Days
  43. #  v = Volume
  44. #  vm = Volume +MA
  45. # c:
  46. #  X = compare with X
  47. #
  48.  
  49. class FinancialChart:
  50.     def __init__(self, ui):
  51.         self.ui = ui
  52.         
  53.         # Window Properties
  54.         win = ui.get_widget("window")
  55.         win.set_title(_("Financial Chart"))
  56.         
  57.         try:
  58.             pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(join(invest.ART_DATA_DIR, "invest-16.png"), -1,-1)
  59.             win.set_icon(pixbuf)
  60.             pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(join(invest.ART_DATA_DIR, "invest.svg"), 96,96)
  61.             self.ui.get_widget("plot").set_from_pixbuf(pixbuf)
  62.         except Exception, msg:
  63.             pass
  64.         
  65.         # Defaut comboboxes values
  66.         for widget in ["t", "q"]:
  67.             ui.get_widget(widget).set_active(0)
  68.         
  69.         # Connect every option widget to its corresponding change signal    
  70.         symbolentry = ui.get_widget("s")
  71.         refresh_chart_callback = lambda w: self.on_refresh_chart()
  72.         
  73.         for widgets, signal in [
  74.             (("pm5","pm10","pm20","pm50","pm100","pm200",
  75.             "pe5","pe10", "pe20","pe50","pe100","pe200",
  76.             "pb","pp","ps","pv",
  77.             "ar","af","ap","aw","am","ass","afs","av","avm"), "toggled"),
  78.             (("t", "q"), "changed"),
  79.             (("s",), "activate"),
  80.         ]:
  81.             for widget in widgets:
  82.                 ui.get_widget(widget).connect(signal, refresh_chart_callback)
  83.         
  84.         ui.get_widget("progress").hide()
  85.         
  86.         # Connect auto-refresh widget
  87.         self.autorefresh_id = 0
  88.         ui.get_widget("autorefresh").connect("toggled", self.on_autorefresh_toggled)
  89.                                         
  90.     def on_refresh_chart(self, from_timer=False):
  91.         tickers = self.ui.get_widget("s").get_text()
  92.             
  93.         if tickers.strip() == "":
  94.             return True
  95.         
  96.         if from_timer and not ustime.hour_between(9, 16):
  97.             return True
  98.             
  99.         tickers = [ticker.strip().upper() for ticker in tickers.split(' ') if ticker != ""]
  100.         
  101.         # Update Window Title ------------------------------------------------------
  102.         win = self.ui.get_widget("window")
  103.         title = _("Financial Chart - %s")
  104.         titletail = ""
  105.         for ticker in tickers:
  106.             titletail += "%s / " % ticker
  107.         title = title % titletail
  108.         
  109.         win.set_title(title[:-3])
  110.  
  111.         # Detect Comparison or simple chart ----------------------------------------
  112.         opt = ""
  113.         for ticker in tickers[1:]:
  114.             opt += "&c=%s" % ticker
  115.         
  116.         # Create the overlay string ------------------------------------------------
  117.         p = ""
  118.         for name, param in [
  119.             ("pm5",   5),
  120.             ("pm10",  10),
  121.             ("pm20",  20),
  122.             ("pm50",  50),
  123.             ("pm100", 100),
  124.             ("pm200", 200),
  125.             ("pe5",   5),
  126.             ("pe10",  10),
  127.             ("pe20",  20),
  128.             ("pe50",  50),
  129.             ("pe100", 100),
  130.             ("pe200", 200),
  131.             ("pb", ""),
  132.             ("pp", ""),
  133.             ("ps", ""),
  134.             ("pv", ""),
  135.         ]:
  136.             if self.ui.get_widget(name).get_active():
  137.                 p += "%s%s," % (name[1], param)
  138.             
  139.         # Create the indicators string ---------------------------------------------
  140.         a = ""
  141.         for name, param in [
  142.             ("ar",  14),
  143.             ("af",  14),
  144.             ("ap",  12),
  145.             ("aw",  14),
  146.             ("am",  "26-12-9"),
  147.             ("ass", ""),
  148.             ("afs", ""),
  149.             ("av",  ""),
  150.             ("avm", ""),
  151.         ]:
  152.             if self.ui.get_widget(name).get_active():
  153.                 a += "%s%s," % (name[1:], param)
  154.         
  155.         # Create the image URL -----------------------------------------------------
  156.         url = CHART_BASE_URL % {
  157.             "s": tickers[0],
  158.             "t": self.ui.get_widget("t").get_active_text(),
  159.             "q": self.ui.get_widget("q").get_active_text(),
  160.             "l": "off",
  161.             "z": "l",
  162.             "p": p,
  163.             "a": a,
  164.             "opt": opt,
  165.         }
  166.         
  167.         # Download and display the image -------------------------------------------    
  168.         progress = self.ui.get_widget("progress")
  169.         progress.set_text(_("Opening Chart"))
  170.         progress.show()
  171.         
  172.         gnomevfs.async.open(url, lambda h,e: self.on_chart_open(h,e,url))
  173.  
  174.         # Update timer if needed
  175.         self.on_autorefresh_toggled(self.ui.get_widget("autorefresh"))
  176.                 
  177.         return True
  178.     
  179.     def on_chart_open(self, handle, exc_type, url):
  180.         progress = self.ui.get_widget("progress")
  181.         progress.set_text(_("Downloading Chart"))
  182.         
  183.         if not exc_type:
  184.             loader = gtk.gdk.PixbufLoader()
  185.             handle.read(GNOMEVFS_CHUNK_SIZE, self.on_chart_read, (loader, url))
  186.         else:
  187.             handle.close(lambda *args: None)
  188.             progress.set_text("")
  189.  
  190.     def on_chart_read(self, handle, data, exc_type, bytes_requested, udata):
  191.         loader, url = udata
  192.         progress = self.ui.get_widget("progress")
  193.         progress.set_text(_("Reading Chart chunk"))
  194.         
  195.         if not exc_type:
  196.             loader.write(data)
  197.         
  198.         if exc_type:
  199.             loader.close()
  200.             handle.close(lambda *args: None)
  201.             self.ui.get_widget("plot").set_from_pixbuf(loader.get_pixbuf())
  202.             progress.set_text(url)
  203.         else:
  204.             progress.set_text(_("Downloading Chart"))
  205.             handle.read(GNOMEVFS_CHUNK_SIZE, self.on_chart_read, udata)
  206.         
  207.     def on_autorefresh_toggled(self, autorefresh):
  208.         if self.autorefresh_id != 0:
  209.             gobject.source_remove(self.autorefresh_id)
  210.             self.autorefresh_id = 0
  211.             
  212.         if autorefresh.get_active():
  213.             self.autorefresh_id = gobject.timeout_add(AUTOREFRESH_TIMEOUT, self.on_refresh_chart, True)
  214.  
  215. def show_chart(tickers):
  216.     ui = gtk.glade.XML(os.path.join(invest.GLADE_DATA_DIR, "financialchart.glade"))
  217.     chart = FinancialChart(ui)
  218.     ui.get_widget("s").set_text(' '.join(tickers))
  219.     chart.on_refresh_chart()
  220.     return ui.get_widget("window")
  221.  
  222.