From cf969f4a7baeb55d866ba4802e20edc0c116efbf Mon Sep 17 00:00:00 2001 From: Dennis Thiessen Date: Thu, 13 Jul 2017 10:06:48 +0200 Subject: [PATCH] Graph implemented --- dekaBot.iml | 6 +- pom.xml | 12 +++- src/main/java/DrawGraph.java | 121 +++++++++++++++++++++++++++++++++++ src/main/java/Main.java | 60 ++++++++++++++--- 4 files changed, 187 insertions(+), 12 deletions(-) create mode 100644 src/main/java/DrawGraph.java diff --git a/dekaBot.iml b/dekaBot.iml index cfbf201..14b1199 100644 --- a/dekaBot.iml +++ b/dekaBot.iml @@ -1,6 +1,6 @@ - + @@ -8,7 +8,7 @@ - + @@ -24,5 +24,7 @@ + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index a630da4..a525b3e 100644 --- a/pom.xml +++ b/pom.xml @@ -80,8 +80,16 @@ joda-time 2.9.9 - - + + org.jgrapht + jgrapht-core + 1.0.1 + + + jgraph + jgraph + 5.13.0.0 + diff --git a/src/main/java/DrawGraph.java b/src/main/java/DrawGraph.java new file mode 100644 index 0000000..b8d242d --- /dev/null +++ b/src/main/java/DrawGraph.java @@ -0,0 +1,121 @@ +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.RenderingHints; +import java.awt.Stroke; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import javax.swing.*; + +@SuppressWarnings("serial") +public class DrawGraph extends JPanel { + private static final int MAX_SCORE = 20; + private static final int PREF_W = 800; + private static final int PREF_H = 650; + private static final int BORDER_GAP = 30; + private static final Color GRAPH_COLOR = Color.black; + private static final Color GRAPH_POINT_COLOR = new Color(150, 50, 50, 180); + private static final Stroke GRAPH_STROKE = new BasicStroke(1f); + private static final int GRAPH_POINT_WIDTH = 2; + private static final int Y_HATCH_CNT = 10; + private List scores; + + public DrawGraph(List scores) { + this.scores = scores; + } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + Graphics2D g2 = (Graphics2D)g; + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + + double xScale = ((double) getWidth() - 2 * BORDER_GAP) / (scores.size() - 1); + double yScale = ((double) getHeight() - 2 * BORDER_GAP) / (MAX_SCORE - 1); + + List graphPoints = new ArrayList(); + for (int i = 0; i < scores.size(); i++) { + int x1 = (int) (i * xScale + BORDER_GAP); + int y1 = (int) ((MAX_SCORE - scores.get(i)) * yScale + BORDER_GAP); + graphPoints.add(new Point(x1, y1)); + } + + // create x and y axes + g2.drawLine(BORDER_GAP, getHeight() - BORDER_GAP, BORDER_GAP, BORDER_GAP); + g2.drawLine(BORDER_GAP, getHeight() - BORDER_GAP, getWidth() - BORDER_GAP, getHeight() - BORDER_GAP); + + // create hatch marks for y axis. + for (int i = 0; i < Y_HATCH_CNT; i++) { + int x0 = BORDER_GAP; + int x1 = GRAPH_POINT_WIDTH + BORDER_GAP; + int y0 = getHeight() - (((i + 1) * (getHeight() - BORDER_GAP * 2)) / Y_HATCH_CNT + BORDER_GAP); + int y1 = y0; + g2.drawLine(x0, y0, x1, y1); + } + + // and for x axis + for (int i = 0; i < scores.size() - 1; i++) { + int x0 = (i + 1) * (getWidth() - BORDER_GAP * 2) / (scores.size() - 1) + BORDER_GAP; + int x1 = x0; + int y0 = getHeight() - BORDER_GAP; + int y1 = y0 - GRAPH_POINT_WIDTH; + g2.drawLine(x0, y0, x1, y1); + } + + Stroke oldStroke = g2.getStroke(); + g2.setColor(GRAPH_COLOR); + g2.setStroke(GRAPH_STROKE); + for (int i = 0; i < graphPoints.size() - 1; i++) { + int x1 = graphPoints.get(i).x; + int y1 = graphPoints.get(i).y; + int x2 = graphPoints.get(i + 1).x; + int y2 = graphPoints.get(i + 1).y; + g2.drawLine(x1, y1, x2, y2); + } + + g2.setStroke(oldStroke); + g2.setColor(GRAPH_POINT_COLOR); + for (int i = 0; i < graphPoints.size(); i++) { + int x = graphPoints.get(i).x - GRAPH_POINT_WIDTH / 2; + int y = graphPoints.get(i).y - GRAPH_POINT_WIDTH / 2;; + int ovalW = GRAPH_POINT_WIDTH; + int ovalH = GRAPH_POINT_WIDTH; + g2.fillOval(x, y, ovalW, ovalH); + } + } + + @Override + public Dimension getPreferredSize() { + return new Dimension(PREF_W, PREF_H); + } + + private static void createAndShowGui() { + List scores = new ArrayList<>(); + Random random = new Random(); + int maxDataPoints = 16; + double maxScore = 20.0; + for (int i = 0; i < maxDataPoints ; i++) { + scores.add(random.nextDouble()*maxScore); + } + DrawGraph mainPanel = new DrawGraph(scores); + + JFrame frame = new JFrame("DrawGraph"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.getContentPane().add(mainPanel); + frame.pack(); + frame.setLocationByPlatform(true); + frame.setVisible(true); + } + + public static void main(String[] args) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + createAndShowGui(); + } + }); + } +} \ No newline at end of file diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 89373df..f740295 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -5,6 +5,7 @@ import com.mashape.unirest.http.exceptions.UnirestException; import org.apache.commons.math3.stat.regression.SimpleRegression; import org.json.JSONArray; import org.json.JSONObject; +import javax.swing.*; import java.io.*; import java.nio.charset.Charset; @@ -22,8 +23,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 MovingAverage ma15 = new MovingAverage(150); + private static MovingAverage ma50 = new MovingAverage(500); private static OrderHistory orders = new OrderHistory(); private static Funds funds = new Funds(); @@ -47,6 +48,7 @@ public class Main { private static boolean backtest = false; private static Map results = new HashMap<>(); + private static ArrayList graphValues = new ArrayList<>(); public static void main(String[] args) throws InterruptedException { System.out.println("Starting DekaBot..."); @@ -87,6 +89,7 @@ public class Main { return; }else if(input.equals("y")){ backtest = true; + doBacktest(); doOrder(new Order("buy")); @@ -213,6 +216,31 @@ public class Main { return newOrder; } + private static Order decide2() { + Order newOrder = new Order(); + newOrder.price = currentPrice; + + if(!regressionbacktest) System.out.println("------- START ORDER -------"); + if (buyindicator > BUY_THRESHOLD) { + + if(!regressionbacktest) System.out.println("BUY NOW - PRICE: " + currentPrice); + newOrder.ordertype = "buy"; + + } else if (buyindicator > SELL_THRESHOLD) { + if(!regressionbacktest) System.out.println("DO NOTHING - NEUTRAL: " + currentPrice); + counterneutrals++; + } else { + + if(!regressionbacktest) System.out.println("SELL NOW - PRICE: " + currentPrice); + newOrder.ordertype = "sell"; + + + } + if(!regressionbacktest) System.out.println("------- END ORDER -------"); + + return newOrder; + } + private static String calculateTrend() { if ((Double.compare(buyvslope, 0) > 0) && (Double.compare(priceslope, 0) > 0)) { if (Double.compare(trades.volumeOfBuyTrades, trades.volumeOfSellTrades) > 0) { @@ -308,13 +336,13 @@ public class Main { } private static String calculateTrend_4() { - if(counter < 50) return "neutral"; + if(counter < 500) return "neutral"; if(ma15.getAverage().compareTo(ma50.getAverage()) == 1){ - buyindicator += 2; + buyindicator += 3; return "normal buy"; }else if(ma15.getAverage().compareTo(ma50.getAverage()) == -1){ - buyindicator -= 2; + buyindicator -= 3; return "normal sell"; }else{ return "neutral"; @@ -368,8 +396,7 @@ public class Main { ma15.add(currentPrice); ma50.add(currentPrice); - - + graphValues.add(currentPrice); trades = new TradeHistory(volumeArray, sinceid); @@ -381,11 +408,12 @@ public class Main { sellvslope = srsellvolume.getSlope(); trend = calculateTrend_4(); + //System.out.println("Trend: "+trend+" shortAVG "+ma15.getAverage()+" longAVG "+ma50.getAverage()); outputAnalyzationResults(); if (((counter % NUM_ITERATIONS_FOR_ORDER) == 0) && (counter != 0)) { - Order order = decide(); + Order order = decide2(); if (order.ordertype != null) doOrder(order); @@ -401,6 +429,9 @@ public class Main { counter++; } + drawGraph("Threshold: "+BUY_THRESHOLD+" Iterations: "+NUM_ITERATIONS_FOR_ORDER,graphValues); + graphValues.clear(); + } catch (IOException e) { e.printStackTrace(); } @@ -513,5 +544,18 @@ public class Main { return Math.abs(d.intValue()); } + private static void drawGraph(String title, ArrayList values){ + JFrame frame = new JFrame("Graph"); + + frame.setSize(700, 400); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JPanel panel = new JPanel(); + + DrawGraph graph = new DrawGraph(values); + frame.add(graph); + + frame.setVisible(true); + } }