Giter VIP home page Giter VIP logo

denismosolov / oliver Goto Github PK

View Code? Open in Web Editor NEW
21.0 4.0 1.0 145 KB

Оливер — навык для голосового помощника Алиса. С помощью навыка можно создать заявку на покупку или продажу акций на бирже (Тинькофф Инвестиции).

License: MIT License

Makefile 1.30% PHP 98.67% Shell 0.03%
yandex-dialogs alice-skills tinkoff-invest-api yandex-alice tinkoff-invest

oliver's Introduction

Оливер — навык для голосового помощника Алиса

Оливер купит и продаст ценные бумаги на вашем брокерском счёте в Тинькофф Инвестиции, расскажет о ваших активах.

Установка (Linux / MacOSX)

YC CLI

Инструкция https://cloud.yandex.ru/docs/cli/operations/install-cli

Инициализация

git clone https://github.com/denismosolov/oliver.git
cd oliver
make

В процессе интерактивного создания профиля CLI будет поэтапно предлагать задать базовые параметры профиля. Cправка https://cloud.yandex.ru/docs/cli/operations/profile/profile-create#interactive-create

В качестве имени профиля укажите oliver, а в качестве каталога по умолчанию создайте новый каталог oliver. Можете указать другие названия, это ни на что не повлияет.

Если всё сделаете правильно, то появится функция с именем oliver в Яндекс.Облаке.

Деплой в Яндекс.Облако

Выпустите токен OpenAPI для биржи, запишите значение токена в TINKOFF_OPEN_API_EXCHANGE в файле .env.

А вот и команда для деплоя кода в Яндекс.Облако.

make create_version

Если всё сделаете правильно, то у функции oliver появится версия и вы увидите исходный код в Яндекс.Облаке, а так же переменую окружения TINKOFF_OPEN_API_EXCHANGE.

Навык в Яндекс.Диалоги

Справка https://yandex.ru/dev/dialogs/alice/doc/smart-home/start-docpage/

В поле «Тип доступа» выберите «Приватный».

Не забудьте указать функцию Selection_018

Сущности

В настройках навыка выберите подраздел Интенты, найдите Сущности и нажмите Редактировать, появится всплывающее окно с полем ввода. Вставьте содержимое файла intents/entities в поле ввода, нажмите Сохранить и закройте окно.

Интенты

В настройках навыка выберите подраздел Интенты, нажмите Создать. В появившемся окне впишите Название: Заявка на покупку или продажу по рыночной цене, ID: market.order, в поле Грамматика вставьте содержимое файла intents/market_order/intent, в поле Положительные тесты вставьте содержимое файла tests/intents/market_order/positive, а в поле Отрицательные тесты вставьте содержимое файла tests/intents/market_order/negative. Нажмите Сохранить. Первый интент готов.

По аналогии создайте второй интент. Название: Мои заявки ID: my.orders Грамматика: intents/my_orders/intent Положительные тесты: tests/intents/my_orders/positive Отрицательные тесты: tests/intents/my_orders/negative

Название: Мои акции ID: my.stocks Грамматика: intents/my_stocks/intent Положительные тесты: tests/intents/my_stocks/positive Отрицательные тесты: tests/intents/my_stocks/negative

Руководство пользователя

Покупка акций по рыночной цене

Чтобы отправить заявку на покупку акций по рыночной цене скажите: «купи 10 лотов Яндекс».

После этого Оливер попросит подтвердить заявку: «заявка на покупку 10 лотов Яндекс по рыночной цене, тикер YNDX, для подтверждения скажите подтверждаю, для отмены скажите нет».

Если вы подтвердите намерение, то услышите: «заявка на покупку 10 лотов Яндекс по рыночной цене создана» либо «заявка исполнена».

Продажа акций по рыночной цене

Чтобы отправить заявку на продажу акций по рыночной цене скажите: «продай 10 лотов Яндекс».

После этого Оливер попросит подтвердить заявку: «заявка на продажу 10 лотов Яндекс по рыночной цене, тикер YNDX, для подтверждения скажите подтверждаю, для отмены скажите нет».

Если вы подтвердите намерение, то услышите: «заявка на продажу создана» либо «заявка исполнена».

Мои активные заявки

Чтобы узнать информацию об активных заявках, скажите: «мои заявки».

Мои акции

