Skip to content

Commit

Permalink
Лимитная заявка
Browse files Browse the repository at this point in the history
  • Loading branch information
denismosolov committed Jun 26, 2020
1 parent 01d139d commit 9f7a225
Show file tree
Hide file tree
Showing 10 changed files with 1,028 additions and 80 deletions.
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

0 comments on commit 9f7a225

Please sign in to comment.