Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,16 @@ ID: my.stocks

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

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

Чтобы отправить лимитную заявку на покупку акций по заданной цене скажите: «купи 10 лотов НЛМК по цене 120 рублей 30 копеек».

После этого Оливер попросит подтвердить заявку: «заявка на покупку 10 лотов НЛМК, тикер NLMK, по цене 120 рублей 30 копеек за акцию, сумма сделки 1203 рубля плюс комиссия брокера, для подтверждения скажите подтверждаю».

Если вы подтвержите намерение, то услышите «заявка на покупку 10 лотов НЛМК по цене 120 рублей 30 копеек создана».

[Видео](https://youtu.be/EjlN4JI23B0)

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

Чтобы узнать информацию об активных заявках, скажите: «мои заявки».
Expand Down
226 changes: 146 additions & 80 deletions composer.lock

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions phpunit.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
<testsuite name="handlers">
<file>tests/Reply/IntroductionTest.php</file>
<file>tests/Reply/RepeatTest.php</file>
<file>tests/Reply/LimitOrderBuyStockTest.php</file>
<file>tests/Reply/OrdersTest.php</file>
<file>tests/Reply/StocksTest.php</file>
<file>tests/Reply/MarketOrderBuyStockTest.php</file>
Expand All @@ -11,6 +12,7 @@
</testsuite>
<testsuite name="utils">
<file>tests/DeclensionTest.php</file>
<file>tests/PriceTest.php</file>
</testsuite>
</testsuites>
</phpunit>
2 changes: 2 additions & 0 deletions src/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use jamesRUS52\TinkoffInvest\TIClient;
use Oliver\Reply\ICanDo;
use Oliver\Reply\Introduction;
use Oliver\Reply\LimitOrderBuyStock;
use Oliver\Reply\Orders;
use Oliver\Reply\Repeat;
use Oliver\Reply\MarketOrderBuyStock;
Expand Down Expand Up @@ -72,6 +73,7 @@ public function run(): array
new Orders($this->client),
new MarketOrderBuyStock($this->client),
new MarketOrderSellStock($this->client),
new LimitOrderBuyStock($this->client),
];
foreach ($replies as $reply) {
$response = $reply->handle($this->event);
Expand Down
9 changes: 9 additions & 0 deletions src/InvalidPriceException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php

declare(strict_types=1);

namespace Oliver;

class InvalidPriceException extends \Exception
{
}
71 changes: 71 additions & 0 deletions src/Price.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
<?php

declare(strict_types=1);

namespace Oliver;

use Oliver\InvalidPriceException;

class Price
{
private string $currency;

public function __construct(string $currency = 'RUB')
{
$this->currency = $currency;
}

/**
* Переводит рубли и копейки в float.
* В случае некорректных данных выбрасывает исключение, например:
* 120 рублей 50 копеек - 120.5
* 120 рублей - 120.0
* 50 копеек - 0.5
* 0.5 копейки - 0.05
* 120 рублей 120 копеек - исключение
* 120 рублей 10 центов - исключение
* 50 копеек 120 рублей - исключение
* 120 лей - исключение
*
* @return float
* @throws Oliver\TIException
*/
public function concat(float $price1, string $currency1, float $price2 = 0.0, string $currency2 = '')
{
if ($price2 === 0.0 && $currency2 === '') {
// ожидаются рубли или копейки
if (in_array($currency1, ['рубль', 'рубля', 'рублей'])) {
// считать допустимым 120.5 рублей
if ($price1 > 0) {
return $price1;
} else {
throw new InvalidPriceException('не понимаю, похоже на отрицательную цену, используйте рубли и копейки, например сто рублей десять копеек.');
}
} elseif (in_array($currency1, ['копейка', 'копейки', 'копеек'])) {
// не может быть больше 99 копеек
if ($price1 > 0 && $price1 < 100.0) {
return $price1 * 0.01;
} else {
throw new InvalidPriceException('не понимаю цену, не доложно быть больше девяносто девяти копеек, например, сто рублей десять копеек.');
}
} else {
// @todo: rework
throw new InvalidPriceException('неправильная валюта, используйте рубли и копейки, например сто рублей десять копеек.');
}
} else {
if (
in_array($currency1, ['рубль', 'рубля', 'рублей']) &&
in_array($currency2, ['копейка', 'копейки', 'копеек'])
) {
if ($price2 > 0 && $price2 < 100.0) {
return intval($price1) + $price2 * 0.01;
} else {
throw new InvalidPriceException('не понимаю цену, не доложно быть больше девяносто девяти копеек, например, сто рублей десять копеек.');
}
} else {
throw new InvalidPriceException('не понимаю цену, сначала рубли затем копейки, например, сто рублей десять копеек.');
}
}
throw new InvalidPriceException('не понимаю цену, пример, сто рублей десять копеек.');
}
}
Loading