From 3039cee6807c5f3d62da0b4bb52edc6b59c49490 Mon Sep 17 00:00:00 2001 From: 7u83 <7u83@maiol.ru> Date: Fri, 3 Feb 2017 01:56:41 +0100 Subject: [PATCH] Better schedulet --- pom.xml | 5 + src/main/java/chart/Chart.java | 2 +- src/main/java/gui/Clock.java | 11 +- src/main/java/gui/ClockDialog.form | 4 + src/main/java/gui/ClockDialog.java | 12 +++ src/main/java/gui/NewMDIApplication.form | 127 ++++++++++++++++------ src/main/java/gui/NewMDIApplication.java | 128 +++++++++++++++------- src/main/java/gui/StatisticsDialog.form | 60 +++++++++++ src/main/java/gui/StatisticsDialog.java | 131 +++++++++++++++++++++++ src/main/java/gui/StatisticsPanel.form | 40 +++++++ src/main/java/gui/StatisticsPanel.java | 93 ++++++++++++++++ src/main/java/sesim/Exchange.java | 37 ++++--- src/main/java/sesim/Scheduler.java | 38 +++++-- src/main/java/traders/RandomTrader.java | 25 ++--- src/main/resources/icons/stop.gif | Bin 0 -> 777 bytes 15 files changed, 602 insertions(+), 111 deletions(-) create mode 100644 src/main/java/gui/StatisticsDialog.form create mode 100644 src/main/java/gui/StatisticsDialog.java create mode 100644 src/main/java/gui/StatisticsPanel.form create mode 100644 src/main/java/gui/StatisticsPanel.java create mode 100644 src/main/resources/icons/stop.gif diff --git a/pom.xml b/pom.xml index 9d7de6a..4cbed3b 100644 --- a/pom.xml +++ b/pom.xml @@ -23,6 +23,11 @@ json 20160810 + + net.java.linoleum + jlfgr + 1_0 + UTF-8 diff --git a/src/main/java/chart/Chart.java b/src/main/java/chart/Chart.java index bafa321..ae320fc 100644 --- a/src/main/java/chart/Chart.java +++ b/src/main/java/chart/Chart.java @@ -55,7 +55,7 @@ public class Chart extends javax.swing.JPanel implements QuoteReceiver, Scrollab // int item_width = 10; //int items = 350; //long ntime = 0; - OHLCData data = new OHLCData(16000); + OHLCData data = new OHLCData(60000*15); OHLCDataItem current = null; diff --git a/src/main/java/gui/Clock.java b/src/main/java/gui/Clock.java index 7b3111a..5dc8970 100644 --- a/src/main/java/gui/Clock.java +++ b/src/main/java/gui/Clock.java @@ -27,6 +27,7 @@ package gui; import java.util.Timer; import java.util.TimerTask; +import sesim.Exchange.Statistics; import sesim.Scheduler; /** @@ -35,7 +36,7 @@ import sesim.Scheduler; */ public class Clock extends javax.swing.JPanel { - private final Timer timer; + protected final Timer timer; TimerTask clockUpdater; /** * Creates new form Clock @@ -50,6 +51,8 @@ public class Clock extends javax.swing.JPanel { long t = Globals.se.timer.currentTimeMillis(); System.out.printf("The Clock: %d\n",t); + Statistics s = Globals.se.getStatistics(); + System.out.printf("Num trades: %d, %d\n",s.trades,s.orders); jLabel1.setText(Scheduler.formatTimeMillis(t)); } @@ -57,9 +60,13 @@ public class Clock extends javax.swing.JPanel { timer.schedule(clockUpdater, 0, 1000); + } - + @Override + public void setVisible(boolean b){ + System.out.printf("Visible: %s\n",Boolean.toString(b)); + } /** diff --git a/src/main/java/gui/ClockDialog.form b/src/main/java/gui/ClockDialog.form index 3c797f4..efe2abb 100644 --- a/src/main/java/gui/ClockDialog.form +++ b/src/main/java/gui/ClockDialog.form @@ -3,6 +3,7 @@
+ @@ -49,6 +50,9 @@ + + + diff --git a/src/main/java/gui/ClockDialog.java b/src/main/java/gui/ClockDialog.java index 76ce0ed..bca8f65 100644 --- a/src/main/java/gui/ClockDialog.java +++ b/src/main/java/gui/ClockDialog.java @@ -37,6 +37,7 @@ public class ClockDialog extends javax.swing.JDialog { public ClockDialog(java.awt.Frame parent, boolean modal) { super(parent, modal); initComponents(); + this.setLocationRelativeTo(parent); } /** @@ -52,8 +53,14 @@ public class ClockDialog extends javax.swing.JDialog { jButton1 = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + setTitle("Clock"); jButton1.setText("Ok"); + jButton1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jButton1ActionPerformed(evt); + } + }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); @@ -77,6 +84,10 @@ public class ClockDialog extends javax.swing.JDialog { pack(); }// //GEN-END:initComponents + private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed + this.dispose(); + }//GEN-LAST:event_jButton1ActionPerformed + /** * @param args the command line arguments */ @@ -122,6 +133,7 @@ public class ClockDialog extends javax.swing.JDialog { @Override public void dispose(){ super.dispose(); + this.clock1.timer.cancel(); System.out.print("Disposed\n"); } diff --git a/src/main/java/gui/NewMDIApplication.form b/src/main/java/gui/NewMDIApplication.form index 7ed2347..6b8a218 100644 --- a/src/main/java/gui/NewMDIApplication.form +++ b/src/main/java/gui/NewMDIApplication.form @@ -196,15 +196,15 @@ - + + + - - @@ -213,11 +213,12 @@ - + + - + @@ -225,16 +226,85 @@ - - - - - + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -262,29 +332,18 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/src/main/java/gui/NewMDIApplication.java b/src/main/java/gui/NewMDIApplication.java index 081a642..ede52a9 100644 --- a/src/main/java/gui/NewMDIApplication.java +++ b/src/main/java/gui/NewMDIApplication.java @@ -137,12 +137,15 @@ public class NewMDIApplication extends javax.swing.JFrame { jScrollPane2 = new javax.swing.JScrollPane(); jTextArea1 = new javax.swing.JTextArea(); - jToolBar1 = new javax.swing.JToolBar(); - jRunButton = new javax.swing.JButton(); - jButton2 = new javax.swing.JButton(); orderBookPanel1 = new gui.OrderBookPanel(); jScrollPane1 = new javax.swing.JScrollPane(); chart1 = new chart.Chart(); + jPanel2 = new javax.swing.JPanel(); + jButton1 = new javax.swing.JButton(); + jRunButton = new javax.swing.JButton(); + jButton2 = new javax.swing.JButton(); + jSpinner2 = new javax.swing.JSpinner(); + clock1 = new gui.Clock(); menuBar = new javax.swing.JMenuBar(); fileMenu = new javax.swing.JMenu(); openMenuItem = new javax.swing.JMenuItem(); @@ -173,34 +176,6 @@ public class NewMDIApplication extends javax.swing.JFrame { setMinimumSize(new java.awt.Dimension(640, 480)); setPreferredSize(new java.awt.Dimension(800, 561)); - jToolBar1.setFloatable(false); - jToolBar1.setRollover(true); - - jRunButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/icons/run.gif"))); // NOI18N - jRunButton.setText("Run sim!"); - jRunButton.setToolTipText("Run the simmulation"); - jRunButton.setFocusable(false); - jRunButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - jRunButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); - jRunButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jRunButtonActionPerformed(evt); - } - }); - jToolBar1.add(jRunButton); - - jButton2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/icons/pause.gif"))); // NOI18N - jButton2.setText("Pause"); - jButton2.setFocusable(false); - jButton2.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - jButton2.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); - jButton2.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jButton2ActionPerformed(evt); - } - }); - jToolBar1.add(jButton2); - javax.swing.GroupLayout chart1Layout = new javax.swing.GroupLayout(chart1); chart1.setLayout(chart1Layout); chart1Layout.setHorizontalGroup( @@ -214,6 +189,74 @@ public class NewMDIApplication extends javax.swing.JFrame { jScrollPane1.setViewportView(chart1); + jButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/toolbarButtonGraphics/general/Stop24.gif"))); // NOI18N + jButton1.setText("Stop"); + jButton1.setFocusable(false); + jButton1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + jButton1.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + + jRunButton.setFont(jRunButton.getFont()); + jRunButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/icons/run.gif"))); // NOI18N + jRunButton.setText("Run sim!"); + jRunButton.setToolTipText("Run the simmulation"); + jRunButton.setFocusable(false); + jRunButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + jRunButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + jRunButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jRunButtonActionPerformed(evt); + } + }); + + jButton2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/icons/pause.gif"))); // NOI18N + jButton2.setText("Pause"); + jButton2.setFocusable(false); + jButton2.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + jButton2.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + jButton2.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jButton2ActionPerformed(evt); + } + }); + + jSpinner2.setModel(new javax.swing.SpinnerNumberModel(0.0d, 0.0d, 1000.0d, 0.1d)); + jSpinner2.addChangeListener(new javax.swing.event.ChangeListener() { + public void stateChanged(javax.swing.event.ChangeEvent evt) { + jSpinner2StateChanged(evt); + } + }); + + javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); + jPanel2.setLayout(jPanel2Layout); + jPanel2Layout.setHorizontalGroup( + jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel2Layout.createSequentialGroup() + .addComponent(jRunButton, javax.swing.GroupLayout.PREFERRED_SIZE, 86, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 67, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(clock1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(17, 17, 17) + .addComponent(jSpinner2, javax.swing.GroupLayout.PREFERRED_SIZE, 90, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap()) + ); + jPanel2Layout.setVerticalGroup( + jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jRunButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jButton2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jSpinner2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap()) + .addGroup(jPanel2Layout.createSequentialGroup() + .addContainerGap() + .addComponent(clock1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(9, Short.MAX_VALUE)) + ); + fileMenu.setMnemonic('f'); fileMenu.setText("File"); @@ -347,23 +390,24 @@ public class NewMDIApplication extends javax.swing.JFrame { layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() + .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() - .addContainerGap() .addComponent(orderBookPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 233, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jScrollPane1)) - .addComponent(jToolBar1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(jScrollPane1))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap() + .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(orderBookPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jScrollPane1)) + .addComponent(jScrollPane1) + .addComponent(orderBookPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) ); @@ -478,6 +522,11 @@ public class NewMDIApplication extends javax.swing.JFrame { }//GEN-LAST:event_viewClockActionPerformed + private void jSpinner2StateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jSpinner2StateChanged + Double val = (Double)this.jSpinner2.getValue(); + Globals.se.timer.setMultiply(val); + }//GEN-LAST:event_jSpinner2StateChanged + /** * @param args the command line arguments * @throws java.lang.IllegalAccessException @@ -535,6 +584,7 @@ public class NewMDIApplication extends javax.swing.JFrame { // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JMenuItem aboutMenuItem; private chart.Chart chart1; + private gui.Clock clock1; private javax.swing.JMenuItem contentMenuItem; private javax.swing.JMenuItem deleteMenuItem; private javax.swing.JMenuItem editExchangeMenuItem; @@ -543,16 +593,18 @@ public class NewMDIApplication extends javax.swing.JFrame { private javax.swing.JMenuItem exitMenuItem; private javax.swing.JMenu fileMenu; private javax.swing.JMenu helpMenu; + private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JMenuItem jMenuItem2; private javax.swing.JMenuItem jMenuItem3; + private javax.swing.JPanel jPanel2; private javax.swing.JButton jRunButton; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JPopupMenu.Separator jSeparator1; private javax.swing.JPopupMenu.Separator jSeparator2; + private javax.swing.JSpinner jSpinner2; private javax.swing.JTextArea jTextArea1; - private javax.swing.JToolBar jToolBar1; private javax.swing.JMenuBar menuBar; private javax.swing.JMenuItem openMenuItem; private gui.OrderBookPanel orderBookPanel1; diff --git a/src/main/java/gui/StatisticsDialog.form b/src/main/java/gui/StatisticsDialog.form new file mode 100644 index 0000000..bfea7a3 --- /dev/null +++ b/src/main/java/gui/StatisticsDialog.form @@ -0,0 +1,60 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/main/java/gui/StatisticsDialog.java b/src/main/java/gui/StatisticsDialog.java new file mode 100644 index 0000000..9ad5a07 --- /dev/null +++ b/src/main/java/gui/StatisticsDialog.java @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2017, 7u83 <7u83@mail.ru> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +package gui; + +/** + * + * @author 7u83 <7u83@mail.ru> + */ +public class StatisticsDialog extends javax.swing.JDialog { + + /** + * Creates new form StatisticsDialog + */ + public StatisticsDialog(java.awt.Frame parent, boolean modal) { + super(parent, modal); + initComponents(); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + statisticsPanel1 = new gui.StatisticsPanel(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + + javax.swing.GroupLayout statisticsPanel1Layout = new javax.swing.GroupLayout(statisticsPanel1); + statisticsPanel1.setLayout(statisticsPanel1Layout); + statisticsPanel1Layout.setHorizontalGroup( + statisticsPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 388, Short.MAX_VALUE) + ); + statisticsPanel1Layout.setVerticalGroup( + statisticsPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 288, Short.MAX_VALUE) + ); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap() + .addComponent(statisticsPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(statisticsPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addContainerGap()) + ); + + pack(); + }// //GEN-END:initComponents + + /** + * @param args the command line arguments + */ + public static void main(String args[]) { + /* Set the Nimbus look and feel */ + // + /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. + * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html + */ + try { + for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { + if ("Nimbus".equals(info.getName())) { + javax.swing.UIManager.setLookAndFeel(info.getClassName()); + break; + } + } + } catch (ClassNotFoundException ex) { + java.util.logging.Logger.getLogger(StatisticsDialog.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (InstantiationException ex) { + java.util.logging.Logger.getLogger(StatisticsDialog.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (IllegalAccessException ex) { + java.util.logging.Logger.getLogger(StatisticsDialog.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (javax.swing.UnsupportedLookAndFeelException ex) { + java.util.logging.Logger.getLogger(StatisticsDialog.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } + // + + /* Create and display the dialog */ + java.awt.EventQueue.invokeLater(new Runnable() { + public void run() { + StatisticsDialog dialog = new StatisticsDialog(new javax.swing.JFrame(), true); + dialog.addWindowListener(new java.awt.event.WindowAdapter() { + @Override + public void windowClosing(java.awt.event.WindowEvent e) { + System.exit(0); + } + }); + dialog.setVisible(true); + } + }); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private gui.StatisticsPanel statisticsPanel1; + // End of variables declaration//GEN-END:variables +} diff --git a/src/main/java/gui/StatisticsPanel.form b/src/main/java/gui/StatisticsPanel.form new file mode 100644 index 0000000..2fc1728 --- /dev/null +++ b/src/main/java/gui/StatisticsPanel.form @@ -0,0 +1,40 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/main/java/gui/StatisticsPanel.java b/src/main/java/gui/StatisticsPanel.java new file mode 100644 index 0000000..25b64a8 --- /dev/null +++ b/src/main/java/gui/StatisticsPanel.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2017, 7u83 <7u83@mail.ru> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +package gui; + +import java.util.Timer; +import java.util.TimerTask; +import sesim.Scheduler; + +/** + * + * @author 7u83 <7u83@mail.ru> + */ +public class StatisticsPanel extends javax.swing.JPanel { + + Timer timer; + TimerTask clockUpdater; + /** + * Creates new form StatisticsPanel + */ + public StatisticsPanel() { + initComponents(); + this.timer = new Timer(); + clockUpdater = new TimerTask() { + @Override + public void run() { + long t = Globals.se.timer.currentTimeMillis(); + + System.out.printf("The Clock: %d\n", t); + jLabel1.setText(Scheduler.formatTimeMillis(t)); + + } + }; + + timer.schedule(clockUpdater, 0, 1000); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + jLabel1 = new javax.swing.JLabel(); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 216, Short.MAX_VALUE) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + }// //GEN-END:initComponents + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel jLabel1; + // End of variables declaration//GEN-END:variables +} diff --git a/src/main/java/sesim/Exchange.java b/src/main/java/sesim/Exchange.java index 3c7cfc0..c02362a 100644 --- a/src/main/java/sesim/Exchange.java +++ b/src/main/java/sesim/Exchange.java @@ -171,7 +171,7 @@ public class Exchange { //extends Thread { this.limit = roundMoney(limit); this.volume = roundShares(volume); this.initial_volume = this.volume; - this.created = System.currentTimeMillis(); + this.created = timer.currentTimeMillis(); } public long getID() { @@ -219,6 +219,24 @@ public class Exchange { //extends Thread { } } + + + public class Statistics{ + public long trades; + public long orders; + } + + long num_trades = 0; + long num_orders=0; + + public Statistics getStatistics(){ + Statistics s = new Statistics(); + s.trades=num_trades; + s.orders=num_orders; + return s; + + } + /*public interface TimerEvent { @@ -239,15 +257,7 @@ public class Exchange { //extends Thread { } } - /** - * - * @return - */ - public static long getCurrentTimeSeconds() { - long ct = System.currentTimeMillis(); - return ct / 1000; - } - + public SortedSet getQuoteHistory(long start) { Quote s = new Quote(); @@ -500,6 +510,8 @@ public class Exchange { //extends Thread { volume_total += volume; money_total += price * volume; + num_trades++; + removeOrderIfExecuted(a); removeOrderIfExecuted(b); @@ -511,7 +523,7 @@ public class Exchange { //extends Thread { Quote q = new Quote(); q.price = money_total / volume_total; q.volume = volume_total; - q.time = System.currentTimeMillis(); + q.time = timer.currentTimeMillis(); // System.out.print("There was a trade:"+q.price+"\n"); this.quoteHistory.add(q); @@ -546,7 +558,8 @@ public class Exchange { //extends Thread { return -1; } tradelock.lock(); - + num_orders++; + addOrderToBook(o); a.orders.put(o.id, o); diff --git a/src/main/java/sesim/Scheduler.java b/src/main/java/sesim/Scheduler.java index 81669ca..93f611e 100644 --- a/src/main/java/sesim/Scheduler.java +++ b/src/main/java/sesim/Scheduler.java @@ -42,7 +42,15 @@ import java.util.TreeSet; */ public class Scheduler extends Thread { - long multiply = 1; + private double multiplier = 0.0; + + public void setMultiply(double val){ + this.multiplier=val; + } + + public double getMultiply(){ + return this.multiplier; + } private final SortedMap> event_queue = new TreeMap<>(); private boolean halt = false; @@ -82,9 +90,10 @@ public class Scheduler extends Thread { * @return */ public long currentTimeMillis() { + long diff = System.currentTimeMillis() - last_time_millis; last_time_millis += diff; - this.current_time_millis += diff * 1; + this.current_time_millis += diff * this.multiplier; return (long) this.current_time_millis; @@ -95,7 +104,10 @@ public class Scheduler extends Thread { DateFormat formatter = new SimpleDateFormat("HH:mm:ss"); String dateFormatted = formatter.format(date); - return dateFormatted; + long seconds = (t/1000) % 60; + long minutes = (t/1000/60) % 60; + long hours = (t/1000)/(60*60); + return String.format("%02d:%02d:%02d",hours,minutes, seconds); } @@ -107,7 +119,7 @@ public class Scheduler extends Thread { public void startTimerEvent(TimerTask e, long time) { long evtime = time + currentTimeMillis(); synchronized (event_queue) { - this.addEvent(e, time); + this.addEvent(e, evtime); } synchronized (this) { notify(); @@ -128,9 +140,9 @@ public class Scheduler extends Thread { return e.timerTask(); } - private boolean addEvent(TimerTask e, long time) { + private boolean addEvent(TimerTask e, long evtime) { - long evtime = time + currentTimeMillis(); + // long evtime = time + currentTimeMillis(); SortedSet s = event_queue.get(evtime); if (s == null) { @@ -147,19 +159,25 @@ public class Scheduler extends Thread { } long t = event_queue.firstKey(); - if (t <= currentTimeMillis()) { + long ct = currentTimeMillis(); + + //System.out.printf("Current CMP %d %d\n", ct, t); + + if (t <= ct) { + this.current_time_millis=t; SortedSet s = event_queue.get(t); event_queue.remove(t); Iterator it = s.iterator(); while (it.hasNext()) { TimerTask e = it.next(); long next_t = this.fireEvent(e); - this.addEvent(e, next_t); + + this.addEvent(e, next_t+ct); } return 0; } else { - return t - currentTimeMillis(); + return (t - currentTimeMillis())/(long)this.multiplier; } } @@ -178,7 +196,7 @@ public class Scheduler extends Thread { synchronized (this) { try { - + if (wtime != -1 && !pause) { wait(wtime); } else { diff --git a/src/main/java/traders/RandomTrader.java b/src/main/java/traders/RandomTrader.java index 09d3fa9..b31db59 100644 --- a/src/main/java/traders/RandomTrader.java +++ b/src/main/java/traders/RandomTrader.java @@ -47,7 +47,7 @@ public class RandomTrader extends AutoTrader { sesim.Exchange.Account a = se.getAccount(account_id); long rc = this.doTrade(); - return rc ; + return rc; } @@ -67,7 +67,8 @@ public class RandomTrader extends AutoTrader { public long timerTask() { sesim.Exchange.Account a = se.getAccount(account_id); long rc = this.doTrade(); - return rc / 1; + System.out.printf("TT RC: %d\n",rc); + return rc; // return this.event(); } @@ -85,9 +86,9 @@ public class RandomTrader extends AutoTrader { } - double getStart (){ + double getStart() { return Globals.se.fairValue; - + } //Timer timer = new Timer(); @@ -104,7 +105,6 @@ public class RandomTrader extends AutoTrader { //final private RandomTraderConfig_old myconfig; // object to generate random numbers //final private Random rand = new Random(); - /** * Get a (long) random number between min an max * @@ -114,7 +114,7 @@ public class RandomTrader extends AutoTrader { */ protected double getRandom(double min, double max) { double r = se.randNextDouble(); - + return (max - min) * r + min; } @@ -122,7 +122,6 @@ public class RandomTrader extends AutoTrader { return (int) Math.round(getRandom(minmax[0], minmax[1])); } - /** * * @param val @@ -130,7 +129,7 @@ public class RandomTrader extends AutoTrader { * @return */ protected double getRandomAmmount(double val, Float[] minmax) { - + //System.out.printf("RandomAmmount: %f (%f,%f)\n",val, minmax[0], minmax[1]); double min = val * minmax[0] / 100.0; double max = val * minmax[1] / 100.0; @@ -175,20 +174,18 @@ public class RandomTrader extends AutoTrader { double limit; limit = lp + getRandomAmmount(lp, myconfig.buy_limit); - -// System.out.printf("MyLimit: %f\n",limit); - +// System.out.printf("MyLimit: %f\n",limit); long volume = (long) (money / (limit * 1)); if (volume <= 0) { return 0; } // double volume = (money / (limit * 1)); - if (volume <= 0) { + if (volume <= 0) { return 0; } - + se.createOrder(account_id, type, volume, limit); return getRandom(myconfig.buy_wait); @@ -202,7 +199,7 @@ public class RandomTrader extends AutoTrader { OrderType type = OrderType.ASK; // how much money we ant to envest? - double volume = (long)getRandomAmmount(ad.shares, myconfig.sell_volume); + double volume = (long) getRandomAmmount(ad.shares, myconfig.sell_volume); // double lp = 100.0; //se.getBestLimit(type); Quote q = se.getCurrentPrice(); diff --git a/src/main/resources/icons/stop.gif b/src/main/resources/icons/stop.gif new file mode 100644 index 0000000000000000000000000000000000000000..62b7743dba57141b88cf08fa456bace18ab3f16e GIT binary patch literal 777 zcmZ?wbhEHblwgoxc=n&+|Ns9j%_~}(mv?uq@9o*x-L-D&l$|rC@0l@u_w;GI=FdAk zf8L?Ri;gW?cy#ru^Q%^#TfOSss+DIA3=(Z^^AZy$78XvetejU_Ik&oceslBkrlw_G zUF(~gmiF{)?Cssy)3c$wdwo~ey6*0EhYo$3Hf{IRsk>&(*fV|l?rGC@O`W>){Q3X$ z<{h3p_t5m|K<E`oEjqSv;n8{X4z5~te&xz@ix(eT zz54vBRp(Z&JiBGf&DE>Vty%?S+}OPN`i>oUHgCSRW5?~rre#gd%co4;ISuHA8M~)W z+qr1*@wxL3E?RtSCD8G!&#hc__P~Jy41)tG{$ycfUn4rM!-=!vTM1n@w%g#aP`n<;^v04;->^JhD)k*_}<^(DUAg zOOE2QA$)GonUC;0NA-*J9ngMX6J zg^yWwXV^3uG&D?PIP5rm*UcFbEM5ZYe0&F9G&nt02z;Z_=40W^c$P<