作者 karlet

feat:监听币安k线数据

@@ -155,9 +155,18 @@ class CmBroker @@ -155,9 +155,18 @@ class CmBroker
155 } 155 }
156 public function klineListen($symbol, $peroid, $onData) 156 public function klineListen($symbol, $peroid, $onData)
157 { 157 {
  158 + if ($this->plat == self::PLAT_BINANCE && $peroid == '1s') {
  159 + $this->msg("币安不支持1sk线", $symbol, $peroid);
  160 + return;
  161 + }
158 $symbol = $this->getSymbolOri($symbol, $this->plat); 162 $symbol = $this->getSymbolOri($symbol, $this->plat);
159 $this->exBroker->klineListen($symbol, $peroid, function ($data) use ($onData) { 163 $this->exBroker->klineListen($symbol, $peroid, function ($data) use ($onData) {
160 - $kline = Kline::transferOkx($data); 164 + if ($this->plat == self::PLAT_BINANCE) {
  165 + $kline = Kline::transferBinance($data);
  166 + }
  167 + if ($this->plat == self::PLAT_OKX) {
  168 + $kline = Kline::transferOkx($data);
  169 + }
161 $onData($kline); 170 $onData($kline);
162 }); 171 });
163 } 172 }
@@ -57,6 +57,24 @@ class ExBroker @@ -57,6 +57,24 @@ class ExBroker
57 ); 57 );
58 } 58 }
59 59
  60 + public function klineListen($symbol, $interval, callable $onData) {
  61 + $this->wsKline = new Websocket($this->host. $this->path);
  62 + $this->wsKline->connect(
  63 + $onOpen = function () use ($symbol, $interval) {
  64 + $subData = json_encode(['method' => 'SUBSCRIBE', 'params' => [$symbol. '@kline_'. $interval], 'id' => 1]);
  65 + $this->wsKline->push($subData);
  66 + },
  67 + $onMessage = function ($data) use ($onData) {
  68 + $data = json_decode($data, true);
  69 + if (!$data) {
  70 + return;
  71 + }
  72 + $onData($data);
  73 + },
  74 + $onClose = null,
  75 + );
  76 + }
  77 +
60 private function getListenKey() 78 private function getListenKey()
61 { 79 {
62 $res = $this->api->getListenKey([]); 80 $res = $this->api->getListenKey([]);
@@ -50,4 +50,16 @@ class Kline @@ -50,4 +50,16 @@ class Kline
50 } 50 }
51 return new Kline($time, $open, $high, $low, $close, $vol, $volQuote); 51 return new Kline($time, $open, $high, $low, $close, $vol, $volQuote);
52 } 52 }
  53 + public static function transferBinance($data)
  54 + {
  55 + $kline = $data['k'];
  56 + $time = $kline['t'];
  57 + $open = $kline['o'];
  58 + $high = $kline['h'];
  59 + $low = $kline['l'];
  60 + $close = $kline['c'];
  61 + $vol = $kline['v'];
  62 + $volQuote = $kline['q'];
  63 + return new Kline($time, $open, $high, $low, $close, $vol, $volQuote);
  64 + }
53 } 65 }