当前位置: 首页 > 知识库问答 >
问题:

如何使用交互式代理Java API检测订单何时满?

闻人思聪
2023-03-14

IBKR TWS(交易者工作站)是一个工具,用于通过交互式经纪人管理股票市场中的股票订单。它们提供了一个API来自动化订单,比如下订单、取消订单等等。

我正在创建一个程序来处理执行订单在我的交易员工作站使用互动经纪商JavaAPI。

我无法检测订单何时满。

留档描述了当一个订单被填满时,会调用执行细节回调(这是一个EWrapper方法,请参阅下面的代码),但是我尝试使用它,并且执行细节回调从未被调用(我通过在该回调中记录reqid int来测试它,并且我从未得到任何日志)。

我还研究了完整的订单回调,我不确定这是否是一个订单被填充时将被调用的回调,因为我用一个简单的日志测试了两个回调,没有任何东西在控制台中输出。

我不明白reqExefftions函数以及我是否需要它。我已经阅读了这个回调的留档,我不明白我做错了什么。我想知道我如何检测订单何时填满,或者使用他们的应用编程接口在TWS中执行。

下面是我的当前代码:

import com.ib.client.*;

import java.util.*;

public class Main implements EWrapper {
    private static EClientSocket clientSocket;
    private static EJavaSignal readerSignal;

    public static void main(String[] args) throws InterruptedException, IOException {
        readerSignal = new EJavaSignal();
        clientSocket = new EClientSocket(this, readerSignal);
        clientSocket.eConnect("127.0.0.1", 7497, 0);
    }
    
    clientSocket.placeOrder(orderidE, contractFill("CUSIP", "USD", tickSymbol, "STK", "SMART"), orderFill(lmtPriceDouble, actionString, "LMT", "GTC", orderQuantity, account,  0));
    //Order executes successfully after sometime
    public static Order orderFill(double lmtPrice, String action, String orderType, String tif, int totalQuantity, String account, int clientId){
        Order order = new Order();
        order.m_lmtPrice = lmtPrice;
        order.m_action = action;
        order.m_orderType = orderType;
        order.m_tif = tif;
        order.m_totalQuantity = totalQuantity;
        order.m_account = account;
        order.m_clientId = clientId;
        return order;
    }
    public static Contract contractFill(String secIdType, String currency, String symbol, String secType, String exchange){
        Contract contract = new Contract();
        contract.m_secIdType = secIdType;
        contract.m_currency = currency;
        contract.m_symbol = symbol;
        contract.m_secType = secType;
        contract.m_exchange = exchange;
        return contract;
    }
    /*Implemented EWrapper methods
    ...
    */
    @Override
    public void execDetails(int reqId, Contract contract, Execution execution) {
        System.out.println(execution + " " + contract + " " + reqId);
    }

    @Override
    public void execDetailsEnd(int reqId) {
        System.out.println(reqId);
    }
    /*Implemented EWrapper methods
    ...
    */
    @Override
    public void completedOrder(Contract contract, Order order, OrderState orderState) {
        System.out.println(contract);
        System.out.println(order);
        System.out.println(orderState);
    }
    @Override
    public void completedOrdersEnd() {
        System.out.println("cOE");
    }/*Implemented rest of EWrapper methods
    ...
    */
}

当代码运行时,我手动下订单,订单填充相当快(代码运行时),所以代码应该检测到它,但是(我的问题)--

共有1个答案

崔宇
2023-03-14

下面是我用api 9.81测试的有效代码。

请注意,如果您使用的是clientID 0,那么您也应该从TWS中的交易位置获得回调。我从未尝试过,但文档很清楚。

import com.ib.client.*;
import java.io.IOException;

import java.util.*;

public class MainIB implements EWrapper {
    private EClientSocket clientSocket;
    private EJavaSignal readerSignal;
    
    public static void main(String[] args) throws IOException {
        new MainIB().connect();
        System.in.read();//press enter to exit
        System.exit(0);
    }
    
    private void connect() {
        readerSignal = new EJavaSignal();
        clientSocket = new EClientSocket(this, readerSignal);
        clientSocket.eConnect("127.0.0.1", 7497, 0);
        //Create a reader to consume messages from the TWS. The EReader will consume the incoming messages and put them in a queue
        EReader reader = new EReader(clientSocket, readerSignal);
        reader.start();
        //Once the messages are in the queue, an additional thread can be created to fetch them
        Thread processer = new Thread(() -> {
            while ( clientSocket.isConnected() ) { 
                readerSignal.waitForSignal();
                try {
                    reader.processMsgs();
                } catch (IOException ex) {}
            }
        });
        processer.setDaemon(true);
        processer.start();
    }
    
