PHP условный цикл для выполнения операций, таких как механизм сопоставления заказов - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь построить фиктивный обмен активами в PHP.Для данного актива, XYZ, ниже находится книга заказов:

| buy_price | amount | sell_price | amount |
|-----------|--------|------------|--------|
|  99.3     |  100   |  99.6      |  110   |
|  99.2     |  150   |  99.7      |  170   |
|  99.1     |  125   |  99.8      |  200   |

Теперь, если пользователь размещает ордер на покупку 400 единиц по рыночной цене , ордера будут выполняться следующим образом:

110 units filled at 99.6
170 units filled at 99.7
120 units filled at 99.8

Как я могу условно выполнить циклы открытых ордеров на продажу, чтобы заказ на покупку 400 единиц заполнялся по разным существующим ценам ордеров на продажу в книге заявок?Я также хотел бы хранить массивы выполненных сделок, например:

$trade1 = ["amount" => 110, "price" => 99.6]
$trade2 = ["amount" => 170, "price" => 99.7]
$trade3 = ["amount" => 120, "price" => 99.8]

1 Ответ

0 голосов
/ 19 сентября 2018

Вам действительно нужно следить за тем, сколько вы зачислили на ордер на покупку при прохождении цикла.Тогда вместо того, что вы показываете как «Я также хотел бы хранить выполненные массивы сделок как», вы используете один многомерный массив вместо нескольких массивов.

// mock of ordered result from DB
$sellOrders = array(
    array("sell_price" => 99.6, "amount" => 110),
    array("sell_price" => 99.7, "amount" => 170),
    array("sell_price" => 99.8, "amount" => 200),
);

// this is where we keep track of total bought/sold
$purchasedCount = 0;
// this is the buy order count
$orderCount = 400;
// this is our result summary of the trades executed
$trades = array();

foreach($sellOrders as $sell)
{
    $thisPurchase = 0;
    if($orderCount - $purchasedCount >= $sell['amount'])
    {
        $thisPurchase = $sell['amount'];
        $purchasedCount += $sell['amount'];
    }
    else
    {
        $thisPurchase = $orderCount - $purchasedCount;
        $purchasedCount = $orderCount;
    }

    $trades[] = array("amount" => $thisPurchase, "price" => $sell['sell_price']);

    if($purchasedCount == $orderCount)
    {
        break;
    }
}

var_dump($trades);

DEMO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...