Чтобы узнать информацию об акциях на вашем брокерском счёте, скажите: «мои акции».

Если биржа закрыта, в сообщение будет только тикер и количество акций на счёте. Если биржа открыта, то к тикеру и количеству акций добавляется минимальная и максимальная цена за день.

Вспомогательные команды

Если вы что-то не расслышали, то скажите «повтори», и Оливер повторит последнюю фразу. Это работает только внутри сессии.

Однопроходный навык

Алиса, спроси у Оливера мои акции — вернёт список акций и завершит сессию.

Руководство тестировщика

Тестирование

Юнит-тестирование (Linux/MacOSX)

Для тестирования нужна версия PHP 7.4 и PHPUnit. См. файл конфигурации phpunit.xml.

Если в системе по умолчанию используется PHP 7.4, то можно запустить тесты из корня проекта командой:

./vendor/bin/phpunit

Если в системе нет PHP либо версия отличается от 7.4, то можно запустить набор тестов через Docker. Убедитесь, что в системе установлен Docker, затем выполните:

make develop # установка phpunit, достаточно запустить один раз
make phpunit

Планы на будущее

  1. Хочу в каталог навыков Алисы https://dialogs.yandex.ru/store (ждём TinkoffCreditSystems/invest-openapi#217)
  2. Хочу выставлять и отменять лимитные заявки на покупку и продажу акций через навык

oliver's People

Contributors

denismosolov avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

Forkers

ergoz

oliver's Issues

Авторизация в навыке

Как администратор я хочу задать ID пользователя, который может взаимодействовать с навыком.

Критерии готовности

  1. В качестве обработчика используется приватная функция oliver в Яндекс.Облаке.
  2. ID пользователя передаётся в функцию через переменную окружения SESSION_USER_ID.

Критерии приёмки

  1. Найти session.user.user_id своего тестового аккаунта и установить это значение в переменную окружения SESSION_USER_ID для функции oliver в Яндекс.Облаке.
  2. Взаимодействуй с навыком через тестовый аккаунт и убедись, что получаешь ответ:
    всё хорошо
  3. Запусти навык со своего аккаунта в Яндекс.Станции и убедись, что получаешь ответ:
    Это приватный навык. У вас нет доступа. Завершаю сессию.
  4. Запусти навык без авторизации и убедись, что получаешь ответ:
    Это приватный навык. У вас нет доступа. Завершаю сессию.

Функция в Яндекс.Облаке

Как администратор я хочу создать обработчик для навыка в Яндекс.Облаке при помощи make.

Критерии готовности

  1. Команда создания функции в Яндекс.Облаке находится в цели all в Makefile.
  2. В README.md написано, как создать функцию

Критерии приёмки

  1. Запустить
git clone https://github.com/denismosolov/oliver.git
make

Функция oliver создалась в каталоге oliver.

Недостаточно заявок в стакане для тикера

Как пользователь, которые покупает TCS в 22:00, я хочу слышать сообщение «Недостаточно заявок в стакане для тикера TCS» вместо «ошибка при взаимодействии с биржей, попробуйте создать лимитную заявку позже»

Критерии готовности

  1. Добавь юнит-тест

Критерии приёмки
— купи 10 лотов Тинькофф
— недостаточно заявок в стакане для тикера TCS, похоже биржа закрыта

Повтори

Как пользователь, который не расслышал слова из за постороннего шума, я хочу иметь возможность повторно прослушать последнею реплику.

Критерии готовности

  1. В руководстве пользователя описано, как пользоваться командой «повтори»
  2. Используется встроенный интент YANDEX.REPEAT

Критерии приёмки
1.
— Алиса, спроси у Оливера Брокера мои акции
— [список]
— Повтори
— [список]
— Повтори
— [список]

Логи на сервере

Как разработчик я хочу записывать сообщения об ошибках в поток вывода только на сервере, чтобы не видеть сообщения об ошибках в терминале при запуске юнит-тестов.

Критерии готовности

  1. Используй PSR-3 совместимый логгер
  2. Используй контекст вызова, чтобы понять, где исполняется функция

Критерии приёмки

  1. ./vendor/bin/phpunit не выводит лишний вывод во время тестов

Отмена заявки

Как инвестор я хочу иметь возможность отменить ранее выставленные заявки

Юнит тесты

Как разработчик я хочу использовать phpunit во время разработки, чтобы быть уверенным, что изменения не ломают старый код.

Критерии готовности

  1. dev секция в composer.json содержит phpunit.
  2. В phpunit.xml описан набор тестов (suite)
  3. Makefile содержит правило test для запуска набора тестов
  4. В README.md описано, как запустить набор тестов
  5. Тест, который проверяет, что в ответе Application->run() присутствует version.
  6. Тесты, которые проверяют, что навык доступен только для авторизованного пользователя и недоступен всем остальным.

Критерии приёмки

  1. make test запускает тестирование
  2. make create_version не заливает функцию в облако, если тесты не проходят

«Далее» для команды ты умеешь

Как пользователь я не хочу слышать беспрерывную справку по всем командам, но хочу, чтобы навык давал справку по одной команде, затем спрашивал хочу ли я узнать о следующей

ещё, дальше, что ещё ты умеешь и т.д.

Перевод акций в лоты

Как пользователь, который пытается купить 10 акций Мостотрест и слышит о необходимости повторить запрос, но использовать лоты вместе акций, я хочу, чтобы количество акций, которое я хочу купить было переведено в лоты.

Критерии готовности

  1. Обнови юнит-тест

Критерии приёмки
— Алиса, купи 10 акций Мостотрест
— ...
— подтрвеждаю
— инструмент продаётся лотами, количество акций в одном лоте: 10, повторите команду ещё раз, вместо акций используйте лоты, например, купи 1 лот Мостотрест

Однопроходый навык

Как пользователь, который спрашивает у Алисы баланс, я хочу, чтобы после ответа сессия завершалась, чтобы я не говорил «хватит» для выхода из навыка.

Критерии готовности

  1. При однопроходном режиме навык не даёт подсказки.
  2. Признак однопроходного режима записывается в сессию
  3. Команды для однопроходного режима записаны в README.md

Критерии приёмки
1.

— Алиса, спроси у Оливера мои акции
— на вашем брокерском счёте нет акций,

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

— Алиса, скажи Оливеру купить 1 акцию Яндекс
— заявка на покупку яндекс по рыночной цене, тикер YNDX, количество акций: 10, для подтверждения скажите подтверждаю, для отмены скажите нет.
— подтверждаю
— заявка исполнена

сессия завершена

— Алиса, скажи Оливеру чтобы он улыбнулся
— пожалуйста, повторите ещё раз, я не расслышала.

сессия завершена

Мои заявки

Как пользователь я хочу узнать список неисполненных заявок, отменить заявку, создать лимитную заявку, создать рыночную заявку, чтобы не открывать интерфейс ТИ.

Облигации

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

Подсказка в ответе на команду Мои акции

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

Критерии готовности

  1. Добавь в tests/Reply/StocksTest.php проверку фразы "мои заявки" в ответе.

Критерии приёмки
1.
— мои заявки
— у вас ....
— чтобы посмотреть активные заявки, скажите мои заявки

1 лот = 1 акция

Как пользователь, который желает купить или продать акции, я хочу иметь возможность сказать "купи Х акций" вместо в дополнение к "купи Х лотов", но только для тех акций, в которых 1 лот = 1 акция.

Обработка ping

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

PSR-12

Как разработчик я хочу, чтобы исходный код (PHP) соответствовал стандарту PSR-12.

Критерии готовности

  1. Секция require-dev в composer.json содержит php_codesniffer.
  2. Makefile содержит проверку кода на соответствие PSR-12 в правиле test
  3. Makefile содержит правило fixpsr12 для исправления несоответствий (phpcs)

Критерии приёмки

  1. Запуск make test сообщает о несоответствии кода стандарту PSR-12, если таковое несоответствие имеется.

Команда что ты умеешь

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

Критерии готовности

  1. Используется интент YANDEX.WHAT_CAN_YOU_DO
  2. В тексте приветствия есть подсказка, запустить команду «что ты умеешь?»

Критерии приёмки

  1. Фраза "что ты умеешь" активирует справку, которая показывает примеры команд: покупка, продажа, мои акции, мои заявки

Добавь акции Яндекс (YNDX) в сущности

Хочу, чтобы все примеры в навыке были с акциями Яндекс (YNDX)

Критерии готовности

  1. Во всех примерах используй Яндекс вместо НЛМК
  2. Добавь YNDX в intents/entities

