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

自定义交互式代理的reqIds()和reqMktData()Java方法

江渊
2023-03-14

我试图在交互式代理的Java API中编写定制代码。有一堆方法通过eClientSocket对象发送到TWS。两个例子是reqIds()和reqMktData()。这两个方法都是void方法,因此它们不会返回任何东西。相反,它们‘激活’在调用它们的类中编写的方法(在本例中为SampleFrame)。这些方法也是无效的,因为它们不返回任何数据。相反,在这些方法中编写代码(分别为nextValidId()和tickPrice())来处理从TWS(trader workstation)发回的数据。

我在创建nextValidId()和tickPrice()方法的修改版本时遇到了麻烦,因为reqIds()和reqMktData()实际上没有在自己的代码中指定这些方法名。因此,我无法编写名为“TickPriceBlackBox()”的方法,该方法是从reqMktData()中调用的,或者从reqMktData()的一个名为reqmktDataBackBox()的副本中调用的。同样,reqMktData()中没有可以修改的特定代码来调用特定的tickPriceBlackBox()方法。这就好像TWS内部的代码本身被硬连接来调用tickPrice()方法,使得我无法创建一个返回价格信息的新方法。

谁能解释一下是怎么回事,或者如何创建一个解决方案?

下面是一些代码:


void onReqMktData() {//requests market data from TWS / Interactive Brokers
        // run m_orderDlg
        m_orderDlg.init("Mkt Data Options", true, "Market Data Options", m_mktDataOptions);
        m_orderDlg.show();
if( !m_orderDlg.m_rc ) { return; } m_mktDataOptions = m_orderDlg.getOptions();

    // req mkt data
    m_client.reqMktData( m_orderDlg.m_id, m_orderDlg.m_contract,
            m_orderDlg.m_genericTicks, m_orderDlg.m_snapshotMktData, m_mktDataOptions);
}

//这里是reqMktData()方法public synchronized void reqMktData(int tickerId,Contract Contract,String genericTickList,boolean snapshot,List mktDataOptions){if(!m_connected){error(eclienterrors.no_valid_id,eclienterrors.not_connected,“”);return;}

    if (m_serverVersion < MIN_SERVER_VER_SNAPSHOT_MKT_DATA && snapshot) {
        error(tickerId, EClientErrors.UPDATE_TWS,
                "  It does not support snapshot market data requests.");
        return;
    }

    if (m_serverVersion < MIN_SERVER_VER_UNDER_COMP) {
        if (contract.m_underComp != null) {
            error(tickerId, EClientErrors.UPDATE_TWS,
                "  It does not support delta-neutral orders.");
            return;
        }
    }

    if (m_serverVersion < MIN_SERVER_VER_REQ_MKT_DATA_CONID) {
        if (contract.m_conId > 0) {
            error(tickerId, EClientErrors.UPDATE_TWS,
                "  It does not support conId parameter.");
            return;
        }
    }

    if (m_serverVersion < MIN_SERVER_VER_TRADING_CLASS) {
        if (!IsEmpty(contract.m_tradingClass)) {
            error(tickerId, EClientErrors.UPDATE_TWS,
                "  It does not support tradingClass parameter in reqMarketData.");
            return;
        }
    }

    final int VERSION = 11;

    try {
        // send req mkt data msg
        send(REQ_MKT_DATA);
        send(VERSION);
        send(tickerId);

        // send contract fields
        if (m_serverVersion >= MIN_SERVER_VER_REQ_MKT_DATA_CONID) {
            send(contract.m_conId);
        }
        send(contract.m_symbol);
        send(contract.m_secType);
        send(contract.m_expiry);
        send(contract.m_strike);
        send(contract.m_right);
        if (m_serverVersion >= 15) {
            send(contract.m_multiplier);
        }
        send(contract.m_exchange);
        if (m_serverVersion >= 14) {
            send(contract.m_primaryExch);
        }
        send(contract.m_currency);
        if(m_serverVersion >= 2) {
            send( contract.m_localSymbol);
        }
        if(m_serverVersion >= MIN_SERVER_VER_TRADING_CLASS) {
            send( contract.m_tradingClass);
        }
        if(m_serverVersion >= 8 && BAG_SEC_TYPE.equalsIgnoreCase(contract.m_secType)) {
            if ( contract.m_comboLegs == null ) {
                send( 0);
            }
            else {
                send( contract.m_comboLegs.size());

                ComboLeg comboLeg;
                for (int i=0; i < contract.m_comboLegs.size(); i ++) {
                    comboLeg = contract.m_comboLegs.get(i);
                    send( comboLeg.m_conId);
                    send( comboLeg.m_ratio);
                    send( comboLeg.m_action);
                    send( comboLeg.m_exchange);
                }
            }
        }

        if (m_serverVersion >= MIN_SERVER_VER_UNDER_COMP) {
           if (contract.m_underComp != null) {
               UnderComp underComp = contract.m_underComp;
               send( true);
               send( underComp.m_conId);
               send( underComp.m_delta);
               send( underComp.m_price);
           }
           else {
               send( false);
           }
        }

        if (m_serverVersion >= 31) {
            /*
             * Note: Even though SHORTABLE tick type supported only
             *       starting server version 33 it would be relatively
             *       expensive to expose this restriction here.
             *
             *       Therefore we are relying on TWS doing validation.
             */
            send( genericTickList);
        }
        if (m_serverVersion >= MIN_SERVER_VER_SNAPSHOT_MKT_DATA) {
            send (snapshot);
        }

        // send mktDataOptions parameter
        if(m_serverVersion >= MIN_SERVER_VER_LINKING) {
            StringBuilder mktDataOptionsStr = new StringBuilder();
            int mktDataOptionsCount = mktDataOptions == null ? 0 : mktDataOptions.size();
            if( mktDataOptionsCount > 0) {
                for( int i = 0; i < mktDataOptionsCount; ++i) {
                    TagValue tagValue = (TagValue)mktDataOptions.get(i);
                    mktDataOptionsStr.append( tagValue.m_tag);
                    mktDataOptionsStr.append( "=");
                    mktDataOptionsStr.append( tagValue.m_value);
                    mktDataOptionsStr.append( ";");
                }
            }
            send( mktDataOptionsStr.toString());
        }

    }
    catch( Exception e) {
        error( tickerId, EClientErrors.FAIL_SEND_REQMKT, "" + e);
        close();
    }
}

//这段代码的关键部分REQ_MKT_DATA导致EclientSocket.java对象中的最后一个int变量,等于1。任何地方都没有提到tickPrice()。

//此方法提供股票价格,但不返回值。您必须将可执行代码放入这个方法中。我无法复制和更改此方法的名称(tickprice();)因为据我所知,我的可访问代码都没有调用它。感觉就好像TWS在从它的末端给tickPrice打电话。

public void tickPrice(int tickerId,int field,double price,int canAutoExecute){//已接收价格刻度字符串msg=eWrapperMsgGenerator.tickPrice(tickerId,field,price,canAutoExecute);m_tickers.add(msg);}


共有1个答案

蒯卓君
2023-03-14

tickPrice方法是从EReader调用的,该EReader是在EClientSocket中创建的,该EClientSocket知道EWrapper实现。

基本上,您调用套接字reqMktData方法,它将把它发送给TWS。EReader会将套接字上的响应视为tickPrice消息,并将其发送给包装器实现。

如果您想自己处理它,那么您可以在tickPrice方法中执行。它可以像将数据传递给您定义的方法一样简单。

public void tickPrice( int tickerId, int field, double price, int canAutoExecute) {
    handleTick(tickerId,field,price);
}
 类似资料:
  • 如果我想使用交互式经纪人Java API检查当前头寸,然后通过出售或购买每个头寸的股票来重新平衡这些头寸,我只需要使用EWrapper。position()方法获取帐户中的当前头寸?或者我应该使用EClientSocket。reqPositions()方法来获取它? Ewrapper似乎用于从TWS接收信息到客户端,而EClientSocket用于向TWS发送请求。在这种情况下,我是否同时使用po

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

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

  • 本文向大家介绍WKWebView、WebView和JS的交互方式详解,包括了WKWebView、WebView和JS的交互方式详解的使用技巧和注意事项,需要的朋友参考一下 由于Xcode8发布之后,编译器开始不支持iOS 7了,这样我们的app也改为最低支持iOS 8.0,既然需要与web交互,那自然也就选择使用了 iOS 8.0之后 才推出的新控件 WKWebView. 相比与 UIWebVie

  • 我正在寻找将Python连接到交互式代理应用编程接口。谷歌搜索显示了ibPy的可用性(见https://pypi.python.org/pypi/ib),但是这个库似乎没有得到维护,也不支持Python 3。我还发现https://github.com/colin1alexander/IbPython3但是这个项目已经被取消了。 我知道Quantopian使用交互式代理作为其执行代理,但有一个用于

  • 我曾尝试在VisualStudio2008中设置Interactive Broker的C API,但我知道的C非常有限,并且不断出现错误: 1)是否有任何方法可以使用某种轻量级的脚本语言来连接到Interactive Brokers并进行交易。 像Python这样轻量级的东西就可以了,是的,我已经研究过IBMY,但我不明白java2python系统是如何工作的。 2) 您是如何设置您的自动系统的,