    public Order orderFill(double lmtPrice, String action, String orderType, String tif, int totalQuantity, String account, int clientId){
        Order order = new Order();
        order.lmtPrice(lmtPrice);
        order.action(action);
        order.orderType(orderType);
        order.tif(tif);
        order.totalQuantity(totalQuantity);
        //order.account(account);
        //order.clientId(clientId);
        return order;
    }
    public Contract contractFill(String secIdType, String currency, String symbol, String secType, String exchange){
        Contract contract = new Contract();
        //contract.secIdType(secIdType);
        contract.currency(currency);
        contract.symbol(symbol);
        contract.secType(secType);
        contract.exchange(exchange);
        return contract;
    }

    @Override
    public void error(int id, int errorCode, String errorMsg) {
        System.out.println(errorCode + " " + errorMsg);
    }

    @Override
    public void nextValidId(int i) {
        int orderidE = i;
        clientSocket.placeOrder(orderidE++, contractFill("", "CAD", "USD", "CASH", "IDEALPRO"), 
                                          orderFill(0, "SELL", "MKT", "GTC", 100000, "",  0));
    }

    @Override
    public void orderStatus(int i, String status, double d, double d1, double d2, int i1, int i2, double d3, int i3, String string1, double d4) {
        System.out.println("status " + status);
    }

    @Override
    public void execDetails(int reqId, Contract contract, Execution execution) {
        System.out.println(execution + " " + contract + " " + reqId);
    }
    
    /*Implemented rest of EWrapper methods
    ...
    */
}

下面是我的api。白天0.0日志文件

t:ms <-> msg#                        #  desc  
9:064 -> 15-1-DU123456-              15 my account #
9:065 -> 9-1-2-                      9 next valid id
9:065 -> 4-2--1-2104-Market da       4 errors(or info) 
9:065 -> 4-2--1-2104-Market da
9:072 <- 3-45-2-0-USD-CASH--0.       <- 3 means an order I sent   
9:671 -> 5-34-2-15016062-USD-C       5 order status
9:722 -> 11--1-2-15016062-USD-       11 exec 
9:724 -> 5-34-2-15016062-USD-C       more status
9:727 -> 5-34-2-15016062-USD-C
9:728 -> 59-1-0000e215.60b94f1       59 commission report
 类似资料:
  • 如果我想使用交互式经纪人Java API检查当前头寸,然后通过出售或购买每个头寸的股票来重新平衡这些头寸,我只需要使用EWrapper。position()方法获取帐户中的当前头寸?或者我应该使用EClientSocket。reqPositions()方法来获取它? Ewrapper似乎用于从TWS接收信息到客户端,而EClientSocket用于向TWS发送请求。在这种情况下,我是否同时使用po

  • 基本上,我想使用python来查询我的IB订单历史,然后进行一些分析。但我找不到任何现有的API来查询这些数据,有人有这样做的经验吗?

  • 我是新的java虽然我有一些经验与R. 我参加过一门java课程,读过一两本书以及interactive brokers发布的API指南。显然,这个API比我以前使用过的任何API都要高。 我想做的第一件事就是简单地连接到软件。我已经能够用Interactive Brokers提供的测试GUI做到这一点。然而,在编写自己的脚本时,我遇到了一个错误:不可编译的源代码——错误的符号类型。我已经将jav

  • 我猜一切都在标题里。 他们确实有一个安装外壳脚本,但没有别的。我在寻找任何其他脚本,或者,也许,一些CLI标志来让它执行卸载,但找不到任何脚本。 如何正确卸载这些东西?

  • 目标: 我想在非常简单的场景中测试所有Nginx代理超时参数。我的第一种方法是创建非常简单的HTTP服务器,并设置一些超时: 在听和接受之间测试proxy_connect_timeout 在接受和读取之间测试proxy_send_timeout 在读取和发送之间测试proxy_read_timeout 测试: 1)服务器代码(python): 2)Nginx配置: 通过显式设置proxy\u co

  • 对Python和IB API还不熟悉,但仍停留在这个简单的问题上。此应用程序工作正常,并打印IB服务器回复。然而,我不知道如何将这些数据输入熊猫的数据框或任何其他变量。你如何“把数据拿出来”谢谢 在论坛、文档或youtube上,我找不到任何有用的例子。我想答案一定是将accountSummary返回给pd。系列,但不知道如何。 预期输出将是一个可以在应用程序之外操作的数据系列或变量。