diff --git a/src/naiback/indicators/__init__.py b/src/naiback/indicators/__init__.py index e3a1002..6f02e63 100644 --- a/src/naiback/indicators/__init__.py +++ b/src/naiback/indicators/__init__.py @@ -6,3 +6,4 @@ from .intradaybarnumber import IntradayBarNumber from .highest import Highest,HighestValue from .lowest import Lowest,LowestValue from .atr import ATR +from .bollinger import BollingerBands diff --git a/src/naiback/indicators/bollinger.py b/src/naiback/indicators/bollinger.py new file mode 100644 index 0000000..8657c10 --- /dev/null +++ b/src/naiback/indicators/bollinger.py @@ -0,0 +1,18 @@ + +import numpy as np + +from .sma import SMA + +def BollingerBands(values, period, stddevs): + lower = np.zeros(len(values)) + higher = np.zeros(len(values)) + ma = SMA(values, period) + diffs = ma - np.array(values) + for i in range(period, len(values)): + sigma = np.std(diffs[i-period+1:i+1]) + lower[i] = ma[i] - stddevs * sigma + higher[i] = ma[i] + stddevs * sigma + + return (lower, higher) + + diff --git a/src/naiback/strategy/strategy.py b/src/naiback/strategy/strategy.py index 17a96f5..81903fd 100644 --- a/src/naiback/strategy/strategy.py +++ b/src/naiback/strategy/strategy.py @@ -92,15 +92,32 @@ class Strategy: def _synchronize_bars(self, bars, all_dates): bar_pos = 0 + open_ = 0 + high = 0 + low = 0 + close = 0 + volume = bars.volume[bar_pos] for dt in all_dates: - if bars.timestamp[bar_pos] > dt: - open_ = bars.open[bar_pos] - high = bars.high[bar_pos] - low = bars.low[bar_pos] - close = bars.close[bar_pos] - volume = bars.volume[bar_pos] - + if len(bars.timestamp) > bar_pos: + print("new close: {} ({})".format(close, dt)) + + if bars.timestamp[bar_pos] > dt: + print("Inserting at {}: {}".format(dt, close)) + bars.insert_bar(bar_pos, open_, high, low, close, volume, dt) + else: + open_ = bars.open[bar_pos] + high = bars.high[bar_pos] + low = bars.low[bar_pos] + close = bars.close[bar_pos] + volume = bars.volume[bar_pos] + if bars.timestamp[bar_pos] > dt: + bars.insert_bar(bar_pos, open_, high, low, close, volume, dt) + print("new close: {} ({})".format(close, dt)) + + else: bars.insert_bar(bar_pos, open_, high, low, close, volume, dt) + print("Inserting[2] at {}: {}".format(dt, close)) + bar_pos += 1 def _combine_dates(self):