I use the following codes to download historical data. Most of the times it works no problem, but sometimes it goes silent, no errors reported and just nothing. I would close and re-open the terminal to re-run (same parameters), and then it would work so not a code problem or connection issue (which is raised at code 502).
I want to set a timeout, get it done in 1 min or kill it, similar to Future.get(timeout, timeoutUNIT) . But I don't want to complicate things and to any threading/Callable. EReader methods and EReaderSignal.waitForSignal don't have a timeout parameter.
Where/how shall I set a timeout here?
I want to set a timeout, get it done in 1 min or kill it, similar to Future.get(timeout, timeoutUNIT) . But I don't want to complicate things and to any threading/Callable. EReader methods and EReaderSignal.waitForSignal don't have a timeout parameter.
Where/how shall I set a timeout here?
Code:
public static void main (String[] args) throws IOException {
downloader = getDownloader(); //calling constructor
downloader.start();
}
public void start() throws IOException {
this.openConnection(portNumber); //connect to TWS
this.request(1); //for TRADES
this.request(2); //for BID
this.request(3); //for ASK
while ( !this.isBidRequestDone || !this.isAskRequestDone || !this.isTradesRequestDone ) {
this.readerSignal.waitForSignal();
try {
this.reader.processMsgs(); //trigger callback
} catch (IOException err) {
throw new IOException(err);
}
}
this.saveData();
this.closeConnection();
}
private void request(int reqId) {
this.setContract();
this.client.reqHistoricalData(reqId, ...<parameters>);
}
public void historicalDataEnd(int reqId, String startDateStr, String endDateStr) {
switch (reqId) {
case 1 -> this.isTradesRequestDone = true;
case 2 -> this.isBidRequestDone = true;
case 3 -> this.isAskRequestDone = true;
}
}
private void openConnection(int port) {
this.readerSignal = new EJavaSignal();
this.client = new EClientSocket(this, this.readerSignal);
this.client.eConnect("127.0.0.1", port, 0);
this.reader = new EReader(this.client, this.readerSignal);
this.reader.start();
}