Börsenticker

Hallo zusammen,

vor einiger Zeit habe ich hier mal eine Anfrage hinsichtlich Börsendaten und Ticker gelesen, leider habe ich es gerade nicht mehr über die Suche gefunden.
Das Thema hatte mich damals schon interessiert und ich habe jetzt eine Lösung dafür gefunden.
Die Daten kann man sich über die Yahoo Finance via CSV abholen:

Yahoo:
Yahoo Finance - Business Finance, Stock Market, Quotes, News
CSV Abholen:
http://finance.yahoo.com/d/quotes.csv?s=AAPL&f=snl1hg
Parameter
s = Wertkennzeichen
f = Finance Tags ( s= Ticker n = Name, l1 = aktuellen Kurs, h = Tageshoch, g Tagestief)

Bei mir sieht das im WebFront dann ungefähr so aus:

Und hier noch ein kleines Script dazu:


<?
################################################################################
# Scriptbezeichnung: Internet.StockExchange.ips.php
# Version:	1.0.20170904
# Author:	Heiko Wilknitz (@Pitti)
#
# Börsenticker:
#	CSV - Yahoo
#		http://finance.yahoo.com/
#			s = Wertkennzeichen
#			f = Finance Tags (	s= Ticker n = Name, l1 = aktuellen Kurs, 
#								h = Tageshoch, g Tagestief)
#		http://finance.yahoo.com/d/quotes.csv?s=AAPL&f=snl1hg
#
#
# Installation:
#	- WKN-Array unter Konfiguration mit den entsprechenden Werten befüllen
#	- Script in der Konsole ausführen
#
# ------------------------------ Konfiguration ---------------------------------
#
$wkn = array(
	"AAPL"  		=> "Apple Inc."
);
#
# ----------------------------------- ID´s -------------------------------------
#
#
################################################################################


if ($_IPS['SENDER'] == "Execute") {
	// ID des ArchiveHandler ermitteln 
	$instances = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}'); 
	$id_archive_handler = $instances[0]; 
	// pro WKN eine Variable
	foreach($wkn as $ident => $name) {
		$vid = CreateVariableByName($_IPS['SELF'], $name, 2 /*Float*/);
		IPS_SetInfo($vid, $ident);
		IPS_SetIcon($vid, "Graph");
		AC_SetLoggingStatus($id_archive_handler, $vid, true);
	}
}


if($_IPS['SENDER'] == "TimerEvent") {
	// alle untergeordneten Objekt einsammeln
	$ids = IPS_GetChildrenIDs($_IPS['SELF']);
	// echo print_r($ids);
	foreach ($ids as $id) {
		// for each Wertkennzeichen daten holen
		$array = IPS_GetObject($id);
		// Float-Variable?
		if ($array['ObjectType'] == 2) {
			$url = 'http://finance.yahoo.com/d/quotes.csv?s='.$array['ObjectInfo'].'&f=snl1hg';
			$req = file_get_contents($url);	// Lesen der Daten.
			$csv   = str_getcsv($req, ",");
			SetValue($id, $csv[2]);
		}		
	}
}	

# ------------------------------ Funktionen ------------------------------------

function CreateVariableByName($id, $name, $type) 
{ 
   $vid = @IPS_GetVariableIDByName($name, $id); 
   if($vid===false) { 
      $vid = IPS_CreateVariable($type); 
      IPS_SetParent($vid, $id); 
      IPS_SetName($vid, $name); 
   } 
   return $vid; 
} 

function CreateEventByName($id, $name, $type) 
{ 
   $eid = @IPS_GetEventIDByName($name, $id); 
   if($eid===false) { 
      $eid = IPS_CreateEvent($type); 
      IPS_SetParent($eid, $id); 
      IPS_SetName($eid, $name); 
   } 
   return $eid; 
}

################################################################################
?>

Ich habe dann noch einen entsprechenden Timer für Mo-Fr von 9-18 Uhr aller 30min angelegt und im WF die Graphen dazu gepackt. Fertig

Viel Spaß
Heiko

Hallo Heiko,

