Untitled

mail@pastecode.io avatar
unknown
apex
2 years ago
58 kB
3
Indexable
Never
***************/
package JForex.myStrategies;
 
import com.dukascopy.api.*;
import com.dukascopy.api.IEngine.OrderCommand;
import com.dukascopy.api.system.tester.ITesterExecutionControl;
 
import javax.swing.*;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.*;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
 
/**
 * Main Class of the strategy
 */
@RequiresFullAccess // Some functions may need this
public class NephewSamBacktester implements IStrategy {
 
    // configurable variables
    @Configurable("Select instrument:")
    public Instrument myInstrument = Instrument.EURUSD;
    public double myPipValue;
    public int myPipScale;
    public double bidPrice = 0.00;
    public double askPrice = 0.00;
    public double spreadDiff = 0.00;
    // controls
    public boolean isPaused = false;
    public Period pauseEvery = null;
    // <editor-fold defaultstate="" desc="Main class variables">
    // base objects creation
    private IContext myContext = null;
    private IEngine myEngine = null;
    private IConsole myConsole = null;
    private IHistory myHistory = null;
    private IAccount myAccount = null;
    // other variables
    private OfflineForm myForm = null;
    public Filter filterWeekend = Filter.WEEKENDS;
    // </editor-fold>
 
    @Override
    public void onStart(IContext context) throws JFException {
        try {
            // Set cross-platform Java L&F (also called "Metal")
            UIManager.setLookAndFeel(
                    UIManager.getCrossPlatformLookAndFeelClassName());
        } catch (IllegalAccessException e) {
            JOptionPane.showMessageDialog(null, "IllegalAccessException !", "Strategy Alert",
                    JOptionPane.WARNING_MESSAGE);
        } catch (InstantiationException e) {
            JOptionPane.showMessageDialog(null, "InstantiationException !", "Strategy Alert",
                    JOptionPane.WARNING_MESSAGE);
        } catch (UnsupportedLookAndFeelException e) {
            JOptionPane.showMessageDialog(null, "UnsupportedLookAndFeelException !", "Strategy Alert",
                    JOptionPane.WARNING_MESSAGE);
        } catch (ClassNotFoundException e) {
            JOptionPane.showMessageDialog(null, "ClassNotFoundException !", "Strategy Alert",
                    JOptionPane.WARNING_MESSAGE);
        }
 
        // objects and variable initialization
        myContext = context;
        myEngine = context.getEngine();
        myConsole = myContext.getConsole();
        myHistory = myContext.getHistory();
        myAccount = myContext.getAccount();
        myPipValue = myInstrument.getPipValue();
        myPipScale = myInstrument.getPipScale();
        myForm = new OfflineForm();
 
        // avoid to run outside of Historical Tester
        if (myEngine.getType() != IEngine.Type.TEST) {
            JOptionPane.showMessageDialog(null, "This strategy only runs on Historical Tester !", "Strategy Alert",
                    JOptionPane.WARNING_MESSAGE);
            myContext.stop();
        } else {
            Set subscribedInstruments = new HashSet();
            subscribedInstruments.add(myInstrument);
            myContext.setSubscribedInstruments(subscribedInstruments);
            myForm.setVisible(true);
        }
 
    }// end onStart
 
    @Override
    public void onTick(Instrument instrument, ITick tick) throws JFException {
        if (myInstrument == instrument) { // filter
            bidPrice = tick.getBid();
            askPrice = tick.getAsk();
            spreadDiff = (askPrice - bidPrice) / instrument.getPipValue();
 
            myForm.updatePrices();
            myForm.updateTableOrders();
        }
    }// end onTick
 
    @Override
    public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {
        boolean marketClose = isWeekend();
 
        if (period.equals(pauseEvery) && !marketClose) {
            myContext.pause();
        }
    }// end onBar
 
    // use of calendar
    private boolean isWeekend() throws JFException {
 
        long lastTickTime = myHistory.getLastTick(myInstrument).getTime();
 
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(lastTickTime);
        calendar.setTimeZone(TimeZone.getTimeZone("GMT"));
 
        int currentMinute = calendar.get(Calendar.MINUTE);
        int currentHour = calendar.get(Calendar.HOUR_OF_DAY);
        int currentDay = calendar.get(Calendar.DAY_OF_WEEK);
 
        // print("Current Day: " + currentDay + ", Current Hour: " + currentHour + ",
        // Current Minute: " + currentMinute);
 
        boolean result = (currentDay == 1 && currentHour <= 21) || (currentDay == 7)
                || (currentDay == 6 && currentHour >= 20 && currentMinute > 58);
 
        return result;
    }
 
    @Override
    public void onMessage(IMessage message) throws JFException {
 
        // remove of the order on the table at order close
        // if(message.getType() == IMessage.Type.ORDER_CLOSE_OK){
        // myForm.removeTableOrder(message.getOrder().getId());
        // }
        // when the server accepted the order fill the stop loss and take profit
        // if we choose them and put the order on the table
        // if(message.getType() == IMessage.Type.ORDER_SUBMIT_OK){
        // if(!(message.getOrder().getOrderCommand() == OrderCommand.BUY ||
        // message.getOrder().getOrderCommand() == OrderCommand.SELL)){
        // myForm.setTpSl(message.getOrder());
        // }
        // }
        // // same as before but for order fill and only update the order status
        // // if not filled on the table
        // if (message.getType() == IMessage.Type.ORDER_FILL_OK){
        // if(message.getOrder().getOrderCommand() == OrderCommand.BUY ||
        // message.getOrder().getOrderCommand() == OrderCommand.SELL){
        // myForm.setTpSl(message.getOrder());
        // }
        // }
        // update of the table at any order change
        // if(message.getType() == IMessage.Type.ORDER_CHANGED_OK){
        // myForm.updateTableOrder(message.getOrder());
        // }
 
    }// end onMessage
 
    @Override
    public void onAccount(IAccount account) throws JFException {
 
    }// end onAccount
 
    @Override
    public void onStop() throws JFException {
        myForm.setVisible(false);
        myForm.dispose();
    }// end onStop
 
