ExBroker.php 4.3 KB
<?php

namespace trader\exchange\binance;

require_once __DIR__ . '/../../struct/ApiInfo.php';
require_once __DIR__ . '/Api.php';
require_once __DIR__ . '/../../../jytools/Websocket.php';
require_once __DIR__ . '/../../../jytools/func.php';

use trader\struct\ApiInfo;
use trader\exchange\binance\Api as BnApi;
use jytools\Websocket;
use function jytools\output;

class ExBroker
{
    private $host = 'wss://fstream.binance.com';
    private $path = '/stream';
    private ApiInfo $apiInfo;
    private BnApi $api;
    private ?Websocket $wsAcc;
    private ?Websocket $wsKline;

    public function __construct(ApiInfo $apiInfo)
    {
        $this->apiInfo = $apiInfo;
        $this->api = new BnApi($apiInfo);
    }

    public function setWsHost($host)
    {
        $this->host = $host;
    }

    public function setRestHost($host)
    {
        $this->api->setHost($host);
    }

    public function accListen(callable $onData)
    {
        $listeneKey = $this->getListenKey();
        $this->wsAcc = new Websocket($this->host . $this->path);
        $this->wsAcc->connect(
            $onOpen = function () use ($listeneKey) {
                $subData = json_encode(['method' => 'SUBSCRIBE', 'params' => [$listeneKey], 'id' => 1]);
                $this->wsAcc->push($subData);
            },
            $onMessage = function ($data) use ($onData) {
                $data = json_decode($data, true);
                if (!$data) {
                    return;
                }
                $onData($data);
            },
            $onClose = null,
        );
    }

    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' => [strtolower($symbol) . '@kline_' . $interval], 'id' => 1]);
                var_dump($subData);
                $this->wsKline->push($subData);
            },
            $onMessage = function ($data) use ($onData) {
                $data = json_decode($data, true);
                if (!$data || !isset($data['data'])) {
                    return;
                }
                $onData($data['data']);
            },
            $onClose = null,
        );
    }

    private function getListenKey()
    {
        $res = $this->api->getListenKey([]);
        return $res['listenKey'];
    }
    //获取所有品种资金费率
    public function getAllPremium()
    {
        $res = $this->api->getPremiumIndex([]);
    }
    //设置双向持仓模式
    public function setLongShortMode($isLongShortMode)
    {
        if ($isLongShortMode) {
            $res = $this->api->setPositionMode(['dualSidePosition' => 'true']);
        } else {
            $res = $this->api->setPositionMode(['dualSidePosition' => 'false']);
        }
        return $res;
    }
    //获取所有账户杠杆
    public function getAllLevers()
    {
        $res = $this->api->getPositionRiskV2([]);
        $retArr = [];
        foreach ($res as $v) {
            $retArr[$v['symbol']] = $v['leverage'];
        }
        return $retArr;
    }
    public function stopListen()
    {
        if (isset($this->wsAcc)) {
            $this->wsAcc->close();
        }
        if (isset($this->wsKline)) {
            $this->wsKline->close();
        }
    }
    public function getSymbolInfos()
    {
        $res = $this->api->getExchangeInfo([]);
        if (!isset($res['symbols'])) {
            output('okx获取所有交易对信息失败');
            return [];
        }
        return $res['symbols'];
    }
    public function placeOrder(array $params)
    {
        return $this->api->placeOrder($params);
    }
    public function setLever($symbol, $lever)
    {
        return $this->api->setLever(['symbol' => $symbol, 'leverage' => $lever]);
    }
    public function getAllPos()
    {
        $newPositions = [];
        $res = $this->api->accountV3([]);
        if ($res && isset($res['positions'])) {
            $positions = $res['positions'];
            foreach ($positions as $key => $value) {
                if ($value['positionAmt'] != 0) {
                    $newPositions[] = $value;
                }
            }
        } else {
            output($res);
        }
        return $newPositions;
    }
}