package gui.tests;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Future;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import singlejartest.MA_Play;
import com.dukascopy.api.DataType;
import com.dukascopy.api.IChart;
import com.dukascopy.api.Instrument;
import com.dukascopy.api.LoadingProgressListener;
import com.dukascopy.api.OfferSide;
import com.dukascopy.api.Period;
import com.dukascopy.api.feed.FeedDescriptor;
import com.dukascopy.api.feed.IFeedDescriptor;
import com.dukascopy.api.system.ISystemListener;
import com.dukascopy.api.system.ITesterClient;
import com.dukascopy.api.system.TesterFactory;
import com.dukascopy.api.system.tester.ITesterExecution;
import com.dukascopy.api.system.tester.ITesterExecutionControl;
import com.dukascopy.api.system.tester.ITesterGui;
import com.dukascopy.api.system.tester.ITesterUserInterface;
@SuppressWarnings("serial")
public class GUIModeMultiChart extends JFrame implements ITesterUserInterface, ITesterExecution {
private static final Logger LOGGER = LoggerFactory.getLogger(GUIModeMultiChart.class);
private final int frameWidth = 1000;
private final int frameHeight = 600;
private final int controlPanelHeight = 40;
private JPanel currentChartPanel = null;
private ITesterExecutionControl executionControl = null;
private JPanel controlPanel = null;
private JButton startStrategyButton = null;
private JButton pauseButton = null;
private JButton continueButton = null;
private JButton cancelButton = null;
private static String jnlpUrl = "https://www.dukascopy.com/client/demo/jclient/jforex.jnlp";
private static String userName = "userName";
private static String password = "password";
public GUIModeMultiChart(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
}
public void setChartPanels(Map<IChart, ITesterGui> chartPanels) {
if (chartPanels != null && chartPanels.size() > 0) {
for (IChart chart : chartPanels.keySet()) {
LOGGER.debug("Chart for instrument" + chart.getInstrument().toString());
Instrument instrument = chart.getInstrument();
setTitle(instrument.toString() + " "+ chart.getSelectedOfferSide() + " "+ chart.getSelectedPeriod());
if (chart.getInstrument().equals(Instrument.EURUSD)) {
IFeedDescriptor feedDescriptor = new FeedDescriptor();
feedDescriptor.setDataType(DataType.TICKS);
feedDescriptor.setInstrument(Instrument.EURUSD);
chartPanels.get(chart).getTesterChartController().setFeedDescriptor(feedDescriptor);
} else {
IFeedDescriptor feedDescriptor = new FeedDescriptor();
feedDescriptor.setDataType(DataType.TIME_PERIOD_AGGREGATION);
feedDescriptor.setOfferSide(OfferSide.BID);
feedDescriptor.setInstrument(Instrument.EURUSD);
feedDescriptor.setPeriod(Period.TEN_MINS);
chartPanels.get(chart).getTesterChartController().setFeedDescriptor(feedDescriptor);
}
JPanel chartPanel = chartPanels.get(chart).getChartPanel();
addChartPanel(chartPanel);
}
}
}
@Override
public void setExecutionControl(ITesterExecutionControl executionControl) {
this.executionControl = executionControl;
}
public void startStrategy() throws Exception {
final ITesterClient client = TesterFactory.getDefaultInstance();
client.setSystemListener(new ISystemListener() {
@Override
public void onStart(long processId) {
LOGGER.info("ストラテジー起動: " + processId);
updateButtons();
}
@Override
public void onStop(long processId) {
LOGGER.info("ストラテジー停止: " + processId);
resetButtons();
File reportFile = new File("C:\\report.html");
try {
client.createReport(processId, reportFile);
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
}
if (client.getStartedStrategies().size() == 0) {
}
}
@Override
public void onConnect() {
LOGGER.info("接続完了");
}
@Override
public void onDisconnect() {
}
});
LOGGER.info("接続中…");
client.connect(jnlpUrl, userName, password);
int i = 10;
while (i > 0 && !client.isConnected()) {
Thread.sleep(1000);
i--;
}
if (!client.isConnected()) {
LOGGER.error("デューカスコピーのサーバーに接続出来ませんでした");
System.exit(1);
}
final Set<Instrument> instruments = new HashSet<Instrument>();
instruments.add(Instrument.EURUSD);
instruments.add(Instrument.GBPUSD);
LOGGER.info("通貨ペア登録…");
client.setSubscribedInstruments(instruments);
client.setInitialDeposit(Instrument.EURUSD.getSecondaryCurrency(), 50000);
LOGGER.info("データのダウンロード中");
Future<?> future = client.downloadData(null);
future.get();
LOGGER.info("ストラテジー開始");
client.startStrategy(
new MA_Play(),
new LoadingProgressListener() {
@Override
public void dataLoaded(long startTime, long endTime, long currentTime, String information) {
LOGGER.info(information);
}
@Override
public void loadingFinished(boolean allDataLoaded, long startTime, long endTime, long currentTime) {
}
@Override
public boolean stopJob() {
return false;
}
}, this, this
);
}
private void centerFrame(){
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension screenSize = tk.getScreenSize();
int screenHeight = screenSize.height;
int screenWidth = screenSize.width;
setSize(screenWidth / 2, screenHeight / 2);
setLocation(screenWidth / 4, screenHeight / 4);
}
private void addChartPanel(JPanel chartPanel){
this.currentChartPanel = chartPanel;
chartPanel.setPreferredSize(new Dimension(frameWidth, frameHeight - controlPanelHeight));
chartPanel.setMinimumSize(new Dimension(frameWidth, 200));
chartPanel.setMaximumSize(new Dimension(Short.MAX_VALUE, Short.MAX_VALUE));
getContentPane().add(chartPanel);
this.validate();
chartPanel.repaint();
}
private void addControlPanel(){
controlPanel = new JPanel();
FlowLayout flowLayout = new FlowLayout(FlowLayout.LEFT);
controlPanel.setLayout(flowLayout);
controlPanel.setPreferredSize(new Dimension(frameWidth, controlPanelHeight));
controlPanel.setMinimumSize(new Dimension(frameWidth, controlPanelHeight));
controlPanel.setMaximumSize(new Dimension(Short.MAX_VALUE, controlPanelHeight));
startStrategyButton = new JButton("Start strategy");
startStrategyButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
startStrategyButton.setEnabled(false);
Runnable r = new Runnable() {
public void run() {
try {
startStrategy();
} catch (Exception e2) {
LOGGER.error(e2.getMessage(), e2);
e2.printStackTrace();
resetButtons();
}
}
};
Thread t = new Thread(r);
t.start();
}
});
pauseButton = new JButton("Pause");
pauseButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(executionControl != null){
executionControl.pauseExecution();
updateButtons();
}
}
});
continueButton = new JButton("Continue");
continueButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(executionControl != null){
executionControl.continueExecution();
updateButtons();
}
}
});
cancelButton = new JButton("Cancel");
cancelButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(executionControl != null){
executionControl.cancelExecution();
updateButtons();
}
}
});
controlPanel.add(startStrategyButton);
controlPanel.add(pauseButton);
controlPanel.add(continueButton);
controlPanel.add(cancelButton);
getContentPane().add(controlPanel);
pauseButton.setEnabled(false);
continueButton.setEnabled(false);
cancelButton.setEnabled(false);
}
private void updateButtons(){
if(executionControl != null){
startStrategyButton.setEnabled(executionControl.isExecutionCanceled());
pauseButton.setEnabled(!executionControl.isExecutionPaused() && !executionControl.isExecutionCanceled());
cancelButton.setEnabled(!executionControl.isExecutionCanceled());
continueButton.setEnabled(executionControl.isExecutionPaused());
}
}
private void resetButtons(){
startStrategyButton.setEnabled(true);
pauseButton.setEnabled(false);
continueButton.setEnabled(false);
cancelButton.setEnabled(false);
}
private void removecurrentChartPanel(){
if(this.currentChartPanel != null){
try {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
GUIModeMultiChart.this.getContentPane().remove(GUIModeMultiChart.this.currentChartPanel);
GUIModeMultiChart.this.getContentPane().repaint();
}
});
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
}
}
}
public void showChartFrame(){
setSize(frameWidth, frameHeight);
centerFrame();
addControlPanel();
setVisible(true);
}
public static void main(String[] args) throws Exception {
GUIModeMultiChart testerMainGUI = new GUIModeMultiChart();
testerMainGUI.showChartFrame();
}
}