Как получить информацию о контракте из API Interactive Brokers?

Если вы используете залп и хотите выполнить HTTPS-запрос или службу SSL-сертификации, вы можете выбрать этот самый простой способ: ->

Шаг -> 1. сохранить файл .cer в res / raw / папка.

Шаг -> 2. Используйте этот метод и замените имя файла .cer файлом .cer и замените имя своего хоста.

private SSLSocketFactory getSocketFactory() {

    CertificateFactory cf = null;
    try {

        cf = CertificateFactory.getInstance("X.509");
        InputStream caInput = getResources().openRawResource(R.raw.cert_name);
        Certificate ca;
        try {

            ca = cf.generateCertificate(caInput);
            Log.e("CERT", "ca=" + ((X509Certificate) ca).getSubjectDN());
        } finally {
            caInput.close();
        }


        String keyStoreType = KeyStore.getDefaultType();
        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
        keyStore.load(null, null);
        keyStore.setCertificateEntry("ca", ca);


        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore);


        HostnameVerifier hostnameVerifier = new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {

                Log.e("CipherUsed", session.getCipherSuite());
                return hostname.compareTo("10.199.89.68")==0; //The Hostname of your server.

            }
        };


        HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
        SSLContext context = null;
        context = SSLContext.getInstance("TLS");

        context.init(null, tmf.getTrustManagers(), null);
        HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());

        SSLSocketFactory sf = context.getSocketFactory();


        return sf;

    } catch (CertificateException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (KeyStoreException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (KeyManagementException e) {
        e.printStackTrace();
    }

    return  null;
}

Шаг -> 3. Замените эту строку «RequestQueue queue = Volley.newRequestQueue (this);» с «RequestQueue queue = Volley.newRequestQueue (это новый HurlStack (null, getSocketFactory ())); по просьбе залпа.

0
задан Greg 17 January 2019 в 06:17
поделиться

1 ответ

from ibapi.client import EClient
from ibapi.wrapper import EWrapper


class MyWrapper(EWrapper):

    def nextValidId(self, orderId:int):
        print("setting nextValidOrderId: %d", orderId)
        self.nextValidOrderId = orderId
        # start program here or use threading
        app.reqContractDetails(4444, contract)

    def contractDetails(self, reqId, contractDetails):
        print(reqId, contractDetails.contract)# my version doesnt use summary

    def contractDetailsEnd(self, reqId):
        print("ContractDetailsEnd. ", reqId)
        # this is the logical end of your program
        app.disconnect() # delete if threading and you want to stay connected

    def error(self, reqId, errorCode, errorString):
        print("Error. Id: " , reqId, " Code: " , errorCode , " Msg: " , errorString)


wrapper = MyWrapper()
app = EClient(wrapper)
app.connect("127.0.0.1", 7497, clientId=123)
print("serverVersion:%s connectionTime:%s" % (app.serverVersion(), app.twsConnectionTime()))

from ibapi.contract import Contract
contract = Contract()
contract.symbol = "XAUUSD"
contract.secType = "CMDTY"
contract.exchange = "SMART"
contract.currency = "USD"

app.run() # delete this line if threading

# def runMe():
#     app.run()

# import threading
# thread = threading.Thread(target = runMe)
# thread.start()

# input('enter to disconnect')
# app.disconnect()

Вы запрашиваете данные, прежде чем запустить программу чтения сообщений. Может быть, вы получите данные до его начала.

IB рекомендует запускать программу после получения nextValidId, чтобы вы знали, что все работает правильно. Поскольку Python API блокирует в цикле чтения сообщений, вам необходимо реализовать многопоточность или структурировать вашу программу для асинхронного запуска.

Я показал, как это сделать, чтобы он просто работал без ввода данных пользователем и управлялся событиями или был асинхронным. Это означает, что программа ждет, пока она должна что-то сделать, а затем она это делает.

Я включил параметр потоков, просто измените комментарии.

ContractDetails.summary был изменен на контракт. Я не уверен, что это когда-либо было обобщением в python, не знаю, откуда вы это взяли.

0
ответ дан brian 17 January 2019 в 06:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: