diff --git a/pom.xml b/pom.xml index 62ab98f..4bc2fa8 100644 --- a/pom.xml +++ b/pom.xml @@ -38,6 +38,11 @@ keytool-api-1.7 1.5 + + org.jdesktop + beansbinding + 1.2.1 + UTF-8 diff --git a/src/main/java/gui/EditExchangeDialog.form b/src/main/java/gui/EditExchangeDialog.form index b2b5e1c..7b717f1 100644 --- a/src/main/java/gui/EditExchangeDialog.form +++ b/src/main/java/gui/EditExchangeDialog.form @@ -33,7 +33,7 @@ - + @@ -44,8 +44,8 @@ - - + + @@ -58,18 +58,18 @@ - + - + - + @@ -77,7 +77,7 @@ - + @@ -89,7 +89,7 @@ - + @@ -106,14 +106,17 @@ + + + - + - + diff --git a/src/main/java/gui/EditExchangeDialog.java b/src/main/java/gui/EditExchangeDialog.java index 2977fdb..aa6076f 100644 --- a/src/main/java/gui/EditExchangeDialog.java +++ b/src/main/java/gui/EditExchangeDialog.java @@ -25,6 +25,8 @@ */ package gui; +import org.json.JSONObject; + /** * * @author 7u83 <7u83@mail.ru> @@ -38,9 +40,12 @@ public class EditExchangeDialog extends javax.swing.JDialog { super(parent, modal); initComponents(); this.setLocationRelativeTo(parent); + JSONObject jo = new JSONObject(Globals.prefs.get("Exchange", "{}")); + this.moneyDecimalsSpinner.setValue(jo.getInt(Globals.se.CFG_MONEY_DECIMALS)); + this.sharesDecimalsSpinner.setValue(jo.getInt(Globals.se.CFG_SHARES_DECIMALS)); } - - int showdialog(){ + + int showdialog() { this.setVisible(true); return 3; } @@ -54,34 +59,39 @@ public class EditExchangeDialog extends javax.swing.JDialog { // //GEN-BEGIN:initComponents private void initComponents() { - jSpinner1 = new javax.swing.JSpinner(); + sharesDecimalsSpinner = new javax.swing.JSpinner(); jLabel1 = new javax.swing.JLabel(); - jSpinner2 = new javax.swing.JSpinner(); + moneyDecimalsSpinner = new javax.swing.JSpinner(); jLabel2 = new javax.swing.JLabel(); jButton1 = new javax.swing.JButton(); - jButton2 = new javax.swing.JButton(); + okButton = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("SeSim ExchangeSettings"); setMinimumSize(new java.awt.Dimension(300, 142)); setModal(true); - jSpinner1.setModel(new javax.swing.SpinnerNumberModel(0, 0, 10, 1)); + sharesDecimalsSpinner.setModel(new javax.swing.SpinnerNumberModel(0, 0, 10, 1)); jLabel1.setText("Number of decimals for shares:"); - jSpinner2.setModel(new javax.swing.SpinnerNumberModel(2, 0, 10, 1)); + moneyDecimalsSpinner.setModel(new javax.swing.SpinnerNumberModel(2, 0, 10, 1)); jLabel2.setText("Number of decimals for money:"); jButton1.setMnemonic('c'); jButton1.setText("Cancel"); - - jButton2.setMnemonic('o'); - jButton2.setText("Ok"); - jButton2.addActionListener(new java.awt.event.ActionListener() { + jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { - jButton2ActionPerformed(evt); + jButton1ActionPerformed(evt); + } + }); + + okButton.setMnemonic('o'); + okButton.setText("Ok"); + okButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + okButtonActionPerformed(evt); } }); @@ -94,7 +104,7 @@ public class EditExchangeDialog extends javax.swing.JDialog { .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addGap(0, 0, Short.MAX_VALUE) - .addComponent(jButton2) + .addComponent(okButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jButton1)) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() @@ -103,8 +113,8 @@ public class EditExchangeDialog extends javax.swing.JDialog { .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jSpinner2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jSpinner1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE)))) + .addComponent(moneyDecimalsSpinner, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(sharesDecimalsSpinner, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE)))) .addContainerGap()) ); layout.setVerticalGroup( @@ -112,25 +122,34 @@ public class EditExchangeDialog extends javax.swing.JDialog { .addGroup(layout.createSequentialGroup() .addGap(15, 15, 15) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jSpinner1, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(sharesDecimalsSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel1)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jSpinner2, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(moneyDecimalsSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel2)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 32, Short.MAX_VALUE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jButton1) - .addComponent(jButton2)) + .addComponent(okButton)) .addContainerGap()) ); pack(); }// //GEN-END:initComponents - private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed -// Globals.prefs.put("money_decimals", value); - }//GEN-LAST:event_jButton2ActionPerformed + private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed + JSONObject jo = new JSONObject(); + jo.put(Globals.se.CFG_MONEY_DECIMALS, (Integer) this.moneyDecimalsSpinner.getValue()); + jo.put(Globals.se.CFG_SHARES_DECIMALS, (Integer) this.sharesDecimalsSpinner.getValue()); + System.out.printf("EC: %s\n", jo.toString(3)); + Globals.prefs.put("Exchange", jo.toString()); + dispose(); + }//GEN-LAST:event_okButtonActionPerformed + + private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed + dispose(); + }//GEN-LAST:event_jButton1ActionPerformed /** * @param args the command line arguments @@ -177,10 +196,10 @@ public class EditExchangeDialog extends javax.swing.JDialog { // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton jButton1; - private javax.swing.JButton jButton2; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; - private javax.swing.JSpinner jSpinner1; - private javax.swing.JSpinner jSpinner2; + private javax.swing.JSpinner moneyDecimalsSpinner; + private javax.swing.JButton okButton; + private javax.swing.JSpinner sharesDecimalsSpinner; // End of variables declaration//GEN-END:variables } diff --git a/src/main/java/gui/EditStrategies.java b/src/main/java/gui/EditStrategies.java index fdf6b1d..e475f54 100644 --- a/src/main/java/gui/EditStrategies.java +++ b/src/main/java/gui/EditStrategies.java @@ -35,7 +35,7 @@ import java.util.logging.Logger; import javax.swing.JPanel; import org.json.JSONArray; import org.json.JSONObject; -import sesim.AutoTrader; + import sesim.AutoTraderConfig; import sesim.AutoTraderGui; import sesim.AutoTraderInterface; diff --git a/src/main/java/gui/MainWin.java b/src/main/java/gui/MainWin.java index fd5355f..23dc082 100644 --- a/src/main/java/gui/MainWin.java +++ b/src/main/java/gui/MainWin.java @@ -27,7 +27,7 @@ package gui; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; -import sesim.AutoTrader; + import sesim.Exchange; import traders.*; diff --git a/src/main/java/gui/NewMDIApplication.form b/src/main/java/gui/NewMDIApplication.form index f1e8caf..ded9d96 100644 --- a/src/main/java/gui/NewMDIApplication.form +++ b/src/main/java/gui/NewMDIApplication.form @@ -243,16 +243,12 @@ - - - - - - - - + + + + diff --git a/src/main/java/gui/NewMDIApplication.java b/src/main/java/gui/NewMDIApplication.java index 2afd82f..110fbf0 100644 --- a/src/main/java/gui/NewMDIApplication.java +++ b/src/main/java/gui/NewMDIApplication.java @@ -39,7 +39,7 @@ import javax.swing.UIManager; import javax.swing.filechooser.FileNameExtensionFilter; import org.json.JSONArray; import org.json.JSONObject; -import sesim.AutoTrader; + import sesim.AutoTraderConfig; import sesim.AutoTraderInterface; import sesim.Exchange; @@ -73,8 +73,8 @@ public class NewMDIApplication extends javax.swing.JFrame { public void startTraders() { - Globals.se.setMoneyDecimals(8); - Globals.se.setSharesDecimals(0); + // Globals.se.setMoneyDecimals(8); + // Globals.se.setSharesDecimals(0); JSONArray tlist = Globals.getTraders(); @@ -458,13 +458,11 @@ public class NewMDIApplication extends javax.swing.JFrame { 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() - .addComponent(orderBookPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 233, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jChartScrollPane))) + .addComponent(orderBookPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 233, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jChartScrollPane) .addContainerGap()) + .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -496,8 +494,13 @@ public class NewMDIApplication extends javax.swing.JFrame { } void startSim() { - + + + resetSim(); + JSONObject jo = new JSONObject(Globals.prefs.get("Exchange", "{}")); + Globals.se.putConfig(jo); + this.stopButton.setEnabled(true); this.orderBookPanel.invalidate(); diff --git a/src/main/java/gui/OrdersList.form b/src/main/java/gui/OrdersList.form index 5fc287f..736be7a 100644 --- a/src/main/java/gui/OrdersList.form +++ b/src/main/java/gui/OrdersList.form @@ -38,12 +38,14 @@ + - - - - - +
+ + + + +
diff --git a/src/main/java/gui/OrdersList.java b/src/main/java/gui/OrdersList.java index 91d95aa..224aceb 100644 --- a/src/main/java/gui/OrdersList.java +++ b/src/main/java/gui/OrdersList.java @@ -25,9 +25,13 @@ */ package gui; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; import java.util.function.BiConsumer; import javax.swing.table.DefaultTableModel; import sesim.Exchange.Account; +import sesim.Exchange.Order; /** * @@ -37,24 +41,33 @@ public class OrdersList extends javax.swing.JPanel { public Account account; DefaultTableModel model; - - public final void updateModel(){ - if (null==account) - return; - - account.getOrders().forEach(new BiConsumer() { - @Override - public void accept(Object k, Object u) { - System.out.printf("Key: %d\n", (Long)k); - } - }); - - - - + public final void updateModel() { + if (null == account) { + return; + } + + int row = 0; + + Iterator> it = account.getOrders().entrySet().iterator(); + model.setRowCount(account.getOrders().size()); + while (it.hasNext()) { + Map.Entry e = it.next(); + Long k = (Long) e.getKey(); + Order o = (Order) e.getValue(); + + model.setValueAt(k, row, 0); + + model.setValueAt(((Order) o).getType().toString(), row, 1); + + model.setValueAt(((Order) o).getLimit(), row, 2); + model.setValueAt(((Order) o).getVolume(), row, 3); + model.setValueAt(((Order) o).getOrderStatus().toString(), row, 4); + row++; + } + this.order_table.getRowSorter().allRowsChanged(); } - + /** * Creates new form OrdersList */ @@ -76,24 +89,32 @@ public class OrdersList extends javax.swing.JPanel { jScrollPane1 = new javax.swing.JScrollPane(); order_table = new javax.swing.JTable(); + order_table.setAutoCreateRowSorter(true); order_table.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { - {null, null, null, null}, - {null, null, null, null}, - {null, null, null, null}, - {null, null, null, null} + {null, null, null, null, null}, + {null, null, null, null, null}, + {null, null, null, null, null}, + {null, null, null, null, null} }, new String [] { - "ID", "Type", "Price", "Volume" + "ID", "Type", "Limit", "Volume", "Status" } ) { Class[] types = new Class [] { - java.lang.Long.class, java.lang.String.class, java.lang.Double.class, java.lang.Double.class + java.lang.Long.class, java.lang.String.class, java.lang.Double.class, java.lang.Double.class, java.lang.String.class + }; + boolean[] canEdit = new boolean [] { + false, false, false, false, false }; public Class getColumnClass(int columnIndex) { return types [columnIndex]; } + + public boolean isCellEditable(int rowIndex, int columnIndex) { + return canEdit [columnIndex]; + } }); jScrollPane1.setViewportView(order_table); diff --git a/src/main/java/gui/TestPanel.form b/src/main/java/gui/TestPanel.form new file mode 100644 index 0000000..c638b68 --- /dev/null +++ b/src/main/java/gui/TestPanel.form @@ -0,0 +1,28 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/main/java/gui/TestPanel.java b/src/main/java/gui/TestPanel.java new file mode 100644 index 0000000..8797d9c --- /dev/null +++ b/src/main/java/gui/TestPanel.java @@ -0,0 +1,65 @@ +/* + * 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 TestPanel extends TraderListPanel { + + /** + * Creates new form TestPanel + */ + public TestPanel() { + 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() { + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 400, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 300, Short.MAX_VALUE) + ); + }// //GEN-END:initComponents + + + // Variables declaration - do not modify//GEN-BEGIN:variables + // End of variables declaration//GEN-END:variables +} diff --git a/src/main/java/gui/TraderListDialog.form b/src/main/java/gui/TraderListDialog.form index 64e2236..66a27b7 100644 --- a/src/main/java/gui/TraderListDialog.form +++ b/src/main/java/gui/TraderListDialog.form @@ -3,6 +3,7 @@
+ @@ -23,25 +24,17 @@ - - - - - + - - - - - + - + diff --git a/src/main/java/gui/TraderListDialog.java b/src/main/java/gui/TraderListDialog.java index dba4856..d1d93eb 100644 --- a/src/main/java/gui/TraderListDialog.java +++ b/src/main/java/gui/TraderListDialog.java @@ -52,25 +52,20 @@ public class TraderListDialog extends javax.swing.JDialog { // //GEN-BEGIN:initComponents private void initComponents() { - traderListPanel1 = new gui.TraderListPanel(); + traderListPanel22 = new gui.TraderListPanel2(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + setTitle("Trader List"); 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(traderListPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addContainerGap()) + .addComponent(traderListPanel22, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addContainerGap() - .addComponent(traderListPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 294, Short.MAX_VALUE) - .addContainerGap()) + .addComponent(traderListPanel22, javax.swing.GroupLayout.DEFAULT_SIZE, 312, Short.MAX_VALUE) ); pack(); @@ -120,6 +115,6 @@ public class TraderListDialog extends javax.swing.JDialog { } // Variables declaration - do not modify//GEN-BEGIN:variables - private gui.TraderListPanel traderListPanel1; + private gui.TraderListPanel2 traderListPanel22; // End of variables declaration//GEN-END:variables } diff --git a/src/main/java/gui/TraderListPanel.form b/src/main/java/gui/TraderListPanel.form index 752ad3c..ab33ab4 100644 --- a/src/main/java/gui/TraderListPanel.form +++ b/src/main/java/gui/TraderListPanel.form @@ -45,6 +45,9 @@
+ + + diff --git a/src/main/java/gui/TraderListPanel.java b/src/main/java/gui/TraderListPanel.java index 57abea1..e8eba8a 100644 --- a/src/main/java/gui/TraderListPanel.java +++ b/src/main/java/gui/TraderListPanel.java @@ -36,7 +36,7 @@ import javax.swing.ListModel; import javax.swing.SwingUtilities; import javax.swing.table.AbstractTableModel; import javax.swing.table.JTableHeader; -import sesim.AutoTrader; + import sesim.AutoTraderInterface; import sesim.Exchange; import sesim.Scheduler; @@ -247,6 +247,11 @@ public class TraderListPanel extends javax.swing.JPanel { "Title 1", "Title 2", "Title 3", "Title 4" } )); + traderList.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + traderListMouseClicked(evt); + } + }); traderListScroller.setViewportView(traderList); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); @@ -261,6 +266,10 @@ public class TraderListPanel extends javax.swing.JPanel { ); }// //GEN-END:initComponents + private void traderListMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_traderListMouseClicked + + }//GEN-LAST:event_traderListMouseClicked + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JTable traderList; diff --git a/src/main/java/gui/TraderListPanel2.form b/src/main/java/gui/TraderListPanel2.form new file mode 100644 index 0000000..5b2ae04 --- /dev/null +++ b/src/main/java/gui/TraderListPanel2.form @@ -0,0 +1,56 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+
+
+
+
diff --git a/src/main/java/gui/TraderListPanel2.java b/src/main/java/gui/TraderListPanel2.java new file mode 100644 index 0000000..a9162f5 --- /dev/null +++ b/src/main/java/gui/TraderListPanel2.java @@ -0,0 +1,181 @@ +/* + * 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.ArrayList; +import java.util.Iterator; +import java.util.Timer; +import java.util.TimerTask; +import javax.swing.JDialog; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.table.DefaultTableModel; + +import sesim.AutoTraderInterface; +import sesim.Exchange; +import sesim.Exchange.Account; + +/** + * + * @author 7u83 <7u83@mail.ru> + */ +public class TraderListPanel2 extends javax.swing.JPanel { + + DefaultTableModel model; + + final void updateModel() { + if (Globals.se == null) { + return; + } + + if (Globals.se.traders == null) { + return; + } + + sesim.Quote q = Globals.se.getLastQuoete(); + double price = q == null ? 0 : q.price; + + int size = Globals.se.traders.size(); + model.setRowCount(size); + for (int i = 0; i < size; i++) { + AutoTraderInterface at = Globals.se.traders.get(i); + Account a = at.getAccount(); + model.setValueAt(i, i, 0); + model.setValueAt(at.getName(), i, 1); + model.setValueAt(a.getMoney(), i, 2); + model.setValueAt(a.getShares(), i, 3); + + double wealth = a.getShares() * price + a.getMoney(); + model.setValueAt(wealth, i, 4); + } + list.getRowSorter().allRowsChanged(); + } + + TimerTask updater; + + /** + * Creates new form TraderListPanel2 + */ + public TraderListPanel2() { + initComponents(); + model = (DefaultTableModel) list.getModel(); + updateModel(); + + Timer timer = new Timer(); + updater = new TimerTask() { + @Override + public void run() { + updateModel(); + + } + }; + + timer.schedule(updater, 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() { + + jScrollPane1 = new javax.swing.JScrollPane(); + list = new javax.swing.JTable(); + + list.setAutoCreateRowSorter(true); + list.setModel(new javax.swing.table.DefaultTableModel( + new Object [][] { + {null, null, null, null, null}, + {null, null, null, null, null}, + {null, null, null, null, null}, + {null, null, null, null, null}, + {null, null, null, null, null} + }, + new String [] { + "ID", "Name", "Money", "Shares", "Wealth" + } + ) { + Class[] types = new Class [] { + java.lang.Long.class, java.lang.String.class, java.lang.Double.class, java.lang.Double.class, java.lang.Double.class + }; + boolean[] canEdit = new boolean [] { + false, false, false, false, false + }; + + public Class getColumnClass(int columnIndex) { + return types [columnIndex]; + } + + public boolean isCellEditable(int rowIndex, int columnIndex) { + return canEdit [columnIndex]; + } + }); + list.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + listMouseClicked(evt); + } + }); + jScrollPane1.setViewportView(list); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 537, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE) + ); + }// //GEN-END:initComponents + + private void listMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_listMouseClicked + if (evt.getClickCount() == 2) { + int index = list.rowAtPoint(evt.getPoint()); + + index = list.getRowSorter().convertRowIndexToModel(index); + Integer tid = (Integer)model.getValueAt(index, 0); + System.out.printf("Trader ID %d\n", tid); + + JDialog console = Globals.se.traders.get(tid).getGuiConsole(); + if (console == null) + return; + console.setVisible(true); + + } + + }//GEN-LAST:event_listMouseClicked + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JTable list; + // End of variables declaration//GEN-END:variables +} diff --git a/src/main/java/sesim/AutoTraderBase.java b/src/main/java/sesim/AutoTraderBase.java index ee4de55..5cdaa43 100644 --- a/src/main/java/sesim/AutoTraderBase.java +++ b/src/main/java/sesim/AutoTraderBase.java @@ -32,9 +32,9 @@ import sesim.Scheduler.TimerTask; * * @author 7u83 <7u83@mail.ru> */ -public abstract class AutoTraderBase implements AutoTraderInterface, TimerTask{ +public abstract class AutoTraderBase implements AutoTraderInterface, TimerTask { - protected double account_id; + protected double account_id; protected Exchange se; protected AutoTraderConfig config; @@ -43,19 +43,18 @@ public abstract class AutoTraderBase implements AutoTraderInterface, TimerTask{ public AutoTraderBase(Exchange se, long id, String name, double money, double shares, AutoTraderConfig config) { account_id = se.createAccount(money, shares); Exchange.Account a = se.getAccount(account_id); - - // a.owner=this; - + + // a.owner=this; this.se = se; this.config = config; this.name = name; - this.id=id; + this.id = id; } - - public AutoTraderBase(){ - se=null; - id=0; + + public AutoTraderBase() { + se = null; + id = 0; } public void setName(String name) { @@ -65,35 +64,30 @@ public abstract class AutoTraderBase implements AutoTraderInterface, TimerTask{ public String getName() { return name; } - - // @Override - public long getID(){ + + // @Override + public long getID() { return id; } private long id; - - public Exchange.Account getAccount(){ + + public Exchange.Account getAccount() { return se.getAccount(account_id); } - - public void init(Exchange se,long id,String name, double money, double shares, JSONObject cfg){ - this.account_id=se.createAccount(money, shares); - se.getAccount(account_id).owner=this; - this.se = se; + + public void init(Exchange se, long id, String name, double money, double shares, JSONObject cfg) { + this.account_id = se.createAccount(money, shares); + se.getAccount(account_id).owner = this; + this.se = se; this.name = name; - this.id=id; - - + this.id = id; + } - - public Exchange getSE(){ + + public Exchange getSE() { return se; } public abstract void start(); - - - - } diff --git a/src/main/java/sesim/AutoTraderConfig.java b/src/main/java/sesim/AutoTraderConfig.java index 02710c1..457cf81 100644 --- a/src/main/java/sesim/AutoTraderConfig.java +++ b/src/main/java/sesim/AutoTraderConfig.java @@ -34,7 +34,7 @@ import org.json.JSONObject; */ public abstract interface AutoTraderConfig { - public abstract AutoTrader createTrader(Exchange se, JSONObject cfg, long id, String name, double money, double shares); + public abstract OldAutoTrader createTrader(Exchange se, JSONObject cfg, long id, String name, double money, double shares); public abstract String getDisplayName(); diff --git a/src/main/java/sesim/AutoTraderInterface.java b/src/main/java/sesim/AutoTraderInterface.java index 4aacbfb..59ecdda 100644 --- a/src/main/java/sesim/AutoTraderInterface.java +++ b/src/main/java/sesim/AutoTraderInterface.java @@ -25,6 +25,7 @@ */ package sesim; +import javax.swing.JDialog; import org.json.JSONObject; /** @@ -39,13 +40,15 @@ public interface AutoTraderInterface { public abstract AutoTraderGui getGui(); + public abstract JDialog getGuiConsole(); + public abstract JSONObject getConfig(); public abstract void putConfig(JSONObject cfg); - + public abstract String getName(); - - public void init(Exchange se,long id,String name, double money, double shares, JSONObject cfg); + + public void init(Exchange se, long id, String name, double money, double shares, JSONObject cfg); public Exchange.Account getAccount(); diff --git a/src/main/java/sesim/AutoTraderList.java b/src/main/java/sesim/AutoTraderList.java index 29094f0..9d1b5b6 100644 --- a/src/main/java/sesim/AutoTraderList.java +++ b/src/main/java/sesim/AutoTraderList.java @@ -35,7 +35,7 @@ import java.util.ArrayList; */ public class AutoTraderList { - SortedSet traders; + SortedSet traders; AutoTraderList(){ diff --git a/src/main/java/sesim/Exchange.java b/src/main/java/sesim/Exchange.java index e1caec4..632114c 100644 --- a/src/main/java/sesim/Exchange.java +++ b/src/main/java/sesim/Exchange.java @@ -60,11 +60,21 @@ public class Exchange { public ArrayList traders; + /** + * + */ + public interface AccountListener { + + public void accountUpdated(Account a, Order o); + } + /** * Implements a trading account */ public class Account implements Comparable { + private AccountListener listener = null; + private final double id; private double shares; private double money; @@ -101,10 +111,21 @@ public class Exchange { return owner; } - public HashMap getOrders() { + public HashMap getOrders() { return orders; } + public void setListener(AccountListener al) { + this.listener = al; + } + + public void update(Order o) { + if (listener == null) { + return; + } + listener.accountUpdated(this, o); + } + } public void createTraders(JSONArray traderdefs) { @@ -128,6 +149,13 @@ public class Exchange { return a.id; } + public enum OrderStatus { + OPEN, + PARTIALLY_EXECUTED, + CLOSED, + CANCELED + } + class OrderComparator implements Comparator { OrderType type; @@ -141,12 +169,12 @@ public class Exchange { double d; switch (this.type) { case BUYLIMIT: - case STOPBUY: - case BUY: + case STOPBUY: + case BUY: d = right.limit - left.limit; break; case SELLLIMIT: - case STOPLOSS: + case STOPLOSS: case SELL: d = left.limit - right.limit; break; @@ -182,6 +210,7 @@ public class Exchange { public class Order { + OrderStatus status; OrderType type; private double limit; private double volume; @@ -198,6 +227,7 @@ public class Exchange { this.volume = roundShares(volume); this.initial_volume = this.volume; this.created = timer.currentTimeMillis(); + this.status=OrderStatus.OPEN; } public long getID() { @@ -227,6 +257,11 @@ public class Exchange { public Account getAccount() { return account; } + + public OrderStatus getOrderStatus(){ + return status; + } + } @@ -322,8 +357,25 @@ public class Exchange { } + public final String CFG_MONEY_DECIMALS = "money_decimals"; + public final String CFG_SHARES_DECIMALS = "shares_decimals"; + + public void putConfig(JSONObject cfg) { + this.setMoneyDecimals(cfg.getInt(CFG_MONEY_DECIMALS)); + this.setSharesDecimals(cfg.getInt(CFG_SHARES_DECIMALS)); + + } + public Quote getCurrentPrice() { + /* if (!this.quoteHistory.isEmpty()){ + Quote q = this.quoteHistory.pollLast(); + System.out.printf("Quote: %f\n", q.price); + return q; + } + + return null; + */ SortedSet bid = order_books.get(OrderType.BUYLIMIT); SortedSet ask = order_books.get(OrderType.SELLLIMIT); @@ -420,7 +472,6 @@ public class Exchange { // long time = 0; //double theprice = 12.9; // long orderid = 1; - double lastprice = 100.0; long lastsvolume; @@ -451,7 +502,10 @@ public class Exchange { } public Quote getLastQuoete() { - return this.quoteHistory.last(); + if (this.quoteHistory.isEmpty()) { + return null; + } + return this.quoteHistory.pollLast(); } private void transferMoneyAndShares(Account src, Account dst, double money, double shares) { @@ -459,6 +513,7 @@ public class Exchange { dst.money += money; src.shares -= shares; dst.shares += shares; + } public boolean cancelOrder(double account_id, long order_id) { @@ -516,6 +571,8 @@ public class Exchange { private void removeOrderIfExecuted(Order o) { if (o.volume != 0) { + o.status=OrderStatus.PARTIALLY_EXECUTED; + o.account.update(o); return; } @@ -525,23 +582,27 @@ public class Exchange { book.remove(book.first()); + o.status=OrderStatus.CLOSED; + o.account.update(o); + } - - void checkSLOrders(double price){ + + void checkSLOrders(double price) { SortedSet sl = order_books.get(OrderType.STOPLOSS); SortedSet ask = order_books.get(OrderType.SELLLIMIT); - - if (sl.isEmpty()) + + if (sl.isEmpty()) { return; - + } + Order s = sl.first(); - if (price<=s.limit){ + if (price <= s.limit) { sl.remove(s); - - s.type=OrderType.SELL; + + s.type = OrderType.SELL; addOrderToBook(s); - - System.out.printf("Stoploss hit %f %f\n", s.volume,s.limit); + + System.out.printf("Stoploss hit %f %f\n", s.volume, s.limit); } } @@ -552,19 +613,14 @@ public class Exchange { SortedSet bid = order_books.get(OrderType.BUYLIMIT); SortedSet ask = order_books.get(OrderType.SELLLIMIT); - + SortedSet ul_buy = order_books.get(OrderType.BUY); SortedSet ul_sell = order_books.get(OrderType.SELL); - double volume_total = 0; double money_total = 0; while (!bid.isEmpty() && !ask.isEmpty()) { - - - - Order b = bid.first(); Order a = ask.first(); @@ -581,22 +637,24 @@ public class Exchange { //System.out.printf("Price %f Vol %f\n", price,volume); // Transfer money and shares transferMoneyAndShares(b.account, a.account, volume * price, -volume); -//System.out.print("Transfer Shares was called with volume "+volume+"\n"); + + // Update volume b.volume -= volume; a.volume -= volume; + // a.account.update(a); + // b.account.update(b); + //System.out.printf("In %f (%f) < %f (%f)\n",b.limit,b.volume,a.limit,a.volume); volume_total += volume; money_total += price * volume; - - num_trades++; removeOrderIfExecuted(a); removeOrderIfExecuted(b); - + this.checkSLOrders(price); } @@ -646,6 +704,7 @@ public class Exchange { addOrderToBook(o); a.orders.put(o.id, o); + a.update(o); this.executeOrders(); @@ -713,8 +772,7 @@ public class Exchange { //KeySet ks = a.orders.keySet(); return ad; } -*/ - + */ public ArrayList getOpenOrders(double account_id) { Account a = accounts.get(account_id); diff --git a/src/main/java/sesim/AutoTrader.java b/src/main/java/sesim/OldAutoTrader.java similarity index 92% rename from src/main/java/sesim/AutoTrader.java rename to src/main/java/sesim/OldAutoTrader.java index c8422dc..0538807 100644 --- a/src/main/java/sesim/AutoTrader.java +++ b/src/main/java/sesim/OldAutoTrader.java @@ -32,7 +32,7 @@ import sesim.Exchange.Account; * * @author 7u83 */ -public abstract class AutoTrader implements Scheduler.TimerTask { +public abstract class OldAutoTrader implements Scheduler.TimerTask { protected double account_id; protected Exchange se; @@ -40,7 +40,7 @@ public abstract class AutoTrader implements Scheduler.TimerTask { protected String name; - public AutoTrader(Exchange se, long id, String name, double money, double shares, AutoTraderConfig config) { + public OldAutoTrader(Exchange se, long id, String name, double money, double shares, AutoTraderConfig config) { account_id = se.createAccount(money, shares); Account a = se.getAccount(account_id); @@ -53,7 +53,7 @@ public abstract class AutoTrader implements Scheduler.TimerTask { } - public AutoTrader(){ + public OldAutoTrader(){ se=null; id=0; } diff --git a/src/main/java/sesim/Scheduler.java b/src/main/java/sesim/Scheduler.java index b558116..4d9b06c 100644 --- a/src/main/java/sesim/Scheduler.java +++ b/src/main/java/sesim/Scheduler.java @@ -109,18 +109,14 @@ public class Scheduler extends Thread { public long currentTimeMillis1() { long diff = System.currentTimeMillis() - last_time_millis; - - // diff = 12199999L; last_time_millis += diff; - + if (diff==0) + diff++; if (pause) { return (long) this.current_time_millis; } - - this.current_time_millis += diff * this.acceleration; -//System.out.printf("Current TM: %f\n", this.current_time_millis); + this.current_time_millis += ((double)diff) * this.acceleration; return (long) this.current_time_millis; - } public long currentTimeMillis() { @@ -214,8 +210,10 @@ public class Scheduler extends Thread { return 0; } else { - return 0; - //return (t - currentTimeMillis())/(long)this.acceleration; + //return 0; + long n =(t - currentTimeMillis())/(long)this.acceleration; + System.out.printf("Return wait %d\n",n); + return n; } } diff --git a/src/main/java/traders/ManTrader/ManTrader.java b/src/main/java/traders/ManTrader/ManTrader.java index fecda83..ec8d196 100644 --- a/src/main/java/traders/ManTrader/ManTrader.java +++ b/src/main/java/traders/ManTrader/ManTrader.java @@ -27,19 +27,21 @@ package traders.ManTrader; import gui.Globals; import gui.OrdersList; +import javax.swing.JDialog; import org.json.JSONObject; -import sesim.AutoTrader; + import sesim.AutoTraderBase; import sesim.AutoTraderConfigBase; import sesim.AutoTraderConfig; import sesim.AutoTraderGui; import sesim.Exchange; +import sesim.Exchange.AccountListener; /** * * @author 7u83 <7u83@mail.ru> */ -public class ManTrader extends AutoTraderBase { +public class ManTrader extends AutoTraderBase implements AccountListener{ public ManTrader(Exchange se, long id, String name, double money, double shares, AutoTraderConfig config) { // super(se, id, name, money, shares, null); @@ -47,9 +49,14 @@ public class ManTrader extends AutoTraderBase { } public ManTrader() { - + super(); + + } + + public void init(Exchange se, long id, String name, double money, double shares, JSONObject cfg){ + super.init(se, id, name, money, shares, cfg); + getAccount().setListener(this); } - ManTraderConsoleDialog consoleDialog; @Override @@ -68,17 +75,13 @@ public class ManTrader extends AutoTraderBase { @Override public long timerTask() { - + OrdersList ol = this.consoleDialog.getConsole().getOrderListPanel(); ol.updateModel(); return 1000; } - /* @Override - public AutoTrader createTrader(Exchange se, JSONObject cfg, long id, String name, double money, double shares) { - return null; - } -*/ + @Override public String getDisplayName() { @@ -106,4 +109,17 @@ public class ManTrader extends AutoTraderBase { return true; } + @Override + public JDialog getGuiConsole() { + return this.consoleDialog; + } + + @Override + public void accountUpdated(Exchange.Account a, Exchange.Order o) { + //this.consoleDialog.cons + System.out.printf("AccountListener called\n"); + + this.consoleDialog.getConsole().getOrderListPanel().updateModel(); + } + } diff --git a/src/main/java/traders/ManTrader/ManTraderConfig.java b/src/main/java/traders/ManTrader/ManTraderConfig.java deleted file mode 100644 index b0170fd..0000000 --- a/src/main/java/traders/ManTrader/ManTraderConfig.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * 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 traders.ManTrader; - -import org.json.JSONObject; -import sesim.AutoTrader; -import sesim.AutoTraderBase; -import sesim.AutoTraderConfigBase; -import sesim.AutoTraderGui; -import sesim.Exchange; - -/** - * - * @author 7u83 <7u83@mail.ru> - */ -public class ManTraderConfig extends AutoTraderBase{ - - @Override - public void start() { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public long timerTask() { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - - @Override - public String getDisplayName() { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public AutoTraderGui getGui() { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public JSONObject getConfig() { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public void putConfig(JSONObject cfg) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public boolean getDevelStatus() { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - - -} diff --git a/src/main/java/traders/ManTrader/ManTraderConsole.form b/src/main/java/traders/ManTrader/ManTraderConsole.form index a09ee49..95a0280 100644 --- a/src/main/java/traders/ManTrader/ManTraderConsole.form +++ b/src/main/java/traders/ManTrader/ManTraderConsole.form @@ -19,7 +19,7 @@ - + @@ -56,7 +56,7 @@ - + @@ -141,7 +141,7 @@ - + diff --git a/src/main/java/traders/ManTrader/ManTraderConsole.java b/src/main/java/traders/ManTrader/ManTraderConsole.java index dd8aab6..d08187e 100644 --- a/src/main/java/traders/ManTrader/ManTraderConsole.java +++ b/src/main/java/traders/ManTrader/ManTraderConsole.java @@ -26,9 +26,7 @@ package traders.ManTrader; import gui.OrdersList; -import javax.swing.JTable; -import sesim.AutoTrader; -import sesim.AutoTraderInterface; + import sesim.Exchange; /** @@ -40,7 +38,8 @@ public class ManTraderConsole extends javax.swing.JPanel { public ManTrader trader; public OrdersList getOrderListPanel(){ - return this.ordersList1; + + return this.ordersList; } /** @@ -48,6 +47,7 @@ public class ManTraderConsole extends javax.swing.JPanel { */ public ManTraderConsole() { initComponents(); + // this.ordersList1.account=trader.getAccount(); } @@ -68,7 +68,7 @@ public class ManTraderConsole extends javax.swing.JPanel { sellButton = new javax.swing.JButton(); jLabel3 = new javax.swing.JLabel(); moneyText = new javax.swing.JLabel(); - ordersList1 = new gui.OrdersList(); + ordersList = new gui.OrdersList(); stopLossButton = new javax.swing.JButton(); limitSpinner.setModel(new javax.swing.SpinnerNumberModel(0.0d, 0.0d, null, 1.0d)); @@ -111,7 +111,7 @@ public class ManTraderConsole extends javax.swing.JPanel { .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(ordersList1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(ordersList, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() @@ -139,7 +139,7 @@ public class ManTraderConsole extends javax.swing.JPanel { layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() - .addComponent(ordersList1, javax.swing.GroupLayout.PREFERRED_SIZE, 148, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(ordersList, javax.swing.GroupLayout.PREFERRED_SIZE, 148, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel3) @@ -174,6 +174,9 @@ public class ManTraderConsole extends javax.swing.JPanel { long createOrder = trader.getSE().createOrder(trader.getAccount().getID(), Exchange.OrderType.BUYLIMIT, volume, limit); System.out.printf("The retval is %d",createOrder); + this.ordersList.account=this.trader.getAccount(); + this.ordersList.updateModel(); + }//GEN-LAST:event_buyButtonActionPerformed @@ -205,7 +208,7 @@ public class ManTraderConsole extends javax.swing.JPanel { private javax.swing.JLabel jLabel3; private javax.swing.JSpinner limitSpinner; private javax.swing.JLabel moneyText; - private gui.OrdersList ordersList1; + private gui.OrdersList ordersList; private javax.swing.JButton sellButton; private javax.swing.JButton stopLossButton; private javax.swing.JSpinner volumeSpinner; diff --git a/src/main/java/traders/ManTrader/ManTraderConsoleDialog.form b/src/main/java/traders/ManTrader/ManTraderConsoleDialog.form index b192fa3..19f24f9 100644 --- a/src/main/java/traders/ManTrader/ManTraderConsoleDialog.form +++ b/src/main/java/traders/ManTrader/ManTraderConsoleDialog.form @@ -34,7 +34,7 @@ - + diff --git a/src/main/java/traders/ManTrader/ManTraderConsoleDialog.java b/src/main/java/traders/ManTrader/ManTraderConsoleDialog.java index 6fb5e7b..1c4ef3b 100644 --- a/src/main/java/traders/ManTrader/ManTraderConsoleDialog.java +++ b/src/main/java/traders/ManTrader/ManTraderConsoleDialog.java @@ -67,14 +67,14 @@ public class ManTraderConsoleDialog extends javax.swing.JDialog { layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() - .addComponent(console, javax.swing.GroupLayout.DEFAULT_SIZE, 383, Short.MAX_VALUE) + .addComponent(console, javax.swing.GroupLayout.PREFERRED_SIZE, 383, Short.MAX_VALUE) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() - .addComponent(console, javax.swing.GroupLayout.DEFAULT_SIZE, 280, Short.MAX_VALUE) + .addComponent(console, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE) .addContainerGap()) ); diff --git a/src/main/java/traders/RandomTraderA.java b/src/main/java/traders/RandomTraderA.java index 6417b9f..bb43ed9 100644 --- a/src/main/java/traders/RandomTraderA.java +++ b/src/main/java/traders/RandomTraderA.java @@ -31,10 +31,11 @@ import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.SortedMap; +import javax.swing.JDialog; import org.json.JSONArray; import org.json.JSONObject; //import sesim.AccountData; -import sesim.AutoTrader; + import sesim.AutoTraderBase; import sesim.AutoTraderConfig; import sesim.AutoTraderGui; @@ -178,6 +179,11 @@ public class RandomTraderA extends AutoTraderBase { } + @Override + public JDialog getGuiConsole() { + return null; + } + protected enum Action { BUY, SELL, RANDOM } @@ -276,18 +282,21 @@ public class RandomTraderA extends AutoTraderBase { // how much money we ant to invest? double money = getRandomAmmount(ad.getMoney(), buy_volume); - money = se.roundMoney(money); - + Quote q = se.getCurrentPrice(); double lp = q == null ? getStart() : q.price; double limit; limit = lp + getRandomAmmount(lp, buy_limit); - limit = se.roundMoney(limit); + double volume = money / limit; - volume = se.roundShares(volume); + // System.out.printf("Volume : %f", volume); + + limit = se.roundMoney(limit); + volume = se.roundShares(volume); + if (volume <= 0 || money <= 0) { return false; } diff --git a/src/main/java/traders/RandomTraderConfig.java b/src/main/java/traders/RandomTraderConfig.java index 507a9af..7df98d1 100644 --- a/src/main/java/traders/RandomTraderConfig.java +++ b/src/main/java/traders/RandomTraderConfig.java @@ -25,16 +25,15 @@ */ package traders; -import java.util.ArrayList; -import java.util.List; -import javax.swing.JPanel; + import org.json.JSONArray; import org.json.JSONObject; -import sesim.AutoTrader; + import sesim.AutoTraderConfigBase; import sesim.AutoTraderConfig; import sesim.AutoTraderGui; import sesim.Exchange; +import sesim.OldAutoTrader; /** * @@ -53,7 +52,7 @@ public class RandomTraderConfig extends AutoTraderConfigBase implements AutoTrad public Long[] wait_after_buy = {10L, 30L}; @Override - public AutoTrader createTrader(Exchange se, JSONObject cfg, long id, String name, double money, double shares) { + public OldAutoTrader createTrader(Exchange se, JSONObject cfg, long id, String name, double money, double shares) { if (cfg != null) { this.putConfig(cfg); } diff --git a/src/main/java/traders/RandomTraderGuiA.form b/src/main/java/traders/RandomTraderGuiA.form index 802cec2..88a5177 100644 --- a/src/main/java/traders/RandomTraderGuiA.form +++ b/src/main/java/traders/RandomTraderGuiA.form @@ -296,28 +296,28 @@ - + - + - + - + diff --git a/src/main/java/traders/RandomTraderGuiA.java b/src/main/java/traders/RandomTraderGuiA.java index 1df5cb8..d2ca170 100644 --- a/src/main/java/traders/RandomTraderGuiA.java +++ b/src/main/java/traders/RandomTraderGuiA.java @@ -46,29 +46,32 @@ public class RandomTraderGuiA extends AutoTraderGui { JDialog d; - this.initialDelayMin.setValue(cfg.initial_delay[0]); - this.initialDelayMax.setValue(cfg.initial_delay[1]); + try { + this.initialDelayMin.setValue(cfg.initial_delay[0]); + this.initialDelayMax.setValue(cfg.initial_delay[1]); - this.buyVolMin.setValue(cfg.buy_volume[0]); - this.buyVolMax.setValue(cfg.buy_volume[1]); - this.sellVolMin.setValue(cfg.sell_volume[0]); - this.sellVolMax.setValue(cfg.sell_volume[1]); - this.buyLimitMin.setValue(cfg.buy_limit[0]); - this.buyLimitMax.setValue(cfg.buy_limit[1]); - this.sellLimitMin.setValue(cfg.sell_limit[0]); - this.sellLimitMax.setValue(cfg.sell_limit[1]); + this.buyVolMin.setValue(cfg.buy_volume[0]); + this.buyVolMax.setValue(cfg.buy_volume[1]); + this.sellVolMin.setValue(cfg.sell_volume[0]); + this.sellVolMax.setValue(cfg.sell_volume[1]); + this.buyLimitMin.setValue(cfg.buy_limit[0]); + this.buyLimitMax.setValue(cfg.buy_limit[1]); + this.sellLimitMin.setValue(cfg.sell_limit[0]); + this.sellLimitMax.setValue(cfg.sell_limit[1]); - this.buyWaitMin.setValue(cfg.buy_wait[0]); - this.buyWaitMax.setValue(cfg.buy_wait[1]); - this.sellWaitMin.setValue(cfg.sell_wait[0]); - this.sellWaitMax.setValue(cfg.sell_wait[1]); + this.buyWaitMin.setValue(cfg.buy_wait[0]); + this.buyWaitMax.setValue(cfg.buy_wait[1]); + this.sellWaitMin.setValue(cfg.sell_wait[0]); + this.sellWaitMax.setValue(cfg.sell_wait[1]); - this.waitAfterBuyMin.setValue(cfg.wait_after_buy[0]); - this.waitAfterBuyMax.setValue(cfg.wait_after_buy[1]); + this.waitAfterBuyMin.setValue(cfg.wait_after_buy[0]); + this.waitAfterBuyMax.setValue(cfg.wait_after_buy[1]); - this.waitAfterSellMin.setValue(cfg.wait_after_sell[0]); - this.waitAfterSellMax.setValue(cfg.wait_after_sell[1]); + this.waitAfterSellMin.setValue(cfg.wait_after_sell[0]); + this.waitAfterSellMax.setValue(cfg.wait_after_sell[1]); + } catch (Exception e) { + } } @Override @@ -179,13 +182,13 @@ public class RandomTraderGuiA extends AutoTraderGui { sellLimitMin.setModel(new javax.swing.SpinnerNumberModel(0.0f, -100.0f, null, 1.0f)); - waitAfterBuyMin.setModel(new javax.swing.SpinnerNumberModel(0, 0, null, 1000)); + waitAfterBuyMin.setModel(new javax.swing.SpinnerNumberModel(0L, 0L, null, 1000L)); - waitAfterSellMin.setModel(new javax.swing.SpinnerNumberModel(0, 0, null, 1000)); + waitAfterSellMin.setModel(new javax.swing.SpinnerNumberModel(0L, 0L, null, 1000L)); - waitAfterSellMax.setModel(new javax.swing.SpinnerNumberModel(0, 0, null, 1000)); + waitAfterSellMax.setModel(new javax.swing.SpinnerNumberModel(0L, 0L, null, 1000L)); - waitAfterBuyMax.setModel(new javax.swing.SpinnerNumberModel(0, 0, null, 1000)); + waitAfterBuyMax.setModel(new javax.swing.SpinnerNumberModel(0L, 0L, null, 1000L)); buyVolMin.setModel(new javax.swing.SpinnerNumberModel(Float.valueOf(0.0f), Float.valueOf(0.0f), Float.valueOf(100.0f), Float.valueOf(1.0f)));