    public void print(String string) {
        myConsole.getOut().println(string);
    }// end print
 
    class OfflineForm extends JFrame implements ActionListener {
 
        private JComboBox lotsDropdown = new JComboBox();
        private JComboBox entryDropdown = new JComboBox();
        private JComboBox tpDropdown = new JComboBox();
        private JComboBox slDropdown = new JComboBox();
        private JComboBox pauseEveryDropdown = new JComboBox();
        private JComboBox partialsDropdown = new JComboBox();
        private JTextField lotsField = new JTextField(null);
        private JTextField symbolField = new JTextField(null);
        private JTextField entryField = new JTextField();
        private JTextField slField = new JTextField();
        private JTextField tpField = new JTextField();
        private JButton buyButton = new JButton();
        private JButton spreadButton = new JButton();
        private JButton sellButton = new JButton();
        private JButton closeTradeButton = new JButton();
        private JButton sl2beButton = new JButton();
        private JButton updateSLTPButton = new JButton();
        private JButton pauseEveryButton = new JButton();
        private JPanel mainPanel = new JPanel();
        private JPanel headerPanel = new JPanel();
        private JPanel lotsPanel = new JPanel();
        private JPanel buySellPanel = new JPanel();
        private JPanel detailsPanel = new JPanel();
        private JPanel tablePanel = new JPanel();
        private JPanel controlsPanel = new JPanel();
        private JPanel pausePanel = new JPanel();
        private DefaultTableModel tradesTableModel = new DefaultTableModel();
        private JTable tradesTable = new JTable(tradesTableModel);
        private JScrollPane tableScrollPane1 = new JScrollPane();
        private GridBagConstraints gbc = new GridBagConstraints();
        private JScrollBar scrollBar1 = new JScrollBar();
 
        // order variables
        private double myEntry = Double.NaN;
        private double myAmount = Double.NaN;
        private double myStopLoss = Double.NaN;
        private double myStopLossInPips = Double.NaN;
        private double myTakeProfit = Double.NaN;
        private double mySlippage = 0;
        private IOrder myOrder = null;
        private int myOrderCounter = 1;
        private OrderCommand myOrderCommand = null;
        private String selectedRow = null;
 
        // Table Data
        final String[] tableHeaders = { "#", "Direction", "Lots", "Entry", "SL", "TP", "PnL" };
        Object[][] tableData = new Object[0][0];
 
        /**
         * Offline class contructor
         * <p>
         * Creates new form OfflineForm
         */
        public OfflineForm() {
            initComponents();
 
        }// end offlineForm
 
        @SuppressWarnings("unchecked")
        private void initComponents() {
 
            // action listeners
            buyButton.addActionListener(this);
            sellButton.addActionListener(this);
            lotsDropdown.addActionListener(this);
            entryDropdown.addActionListener(this);
            slDropdown.addActionListener(this);
            tpDropdown.addActionListener(this);
            pauseEveryDropdown.addActionListener(this);
            closeTradeButton.addActionListener(this);
            sl2beButton.addActionListener(this);
            pauseEveryButton.addActionListener(this);
            updateSLTPButton.addActionListener(this);
 
            setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
 
            // ------------------------------------
            // ---------- MAIN CONTAINER ----------
            // ------------------------------------
 
            mainPanel.setLayout(new GridBagLayout());
            mainPanel.setBackground(new Color(-14933440));
            mainPanel.setEnabled(true);
            mainPanel.setMaximumSize(new Dimension(-1, -1));
            mainPanel.setMinimumSize(new Dimension(360, 460));
            mainPanel.setPreferredSize(new Dimension(360, 560));
            mainPanel.setBorder(
                    BorderFactory.createTitledBorder(BorderFactory.createLineBorder(new Color(-12762013)), null));
 
            // ------------------------------------
            // -------- Panel 1 (HEADER) ----------
            // ------------------------------------
            headerPanel.setLayout(new GridBagLayout());
            headerPanel.setBackground(new Color(-14933440));
            gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.gridwidth = 3;
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gbc.anchor = GridBagConstraints.NORTH;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.insets = new Insets(10, 10, 5, 10);
            mainPanel.add(headerPanel, gbc);
            headerPanel.setBorder(
                    BorderFactory.createTitledBorder(BorderFactory.createLineBorder(new Color(-12762013)), null));
            final JLabel label1 = new JLabel();
            Font label1Font = getFont(null, Font.BOLD, 16, label1.getFont());
            if (label1Font != null)
                label1.setFont(label1Font);
            label1.setForeground(new Color(-1909284));
            label1.setText("BACKTESTING TOOL By Nephew_Sam_");
            gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.insets = new Insets(10, 10, 10, 10);
            headerPanel.add(label1, gbc);
 
            // ------------------------------------
            // ---------- Panel 2 (LOTS) ----------
            // ------------------------------------
            lotsPanel.setLayout(new GridBagLayout());
            lotsPanel.setBackground(new Color(-14933440));
            gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 1;
            gbc.gridwidth = 3;
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gbc.anchor = GridBagConstraints.NORTH;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.insets = new Insets(5, 10, 5, 10);
            mainPanel.add(lotsPanel, gbc);
            lotsPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(new Color(-12762013)),
                    null, TitledBorder.LEFT, TitledBorder.TOP));
 
            // Symbol Label
            final JLabel label2 = new JLabel();
            Font label2Font = this.getFont(null, -1, 14, label2.getFont());
            if (label2Font != null)
                label2.setFont(label2Font);
            label2.setForeground(new Color(-1909284));
            label2.setText("Symbol");
            gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gbc.anchor = GridBagConstraints.WEST;
            gbc.insets = new Insets(10, 15, 0, 0);
            lotsPanel.add(label2, gbc);
 
