execution at the next available price
I'm testing a strategy with multiple stocks some of which have missing data for the next day after the buy order is submitted. Is it possible to execute a buy order on the first available price (skip days with missing data)? Should be something straightforward that I'm missing... I'm using by own datafeeds (daily bars) if this matters.
Orders in the daily timeframe are executed when the next "date" (ie: bar) shows up.
Yes, right, but how does this work with multiple stocks? Say, on day 1 I submit the buy order for stocks A and B. A has data on day 2, while B only has data on day 3. So, I want the order for A to be executed on day 2 and the order for B to be executed on day 3. But what I get is both orders being executed on day 3. I guess my ultimate question is how to make datafeeds for different stocks kind of independent of each other? Right now I feel that all datafeeds for different stocks are inner-merged on common nonmissing dates and the days that have data for some stocks but not for the others are dropped. Is this the intended feature or am I doing something wrong?
The orders have an associated target (the data feed) and they will only be executed when the data feed moves forward.
I guess my ultimate question is how to make datafeeds for different stocks kind of independent of each other?
They are already independent.
Right now I feel that all datafeeds for different stocks are inner-merged on common nonmissing dates and the days that have data for some stocks but not for the others are dropped
Nothing is merged.
Is this the intended feature or am I doing something wrong?
Without some simple code to replicate what you are doing, nothing can be really said.
Thanks, good to know that it is supposed to work how I need it to work. Could you please help me to understand what I'm doing wrong then?
That's how I feed the data. My dataframe is ohlc, with security, date, and OHLCV columns.
for s in ohlc.security.unique().tolist(): data_df = ohlc[ohlc.security == s].copy() data = bt.feeds.PandasData(dataname = data_df, name = s, datetime= data_df.columns.get_loc('date'), open= data_df.columns.get_loc('Price_open'), close= data_df.columns.get_loc('Price'), high = data_df.columns.get_loc('Price_high'), low= data_df.columns.get_loc('Price_low'), volume = data_df.columns.get_loc('Volume')) cerebro.adddata(data)
The dummy strategy I'm testing is buy and hold all securities at the beginning of the period.
class BH_strategy(bt.Strategy): def __init__(self): self.first_day = True self.stocks = self.getdatanames() def next(self): if self.first_day: for s in self.stocks: self.order_target_percent(target=0.01, data = self.getdatabyname(s)) self.first_day = False
The notify_order method is taken from the introduction tutorial and I didn't change anything in it:
def notify_order(self, order): if order.status in [order.Submitted, order.Accepted]: return if order.status in [order.Completed]: if order.isbuy(): self.log('BUY EXECUTED, %.2f' % order.executed.price) elif order.issell(): self.log('SELL EXECUTED, %.2f' % order.executed.price) self.bar_executed = len(self) elif order.status in [order.Canceled, order.Margin, order.Rejected]: self.log('Order Canceled/Margin/Rejected') self.order = None
The first date in my dataset is 2012-01-01. And I have data for some stocks on 2012-01-02. But when I run the backtester, I get all orders executed on 2012-01-03.
Execution date may seem obvious to you, but see:
There are no data samples (the first 3 days of 2 data feeds would be enough)
notify_orderdoesn't show when the orders have been executed and there is no log of what it has actually printed.
An obvious question would be: how do you know when the orders were executed?
A working example (in case there is really a bug somewhere) is the best way to go.