Description
Hi!
First of all, thank you for such useful library for plotting candles!
I'm trying to process a scenario, when addplot
and alines
is empty (at the present moment buys
and sells
lists have only one point in format ['date','price']
, but it doesn't matter for question). So my function, that builds a graph is:
def mplfplotcoin(df,title,
buys=[],
sells=[],
rsi=False):
adp = []
# adding trades
if buys:
buysdf = pd.DataFrame([buys],columns=['Date', 'OpenPrice']) # when buys list consists of one point
buysdf = df.merge(buysdf,on='Date',how='left')['OpenPrice'] # left join
addbuys = mpf.make_addplot(buysdf,scatter=True,markersize=300,marker=6,color='forestgreen',alpha=0.75) # buy markers
adp.append(addbuys)
if sells:
sellsdf = pd.DataFrame([sells], columns=['Date', 'ClosePrice']) # when sells list consists of one point
sellsdf = df.merge(sellsdf,on='Date',how='left')['ClosePrice'] # left join
addsells = mpf.make_addplot(sellsdf,scatter=True,markersize=300,marker=7,color='firebrick',alpha=0.75) # sell markers
adp.append(addsells)
# adding line between trades https://github.com/matplotlib/mplfinance/blob/master/examples/using_lines.ipynb
if len(buys) == len(sells) and buys: # I know it's awful))) I'll change it later
tradeline = dict(alines=[tuple(buys),tuple(sells)],colors='lightslategray',linestyle='--',linewidths=2,alpha=0.5)
else: tradeline = None
# adding rsi
if rsi:
addrsi = mpf.make_addplot((df['rsi']),panel=1,type='line',color='orange',width=1,ylabel='rsi',ylim=(-5,105))
adp.append(addrsi)
# checking adp list
if not adp: adp = None
# drawing
mpf.plot(df,
type='candle',
style='tradingview',
volume=True,
show_nontrading=True,
addplot=adp,
alines=tradeline,
figscale=1.3,
title=title,
ylabel='USDT')
so, lines else: tradeline = None
and if not adp: adp = None
are like this, because I found it in your library file plottin.py
:
#211 line:
'addplot' : { 'Default' : None,
'Description' : 'addplot object or sequence of addplot objects (from `mpf.make_addplot()`)',
'Validator' : lambda value: isinstance(value,dict) or (isinstance(value,list) and all([isinstance(d,dict) for d in value])) },
# 267 line:
'alines' : { 'Default' : None,
'Description' : 'Draw one or more ARBITRARY LINES anywhere on the plot, by'+
' specifying a sequence of two or more date/price pairs, or by'+
' specifying a sequence of sequences of two or more date/price pairs.'+
' May also be a dict with key `alines` (as date/price pairs described above),'+
' plus one or more of the following keys:'+
' `colors`, `linestyle`, `linewidths`, `alpha`.',
however I get errors for mpf.plot(..., addplot=adp, alines=tradeline, ...)
:
TypeError: kwarg "addplot" validator returned False for value: "None"
'Validator' : lambda value: isinstance(value,dict) or (isinstance(value,list) and all([isinstance(d,dict) for d in value])) },
and the same for alines
parameter:
TypeError: kwarg "alines" validator returned False for value: "None"
'Validator' : lambda value: _alines_validator(value) },
If I go to plotting.py
, I can't understand why error is rised, because there is only one if
about addplot is None
:
# 739 line
addplot = config['addplot']
if addplot is not None and ptype not in VALID_PMOVE_TYPES:
...
# and then 816 line is new condition:
# fill_between is NOT supported for external_axes_mode
# (caller can easily call ax.fill_between() themselves).
if config['fill_between'] is not None and not external_axes_mode:
...
Ok, I tried to define ptype
in my code:
# checking adp list
if not adp: adp = [mpf.make_addplot(None,type='line')]
But again error:
raise TypeError('Wrong type for data, in make_addplot()')
TypeError: Wrong type for data, in make_addplot()
Please, help me to understand how to draw plot if addplot
and alines
(and other kwards) are empty?