Neues Modul: 98_STOCKQUOTES

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

Vorheriges Thema - Nächstes Thema

klausw

Zitat von: vbs am 15 Februar 2015, 22:18:29
Das liegt zum einen daran, dass kein previous-Feld mitkommt und andererseits daran, dass Sonderzeichen im gelieferten name-Feld enthalten sind.
na super, liegt das am vwd?

gibt es eine Möglichkeit das zum laufen zu bekommen?
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

Man müsste es so ändern, dass das Modul auch ohne previous arbeiten kann (momentan wird dann irgendwo durch Null geteilt). Das mit name ist sicherlich ein Encoding-Problem, das man beheben kann. Oder als Hack des Reading name ignorieren...

Das mit previous habe ich gestern mal gemacht, das sah gut aus. Mit dem Encoding hatte ich so spontan noch keinen Erfolg.

volschin

Die meisten Nicht-Entwickler fahren übrigens besser mit

sudo apt-get install libfinance-quote-perl

Erstens ist das Paket für die jeweilige Umgebung getestet und
Zweitens wird es bei einem "apt-get upgrade" mit auf die neueste Version gebracht.

Bin gerade am Testen. Immer wieder coole Modul-Ideen hier im Forum.  ;D
Intel NUC+Ubuntu 22.04+Docker+FHEM6
HomeMatic: HM-MOD-RPI-PCB+HM-USB-CFG2+hmland+diverse, HUE: Hue-Bridge, RaspBee+deCONZ+diverse
Amzn Dash-Buttons, Siro Rollos
4xRPi, 4xCO20, OWL+USB, HarmonyHub, FRITZ!Box 7590, Echo Dots+Show8, Logi Circle 2, HomeBridge
TIG Stack (Telegraf, InfluxDB, Grafana)

vbs

@klaus
Probier mal bitte die Version im Anhang...

@volschin
Ja, ist bestimmt eine gute Sache, wenn man apt hat. Ist jedoch dann nur für Distros, welche eine Paketverwaltung mitbringen, bei der es sich dann auch um apt handelt ;) Ist bei mir zB nicht der Fall (TinyCore). Soweit ich das als Perl-Newb verstehe, ist cpan dann der generische Ansatz.

volschin

Ich habe mal etwas getestet. Vieles funktioniert sehr gut, wenn ich die Yahoo-Symbols nehme.

Folgende Probleme:
Symbol ALV.DE hat einen Kurs in EUR.
Symbol MSFT hat einen Kurs in USD.

Für den Depotwert zählst Du einfach alles zusammen. Leider ist das ein schwierigeres Problem. Eigentlich brauchst Du einen historischen Umrechnungskurs am Kauftag und einen aktuellen Umrechnungskurs. Das Yahoo-Symbol für EUR/USD ist "EURUSD=X".

Man könnte es so machen, dass die Währung, in der das Depot geführt werden soll als Attribut angegeben wird und diese Währung einfach für Deinen BUY-Preis angenommen wird. Dann muss aber noch der aktuelle Kurs auf die Depotwährung umgerechnet werden, damit eine korrekte Depotsumme herauskommt.

Als Alternative müsste man ein eigenes Depot für jedes Fremdwährungswertpapier definieren.
 
Intel NUC+Ubuntu 22.04+Docker+FHEM6
HomeMatic: HM-MOD-RPI-PCB+HM-USB-CFG2+hmland+diverse, HUE: Hue-Bridge, RaspBee+deCONZ+diverse
Amzn Dash-Buttons, Siro Rollos
4xRPi, 4xCO20, OWL+USB, HarmonyHub, FRITZ!Box 7590, Echo Dots+Show8, Logi Circle 2, HomeBridge
TIG Stack (Telegraf, InfluxDB, Grafana)

vbs

Hm, guter Punkt, ja :) Hast voll recht und finde auch die Vorschläge gut. Muss mal schauen, ob ich mich aufraffen kann, eine Währungsumrechnung einzubauen.

carlos

#21
Brauchst du nicht, ist als Parameter beim finance mit dabei. Ich habs mir gestern kurz angeschaut.

edit:
So hab's gefunden:

# =======================================================================
# set_currency (public object method)
#
# set_currency allows information to be requested in the specified
# currency.  If called with no arguments then information is returned
# in the default currency.
#
# Requesting stocks in a particular currency increases the time taken,
# and the likelyhood of failure, as additional operations are required
# to fetch the currency conversion information.
#
# This method should only be called from the quote object unless you
# know what you are doing.


Aus der Doku:
2.4. Currency
-------------
Finance::Quote has support for multiple currencies and for currency
conversion.  As long as you provide a little bit of information about
the information you are returning, the Finance::Quote framework can
do all the hard stuff for you.