vielen Dank für die Idee. Allerdings hab ich ein kleines Problem. Er legt die Variablen gemäß der WKN-Liste an. Holt auch die Werte bei Yahoo ab, aber er aktualisiert nicht die angelegten Float-Variablen.

<? 
################################################################################ 
# Scriptbezeichnung: Internet.StockExchange.ips.php 
# Version:    1.0.20170904 
# Author:    Heiko Wilknitz (@Pitti) 
# 
# Börsenticker: 
#    CSV - Yahoo 
#        http://finance.yahoo.com/ 
#            s = Wertkennzeichen 
#            f = Finance Tags (    s= Ticker n = Name, l1 = aktuellen Kurs,  
#                                h = Tageshoch, g Tagestief) 
#        http://finance.yahoo.com/d/quotes.csv?s=AAPL&f=snl1hg 
# 
# 
# Installation: 
#    - WKN-Array unter Konfiguration mit den entsprechenden Werten befüllen 
#    - Script in der Konsole ausführen 
# 
# # ------------------------------ Konfiguration --------------------------------- 
# 
$wkn = array(
    "AAPL"            => "Apple",
    "976979.de"       => "DWS Top World");
# 
# ----------------------------------- ID´s ------------------------------------- 
# 
# 
################################################################################ 


if ($_IPS['SENDER'] == "Execute") { 
    // ID des ArchiveHandler ermitteln  
    $instances = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}');  
    $id_archive_handler = $instances[0];  
    // pro WKN eine Variable 
    foreach($wkn as $ident => $name) { 
        $vid = CreateVariableByName($_IPS['SELF'], $name, 2 /*Float*/); 
        IPS_SetInfo($vid, $ident); 
        IPS_SetIcon($vid, "Graph"); 
        AC_SetLoggingStatus($id_archive_handler, $vid, true); 
    } 
} 


if($_IPS['SENDER'] == "TimerEvent") { 
    // alle untergeordneten Objekt einsammeln 
    $ids = IPS_GetChildrenIDs($_IPS['SELF']); 
    // echo print_r($ids); 
    foreach ($ids as $id) { 
        // for each Wertkennzeichen daten holen 
        $array = IPS_GetObject($id); 
        // Float-Variable? 
        if ($array['ObjectType'] == 2) { 
            $url = 'http://finance.yahoo.com/d/quotes.csv?s='.$array['ObjectInfo'].'&f=snl1hg'; 
            $req = file_get_contents($url);    // Lesen der Daten. 
            $csv   = str_getcsv($req, ","); 
            SetValue($id, $csv[2]); 
        }         
    } 
}     

# ------------------------------ Funktionen ------------------------------------ 

function CreateVariableByName($id, $name, $type)  
{  
   $vid = @IPS_GetVariableIDByName($name, $id);  
   if($vid===false) {  
      $vid = IPS_CreateVariable($type);  
      IPS_SetParent($vid, $id);  
      IPS_SetName($vid, $name);  
   }  
   return $vid;  
}  

function CreateEventByName($id, $name, $type)  
{  
   $eid = @IPS_GetEventIDByName($name, $id);  
   if($eid===false) {  
      $eid = IPS_CreateEvent($type);  
      IPS_SetParent($eid, $id);  
      IPS_SetName($eid, $name);  
   }  
   return $eid;  
} 

################################################################################ 

?>

In Deinem Beispiel legt er die Float-Variable „Apple“ an, holt sich die Daten aber in die Variable wird kein Wert übertragen.
Woran kann das liegen? :confused:


Viele Grüße,

Burkhard

P.S.: Fehler werden bei der Ausführung des Script nicht angezeigt.

Hmm, merkwürdig. Bist du schon im Zeitfenster des Timers gewesen? Löst der aus? Haste einfach mal den Timer auf immer aller 5 min gestellt?

Gesendet von iPhone mit Tapatalk

Hallo Heiko,

vielleicht war ich nur zu ungeduldig. Bin gerade nach Hause gekommen und siehe da, die Werte sind aktuell. Vielen Dank für das Script. Läuft also perfekt.

