The values you don't find in the standard Historical Tester Report, you can always log them to some other file. Or if you are launching the strategy from Standalone API then you can modify the html report file itself, in a similar fashion to this:
package singlejartest;
import com.dukascopy.api.*;
import com.dukascopy.api.system.ISystemListener;
import com.dukascopy.api.system.ITesterClient;
import com.dukascopy.api.system.TesterFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.TimeZone;
import java.util.concurrent.Future;
import jforex.news.Main;
/**
* This small program demonstrates how to initialize Dukascopy tester and start a strategy
* with a customization of strategy's report
*/
@RequiresFullAccess
public class TesterMainCustomReport {
private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);
// url of the DEMO jnlp
private static String jnlpUrl = "https://www.dukascopy.com/client/demo/jclient/jforex.jnlp";
// user name
private static String userName = "usernme";
// password
private static String password = "password";
public static void insertStringInFile(File inFile, int lineno, String lineToBeInserted) throws Exception {
// temp file
File outFile = new File("$$$$$$$$.tmp");
// input
FileInputStream fis = new FileInputStream(inFile);
BufferedReader in = new BufferedReader(new InputStreamReader(fis));
// output
FileOutputStream fos = new FileOutputStream(outFile);
PrintWriter out = new PrintWriter(fos);
String thisLine = "";
int i = 1;
while ((thisLine = in.readLine()) != null) {
if (i == lineno)
out.println(lineToBeInserted);
out.println(thisLine);
i++;
}
out.flush();
out.close();
in.close();
inFile.delete();
outFile.renameTo(inFile);
}
public static void main(String[] args) throws Exception {
// get the instance of the IClient interface
final ITesterClient client = TesterFactory.getDefaultInstance();
// set the listener that will receive system events
client.setSystemListener(new ISystemListener() {
@Override
public void onStart(long processId) {
LOGGER.info("Strategy started: " + processId);
}
@Override
public void onStop(long processId) {
LOGGER.info("Strategy stopped: " + processId);
File reportFile = new File("C:\\temp\\report.html");
try {
client.createReport(processId, reportFile);
insertStringInFile(reportFile, 90, "<tr><th>__________INSERTED LINE__________</th><td>1.2345</td></tr>");
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
}
if (client.getStartedStrategies().size() == 0) {
System.exit(0);
}
}
@Override
public void onConnect() {
LOGGER.info("Connected");
}
@Override
public void onDisconnect() {
// tester doesn't disconnect
}
});
LOGGER.info("Connecting...");
// connect to the server using jnlp, user name and password
// connection is needed for data downloading
client.connect(jnlpUrl, userName, password);
// wait for it to connect
int i = 10; // wait max ten seconds
while (i > 0 && !client.isConnected()) {
Thread.sleep(1000);
i--;
}
if (!client.isConnected()) {
LOGGER.error("Failed to connect Dukascopy servers");
System.exit(1);
}
// custom historical data
String dateFromStr = "05/25/2011 00:00:00";
String dateToStr = "05/26/2011 00:00:00";
final SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
Date dateFrom = dateFormat.parse(dateFromStr);
Date dateTo = dateFormat.parse(dateToStr);
client.setDataInterval(Period.THIRTY_MINS, OfferSide.BID, ITesterClient.InterpolationMethod.CLOSE_TICK, dateFrom.getTime(),
dateTo.getTime());
// set instruments that will be used in testing
Set<Instrument> instruments = new HashSet<Instrument>();
instruments.add(Instrument.EURUSD);
LOGGER.info("Subscribing instruments...");
client.setSubscribedInstruments(instruments);
// setting initial deposit
client.setInitialDeposit(Instrument.EURUSD.getSecondaryCurrency(), 50000);
// load data
LOGGER.info("Downloading data");
Future<?> future = client.downloadData(null);
// wait for downloading to complete
future.get();
// start the strategy
LOGGER.info("Starting strategy");
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;
}
});
// now it's running
}
}