package dailyBot.analysis; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.IdentityHashMap; import java.util.LinkedList; import java.util.List; import java.util.TreeMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import dailyBot.control.connection.SqlConnection; import dailyBot.model.MultiFilter; import dailyBot.model.Pair; import dailyBot.model.SignalProvider.SignalProviderId; import dailyBot.model.Strategy; import dailyBot.model.Strategy.StrategyId; import dailyBot.model.StrategySignal; public class Utils { static final AtomicReference < List <SignalHistoryRecord> > allRecords = new AtomicReference < List <SignalHistoryRecord> > (null); static final AtomicInteger lastUpdate = new AtomicInteger(-1); public static synchronized void reloadRecords() { List <SignalHistoryRecord> records = SqlConnection.getRecords(); TreeMap <FilterMap.DoubleArray, SignalHistoryRecord> map = new TreeMap <FilterMap.DoubleArray, SignalHistoryRecord> (); for(SignalHistoryRecord record : records) { FilterMap.DoubleArray doubleArray = new FilterMap.DoubleArray(record); if(map.containsKey(doubleArray)) { if(map.get(doubleArray).closeDate < record.closeDate) map.put(doubleArray, record); } else map.put(doubleArray, record); } List <SignalHistoryRecord> uniqueRecords = new ArrayList <SignalHistoryRecord> (); IdentityHashMap <SignalHistoryRecord, SignalHistoryRecord> choosen = new IdentityHashMap <SignalHistoryRecord, SignalHistoryRecord> (); for(SignalHistoryRecord record : map.values()) choosen.put(record, record); for(SignalHistoryRecord record : records) if(choosen.containsKey(record)) uniqueRecords.add(record); allRecords.getAndSet(Collections.unmodifiableList(uniqueRecords)); lastUpdate.getAndSet(Calendar.getInstance().get(Calendar.DAY_OF_MONTH)); } public static double getSSI(SignalHistoryRecord record) { if(record.pair.pairFatherA() == record.pair.pairFatherB()) return record.buy ? -record.SSI1 * 100 : record.SSI1 * 100; double ssi1 = record.SSI1; double ssi2 = record.SSI2; switch(record.pair.pairFatherA()) { case USDCAD: case USDCHF: case USDJPY: ssi1 = -ssi1; break; default: break; } switch(record.pair.pairFatherB()) { case USDCAD: case USDCHF: case USDJPY: ssi2 = -ssi2; break; default: break; } double ssi = ssi1 - ssi2; if(record.buy) ssi = -ssi; return 100 * ssi; } public static List <SignalHistoryRecord> getRecords() { if((allRecords.get() == null) || (lastUpdate.getAndAdd(0) != Calendar.getInstance().get(Calendar.DAY_OF_MONTH))) reloadRecords(); return allRecords.get(); } public static List <SignalHistoryRecord> getStrategyRecords(StrategyId id, Pair pair) { LinkedList <SignalHistoryRecord> toReturn = new LinkedList <SignalHistoryRecord> (); for(SignalHistoryRecord record : getRecords()) if(record.id == id && record.pair.equals(pair)) toReturn.add(record); return toReturn; } private static final ConcurrentHashMap <Integer, MultiFilter> filterMap = new ConcurrentHashMap <Integer, MultiFilter> (); public static MultiFilter getFilterSignalProvider(int ordinal) { if(!filterMap.containsKey(ordinal)) filterMap.put(ordinal, DailyAnalysis.getFilterSignalProvider(SignalProviderId.values()[ordinal])); return filterMap.get(ordinal); } private static final ConcurrentHashMap <Integer, MultiFilter> filterAllActiveMap = new ConcurrentHashMap <Integer, MultiFilter> (); public static MultiFilter getFilterSignalProvider(int ordinal, boolean allActive) { if(!allActive) return getFilterSignalProvider(ordinal); if(!filterAllActiveMap.containsKey(ordinal)) { filterAllActiveMap.put(ordinal, DailyAnalysis.getFilterSignalProvider(SignalProviderId.values()[ordinal])); MultiFilter filter = filterAllActiveMap.get(ordinal); for(StrategyId strategyId : StrategyId.values()) for(Pair pair : Pair.values()) for(boolean isBuy : new boolean[]{true, false}) filter.changeActive(strategyId, pair, isBuy, false); } return filterAllActiveMap.get(ordinal); } private static final ConcurrentHashMap <Integer, Strategy> strategyMap = new ConcurrentHashMap <Integer, Strategy> (); public static List<StrategySignal> getStrategySignals(int ordinal) { if(!strategyMap.containsKey(ordinal)) strategyMap.put(ordinal, Strategy.readPersistency(StrategyId.values()[ordinal])); return strategyMap.get(ordinal).getSignals(); } private static final ConcurrentHashMap < Integer, List <StrategySignal> > signalProviderMap = new ConcurrentHashMap < Integer, List <StrategySignal> > (); public static List<StrategySignal> getSignalProviderSignals(int ordinal) { if(!signalProviderMap.containsKey(ordinal)) { ArrayList <StrategySignal> signals = new ArrayList <StrategySignal> (); for(StrategyId id : StrategyId.values()) for(StrategySignal signal : getStrategySignals(id.ordinal())) if(signal.getUniqueId(SignalProviderId.values()[ordinal].toString()) != 0) signals.add(signal); signalProviderMap.put(ordinal, signals); } return signalProviderMap.get(ordinal); } public static StrategySignal getStrategySignal(int ordinalStrategy, int ordinalPair) { for(StrategySignal signal : getStrategySignals(ordinalStrategy)) if(signal.getPair().ordinal() == ordinalPair) return signal; return null; } public static String getFilterNameSignalProvider(SignalProviderId id, int i) { return DailyAnalysis.getFilterNameSignalProvider(id, i); } public static boolean isRelevant(long time) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(time); if(calendar.get(Calendar.YEAR) >= 2013) return true; else if(calendar.get(Calendar.YEAR) == 2012 && calendar.get(Calendar.MONTH) >= Calendar.OCTOBER) return true; else return false; } }