            // Lots dropdown
            lotsDropdown.setBackground(new Color(-13024660));
            lotsDropdown.setForeground(new Color(-1909284));
            lotsDropdown.setBorder(BorderFactory.createLineBorder(new Color(-13024660)));
            final DefaultComboBoxModel defaultComboBoxModel1 = new DefaultComboBoxModel();
            defaultComboBoxModel1.addElement("Fixed Lots");
            defaultComboBoxModel1.addElement("Balance %");
            lotsDropdown.setModel(defaultComboBoxModel1);
            gbc = new GridBagConstraints();
            gbc.gridx = 1;
            gbc.gridy = 0;
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gbc.anchor = GridBagConstraints.WEST;
            gbc.fill = GridBagConstraints.BOTH;
            gbc.ipadx = 5;
            gbc.ipady = 0;
            gbc.insets = new Insets(10, 5, 0, 10);
            lotsPanel.add(lotsDropdown, gbc);
 
            // Lots field
            lotsField.setBackground(new Color(-13024660));
            lotsField.setForeground(new Color(-1909284));
            lotsField.setBorder(BorderFactory.createLineBorder(new Color(-13024660)));
            lotsField.setText("1.00");
            gbc = new GridBagConstraints();
            gbc.gridx = 1;
            gbc.gridy = 1;
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gbc.anchor = GridBagConstraints.WEST;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.ipadx = 5;
            gbc.ipady = 5;
            gbc.insets = new Insets(5, 5, 10, 10);
            lotsPanel.add(lotsField, gbc);
 
            // Symbol Field
            symbolField.setBackground(new Color(-13024660));
            symbolField.setForeground(new Color(-1909284));
            symbolField.setBorder(BorderFactory.createLineBorder(new Color(-13024660)));
            symbolField.setText(myInstrument.toString());
            symbolField.setEnabled(false);
            gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 1;
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gbc.anchor = GridBagConstraints.WEST;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.ipadx = 5;
            gbc.ipady = 5;
            gbc.insets = new Insets(5, 10, 10, 0);
            lotsPanel.add(symbolField, gbc);
 
            // ------------------------------------
            // ------- Panel 3 (BUY/SELL) ---------
            // ------------------------------------
 
            buySellPanel.setLayout(new GridBagLayout());
            buySellPanel.setBackground(new Color(-14933440));
            gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 2;
            gbc.gridwidth = 3;
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gbc.anchor = GridBagConstraints.NORTH;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.insets = new Insets(5, 10, 5, 10);
            mainPanel.add(buySellPanel, gbc);
            buySellPanel.setBorder(
                    BorderFactory.createTitledBorder(BorderFactory.createLineBorder(new Color(-12762013)), null));
 
            // Buy button
            buyButton.setBackground(new Color(-14570184));
            buyButton.setBorderPainted(true);
            buyButton.setContentAreaFilled(true);
            buyButton.setDefaultCapable(true);
            buyButton.setEnabled(true);
            buyButton.setForeground(new Color(-1909284));
            buyButton.setHideActionText(false);
            buyButton.setOpaque(true);
            buyButton.setRequestFocusEnabled(true);
            buyButton.setRolloverEnabled(true);
            buyButton.setMaximumSize(new Dimension(85, 30));
            buyButton.setMinimumSize(new Dimension(85, 30));
            buyButton.setPreferredSize(new Dimension(85, 30));
            buyButton.setText("BUY");
            gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.weightx = 2.0;
            gbc.weighty = 1.0;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.ipady = 50;
            gbc.insets = new Insets(10, 10, 10, 10);
            buySellPanel.add(buyButton, gbc);
 
            // Spread Button
            spreadButton.setBackground(new Color(-12762013));
            spreadButton.setContentAreaFilled(true);
            spreadButton.setEnabled(false);
            Font spreadButtonFont = this.getFont(null, -1, 9, spreadButton.getFont());
            if (spreadButtonFont != null)
                spreadButton.setFont(spreadButtonFont);
            spreadButton.setForeground(new Color(-1909284));
            spreadButton.setMaximumSize(new Dimension(70, 60));
            spreadButton.setMinimumSize(new Dimension(70, 60));
            spreadButton.setPreferredSize(new Dimension(70, 60));
            spreadButton.setText("SPREAD");
            gbc = new GridBagConstraints();
            gbc.gridx = 1;
            gbc.gridy = 0;
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.insets = new Insets(10, 10, 10, 10);
            buySellPanel.add(spreadButton, gbc);
 
            // Sell Button
            sellButton.setBackground(new Color(-2341081));
            sellButton.setForeground(new Color(-1909284));
            sellButton.setText("SELL");
            sellButton.setMaximumSize(new Dimension(85, 30));
            sellButton.setMinimumSize(new Dimension(85, 30));
            sellButton.setPreferredSize(new Dimension(85, 30));
            gbc = new GridBagConstraints();
            gbc.gridx = 2;
            gbc.gridy = 0;
            gbc.weightx = 2.0;
            gbc.weighty = 1.0;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.ipady = 50;
            gbc.insets = new Insets(10, 10, 10, 10);
            buySellPanel.add(sellButton, gbc);
 
            // ------------------------------------
            // -------- Panel 4 (DETAILS) ---------
            // ------------------------------------
 
            detailsPanel.setLayout(new GridBagLayout());
            detailsPanel.setBackground(new Color(-14933440));
            gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 3;
            gbc.gridwidth = 3;
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gbc.anchor = GridBagConstraints.NORTH;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.insets = new Insets(5, 10, 5, 10);
            mainPanel.add(detailsPanel, gbc);
            detailsPanel.setBorder(
                    BorderFactory.createTitledBorder(BorderFactory.createLineBorder(new Color(-12762013)), null));
 
            // Entry dropwdown
            entryDropdown.setBackground(new Color(-13024660));
            entryDropdown.setForeground(new Color(-1909284));
            entryDropdown.setBorder(BorderFactory.createLineBorder(new Color(-13024660)));
            final DefaultComboBoxModel defaultComboBoxModel2 = new DefaultComboBoxModel();
            defaultComboBoxModel2.addElement("Market");
            defaultComboBoxModel2.addElement("Limit");
            entryDropdown.setModel(defaultComboBoxModel2);
            gbc = new GridBagConstraints();
            gbc.gridx = 1;
            gbc.gridy = 0;
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.ipadx = 5;
            gbc.ipady = 0;
            gbc.insets = new Insets(10, 5, 5, 5);
            detailsPanel.add(entryDropdown, gbc);
 
