def exit_trades(self, signals, price_df):
"""
This function applies the exit criteria.
:param signals: ndarray
the signals array
:param price_df:
ohlc dataframe
:return:
"""
atr = talib.ATR(np.array(price_df['high']), np.array(price_df['low']),
np.array(price_df['close']),
timeperiod=self.atr_stops_period)
log.info('Starting to calculate profit/loss')
price_df['atr'] = atr
price = price_df['close'].values
entries = np.zeros_like(atr)
exits = np.zeros_like(atr)
profits = np.zeros_like(atr)
units = np.zeros_like(atr)
commission = np.zeros_like(atr)
_exit = 0
# Calculate profit, entry/exit (hold time) based on atr criteria
# In this loop we make sure there are no overlapping trades
for i, s in enumerate(signals):
if np.isnan(price_df.ix[i, ['atr']].values[0]):
signals[i] = 0
continue
if s and _exit <= i:
_exit, profit, unit = self._exit_trailing_atr(price_df, i, s)
entries[i] = i
exits[i] = _exit
# subtract commision from profit
profits[i] = profit
commission[i] = (unit * (price[i] +
price[_exit])) * self.commission
units[i] = unit
else:
signals[i] = 0
exits_df = pd.DataFrame({'entries': entries,
'exits': exits,
'profits': profits,
'commission': commission,
'units': units,
'signal': signals},
index=price_df.index)
price_df = price_df.join(exits_df)
return price_df
评论列表
文章目录