Java интерактивные брокеры API исторические данные и тик
Брайан смог получить рабочий пример этого на 9.72, и с небольшими изменениями он, вероятно, может работать в 9.73. Вопрос был прост: посмотрите на текущую цену и сравните с максимумом и минимумом сессии предыдущего дня. Если цена выше, она распечатывает покупку, а если ниже минимума исторической предыдущей сессии, она распечатывает продажу. Сначала я боролся из-за моих слабых знаний Java, но Брайан показал в своем ответе, выбранный как лучший, как использовать текущие и исторические цены для сравнения. Очень элементарно, но важно.
Это текущий код, который должен брать текущую цену и сравнивать ее с предыдущей сессией, а если он выше максимума, давать распечатку на покупку, а если ниже минимума, распечатывать продажу. В API 9.72 этот код ничего не делал, потому что он неправильно связывал типы данных.
package apidemo;
import java.io.IOException;
import java.util.Set;
import ib.client.TickType;
import ib.client.CommissionReport;
import ib.client.Contract;
import ib.client.ContractDetails;
import ib.client.DeltaNeutralContract;
import ib.client.EClientSocket;
import ib.client.EJavaSignal;
import ib.client.EReader;
import ib.client.EWrapper;
import ib.client.Execution;
import ib.client.Order;
import ib.client.OrderState;
import ib.client.SoftDollarTier;
import ib.client.TagValue;
import java.util.Vector;
import com.ib.client.*;
import com.ib.contracts.StkContract;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Set;
public class xxx implements EWrapper {
EJavaSignal m_signal = new EJavaSignal();
EClientSocket m_s = new EClientSocket(this, m_signal);
// Keep track of the next ID
private int nextOrderID = 0;
// The IB API Client Socket object
private EClientSocket client = null;
private double high = Double.MAX_VALUE;
private double low = -Double.MAX_VALUE;
public static void main(String[] args) {
new xxx().run();
}
private void run() {
m_s.eConnect("localhost", 7497, 0);
final EReader reader = new EReader(m_s, m_signal);
reader.start();
new Thread() {
public void run() {
while (m_s.isConnected()) {
m_signal.waitForSignal();
try {
javax.swing.SwingUtilities
.invokeAndWait(new Runnable() {
@Override
public void run() {
try {
reader.processMsgs();
} catch (IOException e) {
error(e);
}
}
});
} catch (Exception e) {
error(e);
}
}
}
}.start();
Contract contract = new Contract ();
Order order = new Order();
m_s.reqMarketDataType(3);
//contract.m_localSymbol = "ESM7";
}
@Override public void nextValidId(int orderId) {
System.out.println("id "+orderId);
nextOrderID = orderId;
Contract c = new Contract ();
//contract.m_localSymbol = "ESM7";
c.m_symbol = "EUR";
c.m_exchange = "IDEALPRO";
c.m_secType = "CASH";
c.m_currency = "USD";
m_s.reqHistoricalData(1, c,
LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE)+ " 16:00:00",
"2 D", "1 day", "MIDPOINT", 1, 1, null);
m_s.reqMktData(1, c, "", false, null);
}
public void historicalData(int reqId, String date, double open, double high, double low, double close, int volume, int count, double WAP, boolean hasGaps) {
System.out.println("date xxx"+date);
this.high = high;
this.low = low;
System.out.println(high);
System.out.println(low);
System.out.println("xxx");
}
public void tickPrice(int orderId, int field, double price,
int canAutoExecute)
{
System.out.println(high);
System.out.println(low);
System.out.println("idx: "+orderId + " " + TickType.getField(field) + " pricex: "+price);
if (field == TickType.LAST.index()){
if (price > high) {
System.out.println("buy");
}
if (price < low){
System.out.println("sell");
}
}
}
@Override public void connectionClosed() {
}
}
Этот код в настоящее время имеет следующий вид:
id 1836254
date xxx20170328
1.08727
1.079905
xxx
date xxx20170329
1.08267
1.073995
xxx
date xxxfinished-20170327 16:00:00-20170329 16:00:00
-1.0
-1.0
xxx
-1.0
-1.0
idx: 1 bidPrice pricex: 1.07658
-1.0
-1.0
idx: 1 askPrice pricex: 1.07659
-1.0
-1.0
Обратите внимание на то, что дневные максимумы и минимумы демонстрируются в течение двух сессий, это действительно потрясающе. Но при попытке использовать эти максимумы и минимумы в тикпрайсе это не запоминается и возвращает -1.
1 ответ
Я удалил кучу вещей из вашего кода и добавил необходимые части. После подключения подождите, пока nextValidId начнет запрашивать материал. Получить историю и установить максимумы и минимумы. Получить mktData и проверить последнюю цену, купить / продать по мере необходимости.
import com.ib.client.*;
import com.ib.contracts.StkContract;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Set;
public class Test implements EWrapper {
EJavaSignal m_signal = new EJavaSignal();
EClientSocket m_client = new EClientSocket(this, m_signal);
private int nextOrderID = 0;
private double high = Double.MAX_VALUE;
private double low = -Double.MAX_VALUE;
public static void main(String[] args) {
new Test.run();
}
private void run() {
m_client.eConnect("localhost", 7497, 123);
final EReader reader = new EReader(m_client, m_signal);
reader.start();
new Thread() {
@Override
public void run() {
while (m_client.isConnected()) {
m_signal.waitForSignal();
try {
reader.processMsgs();
} catch (Exception e) {
System.out.println("Exception: " + e.getMessage());
}
}
}
}.start();
}
@Override
public void nextValidId(int orderId) {
System.out.println("id "+orderId);
nextOrderID = orderId;
Contract c = new StkContract("IBKR");
m_client.reqHistoricalData(1, c,
LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE)+ " 16:00:00",
"2 D", "1 day", "TRADES", 1, 1, null);
m_client.reqMktData(1, c, "", false, null);
}
@Override
public void error(int id, int errorCode, String errorMsg) {
System.out.println(id + " " + errorCode + " " + errorMsg);
}
@Override
public void historicalData(int reqId, String date, double open, double high, double low, double close, int volume, int count, double WAP, boolean hasGaps) {
//if being run on the next calendar day, this works
if (LocalDate.now().minusDays(1).format(DateTimeFormatter.BASIC_ISO_DATE).equals(date)){
this.high = high;
this.low = low;
System.out.println(date + " h: " + high + " l: " +low);
}
}
@Override
public void tickPrice(int tickerId, int field, double price, int canAutoExecute) {
System.out.println("id: "+tickerId + " " + TickType.getField(field) + " price: "+price);
if (field == TickType.LAST.index()){
if (price > high) {
System.out.println("buy");
}
if (price < low){
System.out.println("sell");
}
}
}
//impl rest of EWrapper
}
выход
id 130002
-1 2104 Market data farm connection is OK:usfuture
-1 2104 Market data farm connection is OK:cashfarm
-1 2104 Market data farm connection is OK:cafarm
-1 2104 Market data farm connection is OK:usfarm
-1 2106 HMDS data farm connection is OK:ushmds
date 20170328
date 20170329
date finished-20170327 16:00:00-20170329 16:00:00
id: 1 bidPrice price: 34.74
id: 1 askPrice price: 34.82
id: 1 lastPrice price: 34.73
buy
id: 1 high price: 34.87
id: 1 low price: 34.56