Viele Grüße,

Burkhard

Hallo Heiko,

vielen Dank für das Skript … Läuft perfekt …

Gruß Proxima

Hi zusammen,

freut mich natürlich, Danke!

Ciao Heiko

Gesendet von iPhone mit Tapatalk

Hallo,

funktioniert bei Euch das Script noch ???

Hab seit mehreren Tagen bei sämtlichen Werten 0,00€ in der Variable stehen.

Gruß Proxima

Wenn du die URL aufrufst, dann kannst du lesen warum:

It has come to our attention that this service is being used in violation of the Yahoo Terms of Service. As such, the service is being discontinued. For all future markets and equities data research, please refer to finance.yahoo.com.

Moin,

Ralf hat ja schon die Antwort geliefert. Habe darum alles auf google umgestellt

<?
################################################################################
# Scriptbezeichnung: Internet.StockExchange.ips.php
# Version:	2.0.20171101
# Author:	Heiko Wilknitz (@Pitti)
#
# Börsenticker:
# 	JSON - Google	
# 		https://www.google.com/finance
# 		ETR:xxx => Xetra
# 		FRA:xxx => Frankfurt
# 		https://www.google.com/finance?q=ETR:BMW
# 		https://www.google.com/finance?q=FRA:BMW
#
# Installation:
#	- WKN-Array unter Konfiguration mit den entsprechenden Werten befüllen
#	- Script in der Konsole ausführen
#
# ------------------------------ Konfiguration ---------------------------------
#
$wkn = array(
	"FRA:BMW"		=> "Bayerische Motoren Werke AG"	//google
);
#
# ----------------------------------- ID´s -------------------------------------
#
#
################################################################################


if ($_IPS['SENDER'] == "Execute") {
	// ID des ArchiveHandler ermitteln 
	$instances = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}'); 
	$id_archive_handler = $instances[0]; 
	// pro WKN eine Variable
	foreach($wkn as $ident => $name) {
		$vid = CreateVariableByName($_IPS['SELF'], $name, 2 /*Float*/);
		IPS_SetInfo($vid, $ident);
		IPS_SetIcon($vid, "Graph");
		AC_SetLoggingStatus($id_archive_handler, $vid, true);
	}
}


if($_IPS['SENDER'] == "TimerEvent") {
	// alle untergeordneten Objekt einsammeln
	$ids = IPS_GetChildrenIDs($_IPS['SELF']);
	// echo print_r($ids);
	foreach ($ids as $id) {
		// for each Wertkennzeichen daten holen
		$array = IPS_GetObject($id);
		// Float-Variable?
		if ($array['ObjectType'] == 2) {
			// Yahoo
			//$url = 'http://finance.yahoo.com/d/quotes.csv?s='.$array['ObjectInfo'].'&f=snl1hg';
			//$req = file_get_contents($url);	// Lesen der Daten.
			//$csv   = str_getcsv($req, ",");
			//SetValue($id, $csv[2]);
			
			// Google
			$url = 'https://www.google.com/finance?q='.$array['ObjectInfo'].'&output=json';
			$req = file_get_contents($url, false, NULL, 4);	// Lesen der Daten.
			$dec = json_decode($req, true);
			if($dec[0]["l"] > 0) {
				SetValue($id, $dec[0]["l"]);
			}
		}		
	}
}	

# ------------------------------ Funktionen ------------------------------------

function CreateVariableByName($id, $name, $type) 
{ 
   $vid = @IPS_GetVariableIDByName($name, $id); 
   if($vid===false) { 
      $vid = IPS_CreateVariable($type); 
      IPS_SetParent($vid, $id); 
      IPS_SetName($vid, $name); 
   } 
   return $vid; 
} 

function CreateEventByName($id, $name, $type) 
{ 
   $eid = @IPS_GetEventIDByName($name, $id); 
   if($eid===false) { 
      $eid = IPS_CreateEvent($type); 
      IPS_SetParent($eid, $id); 
      IPS_SetName($eid, $name); 
   } 
   return $eid; 
}

