From a59197dee2a5a6d8a723c1d6588b26c243f1e964 Mon Sep 17 00:00:00 2001 From: Ted Date: Tue, 11 May 2021 12:28:00 -0400 Subject: [PATCH 1/6] add ability to shift moving average on plots --- src/mplfinance/_arg_validators.py | 32 ++++++++++++++++++++++----- src/mplfinance/plotting.py | 13 ++++++++--- tests/reference_images/addplot12.png | Bin 0 -> 61654 bytes tests/test_addplot.py | 20 +++++++++++++++++ 4 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 tests/reference_images/addplot12.png diff --git a/src/mplfinance/_arg_validators.py b/src/mplfinance/_arg_validators.py index 351eb1e9..f0e17243 100644 --- a/src/mplfinance/_arg_validators.py +++ b/src/mplfinance/_arg_validators.py @@ -110,14 +110,36 @@ def _mav_validator(mav_value): ''' if isinstance(mav_value,int) and mav_value > 1: return True - elif not isinstance(mav_value,tuple) and not isinstance(mav_value,list): + elif not isinstance(mav_value,tuple) and not isinstance(mav_value,list) and not isinstance(mav_value,dict): return False - if not len(mav_value) < 8: - return False - for num in mav_value: - if not isinstance(num,int) and num > 1: + if isinstance(mav_value,dict): + if 'scale' not in mav_value or not (isinstance(mav_value['scale'],tuple) or\ + isinstance(mav_value['scale'],int) or isinstance(mav_value['scale'], list)): + return False + if 'shift' in mav_value: + if not (isinstance(mav_value['shift'],tuple) or isinstance(mav_value['shift'],int) or\ + isinstance(mav_value['shift'], list)): + return False + if isinstance(mav_value['scale'], int) and isinstance(mav_value['shift'], int): + return True + elif isinstance(mav_value['scale'], int) or isinstance(mav_value['shift'], int): + return False + if len(mav_value['scale']) == len(mav_value['shift']): + for num in mav_value['scale']: + if not isinstance(num, int) and num > 1: + return False + for num in mav_value['shift']: + if not isinstance(num, int) and num > 1: + return False + return True return False + elif not len(mav_value) < 8: + return False + else: + for num in mav_value: + if not isinstance(num,int) and num > 1: + return False return True def _hlines_validator(value): diff --git a/src/mplfinance/plotting.py b/src/mplfinance/plotting.py index e2219903..95acee7e 100644 --- a/src/mplfinance/plotting.py +++ b/src/mplfinance/plotting.py @@ -978,8 +978,12 @@ def _plot_mav(ax,config,xdates,prices,apmav=None,apwidth=None): mavgs = config['mav'] mavp_list = [] if mavgs is not None: + shift = None + if isinstance(mavgs,dict): + shift = mavgs['shift'] + mavgs = mavgs['scale'] if isinstance(mavgs,int): - mavgs = mavgs, # convert to tuple + mavgs = mavgs, # convert to tuple if len(mavgs) > 7: mavgs = mavgs[0:7] # take at most 7 @@ -988,8 +992,11 @@ def _plot_mav(ax,config,xdates,prices,apmav=None,apwidth=None): else: mavc = None - for mav in mavgs: - mavprices = pd.Series(prices).rolling(mav).mean().values + for idx,mav in enumerate(mavgs): + mean = pd.Series(prices).rolling(mav).mean() + if shift is not None: + mean = mean.shift(periods=shift[idx]) + mavprices = mean.values lw = config['_width_config']['line_width'] if mavc: ax.plot(xdates, mavprices, linewidth=lw, color=next(mavc)) diff --git a/tests/reference_images/addplot12.png b/tests/reference_images/addplot12.png new file mode 100644 index 0000000000000000000000000000000000000000..684d8fb09cdd40cb0a23bcc17cf6cd1135445575 GIT binary patch literal 61654 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%0Aks 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 OloizFAITYC|9=3=cyTEJ literal 0 HcmV?d00001 diff --git a/tests/test_addplot.py b/tests/test_addplot.py index 5c327f63..b65a5504 100644 --- a/tests/test_addplot.py +++ b/tests/test_addplot.py @@ -354,3 +354,23 @@ def test_addplot11(bolldata): print('result=',result) assert result is None +def test_addplot12(bolldata): + + df = bolldata + + fname = base+'12.png' + tname = os.path.join(tdir,fname) + rname = os.path.join(refd,fname) + + mpf.plot(df,type='candle',volume=True,savefig=tname,mav={'scale':(20,40,60), 'shift': [5,10,20]}) + + tsize = os.path.getsize(tname) + print(glob.glob(tname),'[',tsize,'bytes',']') + + rsize = os.path.getsize(rname) + print(glob.glob(rname),'[',rsize,'bytes',']') + + result = compare_images(rname,tname,tol=IMGCOMP_TOLERANCE) + if result is not None: + print('result=',result) + assert result is None From 3e12ebf7ab8bd7154ffa42403f20fd4d52788105 Mon Sep 17 00:00:00 2001 From: Ted Date: Tue, 11 May 2021 20:25:52 -0400 Subject: [PATCH 2/6] swap scale for period, simplify isinstance checks, update version number --- src/mplfinance/_arg_validators.py | 16 +++++++--------- src/mplfinance/plotting.py | 2 +- tests/test_addplot.py | 2 +- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/mplfinance/_arg_validators.py b/src/mplfinance/_arg_validators.py index f0e17243..9c8246dd 100644 --- a/src/mplfinance/_arg_validators.py +++ b/src/mplfinance/_arg_validators.py @@ -110,23 +110,21 @@ def _mav_validator(mav_value): ''' if isinstance(mav_value,int) and mav_value > 1: return True - elif not isinstance(mav_value,tuple) and not isinstance(mav_value,list) and not isinstance(mav_value,dict): + elif not isinstance(mav_value,(tuple,list,dict)): return False if isinstance(mav_value,dict): - if 'scale' not in mav_value or not (isinstance(mav_value['scale'],tuple) or\ - isinstance(mav_value['scale'],int) or isinstance(mav_value['scale'], list)): + if 'period' not in mav_value or not isinstance(mav_value['period'],(tuple,list,dict)): return False if 'shift' in mav_value: - if not (isinstance(mav_value['shift'],tuple) or isinstance(mav_value['shift'],int) or\ - isinstance(mav_value['shift'], list)): + if not isinstance(mav_value['shift'],(tuple,list,dict)): return False - if isinstance(mav_value['scale'], int) and isinstance(mav_value['shift'], int): + if isinstance(mav_value['period'], int) and isinstance(mav_value['shift'], int): return True - elif isinstance(mav_value['scale'], int) or isinstance(mav_value['shift'], int): + elif isinstance(mav_value['period'], int) or isinstance(mav_value['shift'], int): return False - if len(mav_value['scale']) == len(mav_value['shift']): - for num in mav_value['scale']: + if len(mav_value['period']) == len(mav_value['shift']): + for num in mav_value['period']: if not isinstance(num, int) and num > 1: return False for num in mav_value['shift']: diff --git a/src/mplfinance/plotting.py b/src/mplfinance/plotting.py index 95acee7e..c6cccc0b 100644 --- a/src/mplfinance/plotting.py +++ b/src/mplfinance/plotting.py @@ -981,7 +981,7 @@ def _plot_mav(ax,config,xdates,prices,apmav=None,apwidth=None): shift = None if isinstance(mavgs,dict): shift = mavgs['shift'] - mavgs = mavgs['scale'] + mavgs = mavgs['period'] if isinstance(mavgs,int): mavgs = mavgs, # convert to tuple if len(mavgs) > 7: diff --git a/tests/test_addplot.py b/tests/test_addplot.py index b65a5504..5a4867d7 100644 --- a/tests/test_addplot.py +++ b/tests/test_addplot.py @@ -362,7 +362,7 @@ def test_addplot12(bolldata): tname = os.path.join(tdir,fname) rname = os.path.join(refd,fname) - mpf.plot(df,type='candle',volume=True,savefig=tname,mav={'scale':(20,40,60), 'shift': [5,10,20]}) + mpf.plot(df,type='candle',volume=True,savefig=tname,mav={'period':(20,40,60), 'shift': [5,10,20]}) tsize = os.path.getsize(tname) print(glob.glob(tname),'[',tsize,'bytes',']') From 5b4979e1a7e58070e51e1787ca76a529f02a1bf2 Mon Sep 17 00:00:00 2001 From: Ted Date: Tue, 11 May 2021 20:39:50 -0400 Subject: [PATCH 3/6] it helps to commit the version number change --- src/mplfinance/_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mplfinance/_version.py b/src/mplfinance/_version.py index f438cd1d..ac383efb 100644 --- a/src/mplfinance/_version.py +++ b/src/mplfinance/_version.py @@ -1,5 +1,5 @@ -version_info = (0, 12, 7, 'alpha', 17) +version_info = (0, 12, 7, 'alpha', 18) _specifier_ = {'alpha': 'a','beta': 'b','candidate': 'rc','final': ''} From fb8bccbd9e809115864082dc55929ed5f59aeb54 Mon Sep 17 00:00:00 2001 From: Ted Date: Wed, 12 May 2021 09:52:30 -0400 Subject: [PATCH 4/6] int, not dict for type check on mav keys --- src/mplfinance/_arg_validators.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mplfinance/_arg_validators.py b/src/mplfinance/_arg_validators.py index 9c8246dd..5f9391db 100644 --- a/src/mplfinance/_arg_validators.py +++ b/src/mplfinance/_arg_validators.py @@ -114,10 +114,10 @@ def _mav_validator(mav_value): return False if isinstance(mav_value,dict): - if 'period' not in mav_value or not isinstance(mav_value['period'],(tuple,list,dict)): + if 'period' not in mav_value or not isinstance(mav_value['period'],(tuple,list,int)): return False if 'shift' in mav_value: - if not isinstance(mav_value['shift'],(tuple,list,dict)): + if not isinstance(mav_value['shift'],(tuple,list,int)): return False if isinstance(mav_value['period'], int) and isinstance(mav_value['shift'], int): return True From 2aae88b3c9cffcafb084da75f846e80797c4d21f Mon Sep 17 00:00:00 2001 From: Ted Date: Thu, 13 May 2021 15:36:02 -0400 Subject: [PATCH 5/6] simpler code, and don't check for minimum size in shifts --- src/mplfinance/_arg_validators.py | 64 ++++++++++++++++--------------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/src/mplfinance/_arg_validators.py b/src/mplfinance/_arg_validators.py index 5f9391db..ec1eefc9 100644 --- a/src/mplfinance/_arg_validators.py +++ b/src/mplfinance/_arg_validators.py @@ -103,42 +103,46 @@ def _get_valid_plot_types(plottype=None): def _mav_validator(mav_value): - ''' + ''' Value for mav (moving average) keyword may be: - scalar int greater than 1, or tuple of ints, or list of ints (greater than 1). - tuple or list limited to length of 7 moving averages (to keep the plot clean). + scalar int greater than 1, or tuple of ints, or list of ints (each greater than 1) + or a dict of `period` and `shift` each of which may be: + scalar int, or tuple of ints, or list of ints. `period` must be greater than 1 + while `shift` must be greater than 0. ''' - if isinstance(mav_value,int) and mav_value > 1: + def _valid_mav(value, is_period=True): + if not isinstance(value,(tuple,list,int)): + return False + if isinstance(value,int): + return isinstance(value,int) and (value >= 2 or not is_period) + # Must be a tuple or list here: + for num in value: + if not isinstance(num,int) or (is_period and num < 2): + return False return True - elif not isinstance(mav_value,(tuple,list,dict)): + + if not isinstance(mav_value,(tuple,list,int,dict)): return False - if isinstance(mav_value,dict): - if 'period' not in mav_value or not isinstance(mav_value['period'],(tuple,list,int)): - return False - if 'shift' in mav_value: - if not isinstance(mav_value['shift'],(tuple,list,int)): - return False - if isinstance(mav_value['period'], int) and isinstance(mav_value['shift'], int): - return True - elif isinstance(mav_value['period'], int) or isinstance(mav_value['shift'], int): - return False - if len(mav_value['period']) == len(mav_value['shift']): - for num in mav_value['period']: - if not isinstance(num, int) and num > 1: - return False - for num in mav_value['shift']: - if not isinstance(num, int) and num > 1: - return False - return True - return False - elif not len(mav_value) < 8: + if not isinstance(mav_value,dict): + return _valid_mav(mav_value) + + else: #isinstance(mav_value,dict) + if 'period' not in mav_value: return False + + period = mav_value['period'] + if not _valid_mav(period): return False + + if 'shift' not in mav_value: return True + + shift = mav_value['shift'] + if not _valid_mav(shift, False): return False + if isinstance(period,int) and isinstance(shift,int): return True + if isinstance(period,(tuple,list)) and isinstance(shift,(tuple,list)): + if len(period) != len(shift): return False + return True return False - else: - for num in mav_value: - if not isinstance(num,int) and num > 1: - return False - return True + def _hlines_validator(value): if isinstance(value,dict): From d22a8cc9934a98df96bcb5ed444c81ee649aee98 Mon Sep 17 00:00:00 2001 From: Daniel Goldfarb Date: Thu, 13 May 2021 16:59:24 -0400 Subject: [PATCH 6/6] fix docstring;remove extra isinstance (my bad) --- src/mplfinance/_arg_validators.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/mplfinance/_arg_validators.py b/src/mplfinance/_arg_validators.py index ec1eefc9..ef91eb05 100644 --- a/src/mplfinance/_arg_validators.py +++ b/src/mplfinance/_arg_validators.py @@ -107,14 +107,13 @@ def _mav_validator(mav_value): Value for mav (moving average) keyword may be: scalar int greater than 1, or tuple of ints, or list of ints (each greater than 1) or a dict of `period` and `shift` each of which may be: - scalar int, or tuple of ints, or list of ints. `period` must be greater than 1 - while `shift` must be greater than 0. + scalar int, or tuple of ints, or list of ints: each `period` int must be greater than 1 ''' def _valid_mav(value, is_period=True): if not isinstance(value,(tuple,list,int)): return False if isinstance(value,int): - return isinstance(value,int) and (value >= 2 or not is_period) + return (value >= 2 or not is_period) # Must be a tuple or list here: for num in value: if not isinstance(num,int) or (is_period and num < 2):