For code/output blocks: Use ``` (aka backtick or grave accent) in a single line before and after the block. See: http://commonmark.org/help/
Managing orders for multiple data feeds
-
I wanted to know what is the best way to manage orders in multi data feeds. In case of single data feeds I use the notify order method but incase on multiple data feeds, as is the case in the below code, I think it is submitting orders for both my feeds.
# Breakout Strategy class Breakout(bt.Strategy): params = (('roc', 10), ('stop', 0.98), ('tgt', 1.05), ) def __init__(self): self.inds = {} for d in (self.datas): self.inds[d] = {} # self.open = self.datas[d].open # self.close = self.datas[d].close # self.high = self.datas[0].high self.inds[d]['roc'] = bt.talib.ROC(d.close, timeperiod = self.p.roc) self.inds[d]['p_range'] = bt.talib.SUB(d.close, d.open) self.inds[d]['price_range'] = bt.talib.SMA(self.inds[d]['p_range'], timeperiod = 10) self.inds[d]['vol_range'] = bt.talib.SMA(d.volume, timeperiod = 10) self.inds[d]['prev_high'] = 0 self.orefs = list() self.execprice = None self.totalcost = None def log(self, txt, dt=None): dt = self.datas[0].datetime.date() print(f'Date: {dt}, {txt}') def notify_order(self, order): for d in self.datas: print(f'{self.datetime.date()}: Close: {d.close[0]}') print(f'Order ref: {order.ref} / Type {"Buy" * order.isbuy() or "Sell"} / Status {order.getstatusname()}') if order.status == order.Completed: self.execprice = order.executed.price self.totalcost = order.executed.value self.log(f'Executed price: {self.execprice}') if not order.alive() and order.ref in self.orefs: self.orefs.remove(order.ref) print(f'Order Numbers are {self.orefs}') def notify_trade(self, trade): if trade.isopen: return else: self.log(f'OPERATION PROFIT: GROSS {trade.pnl}, NET {trade.pnlcomm}, Trade PnL: {trade.pnlcomm/self.totalcost}') self.log(f'Updated Account Balance: {cerebro.broker.getcash()}') def next(self): for d in (self.datas): name = d._name pos = self.getposition(d).size self.log(f'Name: {name}, Close: {d.close[0]}') if d.Peaks == 1.0: self.inds[d]['prev_high'] = d.high[0] # print('Date: {}, Name: {}, ROC: {}, Prange: {}, Price Range: {}, Vol_range: {}, Prev_high: {}'.format(self.datas[0].datetime.date(), name, self.inds[d]['roc'][0], self.inds[d]['p_range'][0], self.inds[d]['price_range'][0], self.inds[d]['vol_range'][0], self.inds[d]['prev_high'])) if not pos: if (-3 <= self.inds[d]['roc'][-1] <= 3): p1 = d.open[1] p2 = p1 * self.p.stop p3 = p1 * self.p.tgt os = self.buy_bracket(data = d, price=p1, stopprice=p2, limitprice=p3, exectype = bt.Order.Market) self.orefs = [o.ref for o in os] # print(f'Order Numbers are : {self.orefs}') self.log(f'Name: {name}, Buy at {p1} - OID: {self.orefs[0]}, Stop sell at {p2} - OID: {self.orefs[1]}, Tgt sell at {p3} - OID: {self.orefs[2]}') # print('Date: {}, Name: {}, Prange: {}'.format(self.datetime.date(), name, self.inds[d]['p_range'][0], self.inds[d]['price_range'][0], self.inds[d]['vol_range'][0])) cerebro = bt.Cerebro() dataset = [(hdfc, 'hdfc'), (maruti, 'maruti')] for n in range(len(dataset)): data = pandas_data_ext(dataname=dataset[n][0], datetime=None, open=-1, high=-1, low=-1, close=-1, volume=-1, Peaks=-1, Trough=-1) cerebro.adddata(data, name = dataset[n][1]) cerebro.addstrategy(Breakout) cerebro.run()
Output is as below:
Date: 2017-02-27, Name: hdfc, Close: 1375.7 Date: 2017-02-27, Name: maruti, Close: 5951.5 Date: 2017-02-28, Name: hdfc, Close: 1370.05 Date: 2017-02-28, Name: hdfc, Buy at 1369.8 - OID: 1078, Stop sell at 1342.404 - OID: 1079, Tgt sell at 1438.29 - OID: 1080 Date: 2017-02-28, Name: maruti, Close: 5922.5 Date: 2017-02-28, Name: maruti, Buy at 5960.0 - OID: 1081, Stop sell at 5840.8 - OID: 1082, Tgt sell at 6258.0 - OID: 1083 2017-03-01: Close: 1400.55 2017-03-01: Close: 5919.6 Order ref: 1078 / Type Buy / Status Submitted 2017-03-01: Close: 1400.55 2017-03-01: Close: 5919.6 Order ref: 1079 / Type Sell / Status Submitted 2017-03-01: Close: 1400.55 2017-03-01: Close: 5919.6 Order ref: 1080 / Type Sell / Status Submitted 2017-03-01: Close: 1400.55 2017-03-01: Close: 5919.6 Order ref: 1081 / Type Buy / Status Submitted 2017-03-01: Close: 1400.55 2017-03-01: Close: 5919.6 Order ref: 1082 / Type Sell / Status Submitted 2017-03-01: Close: 1400.55 2017-03-01: Close: 5919.6 Order ref: 1083 / Type Sell / Status Submitted 2017-03-01: Close: 1400.55 2017-03-01: Close: 5919.6 Order ref: 1078 / Type Buy / Status Accepted 2017-03-01: Close: 1400.55 2017-03-01: Close: 5919.6 Order ref: 1079 / Type Sell / Status Accepted 2017-03-01: Close: 1400.55 2017-03-01: Close: 5919.6 Order ref: 1080 / Type Sell / Status Accepted 2017-03-01: Close: 1400.55 2017-03-01: Close: 5919.6 Order ref: 1081 / Type Buy / Status Accepted 2017-03-01: Close: 1400.55 2017-03-01: Close: 5919.6 Order ref: 1082 / Type Sell / Status Accepted 2017-03-01: Close: 1400.55 2017-03-01: Close: 5919.6 Order ref: 1083 / Type Sell / Status Accepted 2017-03-01: Close: 1400.55 2017-03-01: Close: 5919.6 Order ref: 1078 / Type Buy / Status Completed Date: 2017-03-01, Executed price: 1369.8 2017-03-01: Close: 1400.55 2017-03-01: Close: 5919.6 Order ref: 1081 / Type Buy / Status Completed Date: 2017-03-01, Executed price: 5960.0 Order Numbers are [1082, 1083] Date: 2017-03-01, Name: hdfc, Close: 1400.55 Date: 2017-03-01, Name: maruti, Close: 5919.6 Date: 2017-03-02, Name: hdfc, Close: 1399.0 Date: 2017-03-02, Name: maruti, Close: 5918.75 Date: 2017-03-03, Name: hdfc, Close: 1371.2 Date: 2017-03-03, Name: maruti, Close: 5887.75 Date: 2017-03-06, Name: hdfc, Close: 1365.95 Date: 2017-03-06, Name: maruti, Close: 5934.85 Date: 2017-03-07, Name: hdfc, Close: 1365.4 Date: 2017-03-07, Name: maruti, Close: 5888.5 2017-03-08: Close: 1367.7 2017-03-08: Close: 5864.15 Order ref: 1082 / Type Sell / Status Completed Date: 2017-03-08, Executed price: 5840.8 Order Numbers are [1083] 2017-03-08: Close: 1367.7 2017-03-08: Close: 5864.15 Order ref: 1083 / Type Sell / Status Canceled Order Numbers are [] Date: 2017-03-08, OPERATION PROFIT: GROSS -119.19999999999982, NET -119.19999999999982, Trade PnL: -0.01999999999999997 Date: 2017-03-08, Updated Account Balance: 8511.0 Date: 2017-03-08, Name: hdfc, Close: 1367.7 Date: 2017-03-08, Name: maruti, Close: 5864.15 Date: 2017-03-09, Name: hdfc, Close: 1371.5 Date: 2017-03-09, Name: maruti, Close: 5964.4 Date: 2017-03-10, Name: hdfc, Close: 1373.8 Date: 2017-03-10, Name: maruti, Close: 5955.6 Date: 2017-03-10, Name: maruti, Buy at 6060.0 - OID: 1084, Stop sell at 5938.8 - OID: 1085, Tgt sell at 6363.0 - OID: 1086
What I want is to submit an order for one feed upon meeting the criteria in next. But not to submit order for the other feed if the criteria is not met. How can I do this?
-
-
@run-out thanks, was able to figure it out.