230 lines
8.3 KiB
Python
230 lines
8.3 KiB
Python
from decimal import Decimal
|
|
import unittest
|
|
|
|
from position import Position
|
|
|
|
|
|
class TickerMock(object):
|
|
"""
|
|
A mock object that allows a representation of the
|
|
ticker/pricing handler.
|
|
"""
|
|
|
|
def __init__(self):
|
|
self.pairs = ["GBPUSD", "EURUSD"]
|
|
self.prices = {
|
|
"GBPUSD": {"bid": Decimal("1.50328"), "ask": Decimal("1.50349")},
|
|
"USDGBP": {"bid": Decimal("0.66521"), "ask": Decimal("0.66512")},
|
|
"EURUSD": {"bid": Decimal("1.07832"), "ask": Decimal("1.07847")}
|
|
}
|
|
|
|
|
|
|
|
# =====================================
|
|
# GBP Home Currency with GBP/USD traded
|
|
# =====================================
|
|
|
|
class TestLongGBPUSDPosition(unittest.TestCase):
|
|
"""
|
|
Unit tests that cover going long GBP/USD with an account
|
|
denominated currency of GBP, using 2,000 units of GBP/USD.
|
|
"""
|
|
def setUp(self):
|
|
home_currency = "GBP"
|
|
position_type = "long"
|
|
currency_pair = "GBPUSD"
|
|
units = Decimal("2000")
|
|
ticker = TickerMock()
|
|
self.position = Position(
|
|
home_currency, position_type,
|
|
currency_pair, units, ticker
|
|
)
|
|
|
|
def test_calculate_init_pips(self):
|
|
pos_pips = self.position.calculate_pips()
|
|
self.assertEqual(pos_pips, Decimal("-0.00021"))
|
|
|
|
def test_calculate_init_profit_base(self):
|
|
profit_base = self.position.calculate_profit_base()
|
|
self.assertEqual(profit_base, Decimal("-0.27939"))
|
|
|
|
def test_calculate_init_profit_perc(self):
|
|
profit_perc = self.position.calculate_profit_perc()
|
|
self.assertEqual(profit_perc, Decimal("-0.01397"))
|
|
|
|
def test_calculate_updated_values(self):
|
|
"""
|
|
Check that after the bid/ask prices move, that the updated
|
|
pips, profit and percentage profit calculations are correct.
|
|
"""
|
|
prices = self.position.ticker.prices
|
|
prices["GBPUSD"] = {"bid": Decimal("1.50486"), "ask": Decimal("1.50586")}
|
|
prices["USDGBP"] = {"bid": Decimal("0.66451"), "ask": Decimal("0.66407")}
|
|
self.position.update_position_price()
|
|
|
|
# Check pips
|
|
pos_pips = self.position.calculate_pips()
|
|
self.assertEqual(pos_pips, Decimal("0.00137"))
|
|
# Check profit base
|
|
profit_base = self.position.calculate_profit_base()
|
|
self.assertEqual(profit_base, Decimal("1.82076"))
|
|
# Check profit percentage
|
|
profit_perc = self.position.calculate_profit_perc()
|
|
self.assertEqual(profit_perc, Decimal("0.09104"))
|
|
|
|
|
|
class TestShortGBPUSDPosition(unittest.TestCase):
|
|
"""
|
|
Unit tests that cover going short GBP/USD with an account
|
|
denominated currency of GBP, using 2,000 units of GBP/USD.
|
|
"""
|
|
def setUp(self):
|
|
home_currency = "GBP"
|
|
position_type = "short"
|
|
currency_pair = "GBPUSD"
|
|
units = Decimal("2000")
|
|
ticker = TickerMock()
|
|
self.position = Position(
|
|
home_currency, position_type,
|
|
currency_pair, units, ticker
|
|
)
|
|
|
|
def test_calculate_init_pips(self):
|
|
pos_pips = self.position.calculate_pips()
|
|
self.assertEqual(pos_pips, Decimal("-0.00021"))
|
|
|
|
def test_calculate_init_profit_base(self):
|
|
profit_base = self.position.calculate_profit_base()
|
|
self.assertEqual(profit_base, Decimal("-0.27935"))
|
|
|
|
def test_calculate_init_profit_perc(self):
|
|
profit_perc = self.position.calculate_profit_perc()
|
|
self.assertEqual(profit_perc, Decimal("-0.01397"))
|
|
|
|
def test_calculate_updated_values(self):
|
|
"""
|
|
Check that after the bid/ask prices move, that the updated
|
|
pips, profit and percentage profit calculations are correct.
|
|
"""
|
|
prices = self.position.ticker.prices
|
|
prices["GBPUSD"] = {"bid": Decimal("1.50486"), "ask": Decimal("1.50586")}
|
|
prices["USDGBP"] = {"bid": Decimal("0.66451"), "ask": Decimal("0.66407")}
|
|
self.position.update_position_price()
|
|
|
|
# Check pips
|
|
pos_pips = self.position.calculate_pips()
|
|
self.assertEqual(pos_pips, Decimal("-0.00258"))
|
|
# Check profit base
|
|
profit_base = self.position.calculate_profit_base()
|
|
self.assertEqual(profit_base, Decimal("-3.42660"))
|
|
# Check profit percentage
|
|
profit_perc = self.position.calculate_profit_perc()
|
|
self.assertEqual(profit_perc, Decimal("-0.17133"))
|
|
|
|
|
|
# =====================================
|
|
# GBP Home Currency with EUR/USD traded
|
|
# =====================================
|
|
|
|
class TestLongEURUSDPosition(unittest.TestCase):
|
|
"""
|
|
Unit tests that cover going long EUR/USD with an account
|
|
denominated currency of GBP, using 2,000 units of EUR/USD.
|
|
"""
|
|
def setUp(self):
|
|
home_currency = "GBP"
|
|
position_type = "long"
|
|
currency_pair = "EURUSD"
|
|
units = Decimal("2000")
|
|
ticker = TickerMock()
|
|
self.position = Position(
|
|
home_currency, position_type,
|
|
currency_pair, units, ticker
|
|
)
|
|
|
|
def test_calculate_init_pips(self):
|
|
pos_pips = self.position.calculate_pips()
|
|
self.assertEqual(pos_pips, Decimal("-0.00015"))
|
|
|
|
def test_calculate_init_profit_base(self):
|
|
profit_base = self.position.calculate_profit_base()
|
|
self.assertEqual(profit_base, Decimal("-0.19956"))
|
|
|
|
def test_calculate_init_profit_perc(self):
|
|
profit_perc = self.position.calculate_profit_perc()
|
|
self.assertEqual(profit_perc, Decimal("-0.00998"))
|
|
|
|
def test_calculate_updated_values(self):
|
|
"""
|
|
Check that after the bid/ask prices move, that the updated
|
|
pips, profit and percentage profit calculations are correct.
|
|
"""
|
|
prices = self.position.ticker.prices
|
|
prices["GBPUSD"] = {"bid": Decimal("1.50486"), "ask": Decimal("1.50586")}
|
|
prices["USDGBP"] = {"bid": Decimal("0.66451"), "ask": Decimal("0.66407")}
|
|
prices["EURUSD"] = {"bid": Decimal("1.07811"), "ask": Decimal("1.07827")}
|
|
self.position.update_position_price()
|
|
|
|
# Check pips
|
|
pos_pips = self.position.calculate_pips()
|
|
self.assertEqual(pos_pips, Decimal("-0.00036"))
|
|
# Check profit base
|
|
profit_base = self.position.calculate_profit_base()
|
|
self.assertEqual(profit_base, Decimal("-0.47845"))
|
|
# Check profit percentage
|
|
profit_perc = self.position.calculate_profit_perc()
|
|
self.assertEqual(profit_perc, Decimal("-0.02392"))
|
|
|
|
|
|
class TestLongEURUSDPosition(unittest.TestCase):
|
|
"""
|
|
Unit tests that cover going short EUR/USD with an account
|
|
denominated currency of GBP, using 2,000 units of EUR/USD.
|
|
"""
|
|
def setUp(self):
|
|
home_currency = "GBP"
|
|
position_type = "short"
|
|
currency_pair = "EURUSD"
|
|
units = Decimal("2000")
|
|
ticker = TickerMock()
|
|
self.position = Position(
|
|
home_currency, position_type,
|
|
currency_pair, units, ticker
|
|
)
|
|
|
|
def test_calculate_init_pips(self):
|
|
pos_pips = self.position.calculate_pips()
|
|
self.assertEqual(pos_pips, Decimal("-0.00015"))
|
|
|
|
def test_calculate_init_profit_base(self):
|
|
profit_base = self.position.calculate_profit_base()
|
|
self.assertEqual(profit_base, Decimal("-0.19954"))
|
|
|
|
def test_calculate_init_profit_perc(self):
|
|
profit_perc = self.position.calculate_profit_perc()
|
|
self.assertEqual(profit_perc, Decimal("-0.00998"))
|
|
|
|
def test_calculate_updated_values(self):
|
|
"""
|
|
Check that after the bid/ask prices move, that the updated
|
|
pips, profit and percentage profit calculations are correct.
|
|
"""
|
|
prices = self.position.ticker.prices
|
|
prices["GBPUSD"] = {"bid": Decimal("1.50486"), "ask": Decimal("1.50586")}
|
|
prices["USDGBP"] = {"bid": Decimal("0.66451"), "ask": Decimal("0.66407")}
|
|
prices["EURUSD"] = {"bid": Decimal("1.07811"), "ask": Decimal("1.07827")}
|
|
self.position.update_position_price()
|
|
|
|
# Check pips
|
|
pos_pips = self.position.calculate_pips()
|
|
self.assertEqual(pos_pips, Decimal("0.00005"))
|
|
# Check profit base
|
|
profit_base = self.position.calculate_profit_base()
|
|
self.assertEqual(profit_base, Decimal("0.06641"))
|
|
# Check profit percentage
|
|
profit_perc = self.position.calculate_profit_perc()
|
|
self.assertEqual(profit_perc, Decimal("0.00332"))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main() |