我试图在交互式代理的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);}
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) 您是如何设置您的自动系统的,