package dailyBot.analysis;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.SortedMap;
import dailyBot.control.connection.SqlConnection;
import dailyBot.model.Pair;
public class StatisticsUtils
{
public static class PairHistory
{
public Date date;
public double high;
public double low;
public double open;
public double close;
public PairHistory(Date date, double low, double high, double open, double close)
{
this.date = date;
this.low = low;
this.high = high;
this.open = open;
this.close = close;
}
}
public static double calculateEMA(ArrayList <Double> values, int period)
{
double ema = 0;
for(int i = 0; i < Math.min(values.size(), 14); i++)
ema += values.get(i);
ema /= Math.min(values.size(), 14);
double alpha = 2.0d / (period + 1.0d);
for(int i = 14; i < values.size(); i++)
ema = alpha * values.get(i) + (1 - alpha) * ema;
return ema;
}
public static double calculateATR(Pair pair, int period, long closingDate)
{
ArrayList <Double> values = new ArrayList <Double>();
SortedMap <Date, PairHistory> map = SqlConnection.getPairHistory(pair, new Date(closingDate));
double lastClose = 0;
int i = 0;
for(PairHistory actual : map.values())
{
if(i++ == 0)
{
lastClose = actual.close;
continue;
}
values.add(Math.max(
(actual.high - actual.low) * pair.pairMultiplier(),
Math.max(Math.abs(actual.high - lastClose) * pair.pairMultiplier(), Math.abs(actual.low - lastClose)
* pair.pairMultiplier())));
lastClose = actual.close;
}
return StatisticsUtils.calculateEMA(values, period);
}
public static double calculateATR(Pair pair, int period)
{
return calculateATR(pair, period, Calendar.getInstance().getTimeInMillis());
}
public static double calculateRSI(Pair pair, int period, long closingDate)
{
ArrayList <Double> values = new ArrayList <Double>();
SortedMap <Date, PairHistory> map = SqlConnection.getPairHistory(pair, new Date(closingDate));
double lastClose = 0;
int i = 0;
for(PairHistory actual : map.values())
{
if(i++ == 0)
{
lastClose = actual.close;
continue;
}
double newPrice = actual.close - lastClose;
if(newPrice > 0)
values.add(newPrice);
else
values.add(0d);
lastClose = actual.close;
}
double emaU = StatisticsUtils.calculateEMA(values, period);
lastClose = 0;
values.clear();
i = 0;
for(PairHistory actual : map.values())
{
if(i++ == 0)
{
lastClose = actual.close;
continue;
}
double newPrice = actual.close - lastClose;
if(newPrice < 0)
values.add(-newPrice);
else
values.add(0d);
lastClose = actual.close;
}
double emaD = StatisticsUtils.calculateEMA(values, period);
double rS = emaU / emaD;
return emaD < 1e-8 ? 100 : 100d - 100d / (1d + rS);
}
}