public List<Level> levelsActualAtTime(long time) { List<Level> ret = new LinkedList<Level>(); List<Level> preRet = levels(); List<Bar> atomicDeltas = atomicDeltas(time); for (Level level : preRet) { if (level.timeAppeared() < time) { if (!levelNeutralizedByMovement(level, atomicDeltas)) { ret.add(level); } } } return ret; }
public boolean levelNeutralizedByMovement(Level level, List<Bar> barsToCheck) { double minPrice = 0; double maxPrice = 0; for (Bar bar : barsToCheck) { if (bar.openTime() > level.timeAppeared() // || (bar.openTime() == level.timeAppeared() && closeBid() == level.price()) ) { minPrice = Math.min(bar.openBid(), bar.closeBid()); maxPrice = Math.max(bar.openBid(), bar.closeBid()); if (level.price() >= minPrice && level.price() <= maxPrice) { return true; } if (level.direction == 1 && minPrice > level.price()) { return true; } if (level.direction == -1 && maxPrice < level.price()) { return true; } } } return false; }