package dailyBot.analysis;
import java.beans.XMLDecoder;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import dailyBot.control.DailyProperties;
import dailyBot.control.connection.ChatConnection;
import dailyBot.control.connection.EmailConnection;
import dailyBot.control.connection.dailyFx.DailyFxServerConnection;
import dailyBot.model.ExternalProcessFilter;
import dailyBot.model.Filter;
import dailyBot.model.MultiFilter;
import dailyBot.model.Pair;
import dailyBot.model.SignalProvider.SignalProviderId;
import dailyBot.model.Strategy.StrategyId;
public class DailyAnalysis
{
public static void updateAnalysis()
{
ChatConnection.sendMessage("Starting updating analysis", true, ChatConnection.ADMINS);
FilterMap filterMap = new FilterMap();
Utils.reloadRecords();
List <SignalHistoryRecord> allRecords = Utils.getRecords();
String currentStatusLog = "";
for(SignalProviderId id : SignalProviderId.values())
{
MultiFilter multiFilter = new MultiFilter(id);
multiFilter.startFilters();
currentStatusLog += "\n" + id.toString() + ":\n";
for(Filter filter : multiFilter.filters())
{
Map <FilterMap.DoubleArray, Boolean> map = filterMap.getFilterMap(id.toString() + "." + filter.getName());
for(SignalHistoryRecord record : allRecords)
map.put(new FilterMap.DoubleArray(record), filter.filter(record));
currentStatusLog += filter.getName() + ":\n";
DailyFxServerConnection.loadSSI();
DailyFxServerConnection.loadVix();
for(StrategyId strategy : StrategyId.values())
{
currentStatusLog += strategy + ":\n";
for(Pair pair : Pair.values())
for(boolean buy : new boolean[]{true, false})
currentStatusLog += pair + " " + buy + " " + filter.filter(new SignalHistoryRecord(strategy, pair, buy)) + "\n";
}
}
}
String allHits = "";
for(Map.Entry<String, Integer> e : ExternalProcessFilter.lastHit.entrySet())
allHits += e.getKey() + " : " + e.getValue() + "\n";
EmailConnection.sendEmail("DailyBot-error", allHits, EmailConnection.SUPERADMINS);
filterMap.writePersistence();
for(StrategyId strategy : StrategyId.values())
{
for(Pair pair : Pair.values())
{
for(boolean buy : new boolean[]{true, false})
{
File directory = new File("analysis/rawData/" + strategy.toString() + "/" + pair.toString() + "/");
directory.mkdirs();
File file = new File("analysis/rawData/" + strategy.toString() + "/" + pair.toString() + "/" + (buy ? "buy_" : "sell_") + dailyBot.model.Utils.getId(strategy, pair, buy) + ".txt");
file.delete();
try
{
BufferedWriter bw = new BufferedWriter(new FileWriter(file));
for(SignalHistoryRecord record : allRecords)
bw.write(record.generateLine() + "\n");
bw.close();
}
catch(Exception e)
{
}
}
}
}
ChatConnection.sendMessage("Analysis updated\n" + currentStatusLog, true, ChatConnection.ADMINS);
}
private static class MapFilter implements Filter
{
private final Map <FilterMap.DoubleArray, Boolean> map;
public MapFilter(Map <FilterMap.DoubleArray, Boolean> map)
{
this.map = map;
}
@Override
public boolean filter(SignalHistoryRecord record)
{
if(map.containsKey(new FilterMap.DoubleArray(record)))
return map.get(new FilterMap.DoubleArray(record));
else
return false;
}
@Override
public String getName()
{
return "MapFilter";
}
}
public static MultiFilter readMultiFilter(SignalProviderId id)
{
try
{
FileInputStream fis = new FileInputStream("filters/" + id + ".xml");
XMLDecoder decoder = new XMLDecoder(fis);
MultiFilter answer = (MultiFilter) decoder.readObject();
fis.close();
decoder.close();
return answer;
}
catch(Exception e)
{
return new MultiFilter(id);
}
}
public static MultiFilter getFilterSignalProvider(SignalProviderId id)
{
FilterMap filterMap = FilterMap.loadPersistence();
MultiFilter multiFilter = readMultiFilter(id);
multiFilter.startFilters();
Filter[] filtersBefore = multiFilter.filters();
Filter[] newFilters = new Filter[filtersBefore.length];
for(int i = 0; i < filtersBefore.length; i++)
newFilters[i] = new MapFilter(filterMap.getFilterMap(id.toString() + "." + filtersBefore[i].getName()));
multiFilter.changeFilters(newFilters);
return multiFilter;
}
public static String getFilterNameSignalProvider(SignalProviderId id, int i)
{
MultiFilter multiFilter = readMultiFilter(id);
multiFilter.startFilters();
return multiFilter.filters()[i].getName();
}
public static void main(String[] args)
{
TimeZone.setDefault(TimeZone.getTimeZone("America/Bogota"));
DailyProperties.setAnalysis(true);
DailyProperties.setVerbose(true);
boolean saved = false;
updateAnalysis();
while(true)
{
Calendar calendar = Calendar.getInstance();
if(calendar.get(Calendar.HOUR_OF_DAY) == 18)
{
if(!saved)
updateAnalysis();
saved = true;
}
else
saved = false;
try
{
Thread.sleep(5000);
}
catch (InterruptedException e)
{
}
}
}
}