2017-08-01 3 views
0

Hallo Leute, ich fange gerade an, an einem Ibpy-Algorithmus zu arbeiten, und ich möchte es zuerst mit Papierhandel testen, aber ich habe ein wenig Verständnis, wie man die reqMktData benutzt, um den letzten Preis zu bekommen. Ich habe keine Probleme, Bestellungen aufzugeben, aber das bringt nichts für 25 Sekunden zurück. Ich bin der Meinung, dass es nur während der Handelszeiten verwendet werden soll, oder benutze es vielleicht einfach falsch, irgendwelche Gedanken?Wie benutze ich die reqMktData von Ibpy richtig?

from ib.opt import ibConnection, message 
from ib.ext.Contract import Contract 
from time import sleep 

def my_callback_handler(msg): 
    inside_mkt_bid = '' 
    inside_mkt_ask = '' 

    if msg.field == 1: 
     inside_mkt_bid = msg.price 
     print 'bid', inside_mkt_bid 
    elif msg.field == 2: 
     inside_mkt_ask = msg.price 
     print 'ask', inside_mkt_ask 


tws = ibConnection() 
tws.register(my_callback_handler, message.tickSize, message.tickPrice) 
tws.connect() 

c = Contract() 
c.m_symbol = "DATA" 
c.m_secType = "STK" 
c.m_exchange = "SMART" 
c.m_currency = "USD" 
tws.reqMktData(788,c,"",False) 
sleep(25) 
print 'All done' 

tws.disconnect() 
+0

Wenn die Anfrage erfolgreich gesendet wird, sollte sie entweder die Daten oder eine Fehlermeldung irgendeiner Art zurückgeben. Sie sollten sicherstellen, dass Sie die Fehlermeldungen erfassen. Ich bin mit Ibpy nicht vertraut, aber ich habe herausgefunden, wie man die Protokollierung hier https://github.com/blampe/IbPy/wiki/Getting-Started aktiviert. Wenn Sie IBGateway verwenden, aktivieren Sie auch das Kontrollkästchen "Protokoll anzeigen", um zu sehen, was dort passiert (nicht sicher, wie die Protokolle in TWS angezeigt werden). – kingdc

+0

Hallo ich habe es geändert, so kann ich den Fehler erhalten, das ist, was ich bekomme: TWS Zeit bei Verbindung: 20170801 23:59:20 WET TB1

+0

Also scheint es keine Verbindung zu usfuture, usfarm, fundfarm und ushmds sind die, die nicht 24/7 dran sein sollen oder ich müssen Sie bezahlen, um Zugang zu haben? – TB1

Antwort

0

Ich denke, es hat etwas mit dem Marktdatenabonnement in IB selbst zu tun, weil ich ein ähnliches Problem habe. Ich bekomme eine TWS-Zeit bei Verbindung ... zurückgegeben in den Ergebnissen zusammen mit der "Marktdatenfarm-Verbindung" Msg. Achten Sie darauf, einen Verbindungsanschluss & clientID etabliert haben, das heißt:

tws = ibConnection(port=7496,clientId=100) 

Beachten Sie, dass 7496 ein gemeinsamer Anschluss, aber die clientId ist alles, was Sie (innerhalb des IB-Konto Sie verwenden unter File- angeben möchten> API-> Einstellungen).

0

Ich habe versucht, IbPy vor und erfolgreich die Daten zu bekommen, aber jetzt habe ich Ibapi stattdessen verwenden, die schwieriger ist und immer noch nicht vollständig handeln kann, aber es hat einen angepassten historischen Preis.

Also das ist mein Code, den Sie anpassen müssen, was Sie wollen.

1.Get Excel Aktien Mitglied Form

from ib.opt import ibConnection, message 
from ib.ext.Contract import Contract 
from ib.ext.Order import Order 
from ib.ext.TickType import TickType as tt 
from time import sleep, time, strftime 
import datetime 
from __future__ import print_function #I'm using 3.x style print 
import pandas as pd 
import numpy as np 
from math import ceil 
import re 

xls_file = pd.ExcelFile('xxxx\\Interactive_Broker_trading\\SNP2.xlsx') 
df = xls_file.parse('Sheet1') 
Ticker = df.iloc[:,1] 
all_data = pd.DataFrame(Ticker) 
all_data.columns = ['ticker'] 
all_data['type'] = 'STK' 
all_data['exchange'] = 'SMART' 
all_data['curr'] = 'USD' 
all_data['bidPrice'] =0 
all_data['askPrice'] =0 
all_data['lastPrice'] =0 
all_data['HistoryPrice']=0 

2.Get der Historische Preis für Schleife unter Verwendung, da mein Konto ein Limit von 100 Anfrage pro Moment hat, damit ich es in 8 mehrere Sitzungen für S devide & P 505. Dann wieder an jedem 70 Aktien anmelden. Ich kann die Summe von 505 in 2 Minuten bekommen.

def error_handler(msg): 
    print(msg) 
def my_callback_handler(msg): 
    if msg.field in [tt.BID,tt.ASK,tt.LAST]: 
#   from ib.ext.TickType import TickType as tt 

     #now we can just store the response in the data frame 
     all_data.loc[msg.tickerId,tt.getField(msg.field)] = msg.price 
#   if msg.field == tt.LAST: 
# #    print('a') 
#    print(all_data.loc[msg.tickerId,'ticker'],msg.price) 

t = time() 
max_amount_per_Iter = 70 #max number per iter to save cost 
max_Iter = ceil(len(all_data)/max_amount_per_Iter) 
for i in range (0,max_Iter): 
    print('====================for : ',i+1,'==========================') 
    sleep(1) 
    tws = ibConnection(clientId=11+i) 
    tws.register(my_callback_handler, message.tickPrice, message.tickSize) 
    tws.register(error_handler, 'Error') 
    tws.connect() 
    all_dum = all_data.iloc[i*max_amount_per_Iter:min((i+1)*max_amount_per_Iter,len(all_data)),:] 
    for index, row in all_dum.iterrows(): 


     c = Contract() 
     c.m_symbol = row['ticker'] 
     c.m_exchange = row['exchange'] 
     c.m_currency = row['curr'] 
     c.m_secType = row['type'] 
     # the tickerId is just the index in but for some reason it needs str() 
     tws.reqMktData(str(index),c,'',False) 

     sleep(0.2) 
    sleep(2) 
    print('=========End round : ',i+1,'with time :',time() - t,'==============') 
    tws.disconnect()