            // Entry field
            entryField.setBackground(new Color(-13024660));
            entryField.setForeground(new Color(-4473925));
            entryField.setBorder(BorderFactory.createLineBorder(new Color(-13024660)));
            entryField.setEnabled(false);
            gbc = new GridBagConstraints();
            gbc.gridx = 2;
            gbc.gridy = 0;
            gbc.weightx = 3.0;
            gbc.weighty = 1.0;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.ipadx = 5;
            gbc.ipady = 5;
            gbc.insets = new Insets(10, 5, 5, 5);
            detailsPanel.add(entryField, gbc);
 
            // SL dropdown
            slDropdown.setBackground(new Color(-13024660));
            slDropdown.setForeground(new Color(-1909284));
            slDropdown.setBorder(BorderFactory.createLineBorder(new Color(-13024660)));
            final DefaultComboBoxModel defaultComboBoxModel3 = new DefaultComboBoxModel();
            defaultComboBoxModel3.addElement("Pips");
            defaultComboBoxModel3.addElement("Price");
            slDropdown.setModel(defaultComboBoxModel3);
            gbc = new GridBagConstraints();
            gbc.gridx = 1;
            gbc.gridy = 1;
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.ipadx = 5;
            gbc.ipady = 0;
            gbc.insets = new Insets(10, 5, 5, 5);
            detailsPanel.add(slDropdown, gbc);
 
            // SL field
            slField.setBackground(new Color(-13024660));
            slField.setForeground(new Color(-1909284));
            slField.setBorder(BorderFactory.createLineBorder(new Color(-13024660)));
            slField.setText("0");
            gbc = new GridBagConstraints();
            gbc.gridx = 2;
            gbc.gridy = 1;
            gbc.weightx = 4.0;
            gbc.weighty = 1.0;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.ipadx = 5;
            gbc.ipady = 5;
            gbc.insets = new Insets(10, 5, 5, 5);
            detailsPanel.add(slField, gbc);
 
            // TP field
            tpField.setBackground(new Color(-13024660));
            tpField.setForeground(new Color(-1909284));
            tpField.setBorder(BorderFactory.createLineBorder(new Color(-13024660)));
            tpField.setText("0");
            gbc = new GridBagConstraints();
            gbc.gridx = 2;
            gbc.gridy = 2;
            gbc.weightx = 4.0;
            gbc.weighty = 1.0;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.ipadx = 5;
            gbc.ipady = 5;
            gbc.insets = new Insets(10, 5, 10, 5);
            detailsPanel.add(tpField, gbc);
 
            // Entry Label
            final JLabel label3 = new JLabel();
            label3.setForeground(new Color(-1909284));
            label3.setText("Entry");
            gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gbc.anchor = GridBagConstraints.WEST;
            gbc.insets = new Insets(0, 10, 0, 0);
            detailsPanel.add(label3, gbc);
 
            // SL Label
            final JLabel label4 = new JLabel();
            label4.setForeground(new Color(-1909284));
            label4.setText("SL");
            gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 1;
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gbc.anchor = GridBagConstraints.WEST;
            gbc.insets = new Insets(0, 10, 0, 0);
            detailsPanel.add(label4, gbc);
 
            // TP Label
            final JLabel label5 = new JLabel();
            label5.setForeground(new Color(-1909284));
            label5.setText("TP");
            gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 2;
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gbc.anchor = GridBagConstraints.WEST;
            gbc.insets = new Insets(0, 10, 0, 0);
            detailsPanel.add(label5, gbc);
 
            // TP Dropdown
            tpDropdown.setBackground(new Color(-13024660));
            tpDropdown.setForeground(new Color(-1909284));
            tpDropdown.setBorder(BorderFactory.createLineBorder(new Color(-13024660)));
            final DefaultComboBoxModel defaultComboBoxModel4 = new DefaultComboBoxModel();
            defaultComboBoxModel4.addElement("Pips");
            defaultComboBoxModel4.addElement("Price");
            defaultComboBoxModel4.addElement("RR");
            tpDropdown.setModel(defaultComboBoxModel4);
            gbc = new GridBagConstraints();
            gbc.gridx = 1;
            gbc.gridy = 2;
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.ipadx = 5;
            gbc.ipady = 0;
            gbc.insets = new Insets(10, 5, 10, 5);
            detailsPanel.add(tpDropdown, gbc);
 
            // ------------------------------------
            // --------- Panel 5 (TABLE) ----------
            // ------------------------------------
 
            // Layout and Scrollpane
            tablePanel.setLayout(new CardLayout(0, 0));
            tablePanel.setBackground(new Color(-14933440));
            gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 4;
            gbc.gridwidth = 3;
            gbc.weighty = 100.0;
            gbc.fill = GridBagConstraints.BOTH;
            gbc.insets = new Insets(10, 10, 10, 10);
            mainPanel.add(tablePanel, gbc);
            tablePanel.setBorder(
                    BorderFactory.createTitledBorder(BorderFactory.createLineBorder(new Color(-12762013)), null));
            tableScrollPane1 = new JScrollPane();
            tableScrollPane1.setBackground(new Color(-12762013));
            tablePanel.add(tableScrollPane1, "Card1");
 
