Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

React Event loop #105

Open
RCTORONTO opened this issue Aug 16, 2021 · 9 comments
Open

React Event loop #105

RCTORONTO opened this issue Aug 16, 2021 · 9 comments
Assignees
Labels
enhancement New feature or request

Comments

@RCTORONTO
Copy link

How would I go about using the websocketfeed to get

['topic' => '/market/ticker:XHV-USDT']
['topic' => '/market/ticker:XHV-USDT'],
['topic' => '/spotMarket/tradeOrders'],
['topic' => '/account/balance']

into a single event loop, is there any example that covers having these 4 items push, having one call to the api->subscribePrivateChannels seems to block the next...

@RCTORONTO
Copy link
Author

3 items, not 4

@hhxsv5
Copy link
Collaborator

hhxsv5 commented Aug 16, 2021

// Subscribe multiple channels
$channels = [
    ['topic' => '/market/ticker:XHV-USDT']
    ['topic' => '/market/ticker:XHV-USDT'],
    ['topic' => '/spotMarket/tradeOrders'],
    ['topic' => '/account/balance'],
];

@RCTORONTO
Copy link
Author

`<?php

require DIR . '/vendor/autoload.php';
use KuCoin\SDK\Auth;
use KuCoin\SDK\KuCoinApi;
use KuCoin\SDK\PrivateApi\WebSocketFeed;
use KuCoin\SDK\PrivateApi\Account;
use KuCoin\SDK\Exceptions\HttpException;
use KuCoin\SDK\Exceptions\BusinessException;
use KuCoin\SDK\PrivateApi\Order;
use KuCoin\SDK\PrivateApi\Fill;
use KuCoin\SDK\PublicApi\Symbol;

use Ratchet\Client\WebSocket;
use React\EventLoop\Factory;
use React\EventLoop\LoopInterface;

//KuCoinApi::setBaseUri('https://openapi-sandbox.kucoin.com');
$BOT=array();
$BOT['settings']=parse_ini_file("/etc/rc/ku-xhv.ini", true);
KuCoinApi::setDebugMode($BOT['settings']['debug']['enabled']);

// Logging in your code
KuCoinApi::setLogPath('/tmp');
KuCoinApi::setLogLevel(Monolog\Logger::DEBUG);

if($BOT['settings']['debug']['enabled']){KuCoinApi::getLogger()->debug("ku-xhv-ws-bot logging started...");}

require ( 'vendor/phpclasses/circular-buffer/CircularBuffer.phpclass' ) ;

$auth = null;
// Need to pass the Auth parameter when subscribing to a private channel($api->subscribePrivateChannel()).
// $auth = new Auth('key', 'secret', 'passphrase');
$auth = new Auth('xxx', 'xxx','xxxx', Auth::API_KEY_VERSION_V2);
$api = new WebSocketFeed($auth);
//$api_private = new WebSocketFeed($auth);
// store our bot details in 'BOT'
$BOT['orders']=array();
$BOT['xhv']=array();
$BOT['usdt']=array();
$BOT['xhv']['prices']=new CircularBuffer(100);
$BOT['settings']['firstrun']=true;
$BOT['yins']=array();
$BOT['yins']['count']=0;
$BOT['yangs']=array();
$BOT['yangs']['count']=0;
$BOT['bot_completed_orders']=0;
$BOT['xhv']['price']=null;

//$api_account = new Account($auth);
//$api_orders = new Order($auth);
//$api_symbol = new Symbol();
system("clear");
printf("BOT: ws xhv starting up...\n");sleep(1);
sleep(3);
// Use a custom event loop instance if you like
$BOT['currentprice_ts']=null;
$BOT['lastprice_ts']=null;
$loop = Factory::create();
$loop->addPeriodicTimer(1, function () {
// var_dump(date('Y-m-d H:i:s'));
global $BOT;
// xhv price is set by socketfeed

printf("%s %.3f\n",date("m/d H:i:s",time()),$BOT['xhv']['price']);
if($BOT['settings']['firstrun']){$BOT['settings']['firstrun']=false;}

});
$api->setLoop($loop);
$query = ['connectId' => uniqid('', true)];
$channels = [
['topic' => '/market/ticker:XHV-USDT'],
['topic' => '/spotMarket/tradeOrders'],
['topic' => '/account/balance']
];
/*
$api_private->subscribePrivateChannels($query, $channels, function (array $message, WebSocket $ws, LoopInterface $loop) use ($api_private) {
global $BOT;
printf(var_dump($message));
// Unsubscribe the channel
// $ws->send(json_encode($api->createUnsubscribeMessage('/market/ticker:ETH-BTC')));

// Stop loop
// $loop->stop();

}, function ($code, $reason) {
echo "OnClose: {$code} {$reason}\n";
});
*/
$api->subscribePublicChannels($query, $channels, function (array $message, WebSocket $ws, LoopInterface $loop) use ($api) {
global $BOT;
$BOT['xhv']['price']=$message['data']['price'];
printf(var_dump($message));
// Unsubscribe the channel
// $ws->send(json_encode($api->createUnsubscribeMessage('/market/ticker:ETH-BTC')));

// Stop loop
//$loop->stop();

}, function ($code, $reason) {
echo "OnClose: {$code} {$reason}\n";
});

?>`