If you are returning information on a stock in a particular currency,
then you can enter the ISO currency code into the "currency" field
associated with the stock.  Eg:

$info{$stock,"currency"} = "AUD";  # Australian Dollars

If the information you are returning does not have a currency
(because it's an index like the Dow Jones Industrial or the
All Oridinaries, or because you're returning percentages) then
you should not set the currency field for that stock.  Finance::Quote
knows not to attempt currency conversion for stocks without
a currency field.

If you do have a currency field, then by default Finance::Quote will
arrange for the automatic conversion of a number of fields.  By
default, these fields are last, high, low, net, bid, ask, close, open,
day_range, year_range, eps, div, cap, nav and price.  Of course,
there may be some cases where this set is not appropriate, or where there
are extra fields that should be converted.  This can be indicated
by writing a function called "currency_fields()" in your module,
that returns a list of fields that can undergo currency conversion.
Eg:

sub currency_fields {
return qw/high low price bid/;
}

currency_fields() will be passed a Finance::Quote object as its
first argument, and a method called default_currency_fields()
is available through this object.  This is useful if you want
to use the defaults, but also add some of your own:

sub currency_fields {
my $quoter = shift;
return ($quoter->default_currency_fields, "commission");
}

In the example above, the default fields would be available for currency
conversion, but the "commission" field would also be converted.

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

Klasse, danke! Werd ich mal einbauen.

klausw

#23
Zitat von: vbs am 16 Februar 2015, 19:38:38
@klaus
Probier mal bitte die Version im Anhang...
super, jetzt klappt es
vwd gibt nicht viel zurück, aber die Wichtigsten Werte sind dabei

Irgendwie passiert beim pollintervall bei mit nicht...ich muss manuell updaten
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

Hab mal die Currency-Sache eingebaut im ersten Post. Dass das Updaten nicht klappt, kann ich so erstmal nicht nachstellen. Bitte mal ein Log posten.

klausw

#25
habe jetzt mal das neuste Modul aus dem ersten Post geladen.

Depot angelegt und was eingebucht:

define Depot STOCKQUOTES
set Depot buy 975013 2 80
set Depot verbose 5

PollIntervall funktioniert
die depot_* Readings sind aber negativ ebendo wie einige der 975013_d_* Werte
Folgende (Fehler)meldungen tauchen im Log auf:
2015.02.18 13:46:51 4: STOCKQUOTES_QueryQuotesBlocking
2015.02.18 13:46:51 4: STOCKQUOTES_QueryQuotesBlocking: Query stockname: 975013 from source europe
2015.02.18 13:46:51 4: STOCKQUOTES_QueryQuotesBlocking: Fetching from source: europe
2015.02.18 13:47:00 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/98_STOCKQUOTES.pm line 299.
2015.02.18 13:47:00 4: STOCKQUOTES_QueryQuotesBlocking Return value: Depot|975013&exchange&Ber/Bre|975013&previous&49.580|975013&symbol&HTML|975013&method&bourso|975013&isodate&2015-02-18|975013&last&|975013&high&49.580|975013&volume&0|975013&date&02/18/2015|975013&success&1|975013&name&UNIONGELDMARKTF|975013&open&49.560|975013&low&49.560|975013&errormsg&Stock name 975013 not found|975013&p_change&0.00%|975013¤cy&
2015.02.18 13:47:00 4: STOCKQUOTES_QueryQuotesFinished
2015.02.18 13:47:00 1: PERL WARNING: Use of uninitialized value in multiplication (*) at ./FHEM/98_STOCKQUOTES.pm line 361.
2015.02.18 13:47:00 1: PERL WARNING: Use of uninitialized value in subtraction (-) at ./FHEM/98_STOCKQUOTES.pm line 363.
2015.02.18 13:47:00 4: STOCKQUOTES_QueueTimer: 300 seconds


wenn ich jetzt
attr Depot sources 975013:unionfunds
hinzufüge wird einmal aktualisiert, allerdings werden aber einige redings nicht gelöscht, welche von der neuen Quelle nicht unterstützt werden (sie werden einfach nicht aktualisiert).
Ausserdem funktioniert jetzt der pollintervall nicht mehr und state bleibt auf updating... stehen.
set .... update funktioniert weiterhin
Dafür sehen einige depot_ readings jetzt besser aus.
Log dazu:
2015.02.18 13:52:00 4: STOCKQUOTES: Start blocking query
2015.02.18 13:52:00 4: STOCKQUOTES_QueryQuotesBlocking
2015.02.18 13:52:00 4: STOCKQUOTES_QueryQuotesBlocking: Query stockname: 975013 from source unionfunds
2015.02.18 13:52:00 4: STOCKQUOTES_QueryQuotesBlocking: Fetching from source: unionfunds
2015.02.18 13:52:01 4: STOCKQUOTES_QueryQuotesBlocking Return value: Depot|975013&exchange&UNION|975013&symbol&975013|975013&last&49.60|975013&isodate&2015-02-16|975013&method&unionfunds|975013&date&02/16/2015|975013&price&49.60|975013&success&1|975013&name&975013|975013¤cy&EUR
2015.02.18 13:52:01 4: STOCKQUOTES_QueryQuotesFinished


nach dem Löschen des Attributes sources und einem set Depot update klappt auch der refresh wieder.
Allerings bleiben in diesem Fall 975013_last, _price und _currency wieder stehen.

EDIT:
anstelle von sources das Attribut defaultSource auf unionfunds zu setzen führt zum gleichen Ergebnis.

kann es sein, das die Auswertung nicht zuende geführt wird weil irgendein Wert nicht übermittelt wird?

mit vwd im Sources Attribut funktioniert es

EDITEDIT:
mit yahoo_europe pollt es auch nicht mehr
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

klausw

noch ein paar fixe Ideen:
vielleicht scheint dir ja was davon sinnvoll  8)

Es kann vorkommen, das man Wertpapiere, die bereits im Depot sind nachkauft.
Dann haben diese natürlich einen anderen Einstandskurs.
Das lässt sich derzeit nicht nachbilden.
Allerdings habe ich auch keinen Lösungsansatz. (Das gleiche Wertpapier 2x anzulegen erscheint mir wenig sinnvoll)
...oder vielleicht doch eine Idee dazu: zu einer WKN mehrere Anzahl/Gesamtpreise erlauben

Zu den readings hätte ich den Vorschlag die empfangenen Werte von Finance::Quote als hash in den Internals abzulegen und nur die wichtigen anzuzeigen.
Dadurch würde es etwas übersichtlicher werden.

Wenn man ein Kaufdatum angeben kann, ließen sich daraus im Zusammenhang mit dem Kaufpreis Prozentuale Gewinne (beispielsweise 1/3/5 jährig) ermitteln
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

Zitat von: klausw am 18 Februar 2015, 14:57:36
Depot angelegt und was eingebucht:

define Depot STOCKQUOTES
set Depot buy 975013 2 80
set Depot verbose 5

Hm, das hat ja nichtmal ein "last"-Feld :/ Alles andere hatte ich eigentl. schon optional gemacht, aber ich hätte gedacht, dass last alle haben. Wo ist denn der Kurs zu finden bei dem Symbol? Denke auch, dass dadurch dann die weitere Verarbeitung in Perl abgebrochen wird.

Zitat von: klausw am 18 Februar 2015, 16:42:30
noch ein paar fixe Ideen:
vielleicht scheint dir ja was davon sinnvoll  8)

Es kann vorkommen, das man Wertpapiere, die bereits im Depot sind nachkauft.
Dann haben diese natürlich einen anderen Einstandskurs.
Das lässt sich derzeit nicht nachbilden.
Allerdings habe ich auch keinen Lösungsansatz. (Das gleiche Wertpapier 2x anzulegen erscheint mir wenig sinnvoll)
...oder vielleicht doch eine Idee dazu: zu einer WKN mehrere Anzahl/Gesamtpreise erlauben
Du kannst durchaus per "buy" ein Papier gekauft, welches schon im Depot vorhanden ist. Es *sollte* dann korrekt hinzuaddiert werden und es sollte dann auch ein korrekter Einstandskurs berechnet werden.

Zitat von: klausw am 18 Februar 2015, 16:42:30
Zu den readings hätte ich den Vorschlag die empfangenen Werte von Finance::Quote als hash in den Internals abzulegen und nur die wichtigen anzuzeigen.
Dadurch würde es etwas übersichtlicher werden.
Hm, würde ungern etwas weglassen von vornherein. Wäre es nicht besser, wenn man readingsGroup oder readingsProxy o.ä. benutzen würde, um sich dann ein gefiltertes Device zu bauen? "Wichtig" liegt auch immer sehr im Auge des Betrachters.

Zitat von: klausw am 18 Februar 2015, 16:42:30
Wenn man ein Kaufdatum angeben kann, ließen sich daraus im Zusammenhang mit dem Kaufpreis Prozentuale Gewinne (beispielsweise 1/3/5 jährig) ermitteln
Ja, könnte man überlegen.

vbs

#28
Könntest nochmal diese Version probieren. Sollte nun auch ohne last funktionieren (wenn ich nix übersehen hab).

Ich muss noch einbauen, dass alte Readings an sinnvollen Stellen gelöscht werden. Im Moment muss man händisch clearReadings aufrufen, nachdem man bestimmt Sachen geändert hat.

klausw

Zitat von: vbs am 18 Februar 2015, 18:37:32
Könntest nochmal diese Version probieren. Sollte nun auch ohne last funktionieren (wenn ich nix übersehen hab).
Ich glaube du hast mich falsch verstanden:
Damit
define Depot STOCKQUOTES
set Depot buy 975013 2 80
set Depot verbose 5