            // table
            // tradesTable.setBackground(new Color(-12762013));
            // tradesTable.setForeground(new Color(-1909284));
            tradesTable.setAutoResizeMode(0);
            tradesTable.getTableHeader().setReorderingAllowed(false);
            tradesTable.setModel(new DefaultTableModel(tableData, tableHeaders));
            tradesTable.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent evt) {
 
                    int row = tradesTable.rowAtPoint(evt.getPoint());
                    int col = tradesTable.columnAtPoint(evt.getPoint());
                    selectedRow = tradesTable.getModel().getValueAt(row, 0).toString();
 
                    myConsole.getOut().println("Order Selected: " + selectedRow);
                }
            });
            tableScrollPane1.setViewportView(tradesTable);
 
            // ------------------------------------
            // -------- Panel 6 (controls) --------
            // ------------------------------------
            controlsPanel.setLayout(new GridBagLayout());
            controlsPanel.setBackground(new Color(-14933440));
            gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 5;
            gbc.gridwidth = 3;
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gbc.anchor = GridBagConstraints.SOUTH;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.insets = new Insets(5, 10, 10, 10);
            mainPanel.add(controlsPanel, gbc);
            controlsPanel.setBorder(
                    BorderFactory.createTitledBorder(BorderFactory.createLineBorder(new Color(-12762013)), null));
 
            // Close Button
            closeTradeButton.setBackground(new Color(-12762013));
            closeTradeButton.setForeground(new Color(-1909284));
            closeTradeButton.setText("Close");
            gbc = new GridBagConstraints();
            gbc.gridx = 1;
            gbc.gridy = 0;
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.insets = new Insets(10, 5, 10, 5);
            controlsPanel.add(closeTradeButton, gbc);
 
            // Partials dropdown
            partialsDropdown.setBackground(new Color(-13024660));
            partialsDropdown.setForeground(new Color(-1909284));
            final DefaultComboBoxModel defaultComboBoxModel5 = new DefaultComboBoxModel();
            defaultComboBoxModel5.addElement("20%");
            defaultComboBoxModel5.addElement("30%");
            defaultComboBoxModel5.addElement("40%");
            defaultComboBoxModel5.addElement("50%");
            defaultComboBoxModel5.addElement("60%");
            defaultComboBoxModel5.addElement("70%");
            defaultComboBoxModel5.addElement("80%");
            defaultComboBoxModel5.addElement("90%");
            defaultComboBoxModel5.addElement("100%");
            partialsDropdown.setModel(defaultComboBoxModel5);
            partialsDropdown.setSelectedItem("100%");
            gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.insets = new Insets(10, 5, 10, 5);
            controlsPanel.add(partialsDropdown, gbc);
 
            // SL to BE button
            sl2beButton.setBackground(new Color(-12762013));
            sl2beButton.setForeground(new Color(-1909284));
            sl2beButton.setText("SL 2 BE");
            gbc = new GridBagConstraints();
            gbc.gridx = 2;
            gbc.gridy = 0;
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.insets = new Insets(10, 5, 10, 5);
            controlsPanel.add(sl2beButton, gbc);
 
            // Delete TP Button
            updateSLTPButton.setBackground(new Color(-12762013));
            updateSLTPButton.setForeground(new Color(-1909284));
            updateSLTPButton.setText("Upd SL+TP");
            gbc = new GridBagConstraints();
            gbc.gridx = 3;
            gbc.gridy = 0;
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.insets = new Insets(10, 5, 10, 5);
            controlsPanel.add(updateSLTPButton, gbc);
 
            // ------------------------------------
            // -------- Panel 7 (pause) --------
            // ------------------------------------
            pausePanel.setLayout(new GridBagLayout());
            pausePanel.setBackground(new Color(-14933440));
            gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 6;
            gbc.gridwidth = 3;
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gbc.anchor = GridBagConstraints.SOUTH;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.insets = new Insets(5, 10, 10, 5);
            mainPanel.add(pausePanel, gbc);
            pausePanel.setBorder(
                    BorderFactory.createTitledBorder(BorderFactory.createLineBorder(new Color(-12762013)), null));
 
            // Label
            JLabel pauseLabel = new JLabel();
            Font pauseLabelFont = this.getFont(null, -1, 12, pauseLabel.getFont());
            if (pauseLabelFont != null)
                pauseLabel.setFont(pauseLabelFont);
            pauseLabel.setForeground(new Color(-1909284));
            pauseLabel.setText("Pause Every:");
            gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.gridwidth = 2;
            gbc.weightx = 10.0;
            gbc.weighty = 1.0;
            gbc.anchor = GridBagConstraints.EAST;
            pausePanel.add(pauseLabel, gbc);
 
            // Pause every dropdown
            pauseEveryDropdown.setBackground(new Color(-13024660));
            pauseEveryDropdown.setForeground(new Color(-1909284));
            final DefaultComboBoxModel defaultComboBoxModel6 = new DefaultComboBoxModel();
            defaultComboBoxModel6.addElement("None");
            defaultComboBoxModel6.addElement("1m");
            defaultComboBoxModel6.addElement("5m");
            defaultComboBoxModel6.addElement("15m");
            defaultComboBoxModel6.addElement("30m");
            defaultComboBoxModel6.addElement("1hr");
            defaultComboBoxModel6.addElement("4hr");
            defaultComboBoxModel6.addElement("1d");
            pauseEveryDropdown.setModel(defaultComboBoxModel6);
            gbc = new GridBagConstraints();
            gbc.gridx = 2;
            gbc.gridy = 0;
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.ipadx = 5;
            gbc.insets = new Insets(10, 5, 10, 10);
            pausePanel.add(pauseEveryDropdown, gbc);
 
            setContentPane(mainPanel);
            pack();
            setVisible(true);
        }// </editor-fold>
 
        private Font getFont(String fontName, int style, int size, Font currentFont) {
            if (currentFont == null)
                return null;
            String resultName;
            if (fontName == null) {
                resultName = currentFont.getName();
            } else {
                Font testFont = new Font(fontName, Font.PLAIN, 10);
                if (testFont.canDisplay('a') && testFont.canDisplay('1')) {
                    resultName = fontName;
                } else {
                    resultName = currentFont.getName();
                }
            }
            return new Font(resultName, style >= 0 ? style : currentFont.getStyle(),
                    size >= 0 ? size : currentFont.getSize());
        }
 
        /**
         * actionPerformed Function
         * <p>
         * Window events for radiobuttons and buttons
         *
         * @param e
         */
        @Override
        public void actionPerformed(ActionEvent e) {
 
            // If Entry dropdown changed
            if (e.getSource() == entryDropdown) {
                String value = entryDropdown.getSelectedItem().toString();
                if (value == "Market") {
                    entryField.setText("0");
                    entryField.setEnabled(false);
                } else {
                    entryField.setText(String.valueOf(bidPrice));
                    entryField.setEnabled(true);
                }
            }
 
            // If SL dropdown changed
            if (e.getSource() == slDropdown) {
                String value = slDropdown.getSelectedItem().toString();
                if (value == "Limit") {
                    slField.setText(String.valueOf(bidPrice));
                } else {
                    slField.setText("10");
                }
            }
 
            // If SL dropdown changed
            if (e.getSource() == tpDropdown) {
                String value = tpDropdown.getSelectedItem().toString();
                if (value == "Pips") {
                    tpField.setText("10");
                } else if (value == "Limit") {
                    tpField.setText(String.valueOf(bidPrice));
                } else {
                    tpField.setText("3");
                }
            }
 
            // BUY BUTTON
            if (e.getSource() == buyButton) {
                boolean fieldsOk = validateFields("BUY", -111);
 
                if (!fieldsOk) {
                    return;
                }
                try {
                    placeOrder("BUY");
                } catch (JFException ex) {
                    Logger.getLogger(NephewSamBacktester.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
 
            // SELL BUTTON
            if (e.getSource() == sellButton) {
                boolean fieldsOk = validateFields("SELL", -111);
                if (!fieldsOk) {
                    return;
                }
                try {
                    placeOrder("SELL");
                } catch (JFException ex) {
                    Logger.getLogger(NephewSamBacktester.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
 
            // CLOSE BUTTON
            if (e.getSource() == closeTradeButton && selectedRow != null) {
                try {
                    IOrder order = myEngine.getOrderById(selectedRow);
                    String dropdownValue = partialsDropdown.getSelectedItem().toString().replace("%", "");
                    double percentage = Double.parseDouble(dropdownValue);
                    myConsole.getOut().println(percentage);
 
                    if (percentage < 100) {
                        double orderLots = round(order.getAmount() * percentage / 100, 2);
                        myConsole.getOut().println(orderLots);
                        order.close(orderLots);
                    } else {
                        order.close();
                    }
 
                    partialsDropdown.setSelectedItem("100%");
                } catch (JFException ex) {
                    ex.printStackTrace();
                }
 
            }
 
            // SL2BE BUTTON
            if (e.getSource() == sl2beButton && selectedRow != null) {
                try {
                    IOrder order = myEngine.getOrderById(selectedRow);
                    double entryPrice = order.getOpenPrice();
                    order.setStopLossPrice(entryPrice);
                } catch (JFException ex) {
                    ex.printStackTrace();
                }
            }
 
            // UPDATE SL/TP BUTTON
            if (e.getSource() == updateSLTPButton && selectedRow != null) {
                try {
                    IOrder order = myEngine.getOrderById(selectedRow);
                    String direction = order.getOrderCommand().toString().toLowerCase().contains("buy") ? "BUY"
                            : "SELL";
                    double orderEntryPrice = order.getOpenPrice();
                    validateFields(direction, orderEntryPrice);
                    order.setTakeProfitPrice(myTakeProfit);
                    order.setStopLossPrice(myStopLoss);
                    myConsole.getOut().println("TP and SL Updated");
                    myConsole.getOut().println(myTakeProfit);
                    myConsole.getOut().println(myStopLoss);
                } catch (JFException ex) {
                    ex.printStackTrace();
                }
            }
 
            // PAUSE EVERY BUTTON
            if (e.getSource() == pauseEveryDropdown) {
                String value = pauseEveryDropdown.getSelectedItem().toString();
                if (value.equals("None")) {
                    pauseEvery = null;
                } else if (value.equals("1m")) {
                    pauseEvery = Period.ONE_MIN;
                } else if (value.equals("5m")) {
                    pauseEvery = Period.FIVE_MINS;
                } else if (value.equals("15m")) {
                    pauseEvery = Period.FIFTEEN_MINS;
                } else if (value.equals("30m")) {
                    pauseEvery = Period.THIRTY_MINS;
                } else if (value.equals("1hr")) {
                    pauseEvery = Period.ONE_HOUR;
                } else if (value.equals("4hr")) {
                    pauseEvery = Period.FOUR_HOURS;
                } else if (value.equals("1d")) {
                    pauseEvery = Period.DAILY;
                }
 
            }
        }// end actionPerformed
 
        public double round(double num, int digits) {
 
            // epsilon correction
            double n = Double.longBitsToDouble(Double.doubleToLongBits(num) + 1);
            double p = Math.pow(10, digits);
            return Math.round(n * p) / p;
        }
 
        public void updatePrices() {
            if (entryDropdown.getSelectedItem().toString().equals("Market")) {
                buyButton.setText("<html>BUY<br />" + Double.toString(askPrice) + "</html>");
                sellButton.setText("<html>SELL<br />" + Double.toString(bidPrice) + "</html>");
                spreadButton.setText("<html>Spread:<br />" + Double.toString(round(spreadDiff, 2)) + "</html>");
 
                // myConsole.getOut().println(askPrice - bidPrice);
            }
        }// end updatePrices
 
        // Update Table
        public void updateTableOrders() {
 
            try {
                // get orders
                List<IOrder> myAllOrders = myEngine.getOrders();
                if (myAllOrders.size() > 0) {
                    tableData = new Object[myAllOrders.size()][7];
                    int counter = 0;
 
                    // if any order update the values of the table
                    for (IOrder order : myAllOrders) {
                        if (order != null) {
                            double profitLossInUSD = order.getProfitLossInUSD();
                            double orderEntryPrice = order.getOpenPrice();
                            double orderStopLoss = order.getStopLossPrice();
                            double orderTakeProfit = order.getTakeProfitPrice();
                            double orderLots = order.getAmount();
                            String orderState = order.getState().toString();
                            String orderID = order.getId();
                            String orderDirection = order.getOrderCommand().toString();
 
                            tableData[counter][0] = orderID;
                            tableData[counter][1] = orderDirection;
                            tableData[counter][2] = orderLots * 10;
                            tableData[counter][3] = orderEntryPrice;
                            tableData[counter][4] = orderStopLoss;
                            tableData[counter][5] = orderTakeProfit;
                            tableData[counter][6] = profitLossInUSD;
 
                            counter++;
                        }
                    }
 
                    tradesTableModel = new DefaultTableModel(tableData, tableHeaders);
                    tradesTableModel.fireTableDataChanged();
 
                    tradesTable.setModel(tradesTableModel);
 
                } else {
                    DefaultTableModel dtm = (DefaultTableModel) tradesTable.getModel();
                    dtm.setRowCount(0);
                }
            } catch (Exception e) {
                myConsole.getOut().println(e.getMessage());
            }
 
        }// end updateTableOrder
 
        public void printOrders() {
            try {
                myConsole.getOut().println("Active orders: " + myEngine.getOrders());
            } catch (JFException e) {
                Logger.getLogger("Error!!!");
            }
 
        }
 
        // Validate fields
        private OrderCommand getOrderCommand(String direction) {
            try {
                String entryType = entryDropdown.getSelectedItem().toString();
                String entryPrice = entryField.getText();
 
                // ORDER COMMAND - DIRECTION
                if (direction.equals("BUY")) {
                    if (entryType.equals("Market")) {
                        myOrderCommand = OrderCommand.BUY;
                    } else {
                        if (Double.parseDouble(entryPrice) > bidPrice) {
                            myOrderCommand = OrderCommand.BUYSTOP;
                        } else {
                            myOrderCommand = OrderCommand.BUYLIMIT;
                        }
                    }
                } else {
                    if (entryType.equals("Market")) {
                        myOrderCommand = OrderCommand.SELL;
                    } else {
                        if (Double.parseDouble(entryPrice) > askPrice) {
                            myOrderCommand = OrderCommand.SELLLIMIT;
                        } else {
                            myOrderCommand = OrderCommand.SELLSTOP;
                        }
                    }
                }
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "Error in Order Command!", "Error in Order Command",
                        JOptionPane.WARNING_MESSAGE);
            }
 
            return myOrderCommand;
        }
 
        // Validate fields
        private boolean validateFields(String direction, double entryPrice) {
 
            // ENTRY Field
            try {
                if (entryPrice != -111) {
                    myEntry = entryPrice;
                } else {
                    if (entryDropdown.getSelectedItem().toString().equals("Market")) {
                        myEntry = 0;
                    } else {
                        myEntry = Double.valueOf(entryField.getText());
                    }
 
                    if (myEntry < 0) {
                        JOptionPane.showMessageDialog(null, "Incorrect Entry value!", "Incorrect Entry value...",
                                JOptionPane.WARNING_MESSAGE);
                        slField.requestFocusInWindow();
                        return false;
                    }
                }
 
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "Incorrect Entry value!", "Incorrect Entry value...",
                        JOptionPane.WARNING_MESSAGE);
                slField.requestFocusInWindow();
                return false;
            }
 
            // Order Command
            try {
                myOrderCommand = getOrderCommand(direction);
                if (myOrderCommand == null) {
                    JOptionPane.showMessageDialog(null, "Invalid Order Command", "Invalid Order Command",
                            JOptionPane.WARNING_MESSAGE);
                    return false;
                }
 
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "Invalid Order Command", "Invalid Order Command",
                        JOptionPane.WARNING_MESSAGE);
                return false;
            }
 
            // SL Field
            try {
                myStopLoss = Double.valueOf(slField.getText());
                if (myStopLoss < 0) {
                    JOptionPane.showMessageDialog(null, "Incorrect SL value!", "Incorrect SL value...",
                            JOptionPane.WARNING_MESSAGE);
                    slField.requestFocusInWindow();
                    return false;
                }
 
                if (slDropdown.getSelectedItem().toString().equals("Pips")) {
                    myStopLossInPips = Double.valueOf(slField.getText());
                } else {
                    if (entryDropdown.getSelectedItem().toString().equals("Market")) {
                        if (myOrderCommand.toString().contains("buy")) {
                            myStopLossInPips = Math.abs((bidPrice - myStopLoss) / myInstrument.getPipValue());
                        } else {
                            myStopLossInPips = Math.abs((myStopLoss - askPrice) / myInstrument.getPipValue());
                        }
                    } else {
                        if (myOrderCommand.toString().contains("buy")) {
                            myStopLossInPips = Math.abs((myEntry - myStopLoss) / myInstrument.getPipValue());
                        } else {
                            myStopLossInPips = Math.abs((myStopLoss - myEntry) / myInstrument.getPipValue());
                        }
                    }
                }
 
                myConsole.getOut().println("SL in pips: " + myStopLossInPips);
 
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "Incorrect SL value!", "Incorrect SL value...",
                        JOptionPane.WARNING_MESSAGE);
                slField.requestFocusInWindow();
                return false;
            }
 
            // TP Field
            try {
                myTakeProfit = Double.valueOf(tpField.getText());
                if (myTakeProfit < 0) {
                    JOptionPane.showMessageDialog(null, "Incorrect TP value!", "Incorrect TP value...",
                            JOptionPane.WARNING_MESSAGE);
                    slField.requestFocusInWindow();
                    return false;
                }
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "Incorrect TP value!", "Incorrect TP value...",
                        JOptionPane.WARNING_MESSAGE);
                slField.requestFocusInWindow();
                return false;
            }
 
            // SL/TP
            try {
                boolean orderCommandIsBuy = myOrderCommand.toString().toLowerCase().contains("buy");
                setTpSl(orderCommandIsBuy);
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "Incorrect SLTP value!", "Incorrect SLTP value...",
                        JOptionPane.WARNING_MESSAGE);
                slField.requestFocusInWindow();
                return false;
            }
 
            // LOTS and AMOUNT
            try {
                // If empty lots field
                if (lotsField.getText() == null) {
                    JOptionPane.showMessageDialog(null, "Incorrect Lots/Risk value!", "Incorrect Lots/Risk value...",
                            JOptionPane.WARNING_MESSAGE);
                    lotsField.requestFocusInWindow();
                    return false;
                }
 
                // If lots = FIXED LOT
                if (lotsDropdown.getSelectedItem().toString().equals("Fixed Lots")) {
                    myAmount = Double.valueOf(lotsField.getText()) / 10;
                    if (myAmount < 0.001) {
                        JOptionPane.showMessageDialog(null, "Incorrect lots value!", "Incorrect lots value...",
                                JOptionPane.WARNING_MESSAGE);
                        lotsField.requestFocusInWindow();
                        return false;
                    }
                }
 
                // If lots = Balance %
                else {
                    double riskPercentage = Double.valueOf(lotsField.getText());
                    myAmount = getPositionSize(myStopLossInPips, riskPercentage);
                    myConsole.getOut().println("Amount: " + myAmount);
                }
 
                if (myAmount <= 0) {
                    JOptionPane.showMessageDialog(null, "Incorrect amount value!", "Incorrect amount value...",
                            JOptionPane.WARNING_MESSAGE);
                    lotsField.requestFocusInWindow();
                    return false;
                }
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "Incorrect amount value!", "Incorrect amount value...",
                        JOptionPane.WARNING_MESSAGE);
                lotsField.requestFocusInWindow();
                return false;
            }
 
            return true;
        }// end validateprices
 
        // Validate fields
        double getPositionSize(double stopLossPips, double riskPercentage) throws JFException {
            double lotSize = 0;
            double tickValue = myInstrument.getTickScale();
            double accountBalance = myAccount.getBalance();
            double amountToRiskInUSD = accountBalance * (riskPercentage / 100);
            double pipValue = myInstrument.getPipValue();
            double pairExchangeRate = bidPrice;
 
            // init symbols
            String accountCurrency = myContext.getAccount().getCurrency().getCurrencyCode();
            String primaryCurrency = myInstrument.getPrimaryCurrency().getCurrencyCode();
            String secondaryCurrency = myInstrument.getSecondaryCurrency().getCurrencyCode();
 
            // calc currency/pip value
            // double pairExchangeRate;
            // if (myOrderCommand == OrderCommand.BUY)
            // pairExchangeRate = askPrice;
            // else
            // pairExchangeRate = bidPrice;
 
            if (tickValue == 3) { // 0.001
                pipValue = pipValue * 1000;
            } else if (tickValue == 5) { // 0.00001
                pipValue = pipValue * 100000;
            }
 
            lotSize = (amountToRiskInUSD / (stopLossPips * pipValue)) / 10;
 
            lotSize = round(lotSize, 2);
 
            return lotSize;
 
        }
 
        /**
         * Submits the orders
         *
         * @param orderType direction of the order
         * @throws JFException
         */
        private void placeOrder(String orderType) throws JFException {
 
            try {
                myOrder = myEngine.submitOrder(orderType + myOrderCounter, myInstrument, myOrderCommand, myAmount,
                        myEntry, mySlippage, myStopLoss, myTakeProfit);
 
                myConsole.getOut().println(myOrder);
                myOrderCounter++;
            } catch (JFException ex) {
                myConsole.getOut().println("ERROR IN PLACEORDER");
            }
 
        }// end placeOrder
 
        /**
         * Sets the Stop Loss and take profit of any order provided
         *
         * @param order to change SL and TP
         * @throws JFException
         */
        public void setTpSl(boolean isBuy) throws JFException {
            String slType = slDropdown.getSelectedItem().toString();
            String tpType = tpDropdown.getSelectedItem().toString();
            double orderSL;
            double orderTP;
            double openPrice = 0.00;
 
            if (myEntry > 0) {
                openPrice = myEntry;
            } else {
                if (isBuy) {
                    openPrice = bidPrice;
                } else {
                    openPrice = askPrice;
                }
            }
 
            // SL Field
            try {
                if (myStopLoss > 0) {
                    // If SL = Price
                    if (slType.equals("Price")) {
                        orderSL = Double.parseDouble(slField.getText());
                        myStopLoss = orderSL;
                        // order.setStopLossPrice(orderSL);
                    }
                    // If SL = Pips
                    else if (slType.equals("Pips")) {
                        // If Lots = Fixed (convert pips to price)
                        if (isBuy) {
                            orderSL = openPrice - myStopLoss * myPipValue;
                        } else {
                            orderSL = openPrice + myStopLoss * myPipValue;
                        }
                        myStopLoss = orderSL;
                    }
                }
            } catch (Exception e) {
                myConsole.getOut().println(e.getMessage());
                myConsole.getOut().println(e.getStackTrace()[0].getLineNumber());
                JOptionPane.showMessageDialog(null, "Incorrect SL 2 value!", "Incorrect SL 2 value...",
                        JOptionPane.WARNING_MESSAGE);
                slField.requestFocusInWindow();
            }
 
            try {
                if (myTakeProfit > 0) {
                    // If TP = Price
                    if (tpType.equals("Price")) {
                        orderTP = Double.parseDouble(tpField.getText());
                        myTakeProfit = orderTP;
                        // order.setTakeProfitPrice(orderTP);
                    }
                    // If TP = Pips
                    else if (tpType.equals("Pips")) {
                        // Convert pips to price
                        if (isBuy) {
                            orderTP = openPrice + myTakeProfit * myPipValue;
                        } else {
                            orderTP = openPrice - myTakeProfit * myPipValue;
                        }
                        myTakeProfit = orderTP;
                        // order.setTakeProfitPrice(orderTP);
                    }
 
                    // If TP = RR
                    else {
                        if (myStopLoss > 0) {
                            double tpPips = myStopLossInPips * myTakeProfit;
                            // Convert pips to price
                            if (isBuy) {
                                orderTP = openPrice + tpPips * myPipValue;
                            } else {
                                orderTP = openPrice - tpPips * myPipValue;
                            }
                            myTakeProfit = orderTP;
 
                        }
                    }
                }
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "Incorrect TP 2 value!", "Incorrect TP 2 value...",
                        JOptionPane.WARNING_MESSAGE);
                slField.requestFocusInWindow();
            }
        }// end setTpSl
    }
}