The article discusses how to get historic prices in Java.
Create a session, a session status listener, subscribe the listener to the session status
(see this article
).
Implement the IO2GResponseListener
interface
in a response listener class:
public class ResponseListener implements IO2GResponseListener{...}
Subscribe an object of this class to the session response:
ResponseListener responseListener = new ResponseListener(...);
session.subscribeResponse(new myResponseListener());
Log in (see this article
).
Use the listener onSessionStatusChanged
function to capture the CONNECTED
event:
Create O2GRequestFactory
:
O2GRequestFactory factory = mSession.getRequestFactory();
Get O2GTimeframeCollection
:
O2GTimeframeCollection timeFrames = factory.getTimeFrameCollection();
Get the O2GTimeframe
you need:
O2GTimeframe timeFrame = timeFrames.get(0);
or
O2GTimeframe timeFrame = timeFrames.get("m1");
Create a market data snapshot request (O2GRequest
), using the instrument, time frame, and maximum number of bars as arguments:
O2GRequest marketDataRequest = factory.createMarketDataSnapshotRequestInstrument("EUR/USD", timeFrame, 300);
Fill the market data snapshot request, using the request, date and time "from", and date and time "to" as arguments
(use null
for date and time "from" to get maximum number of bars;
use null
for date and time "to" to get history till now):
factory.fillMarketDataSnapshotRequestTime(marketDataRequest, null, null);
Send the request:
mSession.sendRequest(marketDataRequest);
Finally capture O2GResponse
in the
onRequestCompleted
function of a response listener class.
If the type of response is
MARKET_DATA_SNAPSHOT
,
process the response to extract necessary information.
Get O2GResponseReaderFactory
:
O2GResponseReaderFactory factory = mSession.getResponseReaderFactory();
Create O2GMarketDataSnapshotResponseReader
:
O2GMarketDataSnapshotResponseReader marketSnapshotReader = factory.createMarketDataSnapshotReader(response);
Process row by row:
for (int i = 0; i < marketSnapshotReader.size(); i++) {
{
// information like marketSnapshotReader.getDate(i), marketSnapshotReader.getBidOpen(i), marketSnapshotReader.getBidHigh(i), marketSnapshotReader.getBidLow(i), marketSnapshotReader.getBidClose(i), marketSnapshotReader.getVolume(i) is now available
}
Unsubscribe the session from the response listener.
Log out.
Get historic prices example [hide]
package gethistprices;
import com.fxcore2.O2GSession;
import com.fxcore2.O2GTransport;
import com.fxcore2.O2GRequest;
import com.fxcore2.O2GResponseReaderFactory;
import com.fxcore2.O2GResponse;
import com.fxcore2.O2GTableType;
import com.fxcore2.O2GRequestFactory;
import com.fxcore2.O2GTimeframeCollection;
import com.fxcore2.O2GTimeframe;
import com.fxcore2.O2GMarketDataSnapshotResponseReader;
import com.fxcore2.O2GTimeConverter;
import com.fxcore2.O2GTimeConverterTimeZone;
import java.io.FileNotFoundException;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import com.fxcore2.IO2GResponseListener;
import com.fxcore2.IO2GSessionStatus;
import com.fxcore2.O2GSessionStatusCode;
import com.fxcore2.O2GSessionDescriptorCollection;
import com.fxcore2.O2GSessionDescriptor;
public class Main {
// Historic prices variables
static Calendar calFrom = null;
static Calendar calTo = null;
static Calendar calFirst = null;
static Calendar calDate = null;
static String mInstrument = "";
static int mMaxBars = 300;
public static void main(String[] args) {
// Connection, session and log variables
String mUserID = "";
String mPassword = "";
String mURL = "";
String mConnection = "";
String mDBName = "";
String mPin = "";
O2GSession mSession = null;
// Market Data request variables
O2GRequest request = null;
String mTimeFrame = "";
String mDateFrom = "";
String mDateTo = "";
boolean mContinue = true;
int mReaderSize = 0;
int mCounter = 0;
int mBorder = 0;
// Check for correct number of arguments
if (args.length < 8) {
System.out.println("Not Enough Parameters!");
System.out.println("USAGE: [instrument] [timeframe] [datefrom] [dateto] [user ID] [password] [URL] [connection] [session ID (if needed)] [pin (if needed)]");
System.exit(1);
}
// Establish date format
DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
// Get command line arguments
mInstrument = args[0];
mTimeFrame = args[1];
mDateFrom = args[2].trim();
if ((!mDateFrom.equals("")) && (!mDateFrom.equals("{DATEFROM}"))) {
try {
Date dtFrom = df.parse(mDateFrom);
calFrom = Calendar.getInstance();
calFrom.setTime(dtFrom);
} catch (Exception e) {
System.out.println(" Date From format invalid.");
System.exit(1);
}
}
mDateTo = args[3].trim();
if ((!mDateTo.equals("")) && (!mDateTo.equals("{DATETO}"))) {
try {
Date dtTo = df.parse(mDateTo);
calTo = Calendar.getInstance();
calTo.setTime(dtTo);
} catch (Exception e) {
System.out.println(" Date To format invalid.");
System.exit(1);
}
}
mUserID = args[4];
mPassword = args[5];
mURL = args[6];
mConnection = args[7];
if (args.length > 8) {
mDBName = args[8];
}
if (args.length > 9) {
mPin = args[9];
}
// Create a session, subscribe to session listener, login, get historic prices, logout
try {
mSession = O2GTransport.createSession();
SessionStatusListener statusListener = new SessionStatusListener(mSession, mDBName, mPin);
mSession.subscribeSessionStatus(statusListener);
ResponseListener responseListener = new ResponseListener();
mSession.subscribeResponse(responseListener);
mSession.login(mUserID, mPassword, mURL, mConnection);
while (!statusListener.isConnected() && !statusListener.hasError()) {
Thread.sleep(50);
}
if (!statusListener.hasError()) {
O2GRequestFactory requestFactory = mSession.getRequestFactory();
O2GTimeframeCollection timeFrames = requestFactory.getTimeFrameCollection();
O2GTimeframe timeFrame = timeFrames.get(mTimeFrame);
if (timeFrame == null) {
System.out.println("You specified an invalid time frame.");
mContinue = false;
}
if (mContinue) {
request = requestFactory.createMarketDataSnapshotRequestInstrument(mInstrument, timeFrame, mMaxBars);
if (request == null) {
System.out.println("Cannot create request for market data snapshot.");
mContinue = false;
}
}
if (mContinue) {
do {
requestFactory.fillMarketDataSnapshotRequestTime(request, calFrom, calTo, false);
mSession.sendRequest(request);
Thread.sleep(1000);
O2GResponse response = responseListener.getResponse();
if (response != null){
O2GResponseReaderFactory responseFactory = mSession.getResponseReaderFactory();
O2GMarketDataSnapshotResponseReader reader = responseFactory.createMarketDataSnapshotReader(response);
mReaderSize = reader.size();
// check if we need additional request
if ((calFrom == null) || (calTo == null) || (mReaderSize < mMaxBars)) {
mBorder = 0;
} else {
if (mCounter > 0) {
if (mTimeFrame.equals("m1")) {
mBorder = 1;
}
}
}
O2GTimeConverter converter = mSession.getTimeConverter();
for (int i = mReaderSize - 1; i >= 0; i--) {
calDate = reader.getDate(i);
calDate = converter.convert(calDate, O2GTimeConverterTimeZone.LOCAL);
if (i <= mReaderSize - 1 - mBorder) {
System.out.println("Date = " + calDate.getTime() +
", BidOpen = " + reader.getBidOpen(i) +
", BidHigh = " + reader.getBidHigh(i) +
", BidLow = " + reader.getBidLow(i) +
", BidClose = " + reader.getBidClose(i) +
", AskOpen = " + reader.getAskOpen(i) +
", AskHigh = " + reader.getAskHigh(i) +
", AskLow = " + reader.getAskLow(i) +
", AskClose = " + reader.getAskClose(i));
}
calFirst = reader.getDate(0);
}
mCounter++;
}
if (calFrom == null){
break;
}
if (mReaderSize < mMaxBars) {
break;
}
if (calFrom.before(calFirst)) {
calTo = calFirst;
}
} while (calFrom.before(calFirst));
}
mSession.logout();
while (!statusListener.isDisconnected()) {
Thread.sleep(50);
}
}
mSession.unsubscribeSessionStatus(statusListener);
mSession.unsubscribeResponse(responseListener);
mSession.dispose();
} catch (Exception e) {
System.out.println ("Exception: " + e.getMessage());
System.exit(1);
}
}
}
class ResponseListener implements IO2GResponseListener {
//Response , log and error variables
private boolean mError = false;
private O2GResponse mResponse = null;
// Gets Response
public O2GResponse getResponse() {
return mResponse;
}
// Shows if there was an error during the request processing
public final boolean hasError() {
return mError;
}
// Constructor
public ResponseListener() {
}
// Implementation of IO2GResponseListener interface public method onRequestCompleted
public void onRequestCompleted(String requestID, O2GResponse response) {
mResponse = response;
System.out.println("Request " + requestID + " completed");
mError = false;
}
// Implementation of IO2GResponseListener interface public method onRequestFailed
public void onRequestFailed(String requestID, String error) {
System.out.println("Request " + requestID + " failed. Error = " + error);
mError = true;
}
// Implementation of IO2GResponseListener interface public method onTablesUpdates
public void onTablesUpdates(O2GResponse response) {
}
}
class SessionStatusListener implements IO2GSessionStatus {
// Connection , session and status variables
private boolean mConnected = false;
private boolean mDisconnected = false;
private boolean mError = false;
private String mDBName = "";
private String mPin = "";
private O2GSession mSession = null;
private O2GSessionStatusCode mStatus = null;
// Constructor
public SessionStatusListener(O2GSession session, String dbName, String pin) {
mSession = session;
mDBName = dbName;
mPin = pin;
}
//Shows if session is connected
public final boolean isConnected() {
return mConnected;
}
//Shows if session is disconnected
public final boolean isDisconnected() {
return mDisconnected;
}
// Shows if there was an error during the logn process
public final boolean hasError() {
return mError;
}
// Returns current session status
public final O2GSessionStatusCode getStatus() {
return mStatus;
}
// Implementation of IO2GSessionStatus interface public method onSessionStatusChanged
public final void onSessionStatusChanged(O2GSessionStatusCode status) {
mStatus = status;
System.out.println("Status: " + mStatus.toString());
if (mStatus == O2GSessionStatusCode.CONNECTED) {
mConnected = true;
}
else {
mConnected = false;
}
if (status == O2GSessionStatusCode.DISCONNECTED) {
mDisconnected = true;
}
else {
mDisconnected = false;
}
if (mStatus == O2GSessionStatusCode.TRADING_SESSION_REQUESTED) {
O2GSessionDescriptorCollection descs = mSession.getTradingSessionDescriptors();
System.out.println("\nSession descriptors");
System.out.println("id, name, description, requires pin");
for (O2GSessionDescriptor desc : descs) {
System.out.println(desc.getId() + " " + desc.getName() + " " + desc.getDescription() + " " + desc.isPinRequired());
}
if (mDBName.equals("")) {
System.out.println("Argument for trading session ID is missing");
}
else {
mSession.setTradingSession(mDBName, mPin);
}
}
}
// Implementation of IO2GSessionStatus interface public method onLoginFailed
public final void onLoginFailed(String error) {
System.out.println("Login error: " + error);
mError = true;
}
}