Browse Source

Better bar synchronization

master
Denis Tereshkin 7 years ago
parent
commit
fc66b39e51
  1. 1
      src/naiback/indicators/__init__.py
  2. 18
      src/naiback/indicators/bollinger.py
  3. 31
      src/naiback/strategy/strategy.py

1
src/naiback/indicators/__init__.py

@ -6,3 +6,4 @@ from .intradaybarnumber import IntradayBarNumber
from .highest import Highest,HighestValue from .highest import Highest,HighestValue
from .lowest import Lowest,LowestValue from .lowest import Lowest,LowestValue
from .atr import ATR from .atr import ATR
from .bollinger import BollingerBands

18
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)

31
src/naiback/strategy/strategy.py

@ -92,15 +92,32 @@ class Strategy:
def _synchronize_bars(self, bars, all_dates): def _synchronize_bars(self, bars, all_dates):
bar_pos = 0 bar_pos = 0
open_ = 0
high = 0
low = 0
close = 0
volume = bars.volume[bar_pos]
for dt in all_dates: for dt in all_dates:
if bars.timestamp[bar_pos] > dt: if len(bars.timestamp) > bar_pos:
open_ = bars.open[bar_pos] print("new close: {} ({})".format(close, dt))
high = bars.high[bar_pos]
low = bars.low[bar_pos] if bars.timestamp[bar_pos] > dt:
close = bars.close[bar_pos] print("Inserting at {}: {}".format(dt, close))
volume = bars.volume[bar_pos] 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) bars.insert_bar(bar_pos, open_, high, low, close, volume, dt)
print("Inserting[2] at {}: {}".format(dt, close))
bar_pos += 1 bar_pos += 1
def _combine_dates(self): def _combine_dates(self):

Loading…
Cancel
Save