Added remaining trading system around portfolio in order to compare with OANDA.
This commit is contained in:
+23
-15
@@ -1,20 +1,22 @@
|
||||
from copy import deepcopy
|
||||
|
||||
from position import Position
|
||||
from qsforex.event.event import OrderEvent
|
||||
from qsforex.portfolio.position import Position
|
||||
|
||||
|
||||
class Portfolio(object):
|
||||
def __init__(
|
||||
self, ticker, base="GBP", leverage=20,
|
||||
self, ticker, events, base="GBP", leverage=20,
|
||||
equity=100000.0, risk_per_trade=0.02
|
||||
):
|
||||
self.ticker = ticker
|
||||
self.events = events
|
||||
self.base = base
|
||||
self.leverage = leverage
|
||||
self.equity = equity
|
||||
self.balance = deepcopy(self.equity)
|
||||
self.risk_per_trade = risk_per_trade
|
||||
self.trade_units = self.calc_risk_position_size()
|
||||
self.trade_units = 100000#self.calc_risk_position_size()
|
||||
self.positions = {}
|
||||
|
||||
def calc_risk_position_size(self):
|
||||
@@ -76,16 +78,16 @@ class Portfolio(object):
|
||||
|
||||
def execute_signal(self, signal_event):
|
||||
side = signal_event.side
|
||||
market = signal_event.market
|
||||
units = self.risk_per_trade
|
||||
market = signal_event.instrument
|
||||
units = int(self.trade_units)
|
||||
|
||||
# Check side for correct bid/ask prices
|
||||
if side == "LONG":
|
||||
add_price = self.ticker.cur_ask
|
||||
remove_price = self.ticker.cur_bid
|
||||
else:
|
||||
add_price = self.ticker.cur_bid
|
||||
remove_price = self.ticker.cur_ask
|
||||
#if side == "buy":
|
||||
add_price = self.ticker.cur_ask
|
||||
remove_price = self.ticker.cur_bid
|
||||
#else:
|
||||
#add_price = self.ticker.cur_bid
|
||||
#remove_price = self.ticker.cur_ask
|
||||
exposure = float(units)
|
||||
|
||||
# If there is no position, create one
|
||||
@@ -94,10 +96,13 @@ class Portfolio(object):
|
||||
side, market, units, exposure,
|
||||
add_price, remove_price
|
||||
)
|
||||
order = OrderEvent(market, units, "market", "buy")
|
||||
self.events.put(order)
|
||||
# If a position exists add or remove units
|
||||
else:
|
||||
ps = self.positions[market]
|
||||
# Check if the sides equal
|
||||
if side == ps[market].side:
|
||||
if side == ps.side:
|
||||
# Add to the position
|
||||
add_position_units(
|
||||
market, units, exposure,
|
||||
@@ -108,6 +113,8 @@ class Portfolio(object):
|
||||
if units == ps.units:
|
||||
# Close the position
|
||||
self.close_position(market, remove_price)
|
||||
order = OrderEvent(market, units, "market", "sell")
|
||||
self.events.put(order)
|
||||
elif units < ps.units:
|
||||
# Remove from the position
|
||||
self.remove_position_units(
|
||||
@@ -119,12 +126,13 @@ class Portfolio(object):
|
||||
new_units = units - ps.units
|
||||
self.close_position(market, remove_price)
|
||||
|
||||
if side == "LONG":
|
||||
new_side = "SHORT"
|
||||
if side == "buy":
|
||||
new_side = "sell"
|
||||
else:
|
||||
new_side = "LONG"
|
||||
new_side = "sell"
|
||||
new_exposure = float(units)
|
||||
self.add_new_position(
|
||||
new_side, market, new_units,
|
||||
new_exposure, add_price, remove_price
|
||||
)
|
||||
print "Balance: %0.2f" % self.balance
|
||||
Reference in New Issue
Block a user