Пример #1
0
 /**
  * @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;
 }