作者 karlet

feat:监听币安k线数据

... ... @@ -155,9 +155,18 @@ class CmBroker
}
public function klineListen($symbol, $peroid, $onData)
{
if ($this->plat == self::PLAT_BINANCE && $peroid == '1s') {
$this->msg("币安不支持1sk线", $symbol, $peroid);
return;
}
$symbol = $this->getSymbolOri($symbol, $this->plat);
$this->exBroker->klineListen($symbol, $peroid, function ($data) use ($onData) {
$kline = Kline::transferOkx($data);
if ($this->plat == self::PLAT_BINANCE) {
$kline = Kline::transferBinance($data);
}
if ($this->plat == self::PLAT_OKX) {
$kline = Kline::transferOkx($data);
}
$onData($kline);
});
}
... ...
... ... @@ -57,6 +57,24 @@ class ExBroker
);
}
public function klineListen($symbol, $interval, callable $onData) {
$this->wsKline = new Websocket($this->host. $this->path);
$this->wsKline->connect(
$onOpen = function () use ($symbol, $interval) {
$subData = json_encode(['method' => 'SUBSCRIBE', 'params' => [$symbol. '@kline_'. $interval], 'id' => 1]);
$this->wsKline->push($subData);
},
$onMessage = function ($data) use ($onData) {
$data = json_decode($data, true);
if (!$data) {
return;
}
$onData($data);
},
$onClose = null,
);
}
private function getListenKey()
{
$res = $this->api->getListenKey([]);
... ...
... ... @@ -50,4 +50,16 @@ class Kline
}
return new Kline($time, $open, $high, $low, $close, $vol, $volQuote);
}
public static function transferBinance($data)
{
$kline = $data['k'];
$time = $kline['t'];
$open = $kline['o'];
$high = $kline['h'];
$low = $kline['l'];
$close = $kline['c'];
$vol = $kline['v'];
$volQuote = $kline['q'];
return new Kline($time, $open, $high, $low, $close, $vol, $volQuote);
}
}
... ...