gets the price, I never see any order updates or account info messages

@RCTORONTO
Copy link
Author

I can access the api in the full version of the script just fine for my account in the synchronous version

@RCTORONTO
Copy link
Author

RCTORONTO commented Aug 16, 2021

be great to have a barebones example that works with the private feed

EDIT: I cant seem to figure out how to connect to the Private Channels websocket feed altogether (I only ever get the public channel subscription symbol ticker updates)

"The recommended way is to just create a websocket connection and subscribe to multiple channels." .... yes I'd love to, how?

@RCTORONTO
Copy link
Author

`<?php
require DIR . '/vendor/autoload.php';
use KuCoin\SDK\Auth;
use KuCoin\SDK\KuCoinApi;
use KuCoin\SDK\PrivateApi\WebSocketFeed;

use KuCoin\SDK\Exceptions\HttpException;
use KuCoin\SDK\Exceptions\BusinessException;

use Ratchet\Client\WebSocket;
use React\EventLoop\Factory;
use React\EventLoop\LoopInterface;
use KuCoin\SDK\Http\SwooleHttp;
use Swoole\Runtime;
Swoole\Runtime::enableCoroutine(SWOOLE_HOOK_SLEEP);
//Swoole\Runtime::enableCoroutine();
require('vendor/phpclasses/circular-buffer/CircularBuffer.phpclass');

//KuCoinApi::setBaseUri('https://openapi-sandbox.kucoin.com');

$BOT=array();
$BOT['settings']=parse_ini_file("/etc/rc/ku-xhv-ws.ini", true);

KuCoinApi::setDebugMode($BOT['settings']['debug']['enabled']);
KuCoinApi::setLogPath('/mnt/BACKUP');
KuCoinApi::setLogLevel(Monolog\Logger::DEBUG);
if($BOT['settings']['debug']['enabled']){KuCoinApi::getLogger()->debug("ku-xhv-ws-bot logging started...");}

$auth = null;
$auth = new Auth('xxx', 'xxx','xxx', Auth::API_KEY_VERSION_V2);

$api = new WebSocketFeed($auth);
//$api_private = new WebSocketFeed($auth);

$BOT['orders']=array();
$BOT['xhv']=array();
$BOT['usdt']=array();
$BOT['settings']['firstrun']=true;
$BOT['xhv']['price']=null;
system("clear");
$loop = Factory::create();
$loop->addPeriodicTimer(1, function () {
// var_dump(date('Y-m-d H:i:s'));
global $BOT;
// xhv price is set by socketfeed
printf("%s %.3f\n",date("m/d H:i:s",time()),$BOT['xhv']['price']);
if($BOT['settings']['firstrun']){$BOT['settings']['firstrun']=false;}

});

//$api->setLoop($loop);

//$query_private = ['connectId' => uniqid('', true)];
$query = ['connectId' => uniqid('', true)];

$channels = [
['topic' => '/market/ticker:XHV-USDT'],
];
$pchannels = [
['topic' => '/spotMarket/tradeOrders'],
['topic' => '/account/balance'],
];

$api->setLoop($loop);
//$api_private->setLoop($loop);
go(function() use ($api, $query, $pchannels) {
$api->subscribePrivateChannels($query, $pchannels, function (array $message, WebSocket $ws, LoopInterface $loop) use ($api) {
global $BOT;
printf(var_dump($message));
if($BOT['settings']['debug']['enabled']){KuCoinApi::getLogger()->debug("got a private message?");}
// never see that message
}, function ($code, $reason) {
echo "OnClose: {$code} {$reason}\n";
});
});
printf("\n\nPrivate running??\n\n"); // see that message
go(function() use ($api, $query, $channels) {
$api->subscribePublicChannels($query, $channels, function (array $message, WebSocket $ws, LoopInterface $loop) use ($api) {
global $BOT;
$BOT['xhv']['price']=$message['data']['price'];
printf(var_dump($message));
if($BOT['settings']['debug']['enabled']){KuCoinApi::getLogger()->debug("got a public message?");}
// only works when called before the subscribePrivateChannels
}, function ($code, $reason) {
echo "OnClose: {$code} {$reason}\n";
});
});

printf("\n\nPublic running??\n\n"); // never see that message

?>
`
No dice... I see ticker messages, two sets of pings and pongs, but no account balance or orders messages from the private subscribe

@RCTORONTO
Copy link
Author

commenting $loop->run(); in Private websocket subscribe channels solved my concurrency issue... still not getting any balance or orders messages, I do see welcome, ping and pong for both the connections (private - to get my details & public - to get the currency prices etc)

@RCTORONTO
Copy link
Author

$query_pri = ['connectId' => uniqid('', true),'privateChannel'=>true,'response'=>true];

was needed, wasn't obvious because there's no example demonstrating privateChannel subscription

@makopov
Copy link

makopov commented Sep 8, 2022

Can you paste where you put $loop->run();? I'm running into a similar issue I believe... I'm not even sure I understand what a loop is for.

@ISAAC-XXYYZZ ISAAC-XXYYZZ self-assigned this Aug 15, 2024
@ISAAC-XXYYZZ ISAAC-XXYYZZ added the enhancement New feature or request label Aug 15, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

4 participants