package dailyBot.analysis; import java.io.Serializable; import java.util.EnumMap; public class Ranges implements Serializable { private static final long serialVersionUID = -6461964459317876445L; static public class Range implements Serializable { private static final long serialVersionUID = 3013772711096500473L; private boolean invertedBuy; private boolean invertedSell; private double minBuy; private double maxBuy; private double minSell; private double maxSell; public Range() { } public Range(double minBuy, double maxBuy, double minSell, double maxSell, boolean invertedBuy, boolean invertedSell) { this.minBuy = minBuy; this.maxBuy = maxBuy; this.minSell = minSell; this.maxSell = maxSell; this.invertedBuy = invertedBuy; this.invertedSell = invertedSell; } public Range(double minBuy, double maxBuy, double minSell, double maxSell) { this(minBuy, maxBuy, minSell, maxSell, false, false); } public synchronized Range duplicate() { return new Range(minBuy, maxBuy, minSell, maxSell, invertedBuy, invertedSell); } public synchronized boolean isInside(double value, boolean buy) { double minimum = buy ? minBuy : minSell; double maximum = buy ? maxBuy : maxSell; boolean inverted = buy ? invertedBuy : invertedSell; return !inverted ? minimum <= value && value <= maximum : minimum >= value || value >= maximum; } public synchronized void setInvertedBuy(boolean inverted) { this.invertedBuy = inverted; } public synchronized boolean isInvertedBuy() { return invertedBuy; } public synchronized void setInvertedSell(boolean inverted) { this.invertedSell = inverted; } public synchronized boolean isInvertedSell() { return invertedSell; } public synchronized void setMinBuy(double minBuy) { this.minBuy = minBuy; } public synchronized double getMinBuy() { return minBuy; } public synchronized void setMinSell(double minSell) { this.minSell = minSell; } public synchronized double getMinSell() { return minSell; } public synchronized void setMaxBuy(double maxBuy) { this.maxBuy = maxBuy; } public synchronized double getMaxBuy() { return maxBuy; } public synchronized void setMaxSell(double maxSell) { this.maxSell = maxSell; } public synchronized double getMaxSell() { return maxSell; } public synchronized String toString(double value, boolean buy) { double min = buy ? minBuy : minSell; double max = buy ? maxBuy : maxSell; boolean inverted = buy ? invertedBuy : invertedSell; if(inverted) return value + " <= " + min + " or " + value + " >= " + max; else return min + " <= " + value + " <= " + max; } public boolean isInverted(Ranges ranges) { boolean buy = ((int) ranges.getRange(Indicator.BUY).getMinBuy()) == 1; return buy ? invertedBuy : invertedSell; } public double getMin(Ranges ranges) { boolean buy = ((int) ranges.getRange(Indicator.BUY).getMinBuy()) == 1; return buy ? minBuy : minSell; } public double getMax(Ranges ranges) { boolean buy = ((int) ranges.getRange(Indicator.BUY).getMinBuy()) == 1; return buy ? maxBuy : maxSell; } public void setMin(double value, Ranges ranges) { boolean buy = ((int) ranges.getRange(Indicator.BUY).getMinBuy()) == 1; if(buy) minBuy = value; else minSell = value; } public void setMax(double value, Ranges ranges) { boolean buy = ((int) ranges.getRange(Indicator.BUY).getMinBuy()) == 1; if(buy) maxBuy = value; else maxSell = value; } } EnumMap<Indicator, Range> ranges = new EnumMap<Indicator, Range>(Indicator.class); public Ranges() { for(Indicator indicator : Indicator.values()) ranges.put(indicator, indicator.range.duplicate()); } public EnumMap<Indicator, Range> getRanges() { return ranges; } public void setRanges(EnumMap<Indicator, Range> rangesEnumMap) { ranges = rangesEnumMap; ranges.put(Indicator.BUY, Indicator.BUY.getRange().duplicate()); for(Indicator indicator : Indicator.values()) if(!ranges.containsKey(indicator)) ranges.put(indicator, indicator.range.duplicate()); } public Range getRange(Indicator indicator) { if(!ranges.containsKey(indicator)) ranges.put(indicator, indicator.range.duplicate()); return ranges.get(indicator); } public void changeRange(Indicator indicator, Range range) { if(!ranges.containsKey(indicator)) ranges.put(indicator, indicator.range.duplicate()); Range toChange = ranges.get(indicator); toChange.setMinBuy(range.getMinBuy()); toChange.setMaxBuy(range.getMaxBuy()); toChange.setMinSell(range.getMinSell()); toChange.setMaxSell(range.getMaxSell()); toChange.setInvertedBuy(range.isInvertedBuy()); toChange.setInvertedSell(range.isInvertedSell()); } public boolean fulfills(SignalHistoryRecord record) { for(Indicator indicator : Indicator.values()) { if(!ranges.containsKey(indicator)) ranges.put(indicator, indicator.range.duplicate()); if(indicator == Indicator.BUY) { int value = (int) ranges.get(Indicator.BUY).getMinBuy(); if(value != 2 && value == 0 && record.buy) return false; if(value != 2 && value == 1 && !record.buy) return false; } else if(!ranges.get(indicator).isInside(indicator.calculate(record), record.buy)) return false; } return true; } public Ranges duplicate() { Ranges newRanges = new Ranges(); for(Indicator indicator : Indicator.values()) { if(!ranges.containsKey(indicator)) ranges.put(indicator, indicator.range.duplicate()); Range range = ranges.get(indicator); newRanges.changeRange(indicator, range.duplicate()); } return newRanges; } }