bnb-chain / go-sdk

Apache License 2.0
205 stars 97 forks source link

No support for creating orders with IOC TimeInForce #149

Closed kaladinlight closed 1 year ago

kaladinlight commented 3 years ago

client.CreateOrder does not have a function parameter to allow setting TimeInForce resulting in using the default GTE value every time. The only thought I had was to make use of the Option functions to manually overwrite the message as follows:

    // gymnastics to be able to set TimeInForce value to IOC (Immediate or Cancel)
    // https://docs.binance.org/trading-spec.html
    m := msg.CreateOrderMsg{
        Sender:      addr,
        ID:          "",
        Symbol:      sym,
        OrderType:   msg.OrderType.LIMIT,
        Side:        s,
        Price:       price,
        Quantity:    quantity,
        TimeInForce: msg.TimeInForce.IOC,
    }
    withMsg := func(txMsg *tx.StdSignMsg) *tx.StdSignMsg {
        txMsg.Msgs = []msg.Msg{m}
        return txMsg
    }

    createOrderResult, err := client.CreateOrder(base, quote, s, price, quantity, true, withMsg)
    if err != nil {
                panic(err)
    }

However, after looking more closely, the msg is overwritten with the order message created by CreateOrder regardless at: https://github.com/binance-chain/go-sdk/blob/8f0e838a5402c99cc08057a04eaece6dfd99181f/client/transaction/transaction.go#L101 resulting in no possibility to use the IOC TimeInForce as far as I can tell.

It would be a bit difficult to add without breaking the CreateOrder API as it stands. Can you think of any reasonable way to go about adding this functionality? Or please let me know if I am overlooking something and there is another way to accomplish this. Thank you!