package dailyBot.analysis; import java.beans.XMLDecoder; import java.beans.XMLEncoder; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.Serializable; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentSkipListMap; import dailyBot.control.DailyLog; public class FilterMap implements Serializable { private static final long serialVersionUID = -493259477013147023L; public static class DoubleArray implements Serializable, Comparable <DoubleArray> { private static final long serialVersionUID = 8856878561844025513L; double[] array; public DoubleArray() { } public DoubleArray(SignalHistoryRecord record) { double[] answer = new double[record.getCharacteristics().length + 4]; int current = 0; for(int i = 0; i < record.getCharacteristics().length; i++) answer[current++] = record.getCharacteristics()[i]; answer[current++] = record.id.ordinal(); answer[current++] = record.pair.ordinal(); answer[current++] = record.buy ? 1 : 0; answer[current++] = record.openDate; array = answer; } private int compare(double[] o1, double[] o2) { if(o1.length != o2.length) return o1.length - o2.length; for(int i = 0; i < o1.length; i++) if(o1[i] != o2[i]) return (int) Math.signum(o1[i] - o2[i]); return 0; } public double[] getArray() { return array; } public void setArray(double[] array) { this.array = array; } @Override public int compareTo(DoubleArray o) { return compare(array, o.array); } } private ConcurrentHashMap < String, Map <DoubleArray, Boolean> > map = new ConcurrentHashMap < String, Map <DoubleArray, Boolean> > (); public ConcurrentHashMap < String, Map<DoubleArray, Boolean> > getMap() { return map; } public void setMap(ConcurrentHashMap < String, Map <DoubleArray, Boolean> > map) { this.map = map; } public Map <DoubleArray, Boolean> getFilterMap(String filter) { if(!map.containsKey(filter)) map.put(filter, new ConcurrentSkipListMap <DoubleArray, Boolean> ()); return map.get(filter); } public void writePersistence() { try { FileOutputStream fos = new FileOutputStream("analysis/filterMap.xml"); XMLEncoder encoder = new XMLEncoder(fos); encoder.writeObject(this); encoder.close(); fos.close(); } catch(Exception e) { DailyLog.logError("Error writing filterMap"); } } public static FilterMap loadPersistence() { try { if(!new File("analysis/filterMap.xml").exists()) return new FilterMap(); else { FileInputStream fis = new FileInputStream("analysis/filterMap.xml"); XMLDecoder decoder = new XMLDecoder(fis); FilterMap answer = (FilterMap) decoder.readObject(); fis.close(); decoder.close(); return answer; } } catch(Exception e) { DailyLog.logError("Error reading filterMap"); return new FilterMap(); } } }