From e6e9b8654158e4c05b897037bf5df5900a7d4e7b Mon Sep 17 00:00:00 2001 From: Dennis Thiessen Date: Thu, 20 Jul 2017 15:28:34 +0200 Subject: [PATCH] Exponential Moving Average implemented --- src/main/java/Main.java | 38 ++++++++++++++++--- .../java/utils/ExponentialMovingAverage.java | 26 +++++++++++++ ...gAverage.java => SimpleMovingAverage.java} | 4 +- 3 files changed, 60 insertions(+), 8 deletions(-) create mode 100644 src/main/java/utils/ExponentialMovingAverage.java rename src/main/java/utils/{MovingAverage.java => SimpleMovingAverage.java} (92%) diff --git a/src/main/java/Main.java b/src/main/java/Main.java index f5f92b8..b563703 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -10,7 +10,8 @@ import storage.Order; import storage.OrderHistory; import storage.TradeHistory; import utils.DrawGraph; -import utils.MovingAverage; +import utils.ExponentialMovingAverage; +import utils.SimpleMovingAverage; import javax.swing.*; @@ -34,8 +35,10 @@ public class Main { private static SimpleRegression srbuyvolume = new SimpleRegression(true); private static SimpleRegression srsellvolume = new SimpleRegression(true); private static SimpleRegression srprice = new SimpleRegression(true); - private static MovingAverage ma15 = new MovingAverage(200); - private static MovingAverage ma50 = new MovingAverage(1000); + private static SimpleMovingAverage ma15 = new SimpleMovingAverage(200); + private static SimpleMovingAverage ma50 = new SimpleMovingAverage(1000); + private static ExponentialMovingAverage ema15 = new ExponentialMovingAverage(50); + private static ExponentialMovingAverage ema50 = new ExponentialMovingAverage(100); private static OrderHistory orders = new OrderHistory(); private static Funds funds = new Funds(); @@ -62,6 +65,8 @@ public class Main { private static ArrayList graphValuesBase = new ArrayList<>(); private static ArrayList graphValues1 = new ArrayList<>(); private static ArrayList graphValues2 = new ArrayList<>(); + private static ArrayList graphValues3 = new ArrayList<>(); + private static ArrayList graphValues4 = new ArrayList<>(); public static void main(String[] args) throws InterruptedException { System.out.println("Starting DekaBot..."); @@ -383,7 +388,7 @@ public class Main { private static String calculateTrend_4() { if(currentIteration < 500) return "neutral"; - + /* if(ma15.getAverage().compareTo(ma50.getAverage()) == 1){ buyindicator += 3; return "normal buy"; @@ -393,9 +398,21 @@ public class Main { }else{ return "neutral"; } + */ + + if(ema15.getAverage() > ema50.getAverage()){ + buyindicator += 3; + return "normal buy"; + }else if(ema15.getAverage() < ema50.getAverage()){ + buyindicator -= 3; + return "normal sell"; + }else{ + return "neutral"; + } } private static void doBacktest(){ + System.out.println("Start backtest"); try { graphValues1.clear(); graphValues2.clear(); @@ -450,9 +467,13 @@ public class Main { ma15.add(currentPrice); ma50.add(currentPrice); - if(!regressionbacktest) return;graphValuesBase.add(currentPrice); + // if(!regressionbacktest) return; + + graphValuesBase.add(currentPrice); graphValues1.add(ma15.getAverage().doubleValue()); graphValues2.add(ma50.getAverage().doubleValue()); + graphValues3.add(ema15.average(currentPrice)); + graphValues4.add(ema50.average(currentPrice)); outputAnalyzationResults(); @@ -481,8 +502,13 @@ public class Main { if(!regressionbacktest) System.out.println("utils.DrawGraph -- "+graphValues1.size()); if(!regressionbacktest) drawGraph("Threshold: "+BUY_THRESHOLD+" Iterations: "+NUM_ITERATIONS_FOR_ORDER, graphValuesBase, graphValues1, graphValues2); + + if(!regressionbacktest) drawGraph("Threshold: "+BUY_THRESHOLD+" Iterations: "+NUM_ITERATIONS_FOR_ORDER, graphValuesBase, graphValues3, graphValues4); + } catch (IOException e) { System.out.println("Error:" + e.getMessage()); + } catch (Exception e) { + System.out.println("Exception occured:" + e.getMessage()); } } @@ -588,7 +614,7 @@ public class Main { } private static void drawGraph(String title, ArrayList valuesBase, ArrayList values1, ArrayList values2){ - JFrame frame = new JFrame("Graph"); + JFrame frame = new JFrame(title); frame.setSize(700, 400); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); diff --git a/src/main/java/utils/ExponentialMovingAverage.java b/src/main/java/utils/ExponentialMovingAverage.java new file mode 100644 index 0000000..7ce2ec9 --- /dev/null +++ b/src/main/java/utils/ExponentialMovingAverage.java @@ -0,0 +1,26 @@ +package utils; + + +public class ExponentialMovingAverage { + private double alpha; + private Double oldValue; + public ExponentialMovingAverage(double alpha) { + this.alpha = alpha; + } + + public double average(double value) { + if (oldValue == null) { + oldValue = value; + return value; + } + //double newValue = oldValue + alpha * (value - oldValue); + double k = 2 / (alpha +1); + double newValue = (value * k) + (oldValue * (1 - k)); + oldValue = newValue; + return newValue; + } + + public double getAverage(){ + return oldValue; + } +} diff --git a/src/main/java/utils/MovingAverage.java b/src/main/java/utils/SimpleMovingAverage.java similarity index 92% rename from src/main/java/utils/MovingAverage.java rename to src/main/java/utils/SimpleMovingAverage.java index b25e606..bc397f5 100644 --- a/src/main/java/utils/MovingAverage.java +++ b/src/main/java/utils/SimpleMovingAverage.java @@ -5,13 +5,13 @@ import java.math.RoundingMode; import java.util.LinkedList; import java.util.Queue; -public class MovingAverage { +public class SimpleMovingAverage { private final Queue window = new LinkedList(); private final int period; private BigDecimal sum = BigDecimal.ZERO; - public MovingAverage(int period) { + public SimpleMovingAverage(int period) { this.period = period; }