My idea of having multiple strategies on single instrument is to control drawdown / risk. This multiple strategy concept halps to maximizze return with minimizing return to some extent. We are not going to put whole investment in one single logic rather multiple logics or strategies. Yes, I want to use single broker account and run all strategies in parallel. Any idea, How can I do that? I had enumerated over strategies but that process in sequential not parallel, How to run all strategies in parallel, is what I am interested in now?
Posts made by param.jeet
RE: Multiple strategy execution
RE: Multiple Data Feeds (Instruments) on a single strategy
In that case, wouldn't cerebro.run( ) execute twice? If I run twice then I would get two different datasets.
What if, I want to execute this strategy on both data sets and generate single report as one single portfolio.
Multiple strategy execution
I have 2 strategies and running over same dataset. I am running following command
Add a strategy
Add the Data Feed to Cerebro
Set our desired cash start
Run over everything
When I run these 2 strategies then magic happens and traders entered by one strategy are cancelled out by other strategy. Isn't it the weird behavior?
Logically, traders entered by strategy one should be exited by same strategy, not by the other.
RE: Track Signal name in plot and output data
It's difficult to know how something could solve your problem unless you explain/show how you tried to solve your problem and what failed.
You can see in my code snippet, I have used the command like this right after I signals are generated.
I am not able to see what this .addinfo() does, if it does not use this information.
RE: Track Signal name in plot and output data
Say, I have 5 entry and 5 corresponding exit signals (Green and red Arrow in plot) using different logics. I want to track every green arrow i.e. every buy signal is triggered by one particular logic and so on. Adding name in legend will not solve my purpose as it does not clarify signals by looking at the green arrow. I can only distinguish green arrows if I have the names on top of these green arrows?
Another, Is it possible to track these signal names in some variable so that I can use these signal names to calculate return signal i.e. logic wise.
What does .addinfo() do?
I was assuming this would solve my purpose but it didn't.
Track Signal name in plot and output data
I am using signal names to identify signals but not to track these names. The naming convention helps to track signals and I also would like to plot this name along with green and red arrows in plot. Is it possible to add signal name in plot? If yes, How?
from future import (absolute_import, division, print_function,
import datetime # For datetime objects
import os.path # To manage paths
import sys # To find out the script name (in argv)
Import the backtrader platform
import backtrader as bt
Create a Stratey
def log(self, txt, dt=None): ''' Logging function fot this strategy''' dt = dt or self.datas.datetime.date(0) print('%s, %s' % (dt.isoformat(), txt)) def __init__(self): # Keep a reference to the "close" line in the data dataseries self.dataclose = self.datas.close # To keep track of pending orders self.order = None def notify_order(self, order): if order.status in [order.Submitted, order.Accepted]: # Buy/Sell order submitted/accepted to/by broker - Nothing to do return # Check if an order has been completed # Attention: broker could reject order if not enough cash 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') # Write down: no pending order self.order = None def next(self): # Simply log the closing price of the series from the reference self.log('Close, %.2f' % self.dataclose) # Check if an order is pending ... if yes, we cannot send a 2nd one if self.order: return # Check if we are in the market if not self.position: # Not yet ... we MIGHT BUY if ... if self.dataclose < self.dataclose[-1]: # current close less than previous close if self.dataclose[-1] < self.dataclose[-2]: # previous close less than the previous close # BUY, BUY, BUY!!! (with default parameters) self.log('BUY CREATE, %.2f' % self.dataclose) # Keep track of the created order to avoid a 2nd order longentry = self.buy() longentry.addinfo(name='Long_E') else: # Already in the market ... we might sell if len(self) >= (self.bar_executed + 5): # SELL, SELL, SELL!!! (with all possible default parameters) self.log('SELL CREATE, %.2f' % self.dataclose) # Keep track of the created order to avoid a 2nd order shortentry = self.sell() shortentry.addinfo(name='Short_E') print(shortentry.info)
if name == 'main':
# Create a cerebro entity
cerebro = bt.Cerebro()
# Add a strategy cerebro.addstrategy(TestStrategy) # Datas are in a subfolder of the samples. Need to find where the script is # because it could have been called from anywhere modpath = os.path.dirname(os.path.abspath(sys.argv)) datapath = os.path.join(modpath, 'D:/Projects-Global-Logic/RGEI/Documents/FCPO3-OHLCV.csv') # Create a Data Feed data = bt.feeds.YahooFinanceCSVData( dataname=datapath, # Do not pass values before this date fromdate=datetime.datetime(2000, 1, 1), # Do not pass values before this date todate=datetime.datetime(2010, 12, 31), # Do not pass values after this date reverse=False) # Add the Data Feed to Cerebro cerebro.adddata(data) # Set our desired cash start cerebro.broker.setcash(100000.0) # Print out the starting conditions print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue()) tradehistory=True # Run over everything cerebro.run(stdstats=True) # Print out the final result print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue()) cerebro.plot(style='candle')