187 lines
5.7 KiB
Python
187 lines
5.7 KiB
Python
import unittest
|
|
|
|
#from position import Position
|
|
from portfolio import Portfolio
|
|
|
|
|
|
class TestPortfolio(unittest.TestCase):
|
|
def setUp(self):
|
|
base = "GBP"
|
|
leverage = 20
|
|
equity = 100000.0
|
|
risk_per_trade = 0.02
|
|
ticker = {}
|
|
self.port = Portfolio(
|
|
ticker, base=base, leverage=leverage,
|
|
equity=equity, risk_per_trade=risk_per_trade
|
|
)
|
|
|
|
def test_add_position(self):
|
|
side = "LONG"
|
|
market = "GBP/USD"
|
|
units = 2000
|
|
exposure = float(units)
|
|
add_price = 1.51819
|
|
remove_price = 1.51770
|
|
|
|
self.port.add_new_position(
|
|
side, market, units, exposure,
|
|
add_price, remove_price
|
|
)
|
|
ps = self.port.positions[market]
|
|
|
|
self.assertEquals(ps.side, side)
|
|
self.assertEquals(ps.market, market)
|
|
self.assertEquals(ps.units, units)
|
|
self.assertEquals(ps.exposure, exposure)
|
|
self.assertEquals(ps.avg_price, add_price)
|
|
self.assertEquals(ps.cur_price, remove_price)
|
|
|
|
def test_add_position_units(self):
|
|
side = "LONG"
|
|
market = "GBP/USD"
|
|
units = 2000
|
|
exposure = float(units)
|
|
add_price = 1.51819
|
|
remove_price = 1.51770
|
|
|
|
# Test for no position
|
|
market = "EUR/USD"
|
|
apu = self.port.add_position_units(
|
|
market, units, exposure,
|
|
add_price, remove_price
|
|
)
|
|
self.assertFalse(apu)
|
|
|
|
# Add a position and test for real position
|
|
market = "GBP/USD"
|
|
self.port.add_new_position(
|
|
side, market, units, exposure,
|
|
add_price, remove_price
|
|
)
|
|
ps = self.port.positions[market]
|
|
|
|
# Test for addition of units
|
|
add_price = 1.51928
|
|
remove_price = 1.51878
|
|
apu = self.port.add_position_units(
|
|
market, units, exposure,
|
|
add_price, remove_price
|
|
)
|
|
self.assertTrue(apu)
|
|
self.assertAlmostEqual(ps.avg_price, 1.518735)
|
|
|
|
def test_remove_position_units(self):
|
|
side = "LONG"
|
|
units = 2000
|
|
exposure = float(units)
|
|
add_price = 1.51819
|
|
remove_price = 1.51770
|
|
|
|
# Test for no position
|
|
market = "EUR/USD"
|
|
apu = self.port.remove_position_units(
|
|
market, units, remove_price
|
|
)
|
|
self.assertFalse(apu)
|
|
|
|
# Add a position and then add units to it
|
|
market = "GBP/USD"
|
|
self.port.add_new_position(
|
|
side, market, units, exposure,
|
|
add_price, remove_price
|
|
)
|
|
ps = self.port.positions[market]
|
|
add_price = 1.51928
|
|
remove_price = 1.51878
|
|
add_units = 8000
|
|
add_exposure = float(add_units)
|
|
apu = self.port.add_position_units(
|
|
market, add_units, add_exposure,
|
|
add_price, remove_price
|
|
)
|
|
self.assertEqual(ps.units, 10000)
|
|
self.assertEqual(ps.exposure, 10000.0)
|
|
self.assertAlmostEqual(ps.avg_price, 1.519062)
|
|
|
|
# Test removal of (some) of the units
|
|
add_price = 1.52134
|
|
remove_price = 1.52017
|
|
remove_units = 3000
|
|
rpu = self.port.remove_position_units(
|
|
market, remove_units, remove_price
|
|
)
|
|
self.assertTrue(rpu)
|
|
self.assertEqual(ps.units, 7000)
|
|
self.assertEqual(ps.exposure, 7000.0)
|
|
self.assertAlmostEqual(ps.profit_base, 5.102060953709626)
|
|
self.assertAlmostEqual(self.port.balance, 100002.18659755158)
|
|
|
|
def test_close_position(self):
|
|
side = "LONG"
|
|
units = 2000
|
|
exposure = float(units)
|
|
add_price = 1.51819
|
|
remove_price = 1.51770
|
|
|
|
# Test for no position
|
|
market = "EUR/USD"
|
|
cp = self.port.close_position(
|
|
market, remove_price
|
|
)
|
|
self.assertFalse(cp)
|
|
|
|
# Add a position and then close it
|
|
# Will lose money on the spread
|
|
market = "GBP/USD"
|
|
self.port.add_new_position(
|
|
side, market, units, exposure,
|
|
add_price, remove_price
|
|
)
|
|
ps = self.port.positions[market]
|
|
cp = self.port.close_position(
|
|
market, remove_price
|
|
)
|
|
self.assertTrue(cp)
|
|
self.assertRaises(ps) # Key doesn't exist
|
|
self.assertAlmostEqual(self.port.balance, 99999.35428609079)
|
|
|
|
# Add 2000, add another 8000, remove 3000 and then
|
|
# close the position. Balance should be as expected
|
|
# for a multi-leg transaction.
|
|
self.port.add_new_position(
|
|
side, market, units, exposure,
|
|
add_price, remove_price
|
|
)
|
|
ps = self.port.positions[market]
|
|
add_price = 1.51928
|
|
remove_price = 1.51878
|
|
add_units = 8000
|
|
add_exposure = float(add_units)
|
|
apu = self.port.add_position_units(
|
|
market, add_units, add_exposure,
|
|
add_price, remove_price
|
|
)
|
|
self.assertEqual(ps.units, 10000)
|
|
self.assertEqual(ps.exposure, 10000.0)
|
|
self.assertAlmostEqual(ps.avg_price, 1.519062)
|
|
add_price = 1.52134
|
|
remove_price = 1.52017
|
|
remove_units = 3000
|
|
rpu = self.port.remove_position_units(
|
|
market, remove_units, remove_price
|
|
)
|
|
self.assertEqual(ps.units, 7000)
|
|
self.assertEqual(ps.exposure, 7000.0)
|
|
self.assertAlmostEqual(ps.profit_base, 5.102060953709626)
|
|
self.assertAlmostEqual(self.port.balance, 100001.54088364237)
|
|
cp = self.port.close_position(
|
|
market, remove_price
|
|
)
|
|
self.assertTrue(cp)
|
|
self.assertRaises(ps) # Key doesn't exist
|
|
self.assertAlmostEqual(self.port.balance, 100006.64294459608)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main() |