Skip to content
Snippets Groups Projects
Commit e64523e1 authored by Fabian Schuh's avatar Fabian Schuh
Browse files

[price] fix multiplication of prices

parent ff7178c1
No related branches found
No related tags found
No related merge requests found
...@@ -238,14 +238,24 @@ class Price(dict): ...@@ -238,14 +238,24 @@ class Price(dict):
a = self.copy() a = self.copy()
if isinstance(other, Price): if isinstance(other, Price):
# Rotate/invert other # Rotate/invert other
if self["quote"]["symbol"] in other.symbols(): if (
other = other.as_quote(self["quote"]["symbol"]) self["quote"]["symbol"] not in other.symbols() and
elif self["base"]["symbol"] in other.symbols(): self["base"]["symbol"] not in other.symbols()
other = other.as_quote(self["base"]["symbol"]) ):
else:
raise InvalidAssetException raise InvalidAssetException
a["base"] = Amount(float(self["base"] * other["base"]), other["base"]["symbol"])
a["quote"] = Amount(float(self["quote"] * other["quote"]), self["quote"]["symbol"]) # base/quote = a/b
# a/b * b/c = a/c
a = self.copy()
if self["quote"]["symbol"] == other["base"]["symbol"]:
a["base"] = Amount(float(self["base"]) * float(other["base"]), self["base"]["symbol"])
a["quote"] = Amount(float(self["quote"]) * float(other["quote"]), other["quote"]["symbol"])
# a/b * c/a = c/b
elif self["base"]["symbol"] == other["quote"]["symbol"]:
a["base"] = Amount(float(self["base"]) * float(other["base"]), other["base"]["symbol"])
a["quote"] = Amount(float(self["quote"]) * float(other["quote"]), self["quote"]["symbol"])
else:
raise ValueError("Wrong rotation of prices")
elif isinstance(other, Amount): elif isinstance(other, Amount):
assert other["asset"]["id"] == self["quote"]["asset"]["id"] assert other["asset"]["id"] == self["quote"]["asset"]["id"]
a = other.copy() * self["price"] a = other.copy() * self["price"]
......
...@@ -35,14 +35,14 @@ class Testcases(unittest.TestCase): ...@@ -35,14 +35,14 @@ class Testcases(unittest.TestCase):
def test_multiplication(self): def test_multiplication(self):
p1 = Price(10.0, "USD/GOLD") p1 = Price(10.0, "USD/GOLD")
p2 = Price(5.0, "USD/EUR") p2 = Price(5.0, "EUR/USD")
p3 = p1 * p2 p3 = p1 * p2
p4 = p3.as_base("GOLD") p4 = p3.as_base("GOLD")
self.assertEqual(p4["quote"]["symbol"], "EUR") self.assertEqual(p4["quote"]["symbol"], "EUR")
self.assertEqual(p4["base"]["symbol"], "GOLD") self.assertEqual(p4["base"]["symbol"], "GOLD")
# 10 USD/GOLD * 0.2 EUR/USD = 2 EUR/GOLD = 0.5 GOLD/EUR # 10 USD/GOLD * 0.2 EUR/USD = 50 EUR/GOLD = 0.02 GOLD/EUR
self.assertEqual(float(p4), 0.5) self.assertEqual(float(p4), 0.02)
# Inline multiplication # Inline multiplication
p5 = p1 p5 = p1
...@@ -50,8 +50,8 @@ class Testcases(unittest.TestCase): ...@@ -50,8 +50,8 @@ class Testcases(unittest.TestCase):
p4 = p5.as_base("GOLD") p4 = p5.as_base("GOLD")
self.assertEqual(p4["quote"]["symbol"], "EUR") self.assertEqual(p4["quote"]["symbol"], "EUR")
self.assertEqual(p4["base"]["symbol"], "GOLD") self.assertEqual(p4["base"]["symbol"], "GOLD")
# 10 USD/GOLD * 0.2 EUR/USD = 2 EUR/GOLD = 0.5 GOLD/EUR # 10 USD/GOLD * 0.2 EUR/USD = 2 EUR/GOLD = 0.02 GOLD/EUR
self.assertEqual(float(p4), 0.5) self.assertEqual(float(p4), 0.02)
def test_div(self): def test_div(self):
p1 = Price(10.0, "USD/GOLD") p1 = Price(10.0, "USD/GOLD")
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment