Tinkoff / investAPI

396 stars 136 forks source link

Торговля валютой #76

Closed megaryab closed 2 years ago

megaryab commented 2 years ago

Господа, у меня вопрос. Почему в приложении я могу покупать от 1 доллара или евро и прочую валюту. Но в API установлены ограничения размера покупки валюты кратной 1000. Это я чего то не понимаю или Tinkoff не дает делать такие операции через API?

FooBarrior commented 2 years ago

а ты лимитные покупки ставишь, или по рыночной цене?

megaryab commented 2 years ago

Ставлю и такие и такие. Пытаюсь купить 1 доллар, но не могу.

(async () => { console.log( await api.Orders.PostOrder({figi: "BBG0013HGFT4", quantity : 1, price : {units : 75, nano: 3}, direction : "ORDER_DIRECTION_BUY", account_id : "2142952809", order_type : "ORDER_TYPE_LIMIT", order_id : 2 }) ) } ) ()

(async () => { console.log( await api.Orders.PostOrder({figi: "BBG0013HGFT4", quantity : 1, price : {units : 75, nano: 3}, direction : "ORDER_DIRECTION_BUY", account_id : "2142952809", order_type : "ORDER_TYPE_MARKET", order_id : 3 }) ) } ) ()

Также перепробовал поменять направление сделки. Но всегда одна и та же ошибка

В обоих случаях выдает ошибку. UnhandledPromiseRejectionWarning: Error: 3 INVALID_ARGUMENT: 30042 - Недостаточно активов для маржинальной сделки. Проверьте маржинальные показатели счёта.

На счету деньги есть. Или я делаю что то не так? Или может какие ограничения или настройки.

Помогите пожалуйста

FooBarrior commented 2 years ago

вот я продал только что.

EDIT: а нет, продалось по 1000 долларов! Да, это как-то неправильно

мои request&response:

quantity: 1
price {
  units: 75
  nano: 230000000
}
direction: ORDER_DIRECTION_SELL
account_id: "2035159231"
order_type: ORDER_TYPE_MARKET
order_id: "7163836807453460708"
order_id: "22917997965"
execution_report_status: EXECUTION_REPORT_STATUS_FILL
lots_requested: 1
lots_executed: 1
initial_order_price {
  currency: "rub"
  units: 75185
}
executed_order_price {
  currency: "rub"
  units: 1
}
total_order_amount {
  currency: "rub"
  units: 75185
}
initial_commission {
  currency: "rub"
  units: 18
  nano: 800000000
}
executed_commission {
  currency: "rub"
}
aci_value {
}
figi: "BBG0013HGFT4"
direction: ORDER_DIRECTION_SELL
initial_security_price {
  currency: "rub"
  units: 75
  nano: 185000000
}
order_type: ORDER_TYPE_MARKET
betslus1 commented 2 years ago

Я так понимаю проблема в том что на бирже валюта торгуется лотами по 1000 штук. То что в приложении есть возможность торговать по 1шт, это я так понимаю не уходит на биржу а обмен идет через брокера (как бы через банковский обменник)

FooBarrior commented 2 years ago

Да, действительно, у инструмента указано lot: 1000.

Я думал, цена за лот будет указана тогда в, ну, хотя бы initial_security_price. А так, мы видим, что ни в запросе, ни в ответе не фигурирует ни общая цена, ни количество акций на лот

figi: "BBG0013HGFT4"
 ticker: "USD000UTSTOM"
 class_code: "CETS"
 lot: 1000
...
FooBarrior commented 2 years ago

@betslus1 в документации написано, что price в PostOrderRequest это именно цена лота

betslus1 commented 2 years ago

@betslus1 в документации написано, что price в PostOrderRequest это именно цена лота

мне кажется ошибка в документации, лучше дождаться разработчиков или проверить. я пока не тестил лотные инструменты и временно отказался от них @serejhaaa

Я думал, цена за лот будет указана тогда в, ну, хотя бы initial_security_price. А так, мы видим, что ни в запросе, ни в ответе не фигурирует ни общая цена, ни количество акций на лот

ну так вроде всегда было и везде, с лотными инструментами в принципе очень тяжело работать

initial_order_price { currency: "rub" units: 75185 }

тут ведь указано что общая стоимость лота 75 тысяч рублей

FooBarrior commented 2 years ago

да, initial_order_price правильная.

Разработчикам надо либо исправить докумантацию PostOrderRequest.price, либо исправить хендлинг в соответствии с ней. Также исправить PortfolioPosition в теле ответа Operations.GetPortfolio:

Сейчас возвращается так:

                      figi: "BBG0013HGFT4"
                      instrument_type: "currency"
                      quantity {
                        units: 2249
                        nano: 350000000
                      }
                      average_position_price {
                        currency: "rub"
                      }
                      expected_yield {
                        units: -773
                        nano: -40000000
                      }
                      current_nkd {
                      }
                      current_price {
                        currency: "rub"
                        units: 74
                        nano: 747500000
                      }
                      average_position_price_fifo {
                        currency: "rub"
                        units: 75
                        nano: 90000000
                      }
                      quantity_lots {
                        units: 2249
                        nano: 350000000
                      }

неплохо бы вообще унифицировать это всё -- везде всё в лотах, например, писать, или наоборот