Neues Modul: 98_STOCKQUOTES

Begonnen von vbs, 04 Februar 2015, 21:01:42

Vorheriges Thema - Nächstes Thema

vbs

ACHTUNG:
Durch den Wegfall von Yahoo Finance gibt es mWn momentan keine funktionierende Datenquelle für das zugrunde liegende Perl-Modul Finance::Quote. Es wird wohl an Alternativen gearbeitet.

Ich habe ein kleines Modul gebastelt, das aktuelle Börsenkurse als Readings zur Verfügung stellt. Das Ganze basiert auf dem Perl-Modul Finance::Quote und ist im Prinzip nur ein recht simpler Wrapper, der (nicht-blockierend) das Fetching durchführt und anzeigt.

Es muss dementsprechend zunächst das Modul Finance::Quote installiert werden. Zum Beispiel per Aufruf:
cpan install Finance::Quote

UPDATE:
Hab das Ganze nochmal ziemlich umgekrempelt. Anbei mein aktueller Stand. Sind bestimmt noch ein paar Bugs drin. Ich bin auch mit den Reading-Namen noch nicht so super glücklich. Kommt mir noch uneinheitlich vor. Bin da für Ideen offen. Die können sich u.U. nochmal ändern.

Zum Anlegen des Geräts:
define myQuotes STOCKQUOTES

Das Finance::Quote kennt verschiedene Quellen zur Datenabfrage. Defaultmäßig wird "europe" verwendet (Attribut "defaultSource"). Die verfügbaren Quellen können mit "get showSources" angezeigt werden. Soll für ein Wertpapier eine andere Quelle genutzt werden, dann kann dies über das Attribut "sources" gesteuert werden. Format: "<Symbol>:<Source>[,<Symbol>:<Source>...]".

Zum Hinzufügen/Entfernen eines Wertpapiers wird add/buy bzw. remove/sell verwendet. add/remove für Wertpapiere, die nur beobachtet werden sollen (nicht im Depot). Und buy/sell, falls im Depot vorhanden und man Anzahl und Kaufpreis/Verkaufspreis angeben möchte.

Beispiele:

set myDepot buy 865985 87 7000     <- 87 Apple-Aktien (WKN 865985) zum Gesamtpreis von 7000€ kaufen
set myDepot add 851399  <- IBM beobachten
set myDepot remove 865985  <- Apple entfernen


Als Readings stehen dann folgende Eckdaten zur Verfügung:
Zitat
name         Company or Mutual Fund Name
last         Last Price
high         Highest trade today
low          Lowest trade today
date         Last Trade Date  (MM/DD/YY format)
time         Last Trade Time
net          Net Change
p_change     Percent Change from previous day's close
volume       Volume
avg_vol      Average Daily Vol
bid          Bid
ask          Ask
close        Previous Close
open         Today's Open
day_range    Day's Range
year_range   52-Week Range
eps          Earnings per Share
pe           P/E Ratio
div_date     Dividend Pay Date
div          Dividend per Share
div_yield    Dividend Yield
cap          Market Capitalization
ex_div       Ex-Dividend Date.
nav          Net Asset Value
yield        Yield (usually 30 day avg)
exchange     The exchange the information was obtained from.
success      Did the stock successfully return information? (true/false)
errormsg     If success is false, this field may contain the reason why.
method       The module (as could be passed to fetch) which found
             this information.

Welche Readings tatsächlich zur Verfügung stehen, kann stark variieren und hängt vom Exchange, Quelle bzw. vom Wertpapier ab.

Zusätzlich gibt es folgende Readings für jedes Wertpapier, die sich aufs Depot beziehen (daher _d_):
Zitat
<stockname>_d_buy_quote                  <- Kaufkurs
<stockname>_d_buy_value_total          <- Einstandswert
<stockname>_d_cur_value_total           <- Aktueller Wert
<stockname>_d_p_change_total           <- Prozentualer Unterschied gesamt
<stockname>_d_stockcount                  <- Anzahl Aktien im Depot
<stockname>_d_value_diff                     <- Wertunterschied heute
<stockname>_d_value_diff_total            <- Wertunterschied gesamt

