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,
unicode_literals)import datetime # For datetime objects
import os.path # To manage paths
import sys # To find out the script name (in argv[0])Import the backtrader platform
import backtrader as bt
Create a Stratey
class TestStrategy(bt.Strategy):
def log(self, txt, dt=None): ''' Logging function fot this strategy''' dt = dt or self.datas[0].datetime.date(0) print('%s, %s' % (dt.isoformat(), txt)) def __init__(self): # Keep a reference to the "close" line in the data[0] dataseries self.dataclose = self.datas[0].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[0]) # 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[0] < 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[0]) # 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[0]) # 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[0])) 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')
-
For code/output blocks: Use ``` (aka backtick or grave accent) in a single line before and after the block. See: http://commonmark.org/help/
-
@param-jeet said in Track Signal name in plot and output data:
Is it possible to add signal name in plot?
No. Only in the legend.
-
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.
-
@param-jeet said in Track Signal name in plot and output data:
as it does not clarify signals by looking at the green arrow
The green arrow is there for those who have failed this city and not to identify trades and signals.
@param-jeet said in Track Signal name in plot and output data:
What does .addinfo() do?
I was assuming this would solve my purpose but it didn't.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.
Your actual problem is being fixed on looking at the chart. Problem which backtrader cannot solve for you. Your options:
-
Write a
BuySellObserver
which tracks specific orders with specific information added withaddinfo
Docs - Orders -
Use
tradeid
inbuy/sell
and track the trades innotify_trade
. See
-
-
@backtrader said in 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.
shortentry.addinfo(name='Short_E')I am not able to see what this .addinfo() does, if it does not use this information.
-
@param-jeet said in Track Signal name in plot and output data:
I am not able to see what this .addinfo() does, if it does not use this information.