diff --git a/src/traces/ohlc/helpers.js b/src/traces/ohlc/helpers.js index e7fca7d0d60..01f07dbcaac 100644 --- a/src/traces/ohlc/helpers.js +++ b/src/traces/ohlc/helpers.js @@ -95,15 +95,65 @@ exports.makeTransform = function(traceIn, state, direction) { }; exports.getFilterFn = function(direction) { + + var fn; + var isPrevThisDirection = null; + var oprev = null; + var cprev = null; + switch(direction) { case 'increasing': - return function(o, c) { return o <= c; }; + var fn = function(o, c) { + if(o === c) { + if(c > cprev) { + return true; // increasing + } else if(c < cprev) { + return false; // decreasing + } else { + if(isPrevThisDirection === true) { + return true; // determine by last candle + } else if(isPrevThisDirection === false) { + return false; // determine by last candle + } else { + return true; // If we don't have previous data, assume it was increasing + } + } + } + return o < c; + }; + break; case 'decreasing': - return function(o, c) { return o > c; }; + var fn = function(o, c) { + if(o === c) { + if(c > cprev) { + return false; // increasing + } else if(c < cprev) { + return true; // decreasing + } else { + if(isPrevThisDirection === true) { + return true; // determine by last candle + } else if(isPrevThisDirection === false) { + return false; // determine by last candle + } else { + return false; // If we don't have previous data, assume it was increasing + } + } + } + return o > c; + }; + break } -}; + + return function(o, c) { + var out = fn(o, c); + isPrevThisDirection = !!out; + oprev = o; + cprev = c; + return out; + }; +}; exports.addRangeSlider = function(data, layout) { var hasOneVisibleTrace = false;