gofinance / ib

Pure Go interface to Interactive Brokers IB API
391 stars 121 forks source link

NewInstrumentManager does not seem to work. #2

Open pilwon opened 10 years ago

pilwon commented 10 years ago

Thanks for sharing this project.

I tried to get some data using the following code but I get 0 as value. Is this package still under development or is it currently being used for some relatively important applications?

package main

import (
    "fmt"
    "log"
    "os"

    "github.com/gofinance/ib"
)

func failOnError(err error, msg string) {
    if err != nil {
        log.Fatalf("%s: %s", msg, err)
        panic(fmt.Sprintf("%s: %s", msg, err))
    }
}

func testCurrentTime(engine *ib.Engine) {
    m, err := ib.NewCurrentTimeManager(engine)
    failOnError(err, "Failed to create current time manager")
    defer m.Close()
    fmt.Println(m.Time())
}

func testInstrument1(engine *ib.Engine) {
    m, err := ib.NewInstrumentManager(engine, ib.Contract{
        Symbol:       "AAPL",
        SecurityType: "STK",
        Exchange:     "SMART",
        Currency:     "USD",
    })
    failOnError(err, "Failed to create instrument manager")
    defer m.Close()
    fmt.Println(m.Bid(), m.Ask(), m.Last())
}

func testInstrument2(engine *ib.Engine) {
    m, err := ib.NewInstrumentManager(engine, ib.Contract{
        Symbol:       "USD",
        SecurityType: "CASH",
        Exchange:     "IDEALPRO",
        Currency:     "CAD",
    })
    failOnError(err, "Failed to create instrument manager")
    defer m.Close()
    fmt.Println(m.Bid(), m.Ask(), m.Last())
}

func main() {
    opts := ib.NewEngineOptions{
        Gateway: "127.0.0.1:7496",
    }
    if os.Getenv("CI") != "" || os.Getenv("IB_ENGINE_DUMP") != "" {
        opts.DumpConversation = true
    }

    engine, err := ib.NewEngine(opts)
    failOnError(err, "Failed to connect engine")
    defer engine.Stop()

    testCurrentTime(engine)
    testInstrument1(engine)
    testInstrument2(engine)
}
$ go run test.go
0001-01-01 00:00:00 +0000 UTC
0 0 0
0 0 0
benalexau commented 10 years ago

I am no longer developing this package, and I'm aware the original author is also no longer developing it. While some of our portfolio monitoring systems use this package in production, these only touch account management message types. The market data messages are present, but we don't use them (we use Nanex NxCore instead) and therefore I cannot comment on their robustness. Certainly there are tests though, and they pass based on the CI server report. There are no order-related messages.

If you wish to use Go with IB, feel free to send some pull requests and I'll add you as a member to the gofinance organisation so you can merge them.

dsouzae commented 10 years ago

You need to use the SinkManager. See the instrument_manager_test.go for more details, and for further details read how SinkManager works in manager.go.

See below for an example of what you need to change - I added 2 lines of code before the Println.

func testInstrument1(engine *ib.Engine) {
    m, err := ib.NewInstrumentManager(engine, ib.Contract{
        Symbol:       "AAPL",
        SecurityType: "STK",
        Exchange:     "SMART",
        Currency:     "USD",
    })
    failOnError(err, "Failed to create instrument manager")
    defer m.Close()
    var mgr ib.Manager = m
    ib.SinkManager(&mgr, 5*time.Second, 2)
    fmt.Println(m.Bid(), m.Ask(), m.Last())
}