From c1a35a3f17a665b336f4128e16de2caa17d9cf02 Mon Sep 17 00:00:00 2001 From: Dennis Thiessen Date: Wed, 12 Jul 2017 16:23:18 +0200 Subject: [PATCH] Included MovingAverage --- src/main/java/Main.java | 31 +++++++++++++++++++++----- src/main/java/MovingAverage.java | 38 ++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 src/main/java/MovingAverage.java diff --git a/src/main/java/Main.java b/src/main/java/Main.java index cfbd42b..89373df 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -22,6 +22,8 @@ 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(15); + private static MovingAverage ma50 = new MovingAverage(50); private static OrderHistory orders = new OrderHistory(); private static Funds funds = new Funds(); @@ -48,7 +50,6 @@ public class Main { public static void main(String[] args) throws InterruptedException { System.out.println("Starting DekaBot..."); - System.out.println("Starting simulation... initializing Funds..."); funds.addFund("ETH", VALUE_ETH); @@ -306,6 +307,20 @@ public class Main { } } + private static String calculateTrend_4() { + if(counter < 50) return "neutral"; + + if(ma15.getAverage().compareTo(ma50.getAverage()) == 1){ + buyindicator += 2; + return "normal buy"; + }else if(ma15.getAverage().compareTo(ma50.getAverage()) == -1){ + buyindicator -= 2; + return "normal sell"; + }else{ + return "neutral"; + } + } + private static void doBacktest(){ try { funds.clearFunds(); @@ -316,13 +331,13 @@ public class Main { String priceline = ""; String volumeline = ""; - int counter = 0; + counter = 0; - InputStream fis = new FileInputStream("C:\\Development\\Projects\\DekaBot\\DekaBot\\src\\main\\resources\\price.txt"); + InputStream fis = new FileInputStream(System.getProperty("user.dir")+"\\src\\main\\resources\\price.txt"); InputStreamReader isr = new InputStreamReader(fis, Charset.forName("UTF-8")); BufferedReader br = new BufferedReader(isr); - InputStream fis2 = new FileInputStream("C:\\Development\\Projects\\DekaBot\\DekaBot\\src\\main\\resources\\volume.txt"); + InputStream fis2 = new FileInputStream(System.getProperty("user.dir")+"\\src\\main\\resources\\volume.txt"); InputStreamReader isr2 = new InputStreamReader(fis2, Charset.forName("UTF-8")); BufferedReader br2 = new BufferedReader(isr2); @@ -351,6 +366,11 @@ public class Main { currentPrice = jsonPriceObject.getDouble("EUR"); srprice.addData((double) counter, currentPrice); + ma15.add(currentPrice); + ma50.add(currentPrice); + + + trades = new TradeHistory(volumeArray, sinceid); srbuyvolume.addData((double) counter, trades.volumeOfBuyTrades); @@ -360,7 +380,8 @@ public class Main { buyvslope = srbuyvolume.getSlope(); sellvslope = srsellvolume.getSlope(); - trend = calculateTrend_2(); + trend = calculateTrend_4(); + outputAnalyzationResults(); if (((counter % NUM_ITERATIONS_FOR_ORDER) == 0) && (counter != 0)) { diff --git a/src/main/java/MovingAverage.java b/src/main/java/MovingAverage.java new file mode 100644 index 0000000..ab440bd --- /dev/null +++ b/src/main/java/MovingAverage.java @@ -0,0 +1,38 @@ +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.LinkedList; +import java.util.Queue; + +public class MovingAverage { + + private final Queue window = new LinkedList(); + private final int period; + private BigDecimal sum = BigDecimal.ZERO; + + public MovingAverage(int period) { + this.period = period; + } + + public void add(BigDecimal num) { + sum = sum.add(num); + window.add(num); + if (window.size() > period) { + sum = sum.subtract(window.remove()); + } + } + + public void add(double numd) { + BigDecimal num = BigDecimal.valueOf(numd); + sum = sum.add(num); + window.add(num); + if (window.size() > period) { + sum = sum.subtract(window.remove()); + } + } + + public BigDecimal getAverage() { + if (window.isEmpty()) return BigDecimal.ZERO; + BigDecimal divisor = BigDecimal.valueOf(window.size()); + return sum.divide(divisor, 2, RoundingMode.HALF_UP); + } +}