Критерии приёмки

  1. В ответе на команду «что ты умеешь», все примеры покупки и продажи используют акции Яндекс.
  2. Я могу купить и продать акции Яндекс через навык

Приватный навык

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

https://yandex.ru/blog/dialogs/dve-novye-funktsionalnosti-dlya-razrabotki-privatnye-navyki-i-sharing

Критерии готовности

  1. Юнит тесты продолжают работать
  2. Изменения в README.md

Критерии приёмки

  1. Навык активируется на моих устройствах под моим аккаунтом
  2. Навык не активируется на других устройствах
  3. Навык активируется при тестировании через интерфейс платформы диалогов
  4. Навык активируется при тестировании через интерфейс функции в облаке

Используй stub вместо клиента в StocksTest

Как разработчик я хочу, чтобы мои тесты не падали, в случае отказа песочницы Tinkoff Invest.

There was 1 error:

1) Oliver\StocksTest::testSharesTCS
jamesRUS52\TinkoffInvest\TIException: Unknown error

/home/denis/Documents/oliver/vendor/james.rus52/tinkoffinvest/src/TIResponse.php:67
/home/denis/Documents/oliver/vendor/james.rus52/tinkoffinvest/src/TIClient.php:682
/home/denis/Documents/oliver/vendor/james.rus52/tinkoffinvest/src/TIClient.php:150
/home/denis/Documents/oliver/tests/Reply/StocksTest.php:85

--

Сколько стоит <тикер>

Как пользователь, который интересуется компанией Яндекс, я хочу иметь возможность узнать свежую информацию о торгах по акциям компании Яндекс на Московской бирже.

Список (моих) акций

Как пользователь я хочу иметь возможность спросить у Алисы во сколько оцениваются мои акции, чтобы не брать в руки смартфон или ноутбук.

Критерии готовности

  1. Команда «сколько стоят мои акции» описана в секции «руководство пользователя» README.md
  2. Грамматика интента «сколько стоят мои акции» описана в тикете
  3. Интент создан и опубликован

Критерии приёмки

  1. Биржа закрыта
    — Алиса, спроси у Оливера Брокера сколько стоят мои акции?
    — Ти Си Эс Групп, цена закрытия 17 долларов 80 центов.
    У вас 300 акций, средняя цена 14 долларов 4 цента
    Новолипецкий Металлургический Комбинат, цена закрытия 142 рубля 0 копеек
    У вас 1040 акций, средняя цена 141 рубль 62 копейки
    [подсказка, что делать дальше]
  2. Биржа закрыта
    — Алиса, запусти навык Оливер Брокер
    — Запускаю навык Оливер Брокер
    — [приветствие]
    — [подсказка, что делать дальше]
    — Сколько стоят мои акции?
    — Ти Си Эс Групп, цена закрытия 17 долларов 80 центов
    У вас 300 акций, средняя цена 14 долларов 4 цента
    Новолипецкий Металлургический Комбинат, цена закрытия 142 рубля 0 копеек
    У вас 1040 акций, средняя цена 141 рубль 62 копейки
    [подсказка, что делать дальше]
  3. Биржа открыта
    — Алиса, спроси у Оливера Брокера сколько стоят мои акции?
    — Ти Си Эс Групп
    Минимальная цена сегодня 16 долларов 45 центов, максимальная 18 долларов 2 цента
    У вас 300 акций, средняя цена 14 долларов 4 цента
    Новолипецкий Металлургический Комбинат
    Минимальная цена сегодня 139 рублей 94 копейки, максимальная цена 142 рубля 0 копеек
    У вас 1040 акций, средняя цена 141 рубль 62 копейки
    [подсказка, что делать дальше]
  4. Биржа открыта
    — Алиса, запусти навык Оливер Брокер
    — Запускаю навык Оливер Брокер
    — [приветствие]
    — [подсказка, что делать дальше]
    — Сколько стоят мои акции?
    — Ти Си Эс Групп
    Минимальная цена сегодня 16 долларов 45 центов, максимальная 18 долларов 2 цента
    У вас 300 акций, средняя цена 14 долларов 4 цента
    Новолипецкий Металлургический Комбинат
    Минимальная цена сегодня 139 рублей 94 копейки, максимальная цена 142 рубля 0 копеек
    У вас 1040 акций, средняя цена 141 рубль 62 копейки
    [подсказка, что делать дальше]

Навык в платформе Яндекс.Диалоги

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

Критерии готовности

  1. Все поля заполнены для отправки навыка на модерацию

Selection_018

Критерии приёмки

  1. Навык прошёл модерацию

ETF

Как пользователь я хочу иметь возможность купить и продать ETF

Частично исполненные заявки

Как пользователь, который активирует команду "мои заявки" я хочу знать, какие заявки были частично исполнены.

Как это работает сейчас:
https://youtu.be/6QptVe-674A
Я выставил заявку на продажу 207 лотов, из них исполнились 149, а 58 ожидают исполнения.
Selection_036
Я хочу:
Чтобы Оливер сообщил, сколько лотов исполнено

Критерии готовности

  1. Юнит тесты обновлены

Критерии приёмки
1.
— Мои заявки
— У вас 1 активная заявка. Заявка 1 на продажу TCS Group, тикер TCS, 207 лотов по цене 19 долларов 45 центов, 149 лотов исполнено, ожидается исполнение 58 лотов

Список активных заявок

Как пользователь я хочу иметь возможность получить список активных заявок.

Критерии готовности

  1. Команда «мои заявки» описана в руководстве пользователя в README.md
  2. Интент my.orders создан в Диалогах, код интента приведён здесь
  3. Контекст my_orders сохраняется в сессии при активации команды и удаляется из сессии при активации команды «список акций».

Критерии приёмки
1.
— мои заявки
— у вас нет активных заявок
2.
— мои заявки
— у вас 2 активные заявки
купи 10 акций TCS по цене 14.04 за акцию
продай 10 акций TCS по цене 20 за акцию

Лимитная заявка на покупку акций

Как инвестор я хочу иметь возможность создать лимитную заявку на покупку акций по заданной цене

Критерии готовности

  1. Текст интента limit.order.buy.stock записан сюда
  2. В юнит тесте мокается TIClient, чтобы убедиться, что вызывается метод TIClient::sendOrder
  3. В руководство пользователя в README.md добавлена инструкция, как создать лимитную заявку на покупку акций
  4. После обработки команды пользователя, в контексте(сессия) появляется limit_order_buy_stock.
  5. Для подтверждения заявки используется интент YANDEX.CONFIRM.
  6. Для отказа от заявки используется интент YANDEX.REJECT.
  7. Обработка ошибки: недостаточно средств.
  8. Обработка ошибки: биржа закрыта.
  9. Обработка ошибки: недопустимый диапазон цены.
  10. Обработка ошибки: недопустимый шаг цены.
  11. Обработка ошибки: попытка купить долларовые инструменты, либо рублёвые инструменты за доллары (покупки в долларах будут позже)
  12. Обработка ошибки: не смог распознать тикер

Критерии приёмки
1.
— Создай заявку на покупку 1 лота НЛМК по цене 130 рублей 4 копейки
— Заявка на покупку 1 лот НЛМК по цене 130 рублей 4 копейки за акцию. Сумма сделки 1 тысяча 300 рублей 40 копеек плюс комиссия брокера. Для подтверждения скажите "подтверждаю", для отмены "отмена".
— Подтверждаю
— Заявка на покупку 1 лот НЛМК по цене 130 рублей 4 копейки создана.
2.
— Купи 100 лотов НЛМК по цене 135 рублей 10 копеек
— Заявка на покупку 100 лотов НЛМК по цене 135 рублей 10 копеек за акцию. Сумма сделки 135 тысяч 100 рублей плюс комиссия брокера. Для подтверждения скажите "подтверждаю", для отмены "отмена".
— Подтверждаю
— Недостаточно активов для сделки.

Обработка ошибок

Как разработчик я хочу, чтобы в случае возникновения непредвиденной ошибки, навык корректно завершал работу, чтобы не было 500 ошибки на сервере.

Критерии готовности

  1. Все ошибки/исключения обрабатываются в коде в одном месте
  2. Все ошибки записываются в логи

Критерии приёмки

  1. Вызвать исключительную ситуацию и удостовериться, что Алиса отвечает «извините, произошла ошибка, попробуйте повторить действие немного позже»
  2. Найти в логах в Яндекс.Облаке сообщение об ошибке

Интенты в репозитории

Как разработчик я хочу хранить интенты в репозитории, чтобы не искать из по issues.

Критерии готовности

  1. Каждый интент находится в отдельном файле в директории intents в корне проекта.
  2. В README.md написано, как создать интенты в интерфейсе платформы диалогов.

Критерии приёмки

Разработка на MacOSX

Как разработчик, который использует MacOSX, я хочу скачать исходники проекта, затем запустить тесты одной командой в терминале.

Валюта

Как пользователь я хочу иметь возможность купить и продать валюту по рыночной цене.

Критерии готовности

  1. Валюты добавлены в сущность FIGI
  2. Грамматика новых интентов в репозитории
  3. Используется универсальный интент order, а другие интенты для покупки и продажи акций помечены deprecated.

Критерии приёмки
1.
— купи доллары сша 1 лот
— заявка на покупку доллар сша по рыночной цене, количество лотов: 1, для подтверждения скажите да, для отмены скажите нет
— да
— заявка исполнена

— продай 1 лот долларов
— заявка на продажу доллар сша по рыночной цене, количество лотов: 1, для подтверждения скажите да, для отмены скажите нет
— да
— заявка исполнена

— купи 1000 долларов сша
— инструмент продаётся лотами, количество долларов сша в одном лоте: 1000, повторите команду ещё используя лоты, например, скажите: купи 1 лот доллар сша

Приветственная фраза

Как пользователь я хочу чтобы при запуске Оливер предлагал узнать баланс, чтобы я понял, что я общаюсь с Оливером, а не с Алисой.

Критерии готовности

  1. Pull Request

Критерии приёмки

  1. При запуске навыка я слышу "Здравствуйте, хотите узнать свой баланс?".

Рыночная заявка на покупку акций

Как инвестор я хочу иметь возможность создать заявку на покупку акций по рыночной цене

Критерии готовности

  1. Текст интента запушен в репозиторий\
  2. В юнит тесте мокается TIClient, чтобы убедиться, что вызывается метод TIClient::sendOrder
  3. В руководство пользователя в README.md добавлена инструкция, как создать заявку на покупку акций по рыночной цене, как добавить тикер в entity
  4. После обработки команды пользователя, в контексте(сессия) появляется market_order_buy_stock.
  5. Для подтверждения заявки используется интент YANDEX.CONFIRM.
  6. Для отказа от заявки используется интент YANDEX.REJECT.
  7. Обработка ошибки: недостаточно средств.
  8. Обработка ошибки: биржа закрыта.
  9. Обработка ошибки: не смог распознать тикер

Критерии приёмки
1.
— Купи 1 лот НЛМК по рыночный цене
— Заявка на покупку 1 лот НЛМК по рыночной цене. Для подтверждения скажите "подтверждаю", для отмены "отмена".
— Подтверждаю
— Заявка на покупку 1 лот НЛМК по рыночной цене создана.
2.
— Купи 1 лот НЛМК по рыночный цене
— Заявка на покупку 1 лот НЛМК по рыночной цене. Для подтверждения скажите "подтверждаю", для отмены "отмена".
— Подтверждаю
— Недостаточно активов для сделки.

Продажа акций по рыночной цене

Как инвестор я хочу иметь возможность продать свои акций по рыночной цене.

Критерии готовности

  1. В руководство пользователя в README.md добавлена инструкция, как продать акций по рыночной цене
  2. После обработки команды пользователя, в контексте(сессия) появляется market_order_sell_stock.
  3. Для подтверждения используется интент YANDEX.CONFIRM.
  4. Для отмены используется интент YANDEX.REJECT.
  5. Обработка ошибки: недостаточно средств.
  6. Обработка ошибки: биржа закрыта.
  7. Обработка ошибки: нет столько акций

Критерии приёмки
1.
— продай 1 лот ВТБ
— заявка на продажу Банк ВТБ по рыночной цене, тикер: VTBR, количество лотов: 1, для подтверждения скажите "подтверждаю", для отмены скажите "нет".
— подтверждаю
— заявка исполнена, акции проданы.
2.
— продай 1 лот ВТБ
— заявка на продажу Банк ВТБ по рыночной цене, тикер: VTBR, количество лотов: 1, для подтверждения скажите "подтверждаю", для отмены скажите "нет".
— подтверждаю
— невозможно совершить сделку, у вас нет акций Банк ВТБ

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.