Skip to content

Commit

Permalink
Fixed depthCache, trades, chart functions with multiple symbols
Browse files Browse the repository at this point in the history
  • Loading branch information
Jon Eyrick committed Dec 21, 2017
1 parent 57610d5 commit b43ec76
Showing 1 changed file with 37 additions and 16 deletions.
53 changes: 37 additions & 16 deletions php-binance-api.php
Original file line number Diff line number Diff line change
Expand Up @@ -420,66 +420,83 @@ private function depthData($symbol, $json) {
// Maintains a local Depth Cache in sync via lastUpdateId. See depth() and depthHandler()
public function depthCache($symbols, $callback) {
if ( !is_array($symbols) ) $symbols = [$symbols];
$loop = \React\EventLoop\Factory::create();
$react = new \React\Socket\Connector($loop);
$connector = new \Ratchet\Client\Connector($loop, $react);
foreach ( $symbols as $symbol ) {
if ( !isset($this->info[$symbol]) ) $this->info[$symbol] = [];
$this->info[$symbol]['depthCallback'] = $callback;
if ( !isset($this->depthQueue[$symbol]) ) $this->depthQueue[$symbol] = [];
if ( !isset($this->depthCache[$symbol]) ) $this->depthCache[$symbol] = ["bids" => [], "asks" => []];
$this->info[$symbol]['firstUpdate'] = 0;
\Ratchet\Client\connect('wss://stream.binance.com:9443/ws/'.strtolower($symbol).'@depth')->then(function($ws) {
$ws->on('message', function($data) use($ws) {
$connector('wss://stream.binance.com:9443/ws/'.strtolower($symbol).'@depth')->then(function($ws) use($callback) {
$ws->on('message', function($data) use($ws, $callback) {
$json = json_decode($data, true);
$symbol = $json['s'];
if ( $this->info[$symbol]['firstUpdate'] == 0 ) {
$this->depthQueue[$symbol][] = $json;
return;
}
$this->depthHandler($json);
$this->info[$symbol]['depthCallback']($this, $symbol, $this->depthCache[$symbol]);
//$this->info[$symbol]['depthCallback']($this, $symbol, $this->depthCache[$symbol]);
call_user_func($callback, $this, $symbol, $this->depthCache($symbol));
});
$ws->on('close', function($code = null, $reason = null) {
echo "depthCache({$symbol}) WebSocket Connection closed! ({$code} - {$reason})".PHP_EOL;
});
}, function($e) {
}, function($e) use($loop) {
echo "depthCache({$symbol})) Could not connect: {$e->getMessage()}".PHP_EOL;
$loop->stop();
});
$this->depth($symbol);
foreach ( $this->depthQueue[$symbol] as $data ) {
$this->depthHandler($json);
}
$this->depthQueue[$symbol] = [];
$callback($this, $symbol, $this->depthCache[$symbol]);
call_user_func($callback, $this, $symbol, $this->depthCache[$symbol]);
}
$loop->run();
}

// Trades WebSocket Endpoint
public function trades($symbols, $callback) {
if ( !is_array($symbols) ) $symbols = [$symbol];
$loop = \React\EventLoop\Factory::create();
$react = new \React\Socket\Connector($loop);
$connector = new \Ratchet\Client\Connector($loop, $react);
foreach ( $symbols as $symbol ) {
if ( !isset($this->info[$symbol]) ) $this->info[$symbol] = [];
$this->info[$symbol]['tradesCallback'] = $callback;
\Ratchet\Client\connect('wss://stream.binance.com:9443/ws/'.strtolower($symbol).'@aggTrade')->then(function($ws) {
$ws->on('message', function($data) use($ws) {
//$this->info[$symbol]['tradesCallback'] = $callback;
$connector('wss://stream.binance.com:9443/ws/'.strtolower($symbol).'@aggTrade')->then(function($ws) use($callback) {
$ws->on('message', function($data) use($ws, $callback) {
$json = json_decode($data, true);
$symbol = $json['s'];
$price = $json['p'];
$quantity = $json['q'];
$timestamp = $json['T'];
$maker = $json['m'] ? 'true' : 'false';
$trades = ["price"=>$price, "quantity"=>$quantity, "timestamp"=>$timestamp, "maker"=>$maker];
$this->info[$symbol]['tradesCallback']($this, $symbol, $trades);
//$this->info[$symbol]['tradesCallback']($this, $symbol, $trades);
call_user_func($callback, $this, $symbol, $trades);
});
$ws->on('close', function($code = null, $reason = null) {
echo "trades({$symbol}) WebSocket Connection closed! ({$code} - {$reason})".PHP_EOL;
});
}, function($e) {
}, function($e) use($loop) {
echo "trades({$symbol}) Could not connect: {$e->getMessage()}".PHP_EOL;
$loop->stop();
});
}
$loop->run();
}


// Pulls /kline data and subscribes to @klines WebSocket endpoint
public function chart($symbols, $interval = "30m", $callback) {
if ( !is_array($symbols) ) $symbols = [$symbol];
$loop = \React\EventLoop\Factory::create();
$react = new \React\Socket\Connector($loop);
$connector = new \Ratchet\Client\Connector($loop, $react);
foreach ( $symbols as $symbol ) {
if ( !isset($this->charts[$symbol]) ) $this->charts[$symbol] = [];
$this->charts[$symbol][$interval] = [];
Expand All @@ -488,29 +505,33 @@ public function chart($symbols, $interval = "30m", $callback) {
if ( !isset($this->chartQueue[$symbol]) ) $this->chartQueue[$symbol] = [];
$this->chartQueue[$symbol][$interval] = [];
$this->info[$symbol][$interval]['firstOpen'] = 0;
$this->info[$symbol]['chartCallback'.$interval] = $callback;
\Ratchet\Client\connect('wss://stream.binance.com:9443/ws/'.strtolower($symbol).'@kline_'.$interval)->then(function($ws) {
$ws->on('message', function($data) use($ws) {
//$this->info[$symbol]['chartCallback'.$interval] = $callback;
$connector('wss://stream.binance.com:9443/ws/'.strtolower($symbol).'@kline_'.$interval)->then(function($ws) use($callback) {
$ws->on('message', function($data) use($ws, $callback) {
$json = json_decode($data);
$chart = $json->k;
$symbol = $json->s;
$interval = $chart->i;
$this->chartHandler($symbol, $interval, $json);
$this->info[$symbol]['chartCallback'.$interval]($this, $symbol, $this->charts[$symbol][$interval]);
//$this->info[$symbol]['chartCallback'.$interval]($this, $symbol, $this->charts[$symbol][$interval]);
call_user_func($callback, $this, $symbol, $this->charts[$symbol][$interval]);
});
$ws->on('close', function($code = null, $reason = null) {
echo "chart({$symbol},{$interval}) WebSocket Connection closed! ({$code} - {$reason})".PHP_EOL;
});
}, function($e) {
}, function($e) use($loop) {
echo "chart({$symbol},{$interval})) Could not connect: {$e->getMessage()}".PHP_EOL;
$loop->stop();
});
$this->candlesticks($symbol, $interval);
foreach ( $this->chartQueue[$symbol][$interval] as $json ) {
$this->chartHandler($symbol, $interval, $json);
}
$this->chartQueue[$symbol][$interval] = [];
$this->info[$symbol]['chartCallback'.$interval]($this, $symbol, $this->charts[$symbol][$interval]);
//$this->info[$symbol]['chartCallback'.$interval]($this, $symbol, $this->charts[$symbol][$interval]);
call_user_func($callback, $this, $symbol, $this->charts[$symbol][$interval]);
}
$loop->run();
}

// Keep-alive function for userDataStream
Expand Down

0 comments on commit b43ec76

Please sign in to comment.