Ошибка размещения заказа Golang IB API: невозможно установить атрибут VOL для не-vol заказа

Я пытаюсь использовать порт Golang ib API для подключения к моей рабочей станции Interactive Brokers Trader.

Я могу подключиться и прочитать данные из API, но когда я пытаюсь разместить заказ на бумажном торговом счете, я получаю следующую ошибку:

&{1 321 Error validating request:-'bB' : cause - Cannot set VOL attribute on non-VOL order.}

Но я не верю, что я установил атрибут VOL в запросе. Минимальная программа, которая воспроизводит ошибку:

package main

import (
    "fmt"
    "math"
    "time"

    "github.com/gofinance/ib"
)

func main() {
    eng, err := ib.NewEngine(ib.EngineOptions{
        DumpConversation: true,
        Gateway:          "127.0.0.1:1122",
    })
    if err != nil {
        fmt.Printf("Connection error: %v", err)
    }
    // Note: you have to make sure the connection has been fully established
    // before attempting to do any requests to the TWS. Failure to do so will
    // result in the TWS closing the connection. Typically this can be done by
    // waiting for a callback from an event and the end of the initial connection
    // handshake, such as IBApi.EWrapper.nextValidId or IBApi.EWrapper.managedAccounts
    // https://interactivebrokers.github.io/tws-api/connection.html
    // TODO take apart engine.go and make it wait properly.
    time.Sleep(1 * time.Second)
    defer eng.Stop()
    // printInstrument(eng)
    reqID := eng.NextRequestID()
    o := make(chan ib.Reply)
    eng.Subscribe(o, reqID)
    order := ib.Order{
        Action:     "BUY",
        OrderType:  "LMT",
        TotalQty:   100,
        LimitPrice: 95.94,
    }
    contract := ib.Contract{
        SecurityType:    "STK",
        Symbol:          "MSFT",
        Exchange:        "SMART",
        PrimaryExchange: "NASDAQ",
        Currency:        "USD",
    }
    req := &ib.PlaceOrder{
        Order:    order,
        Contract: contract,
    }
    req.SetID(reqID)
    if err := eng.Send(req); err != nil {
        fmt.Printf("Send error: %v", err)
    }
    fmt.Println("Waiting for reply...")
    reply := <-o
    fmt.Println(reply)
}

И вывод из программы:

$ go run main.go
2> '71-1-2-'
2< &{15 1} &{[DU1029297]}
2< &{9 1} &{1}
2< &{4 2} &{-1 2104 Market data farm connection is OK:usfuture}
2< &{4 2} &{-1 2104 Market data farm connection is OK:cashfarm}
2< &{4 2} &{-1 2104 Market data farm connection is OK:usfarm.us}
2< &{4 2} &{-1 2104 Market data farm connection is OK:usfarm}
2< &{4 2} &{-1 2106 HMDS data farm connection is OK:ilhmds}
2< &{4 2} &{-1 2106 HMDS data farm connection is OK:euhmds}
2< &{4 2} &{-1 2106 HMDS data farm connection is OK:fundfarm}
2< &{4 2} &{-1 2106 HMDS data farm connection is OK:ushmds}
2> '3-42-1-0-MSFT-STK--0---SMART-NASDAQ-USD-----BUY-100-LMT-95.94-0-----0--0-0-0-0-0-0-0-0--0-------0--0-0---0-0-0-0-0-0-0-0-0-0-0-0-0-0-0--0-0-0-0-0-0-0-0-----0---0-0--0--'
Waiting for reply...
2< &{4 2} &{1 321 Error validating request:-'bB' : cause - Cannot set VOL attribute on...
&{1 321 Error validating request:-'bB' : cause - Cannot set VOL attribute on non-VOL order.}

Обратите особое внимание на дамп из движка ib 3-42-1-0-MSFT-STK--0---SMART-NASDAQ-USD-----BUY-100-LMT-95.94-0-----0--0-0-0-0-0-0-0-0--0-------0--0-0---0-0-0-0-0-0-0-0-0-0-0-0-0-0-0--0-0-0-0-0-0-0-0-----0---0-0--0--, Может быть, кто-то, знакомый с IB API, может сказать мне, что я здесь делаю не так?

1 ответ

Похоже, что конструктор объекта заказа устанавливает volatility а также volatilityType атрибуты равны 0. В этом случае, поскольку ордер не является ордером волатильности (введите VOL) эти атрибуты должны быть отключены. В IB API "не установлено" обозначается максимальным значением для этого примитивного типа данных. Итак, в классе Order

volatilityType должен быть = math.MaxInt32 или 2147483647 а также

volatility установить как math.MaxFloat64 = 1.7976931348623157e+308

Вместо ib.Order{...}, пытаться order := ib.NewOrder()

Другие вопросы по тегам