################################################################################
?>

Viel Spaß
Pitti

Danke für die Korrektur auf Google Finance…

Hier mal ein Test von verschiedenen Aktien…

Die Variablen werden angelegt, aber die Werte werden nicht in die Variable geschrieben.

hier mal der angepasste Ausschnitt aus deinem Skript:

$wkn = array( 
    "ETR:SZU"        => "Suedzucker AG",    //suedzucker
	"VIE:PYT"        => "POLYTEC Holding AG", //Polytec
    "ETR:M5Z"        => "Manz AG",    //Manz AG
	"OTCMKTS:BYDDF"        => "BYD COMPANY LTD",    //BYD
); 

Und hier die erstellten Variablen:

Das Ereignis habe ich selbst angelegt. Das Ereignis wurde auch schon mehrfach ausgeführt.

Habt ihr mir dazu eine IDEE?

P.S. IPS darf ins Internet :wink:

Wurde das Script schon per Timer ausgeführt, nicht nur auf der Console?

Sorry, mein Fehler!
Meine 1000 Variablen der IPS Professional Lizenz waren erreicht :slight_smile:
ich habe alte Variablen aufgeräumt, und musste IPS neu starten, damit die Wertpapier Variablen gefüllt werden konnte.

Danke für das super Skript!

Wie gesagt, müssen die Daten per EREIGNIS abgerufen werden.

Aber das ergibt sich ja aus deiner Abfrage „if($_IPS[‚SENDER‘] == „TimerEvent“)“ :wink:

Kann es sein das Dein Array beim letzten Element ein Komma am Ende hat - dürfte aber nicht, oder?

Das habe ich in meinem aufräumwahn gleich auch noch korrigiert :smiley:

D.h. bei mehreren Einträgen sieht dass dann z.B. so aus:

$wkn = array( 
    "ETR:SZU"        => "Suedzucker AG",    //suedzucker
	"VIE:PYT"        => "POLYTEC Holding AG", //Polytec
    "ETR:M5Z"        => "Manz AG",    //Manz AG
	"OTCMKTS:BYDDF"        => "BYD COMPANY LTD"); 

Und, hat es was gebracht?

Wenn nicht, kommentiere doch mal den Part mit „Execute“ aus und nimm die Bedingung für den Timer raus und führ das Script auf der Konsole aus und schau was passiert bzw. ob Fehler kommen!?

Gruß Pitti

Jap, es läuft mit deiner „Timer“ Bedingung einwandfrei.

Ich bastle mir schon Berechnungen zwischen Einstandspreis und aktuellem Kurs :wink:

Supi, dann kannst Du ja Deine Erweiterung - wenn fertig - gern hier teilen :wink:

Ciao Pitti

oje, mein quick & dirty… da muss man sich sogar fremdschämen :smiley:

Was mir noch auffällt, gelegentlich kommt als Kurswert 0 zurück.
Könnte man das noch abfangen, und denn alten Kurs stehen lassen?

Hier mal ein Beispiel:

screen.jpg

Könntest du von deiner WF Zusammenstellung noch ein Screenshot einstellen?
Finde die Aufteilung zu einer Aktie ganz interessant, und der Aufteilung in 4 Bereiche (Stunde/Tag/Woche/Monat…)
BIn nur auf dem Schlauch wie das geht.:banghead:

Das ist ja komisch :confused: Wollte gerade schreiben wie Du auf 0-Werte kommst … und prompt habe ich auch welche.
Habe gerade mal durchgeschaut - fing heute Mittag erst an! Das Script läuft bei mir schon eine Weile ohne jemals ein 0-Wert zu speichern … sehr merkwürdig.

Habe jetzt mal den Test eingebaut, mal schauen ob es hilft:


if($dec[0]["l"] > 0) {
				SetValue($id, $dec[0]["l"]);
			}

Schau mal ob die Bilder Dir helfen!

Viel Erfolg
Pitti

Kannst du das gesamte Skript mit der „if 0“ abfrage mal komplett posten, damit andere dass ebenfalls haben?