funktioniert der refresh.
Nur sind werte wie 975013_d_cur_value_total und die depot_* nahezu alle negativ (vermutlich da _last = 0 ist)

mit attr Deptot sources 975013:unionfunds
gibt es _last
auch werte wie 975013_d_cur_value_total und die depot_* sind korrekt
Allerdings bleibt state auf Updating... stehen und es gibt keine automatische Aktualisierung mehr


letztes Modul mit europe als Quelle:


2015.02.18 18:54:02 4: STOCKQUOTES: Start blocking query
2015.02.18 18:54:02 4: STOCKQUOTES_QueryQuotesBlocking
2015.02.18 18:54:02 4: STOCKQUOTES_QueryQuotesBlocking: Query stockname: 975013 from source europe
2015.02.18 18:54:02 4: STOCKQUOTES_QueryQuotesBlocking: Fetching from source: europe
2015.02.18 18:54:11 1: PERL WARNING: Use of uninitialized value $info{"975013\34last"} in concatenation (.) or string at ./FHEM/98_STOCKQUOTES.pm line 303.
2015.02.18 18:54:11 1: PERL WARNING: Use of uninitialized value $info{"975013\34currency"} in concatenation (.) or string at ./FHEM/98_STOCKQUOTES.pm line 303.
2015.02.18 18:54:11 4: STOCKQUOTES_QueryQuotesBlocking Return value: Depot|975013&exchange&Ber/Bre|975013&previous&49.580|975013&symbol&HTML|975013&method&bourso|975013&isodate&2015-02-18|975013&last&|975013&high&49.580|975013&volume&0|975013&date&02/18/2015|975013&success&1|975013&name&UNIONGELDMARKTF|975013&open&49.560|975013&low&49.560|975013&errormsg&Stock name 975013 not found|975013&p_change&-0.04%|975013¤cy&
2015.02.18 18:54:14 4: STOCKQUOTES_QueryQuotesFinished
2015.02.18 18:54:14 4: STOCKQUOTES_QueueTimer: 150 seconds

das gibt es auch kein last reading
die depot_* redings sind negativ

mit unionfonds folgendes:
2015.02.18 19:05:41 4: STOCKQUOTES: Start blocking query
2015.02.18 19:05:41 4: STOCKQUOTES_QueryQuotesBlocking
2015.02.18 19:05:41 4: STOCKQUOTES_QueryQuotesBlocking: Query stockname: 975013 from source unionfunds
2015.02.18 19:05:41 4: STOCKQUOTES_QueryQuotesBlocking: Fetching from source: unionfunds
2015.02.18 19:05:42 4: STOCKQUOTES_QueryQuotesBlocking Return value: Depot|975013&exchange&UNION|975013&symbol&975013|975013&last&49.60|975013&isodate&2015-02-17|975013&method&unionfunds|975013&date&02/17/2015|975013&price&49.60|975013&success&1|975013&name&975013|975013¤cy&EUR
2015.02.18 19:05:42 4: STOCKQUOTES_QueryQuotesFinished

und kein refresh mehr

Zitat von: vbs am 18 Februar 2015, 18:20:31
Hm, das hat ja nichtmal ein "last"-Feld :/ Alles andere hatte ich eigentl. schon optional gemacht, aber ich hätte gedacht, dass last alle haben. Wo ist denn der Kurs zu finden bei dem Symbol? Denke auch, dass dadurch dann die weitere Verarbeitung in Perl abgebrochen wird.
wie oben beschrieben, hier bricht nichts ab
es gibt nur perl warnings im log und der wert der Wertpapierpakets ist nagativ
ich denke _open kommt dem Wert am nächsten.
Allerdings würde ich sowieso lieber unionfonds verwenden. Dort gibt es _last, und es ist auch der korrekte Wert
Nur funktioniert halt im Zusammenhang mit unionfonds der refresh nicht mehr

Zitat von: vbs am 18 Februar 2015, 18:20:31
Du kannst durchaus per "buy" ein Papier gekauft, welches schon im Depot vorhanden ist. Es *sollte* dann korrekt hinzuaddiert werden und es sollte dann auch ein korrekter Einstandskurs berechnet werden.
ahso
mittelst du diesen dann zwischen beiden Werten?
Zitat von: vbs am 18 Februar 2015, 18:20:31
Hm, würde ungern etwas weglassen von vornherein. Wäre es nicht besser, wenn man readingsGroup oder readingsProxy o.ä. benutzen würde, um sich dann ein gefiltertes Device zu bauen? "Wichtig" liegt auch immer sehr im Auge des Betrachters.
Ja stimmt eigentlich  8)
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