Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
186 changes: 0 additions & 186 deletions kinetick/broker.py
Original file line number Diff line number Diff line change
Expand Up @@ -294,139 +294,11 @@ def _callback(self, caller, msg, **kwargs):
symbol, orderId, quantity, filled=True)
self._expire_pending_order(symbol, orderId)
self._cancel_orphan_orders(orderId)
self._register_trade(order)

# filled
time.sleep(0.005)
self.on_fill(self.get_instrument(order['symbol']), order)

# ---------------------------------------
def _register_trade(self, order):
""" constructs trade info from order data """
if order['id'] in self.orders.recent:
orderId = order['id']
else:
orderId = order['parentId']
# entry / exit?
symbol = order["symbol"]
order_data = self.orders.recent[orderId]
position = self.get_positions(symbol)['position']

if position != 0:
# entry
order_data['action'] = "ENTRY"
order_data['position'] = position
order_data['entry_time'] = datetime_to_timezone(
order['time'])
order_data['exit_time'] = None
order_data['entry_order'] = order_data['order_type']
order_data['entry_price'] = order['avgFillPrice']
order_data['exit_price'] = 0
order_data['exit_reason'] = None

else:
order_data['action'] = "EXIT"
order_data['position'] = 0
order_data['exit_time'] = datetime_to_timezone(order['time'])
order_data['exit_price'] = order['avgFillPrice']

# target / stop?
if order['id'] == order_data['targetOrderId']:
order_data['exit_reason'] = "TARGET"
elif order['id'] == order_data['stopOrderId']:
order_data['exit_reason'] = "STOP"
else:
order_data['exit_reason'] = "SIGNAL"

# remove from collection
del self.orders.recent[orderId]

if order_data is None:
return None

# trade identifier
tradeId = self.strategy.upper() + '_' + symbol.upper()
tradeId = hashlib.sha1(tradeId.encode()).hexdigest()

# existing trade?
if tradeId not in self.active_trades:
self.active_trades[tradeId] = {
"strategy": self.strategy,
"action": order_data['action'],
"quantity": abs(order_data['position']),
"position": order_data['position'],
"symbol": order_data["symbol"].split('_')[0],
"direction": order_data['direction'],
"entry_time": None,
"exit_time": None,
"duration": "0s",
"exit_reason": order_data['exit_reason'],
"order_type": order_data['order_type'],
"market_price": order_data['price'],
"target": order_data['target'],
"stop": order_data['initial_stop'],
"entry_price": 0,
"exit_price": order_data['exit_price'],
"realized_pnl": 0
}
if "entry_time" in order_data:
self.active_trades[tradeId]["entry_time"] = order_data['entry_time']
if "entry_price" in order_data:
self.active_trades[tradeId]["entry_price"] = order_data['entry_price']
else:
# self.active_trades[tradeId]['direction'] = order_data['direction']
self.active_trades[tradeId]['action'] = order_data['action']
self.active_trades[tradeId]['position'] = order_data['position']
self.active_trades[tradeId]['exit_price'] = order_data['exit_price']
self.active_trades[tradeId]['exit_reason'] = order_data['exit_reason']
self.active_trades[tradeId]['exit_time'] = order_data['exit_time']

# calculate trade duration
try:
delta = int((self.active_trades[tradeId]['exit_time'] -
self.active_trades[tradeId]['entry_time']).total_seconds())
days, remainder = divmod(delta, 86400)
hours, remainder = divmod(remainder, 3600)
minutes, seconds = divmod(remainder, 60)
duration = ('%sd %sh %sm %ss' %
(days, hours, minutes, seconds))
self.active_trades[tradeId]['duration'] = duration.replace(
"0d ", "").replace("0h ", "").replace("0m ", "")
except Exception as e:
pass

trade = self.active_trades[tradeId]
if trade['entry_price'] > 0 and trade['position'] == 0:
if trade['direction'] == "SELL":
pnl = trade['entry_price'] - trade['exit_price']
else:
pnl = trade['exit_price'] - trade['entry_price']

pnl = utils.to_decimal(pnl)
# print("1)", pnl)
self.active_trades[tradeId]['realized_pnl'] = pnl

# print("\n\n-----------------")
# print(self.active_trades[tradeId])
# print("-----------------\n\n")

# get trade
trade = self.active_trades[tradeId].copy()

# rename trade direction
trade['direction'] = trade['direction'].replace(
"BUY", "LONG").replace("SELL", "SHORT")

# log
self.log_trade(trade)

# remove from active trades and add to trade
if trade['action'] == "EXIT":
del self.active_trades[tradeId]
self.trades.append(trade)

# return trade
return trade

# ---------------------------------------
def log_trade(self, trade):
Expand Down Expand Up @@ -783,64 +655,6 @@ def get_orders(self, symbol):

return {}

# ---------------------------------------
def get_positions(self, symbol):
symbol = self.get_symbol(symbol)

if self.backtest:
position = 0
avgCost = 0.0

if self.datastore.recorded is not None:
data = self.datastore.recorded
col = symbol.upper() + '_POSITION'
position = data[col].values[-1]
if position != 0:
pos = data[col].diff()
avgCost = data[data.index.isin(pos[pos != 0][-1:].index)
][symbol.upper() + '_OPEN'].values[-1]
return {
"symbol": symbol,
"position": position,
"avgCost": avgCost,
"account": "Backtest"
}

elif symbol in self.broker.positions:
return self.broker.positions[symbol]

return {
"symbol": symbol,
"position": 0,
"avgCost": 0.0,
"account": None
}

# ---------------------------------------
def get_portfolio(self, symbol=None):
raise Exception("Not supported")
# if symbol is not None:
# symbol = self.get_symbol(symbol)
#
# if symbol in self.zerodha.portfolio:
# portfolio = self.zerodha.portfolio[symbol]
# if "symbol" in portfolio:
# return portfolio
#
# return {
# "symbol": symbol,
# "position": 0.0,
# "marketPrice": 0.0,
# "marketValue": 0.0,
# "averageCost": 0.0,
# "unrealizedPNL": 0.0,
# "realizedPNL": 0.0,
# "totalPNL": 0.0,
# "account": None
# }
#
# return self.zerodha.portfolio

# ---------------------------------------
def get_pending_orders(self, symbol=None):
if symbol is not None:
Expand Down
Loading