Darüber hinaus gibt es folgende Werte, die für das gesamte Depot berechnet werden:
Zitat
depot_buy_value_total                           <- Kaufwert gesamt
depot_cur_value_total                            <- Aktueller Wert
depot_p_change                                     <- Prozentualer Unterschied heute
depot_p_change_total                            <- Prozentualer Unterschied gesamt
depot_value_diff                                      <- Wertunterschied heute
depot_value_diff_total                             <- Wertunterschied gesamt

ReadingsGroup

Ich habe mal beispielhaft eine readingsGroup dafür zusammengebastelt:
(https://dl.dropboxusercontent.com/u/24641738/fhem/stockquotes.png)

Die ist im Prinzip generisch und kann so 1:1 kopiert werden:
DEF        myB:<>,.*_name,<Depot>
myB:<Kurs>,.*_last
myB:<Stück>,.*_d_stockcount
myB:<>
myB:<Buchgewinn&nbsp(Heute)>,((?!depot).)*_p_change$,depot_p_change
myB:<>,.*_d_value_diff,depot_value_diff
myB:<Buchgewinn&nbsp(Gesamt)>,.*_d_p_change_total,depot_p_change_total
myB:<>,.*_d_value_diff_total,depot_value_diff_total
myB:<>
myB:<Einstandskurs>,.*_d_buy_quote
myB:<Einstandswert>,.*_d_buy_value_total,depot_buy_value_total
myB:<Aktueller&nbspWert>,.*_d_cur_value_total,depot_cur_value_total

Attributes:
   alias      Wertpapierdepot
   cellStyle  { "r:1"=>'style="font-weight:bold;;font-size:16px"'}
   mapping    &nbsp;
   notime     1
   valueStyle { if ($READING =~ /_p_|_diff/) {return ($VALUE < 0) ? 'style="color:red"':'style="color:green"' } }
   valueSuffix { if ($READING =~ /p_change/) { return " %" } elsif ($READING =~ /value|diff|last|buy_quote/) { return " €"}}

carlos

Hallo,
So ein ähnliches module habe ich seit ca. 3 Monaten bei mir als Test laufen. Wollte es demnächst hier auch mal zur Verfügung stellen.
Da bist du mir leider zuvor gekommen. :'(
Ist aber kein Problem.
War für mich eh nur ein Test ob ich sowas auch noch hinkriege.
Gruß
Carlos
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

TeeVau

Herlich, kann ich endlich die Heizung wärmer schalten, wenn die Kurse besser stehen. Oder aus, wenn der Markt kracht ;-)
FHEM 5.8 dev (virtualisiert) / FBF 7390 (CUL 868MHz V 1.51 / panStick (AVR1))
FS20: fs20di,fs20pira,fs20sm8,fs20st2,fs20tfk,fs20ue1,fs20ws1
panStamp (AVR1): RGB Multi von ext23, 1W-DSxxxx, I/O Sketch, Spritzpumpe
Multimedia: Panasonic TV (VIERA), Kodi, Yamaha RX-V781, LMS
Sonstiges: XiaomiFlowerSen

vbs

@carlos:
Naja, Konkurrenz belebt das Geschäft? Vielleicht können wir auch etwas zusammen werfen. Das beste aus beiden Welten. Wobei meine Welt ja auch überschaubar ist :)

@TeeVau:
Haha klingt gut, ich bin eh noch auf der Suche nach einem richtig sinnvollen Anwendungsgebiet für das Modul :P

Icinger

Raumtemperatur abhängig vom Barrel-Preis  :o

bzw. Automatische Heizöl-Bestellung, wenn Öltank unter xx% und Ölpreis unter xx €  ::)
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

carlos

Hallo vbs,
Ich habe mal meine Features in deine integriert. Ich hoffe das geht in Ordnung. Schau es dir einfach mal an.
Ich habe das Ganze zu einer Art Depot ausgebaut, mit einer readingsgroup kann man sich das Ganze dann auch sauber anzeigen lassen.
Folgende Änderungen:

das define sieht nun z.B.  so aus:

define myDepot STOCKQUOTES nasdaq GOOGL,AAPL 100,200

Also die Wertpapiername durch Komma getrennt und die Anzahl der jeweiligen Wertpapiere durch Komma getrennt.
Das Ganze sieht dann so wie im Anhang aus.
Das neue 98_STOCKQUOTES.pm habe ich auch angehängt.


