手把手教你使用币安(Binance)API交易-PHP
一、前言
什么是API
API接口是一些预先定义的函数,目的是提供给应用程序、开发人员基于某软件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。而交易所API就是其提供的交易行为程序接口,个人用户可以通过申请Key和secret获得操作账户的权限,实现程序化的交易操作,如查询、买卖、提现等。使用过imtoken和sosobtc操作云币账户的老韭菜们一定对其不陌生,现在的bigone也可以通过币观APP实现API交易,其本质都是用户提供Key和secret,第三方软件提供调用接口的工具。
但是其中的风险是不言而喻的,交出了Key和Secret相当于交出了账户的控制权,一方面第三方软件无法自证清白,在巨大的利益面前,情操和品德是很难保护你的账户安全。另一方面,就算平台没有作恶的意愿,也难保其因为技术漏洞、管理不善、黑客攻击等原因泄露了用户的API。这不是危言耸听,在百度、网易、大麦等互联网公司都发生过拖库事件。
特别是当账户里的资金量比较大,希望做一些程序化的交易策略时,第三方软件不仅不安全,其提供的操作灵活性也不可能满足需求。对于有一点点编程基础的同学可以自己写程序来实现API接口的调用,进而实现自己的量化交易、自动搬砖策略。
需要什么准备
量化交易的核心是交易策略,策略都是在我们脑海中,通过点击鼠标来执行。每个人都有不同的交易风格,本文的重点不是介绍交易策略,而是教会大家使用API接口,只需要很少的编程知识就可以一步步完成配置,在各种操作验证成功后,大家就可以自由发挥,将脑海中的交易策略落实成为程序化交易策略了。
编程语言:采用PHP,只要学过C语言即可看懂,语法简单,有编程基础的同学自学半小时即可看懂程序。操作系统:MacOS,链接上网络,最好可以翻墙,不解释。
二、MAC下配置PHP运行环境
Mac系统对于PHP运行非常友好,我们只需要进行简单的配置便可以开始进行使用,本篇文章将一步一步地介绍Apache、PHP的安装与配置,为开始进行开发铺好路。
基本命令
启动Apache服务:sudo apachectl start
查看apache服务版本:sudo apachectl -v
关闭Apache服务:sudo apachectl stop
重启Apache服务:sudo apachectl restart
修改默认工程路径
Apache服务部署路径在/资源库/WebServer/Documents/,我们的项目需要放置在该路径下。
但是本路径属于系统私有,修改文件、添加、删除都需要管理员权限,在开发过程中每次保存都需要输入密码,非常不方便。如果想要修改部署路径,可以在Apache服务默认安装路径/private/etc/apache2目录下找到并打开httpd.conf文件。但是/private/etc/apache2属于系统私有目录,我们不可直接在Finder中找到该路径,在终端中输入open /etc命令可以进入etc文件夹。
在打开httpd.conf文件后,搜索DocumentRoot并修改部署路径:
PHP的启动只需要在Apache服务中进行一下配置即可直接使用:首先,在/private/etc/apache2目录下找到并打开httpd.conf文件;其次,搜索#LoadModule php7_module libexec/apache2/libphp7.so,将前方的#删除。
检查配置是否成功
重启Apache服务,在设置好的配置路径下新建一个info.php测试程序试试效果:
<?php
phpinfo()
?>
最后在浏览器中输入网址http://localhost/info.php即可查看到PHP的信息
三、在币安申请API Keys
由于这方面的教程很多,申请步骤这里就不做详细的介绍了。
随便搜了个链接大家自己看 如何在BB8上关联币安网的API?
四、配置币安PHP API接口
登陆币安个人中心,点击API文档链接,会跳转到github上API说明文档和操作例程。
里面有各种语言的API调用例程,本次介绍的是使用php来调用API接口,因此打开php-binance-api文件夹,发现里面已经有些好的example,简直是太贴心了。
打开example.php,这是一个查询价格的例子。
?php
require '../vendor/autoload.php';
$api = new Binance\API("<api key>","<secret>");
这里用到了github上提供的类,因此在使用之前还需要安装composer,并生成autoload文件。
安装composer
Composer 是 PHP 的一个依赖管理工具。它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们。安装Composer的目的就是要安装币安在github上提供的代码库。对Composer有兴趣可以参考Composer网站:https://getcomposer.org,上面有详细的介绍和安装流程,当然也可以直接参考我下面介绍的步骤来安装和配置。
在MAC系统下可以直接通过终端命令来下载Composer:
curl -sS https://getcomposer.org/installer | php
执行完成后,你会发现在当前目录下多了一个文件composer.phar,在此目录下可以使用composer命令。但每次当你建立新目录时,你必須再复制一个副本到新目录中,这样比较麻烦。所以最佳做法是将它放到 usr/local/bin 目录中中,成为全域指令。
mv composer.phar /usr/local/bin/composer
你就可以直接在终端中使用composer命令了。
安装API代码库
Composer是一个依赖管理工具,默认情况下它不会在全局安装任何东西。Composer 是这样为你解决问题:
a) 你有一个项目依赖于若干个库。
b) 其中一些库依赖于其他库。
c) 你声明你所依赖的东西。
d) Composer 会找出哪个版本的包需要安装,并安装它们(将它们下载到你的项目中)。
描述项目依赖关系的文件就是composer.json,这个是需要根据具体的依赖关系手动创建的,并且需要符合一定的格式。有兴趣可以参考http://docs.phpcomposer.com/04-schema.html。不用担心,币安的github上已经为我们提供了composer.json文件,下载下来即可。
为了方便部署和管理,我们将composer.json下载到前面设置好的部署目录中,在终端输入命令:
composer require "jaggedsoft/php-binance-api @dev"
安装过程可能会有点长,耐心等待安装完成后会发现在此目录下多了composer.lock文件和vendor文件夹,前文中提到的autoload.php即在此目录下。在代码中加入require ‘vendor/autoload.php'就可以在代码中使用API接口类和函数了。
五、测试币安API接口
初次调用API接口
首先,新建php文件BinanceAPI.php,需要将自己的apikey和apisecret填入代码中:
$apikey='0h88ag0KoQMXXXXXXXXXXXXXXXXX';
$apisecret=‘c2ltK5G05t0KSmXXXXXXXXXXXXXXXXXXX’;
加载币安API库,如果vendor路径不在PHP部署路径下,需要根据实际情况进行调整。
require 'vendor/autoload.php';
$api = new Binance\API($apikey,$apisecret);
获取币种当前价格
挑选EOS进行显示
$ticker = $api->prices();
echo "Price of EOS: {$ticker['EOSBTC']} BTC.".PHP_EOL;
返回的数据格式为一维数组:
Array
(
[ETHBTC] => 0.05050800
[LTCBTC] => 0.00967400
[BNBBTC] => 0.00021479
[NEOBTC] => 0.00479300
。。。。。
)
在浏览器中输入http://localhost/BinanceAPI.php,运行输出的结果如下:
Price of EOS: 0.00079242 BTC.
查询个人当前持仓
//Get my balance
$balances = $api->balances($ticker);
print_r($ticker);
echo "Estimated Value: ".$api->btc_value." BTC".PHP_EOL;
返回的数据格式如下:
```
[QTUM] => Array (
[available] => 909.61000000
[onOrder] => 0.00000000
[btcValue] => 2.434015470
)
[BNB] => Array (
[available] => 181.94316876
[onOrder] => 0.00000000
[btcValue] => 0.17637426
)
... (more)
为了避免暴露资产,结果我就不贴了哈:)
查询当前币安可交易的币种数量
$arrlength=count($balances);
echo "Biance has ".$arrlength." different coin.";
运行输出结果为:
Biance has 151 different coin.
查询并打印出此仓金额大于0.01BTC的币种
foreach($balances as $coin => $value)
{
if($value['btcTotal']>0.01)
{
echo $coin.":";
echo "Available ".$value['available']."\t";
echo "BtcTotal ".$value['btcTotal']."";
}
}
其他的代码示例和返回的数据结构说明请参考github上的文档,通过API可以实现查询买卖价格、挂单交易(限价、市价、止盈止损)、提现等功能,这里就不一一示范了,README.md文档中均有说明。