作者 karlet

feat:币安下单完成

@@ -196,12 +196,12 @@ class CmBroker @@ -196,12 +196,12 @@ class CmBroker
196 196
197 public function placeOrder(Order $order) 197 public function placeOrder(Order $order)
198 { 198 {
  199 + /** @var SymbolInfo $symbolInfo */
  200 + $symbolInfo = $this->symbolInfos[$order->symbol];
199 if ($this->plat == self::PLAT_OKX) { 201 if ($this->plat == self::PLAT_OKX) {
200 $orderOri = $order->toOkxOrder($this->symbolInfos, function ($symbol) { 202 $orderOri = $order->toOkxOrder($this->symbolInfos, function ($symbol) {
201 return $this->getSymbolOri($symbol, $this->plat); 203 return $this->getSymbolOri($symbol, $this->plat);
202 }); 204 });
203 - /** @var SymbolInfo $symbolInfo */  
204 - $symbolInfo = $this->symbolInfos[$order->symbol];  
205 $this->msg("下单", $orderOri); 205 $this->msg("下单", $orderOri);
206 if ($orderOri['sz'] == 0) { 206 if ($orderOri['sz'] == 0) {
207 $msg = "当前下单数量为{$order->qty},最小下单数量为{$symbolInfo->minQty},不下单"; 207 $msg = "当前下单数量为{$order->qty},最小下单数量为{$symbolInfo->minQty},不下单";
@@ -212,6 +212,20 @@ class CmBroker @@ -212,6 +212,20 @@ class CmBroker
212 $this->msg("下单结果", $res); 212 $this->msg("下单结果", $res);
213 return $res; 213 return $res;
214 } 214 }
  215 + if ($this->plat == self::PLAT_BINANCE) {
  216 + $orderOri = $order->toBinanceOrder($this->symbolInfos, function ($symbol) {
  217 + return $this->getSymbolOri($symbol, $this->plat);
  218 + });
  219 + $this->msg("下单", $orderOri);
  220 + if ($orderOri['quantity'] == 0) {
  221 + $msg = "当前下单数量为{$order->qty},最小下单数量为{$symbolInfo->minQty},不下单";
  222 + $this->msg($msg, $orderOri);
  223 + return ["code" => 2, "msg" => $msg];
  224 + }
  225 + $res = $this->exBroker->placeOrder($orderOri);
  226 + $this->msg("下单结果", $res);
  227 + return $res;
  228 + }
215 } 229 }
216 230
217 public function msg() 231 public function msg()
@@ -60,6 +60,13 @@ class Api @@ -60,6 +60,13 @@ class Api
60 $method = "GET"; 60 $method = "GET";
61 return $this->request($method, $url, $params, $this->apiInfo); 61 return $this->request($method, $url, $params, $this->apiInfo);
62 } 62 }
  63 + //下单
  64 + public function placeOrder($params)
  65 + {
  66 + $url = "/fapi/v1/order";
  67 + $method = "POST";
  68 + return $this->request($method, $url, $params, $this->apiInfo);
  69 + }
63 70
64 //------------------------------------ 71 //------------------------------------
65 72
@@ -125,4 +125,8 @@ class ExBroker @@ -125,4 +125,8 @@ class ExBroker
125 } 125 }
126 return $res['symbols']; 126 return $res['symbols'];
127 } 127 }
  128 + public function placeOrder(array $params)
  129 + {
  130 + return $this->api->placeOrder($params);
  131 + }
128 } 132 }
@@ -73,4 +73,33 @@ class Order @@ -73,4 +73,33 @@ class Order
73 } 73 }
74 return $order; 74 return $order;
75 } 75 }
  76 + function toBinanceOrder(array $symbolInfos, callable $toSymbolOri)
  77 + {
  78 + $symbol = call_user_func($toSymbolOri, $this->symbol);
  79 + /** @var SymbolInfo $symbolInfo */
  80 + $symbolInfo = $symbolInfos[$this->symbol];
  81 + $ordType = $this->ordType;
  82 + $timeInForce = "GTC";
  83 + if ($this->ordType == "IOC" || $this->ordType == "FOK") {
  84 + $ordType = "LIMIT";
  85 + $timeInForce = $this->ordType;
  86 + }
  87 + $order = [
  88 + 'symbol' => $symbol,
  89 + 'positionSide' => $this->posSide,
  90 + 'side' => $this->side,
  91 + 'type' => $ordType,
  92 + 'timeInForce' => $timeInForce,
  93 + 'quantity' => round($this->qty, $symbolInfo->qtyPrec),
  94 + 'price' => round($this->price, $symbolInfo->pricePrec),
  95 + ];
  96 + if ($ordType == "MARKET") {
  97 + unset($order['price']);
  98 + unset($order['timeInForce']);
  99 + }
  100 + if ($this->cliOrdId != "") {
  101 + $order['newClientOrderId'] = $this->cliOrdId;
  102 + }
  103 + return $order;
  104 + }
76 } 105 }