Eine Readingsgroup könnte dann z.B. so aussehen:
define myDepotRG readingsGroup <%myDepot> <Symbol>,<Name>,<Anzahl>,<Last>,<Wert>
myDepot:GOOGL_symbol,GOOGL_name,GOOGL_anzahl,GOOGL_last,GOOGL_currency,GOOGL_wert
myDepot:AAPL_symbol,AAPL_name,AAPL_anzahl,AAPL_last,AAPL_currency,AAPL_wert


Gruß

Carlos
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

vbs

Danke, super Sache, find ich gut! Hatte auch schon sowas im Kopf, aber bisher nicht zu gekommen. Deins gefällt mir aber gut. Ein paar kleinere Änderungsideen hätte ich:

  • wäre es besser wenn man die Anzahl und den Wert zusammen angeben würde? Zum Beispiel "VW:213,Apple:512,Google:54". Dann wäre das nicht in zwei Teile geteilt
  • Ich hatte eh immer überlegt, ob es besser wäre, die Stocknames als Attribut anstatt im DEF anzugeben. Jetzt, wo es auch die Anzahl gibt, tendiere ich da noch mehr dazu, denk ich. Also Anlegen nur mit "define myQuotes STOCKQUOTES" und dann sowas "attr myQuotes VW:512,Apple:12"
  • Ich finde, die neuen Readings sollten englisch sein (also "wert" und "anzahl"), passend zum Rest

Was denkst du dazu?

carlos

Ja bin ich mit allem einverstanden, jedoch muss da das error handling verbessert werden.
Das hat den Vorteil, dass die Anzahl zum Wertpapier gehört. Jedoch sollte dann auch sowas wie Indices (DAX, ..) möglich sein ohne dass man davon Anteile hat(also Anzahl 0 oder sowas in der Art).
Wie gehen wir da bei der gemeinsamen Entwicklung vor ?
Machst du das ?
Wir konnen uns da auch über PMs verständigen, denn das gehört dann nicht in diesen Thread.
Die neueste Version sollte dann imm im 1. post stehen.
Gruß
Carlos
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

klausw

Hallo zusammen,

beim stöbern durchs Forum finde ich immer wieder Sachen, die ich vorher gar nicht vermisst haben  8)

Ich habe euer Modul schonmal runtergeladen und nutze es inzwischen.
Ein paar Dinge funktionieren schon super.
Was mir aufgefallen ist: beim Dienstleister vwd meldet das Modul nix zurück.
Das Wertpapier ist dort aber definitiv gelistet (wenn ich es selbst über Finance::Quote mit ein bisschen code in den myUtils abfrage dann funktioniert es)
Finance::Quote unterstützt auch weitere Handelsplätze. Z.B. unionfunds.
Alle bekommt man über folgenden code raus:

sub quellen {
use Finance::Quote;
my $q = Finance::Quote->new();
my @sources = $q->sources();
my $var = "Quellen: ";
foreach $s (@sources)
{
      $var .= "$s  ";
}
return $var;
}

RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

vbs

Hm, also ich bekomme beim Symbol "vwd" mit dem Modul die gleichen (seltsamen) Werte wie mit einem Beispiel-Quote-Programm. ZB. isodate 2000-00-00. Was genau hast du gemacht als nichts zurückgeliefert wurde?

vbs

Hab ein bisschen was gemacht und den ersten Post geupdatet.

klausw

Zitat von: vbs am 14 Februar 2015, 00:06:15
Hm, also ich bekomme beim Symbol "vwd" mit dem Modul die gleichen (seltsamen) Werte wie mit einem Beispiel-Quote-Programm. ZB. isodate 2000-00-00. Was genau hast du gemacht als nichts zurückgeliefert wurde?
Ich habe folgendes versucht:

define Depot STOCKQUOTES wvd A0M16S 10

Es wurde nix zurückgeliefert.

Ich werde es mal mit dem neuen Modul testen.
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

Icinger

Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

klausw

Zitat von: Icinger am 15 Februar 2015, 19:57:51
Achtung!

wvd != vwd

lg, Ici
habe mich hier vertippt  ::)

im neuen modul gibt es keine aktualisierung mehr, wenn sources -> A0M16S:vwd
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

vbs

Das liegt zum einen daran, dass kein previous-Feld mitkommt und andererseits daran, dass Sonderzeichen im gelieferten name-Feld enthalten sind.