/** * @desc 生成出可以执行的交易,理论上在一次交易判断中同一个账号最多只能创建一个订单 */ private function generateTrade() { $available_accounts = $this->accounts; // 满足多市场组合算法 $trades = array(); while (count($available_accounts) > 0) { // 从账号组总弹出一个账号 $account1 = array_shift($available_accounts); // 循环剩下的账号与其匹配 foreach ($available_accounts as $account2) { foreach ($account1->actions as $action) { // 第一个账号可以卖同时第二个市场也可以买 if ($action === 'sell' && in_array('buy', $account2->actions)) { $orders = array(new OrderModel($account1, 'sell', $account1->price['buy'], $this->config->trans_unit), new OrderModel($account2, 'buy', $account2->price['sell'], $this->config->trans_unit)); $trade = new TradeModel($orders); Logger::Log('Generate 1 trade: ' . $trade->__toString()); $trades[] = $trade; } // 第一个账号可以买同时第二个市场也可以卖 if ($action === 'buy' && in_array('sell', $account2->actions)) { $orders = array(new OrderModel($account2, 'sell', $account2->price['buy'], $this->config->trans_unit), new OrderModel($account1, 'buy', $account1->price['sell'], $this->config->trans_unit)); $trade = new TradeModel($orders); Logger::Log('Generate 1 trade: ' . $trade->__toString()); $trades[] = $trade; } } } } // sort trade for ($i = 0; $i < count($trades); ++$i) { for ($j = 0; $j < $i; ++$j) { if ($trades[$j]->getSpread() < $trades[$j + 1]->getSpread()) { $temp = $trades[$j]; $trades[$j] = $trades[$j + 1]; $trades[$j + 1] = $temp; } } } return $trades; }