Währungen automatisch aktualisieren / Mathematisches Problem

Mik3e

Erfahrenes Mitglied
Guten Morgen,

Ich stehe vor einem kleine Problem (eher mathematischer Natur).
Es gibt einen Produktkatalog in dem Produkte und Preise gespeichert sind.

Beispiel für den Produktkatalog:
Produkt................Preis
RAM 128MB.........20.00
RAM 256MB.........40.00
CPU Intel..............70.00
etc.

Die Preise sind eigentlich ein "virtueller" Wert ohne eindeutige Währung. Für die Währungen gibt es wieder eine eigene Tabelle, in der die Wechselkurse gespeichert sind, mit denen dann der Preis multipliziert wird.

Beispiel für die Währungstabelle:
Währung...............Wechselkurs
Euro.....................1.000000
US Dollar..............1.169200
Pound Sterling.......0.679500
etc.

Wählt der Benutzer nun die Währung Euro, sieht er für die Produkte folgende Preise (Multiplikator = 1.00000):
Preise wenn Euro gewählt:
RAM 128MB.........20.00 x 1.000 = € 20.00
RAM 256MB.........40.00 x 1.000 = € 40.00
CPU Intel..............70.00 x 1.000 = € 70.00

Wählt der Benutzer die Währung US Dollar, bekommt er logischerweise folgende Preise (Multiplikator: 1.169200):
Preise wenn US Dollar gewählt:
RAM 128MB.........20.00 x 1.1692 = $ 23.38
RAM 256MB.........40.00 x 1.1692 = $ 46,77
CPU Intel..............70.00 x 1.1692 = $ 81,84

D.h., wenn der Administrator die Preise in Euro erfassen möchte, sollte der Wechselkurs für Euro genau 1.0000 sein (logisch).

Nun kann es aber auch sein, dass er die Preise in US Dollar erfassen möchte. Daher setzt er den Wechselkurs für US Dollar auf 1.0000 und passt die anderen Währungen an:
Wechselkurs wenn die Preise in US Dollar erfasst werden sollen:
Währung...............Wechselkurs
Euro.....................= 1.0000 / 1.169200 = 0.855286
US Dollar..............1.0000
Pound Sterling.......= 0.679500 / 1.169200 = 0.58117

DAS EIGENTLICHE PROBLEM:
Die gesamten Wechselkurse werden 1x täglich (optional) automatisch aktualisiert. Dafür verwende ich die Wechselkurs der ECB (Europäische Zentralbank). Die stellt die aktuellen Kurse netterweise bequem in Form eines XML Files zur Verfügung: http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml

Da es sich um die Europäische Zentralbank handelt, werden natürlich alle Kurse auf den Euro referenziert. D.h. Euro ist immer = 1.0000 und alle anderen Währungen werden darauf referenziert.

ICH BRAUCHE FOLGENDE LÖSUNG:
Solange Euro in meiner Währungstabelle 1.0000 ist, kann ich die Wechselkurse ja ganz simpel aus dem XML File mappen (1:1 übernehmen).
ABER: Ist nun z.B. US Dollar mit 1.000 festgelegt, habe ich das Problem, dass sich dieser Kurs in meiner Währungstabelle natürlich nicht ändern darf.
Nachdem ich kein mathematisches Genie bin, brauche ich nun eine Lösung, die mir die Wechselkurse korrekt aktualisiert, abhängig von den festgelegten Werten....
Ist wahrscheinlich eine einfache Schlussrechnung, aber ich steh im Moment ein wenig auf der Leitung...

Danke im Voraus für Eure Hilfe,
Ciao,
Mike
 
dumme Frage aber wieso referenzierst du nicht alle Eingaben auf Euro?
Wenn ein Preis in US Dollar angegeben wird wird er auf Euro umgerechnet und eingetragen.
Denkbar wäre ein eigenes Feld welches angibt in welchem Format (Währund) der Preis eingetragen wurde.
Ich kenne natürlich deine Datenbankstrukturen nicht aber ich stelle mir das so lösbar vor.
 
Hi,

Zu Deinem ersten Vorschlag:
Referenzieren auf Euro ist nicht möglich, da sich natürlich alle Kurse permanent ändern. Abgesehen davon, benötigst Du eine Standard-Währung, deren Kurs immer konstant sein sollte.

Wenn Du als Referenzwährung Euro hast, muss der Kurs natürlich immer 1,000 sein und die Preise in den anderen Währungen müssen sich anpassen (variieren).

Und das berechnen der Preise auf eine Referenzwährung geht natürlich auch nicht, da sich die Kurse ändern. Angenommen der Betreiber erfasst die Preise zuerst in Euro und steigt dann aber auf USD um, dann stimmt das zwar zuerst, nach kurzer Zeit sind die Preise aber natürlich nicht mehr korrekt, da der Wechselkurs des Euro ständig variiert...

Daher ist die Variante die ich gewählt habe für diesen Zweck auch die Beste, jedoch fehlt mir im Moment mein mathematisches Verständnis für die automatische Umrechnung (Wenn eine ander Währung als Euro als Referenzwährung definiert ist) :o)

Ciao,
Mike
 
Ist doch im Prinzip ganz einfach :)

PHP:
<?php

$wechselkurse = array(
	'EUR' => 1.00,
	'USD' => 1.1701,
	'GBP' => 0.68465,
	/* ... */
);

function konvertiereWaehrung($wert, $von, $zu)
{
	global $wechselkurse;

	if ($von == $zu) return $wert;
	else return $wert / $wechselkurse[$von] * $wechselkurse[$zu];
}


$artikel = array(
	array(
		'preis' => 123.45,
		'währung' => 'EUR'
	),
	array(
		'preis' => 765.43,
		'währung' => 'USD'
	),
	array(
		'preis' => 1337.42,
		'währung' => 'GBP'
	),
);

$zielwaehrung = 'USD';

foreach ($artikel as $n => $art) {
	echo 'Artikel '.$n.': ';
	echo $art['preis'].' '.$art['währung'];
	echo ' ('.konvertiereWaehrung($art['preis'], $art['währung'], $zielwaehrung).' '.$zielwaehrung.')<br />'."\n";
}

?>
 
Hi,

Danke :o)
Ich habe nur einen groben Fehler begangen:
Man kann/darf die Währungen natürlich nicht einfach umrechnen! Es gibt ja sowas wie Devisen/Valuten :)

D.h. ich brauche für jede Referenzwährung eine eigene Datenquelle...
Ich habe folgendes bei der NY Bank gefunden:
http://www.newyorkfed.org/markets/pilotfx.html

Leider habe ich mich mit SOAP noch nie beschäftigt...
Kennt irgendjemand zufällig eine ander Seite (Bank/Börse) über die man die aktuellen Währungskurse z.B. per XML abrufen kann? Das Service muss kostenlos sein...

Am schönsten wäre:
usd.xml
euro.xml
gbp.xml
etc. :o)

Ciao,
Mike
 
Mik3e hat gesagt.:
Man kann/darf die Währungen natürlich nicht einfach umrechnen! Es gibt ja sowas wie Devisen/Valuten :)
Jein.
Es gibt viele Wege, um von einer Währung zu einer anderen zu gelangen. Das machen sich zum Beispiel Banken zunutze, wenn sie Devisenarbitrage betreiben (ich vermute vollautomatisch). Ebenso entstehen Arbitragegewinne natürlich durch Devisenhandel an verschiedenen Märkten.
Als Händler solltest Du zu einem Kurs rechnen, zu dem Du auch tauschen kannst, also nicht irgendeinen, der gerade in New York gültig ist, wenn Deine Bank in Frankfurt sitzt.
Noch ein bisschen Hintergrund:
Durch Devisenarbitrage entstehen theoretisch binnen Sekunden auf allen Märkten/Handelsplätzen gleiche Preise, sprich Wechselkurse, sowohl zwischen zwei Währungen, als auch mit dem Wechsel über eine oder mehr weitere Währungen. Es herrscht also theoretisch auf diesen Märkten ein vollkommener Markt.
Die Theorie wird selbstverständlich durch die Praxis gestört. Durch Transaktionskosten, die auch die großen, elektronisch agierenden, Banken haben, gibt es immer Differenzen. Auch die Arbitrage über mehrere Märkte oder Währungen findet ihre Grenzen im Optimiereungspotential durch die Rechenleistung der Differenzen aufspürenden Computer.
Als Händler oder gar Privatperson stehen die Kurse ohnehin schlechter, als an den Märkten.

Ich würde auf einen automatischen Abgleich verzichten, da Deine ganze Kalkulation explodiert, wenn sich in dem geladenen File oder in Deinem auslesenden Skript ein kleiner Fehler befindet. Außerdem gibt es Währungen, die die Tendenz zur Inflation oder plötzlichen Kurssprüngen haben.
Du solltest IMHO auf jeden Fall einen Mechanismus einbauen, der bei starken Schwankungen Alarm schlägt, so dass der Kurs manuell überprüft werden kann, bevor er blind übernommen wird.
Außerdem wäre es sinnvoll, vorerst zu ermitteln, ob die eingelesenen Kurse überhaupt lokal realisiert werden können. Damit meine ich, dass Du bevor das System an den Start geht, statistisch überprüfst, in wie weit die erhaltenen Kurse mit den realisierbaren Kursen korrelieren, so dass Du ggf. Korrektursummanden und -faktoren einführen kannst.

Ich will Dir jetzt den Spaß nicht verderben, aber gerade bei so sensiblen Daten sollte man vorsichtig sein, von wem man sie erhält und vor allem, wie (hier auch wo) sie ermittelt wurden.

Gruß hpvw
 
Zuletzt bearbeitet:
Hi,

Ja, da hast Du natürlich recht... Aber ein wenig denke ich schon mit :) Der User hat natürlich die Möglichkeit die Kurse auch manuell zu korrigieren... Aber eine andere Möglichkeit sehe ich nicht. Selbst wenn er sie manuell nach seiner Hausbank setzt, kann er diese Wahrscheinlich alle paar Stunden aktualisieren...

Hier noch für alle anderen: Gerade heute (was für ein Zufall) wurde die Service_ExchangeRates Klasse im PEAR Framework in einer beta released (bisher alpha)...

http://pear.php.net/package/Services_ExchangeRates

Ciao,
Mike
 
Zurück