PHP 高效的开发量化交易程序,不输 go c++ python

前言

这个SDK是我们团队的成果,现在开源它,让php做虚拟货币量化交易这块更为简单,目前已经大量运用在我们的项目上,效果良好,在请求时间上与 go c++ python相差不大,因为主要网络IO问题。 当然硬件资源的利用率静态语言肯定比动态强很多。中前期用PHP来开发(就算后期也木有压力),后期用静态语言分离模块做微服务化,与PHP结合非常强悍,目前我们正在用GO开始做部分分离了。

这SDK集合了目前交易量最大的几个交易所的API,让开发人员只关注业务层。它目前只是简单的支持买卖、查询、账号余额与仓位等,后期作者会集合更多的API。如果你有特殊的需求你可以单独通过该方法getPlatform()返回实例,调用底层API。

这SDK支持统一参数,也支持原生参数。建议使用者使用统一参数,有特殊需求可以使用原生参数。
所有提交参数与返回参数只要第一个字符为下划线的“_”全部为自定义参数。
很多接口还未完善,使用者可以根据我的设计方案继续扩展,欢迎与我一起改进它。

其他交易所API

Bitmex More Tests

Okex More Tests

Huobi More Tests

Binance More Tests

Exchanges More Tests是以上所有交易所集合成的SDK

安装方式

composer require linwj/exchanges:dev-master

如果安装中出问题composer.json 添加 "minimum-stability":"dev"

交易所初始化

$exchanges=new Exchanges('binance',$key,$secret);
$exchanges=new Exchanges('bitmex',$key,$secret);
$exchanges=new Exchanges('okex',$key,$secret,$passphrase,$host);
$exchanges=new Exchanges('huobi',$key,$secret,$account_id,$host);

火币获取$account_id方式

统一参数返回

/**
 * Buy()   Sell()   Show() 三个方法都返回相同参数
 * @return [
 *      ***返回原始数据
 *      ...
 *      ...
 *      ***返回自定义数据,带'_'下划线的是统一返回参数格式。
 *      _status=>NEW 进行中   PART_FILLED 部分成交   FILLED 完全成交  CANCELING:撤销中   CANCELLED 已撤销   FAILURE 下单失败
 *      _filled_qty=>已交易完成数量
 *      _price_avg=>平均交易价格
 *      _order_id=>系统ID
 *      _client_id=>自定义ID
 * ]
 *
 * */

 /**
 * 系统错误
 * http request code 400 403 500 503
 * @return [
 *      _error=>[
 *          ***返回原始数据
 *          ...
 *          ...
 *          ***返回自定义数据,带'_'下划线的是统一返回参数格式。
 *          _method => POST
 *          _url => https://testnet.bitmex.com/api/v1/order
 *          _httpcode => 400
 *      ]
 * ]
 * */

买卖查询统一参数返回 详情

系统错误统一参数返回
binance
okex
huobi
bitmex

支持本地开发代理设置 More

//如果您正在本地开发需要代理,您可以这样设置
$exchanges->setProxy();

//更灵活的代理设置
$exchanges->setProxy([
    'http'  => 'http://127.0.0.1:12333',
    'https' => 'http://127.0.0.1:12333',
]);

现货交易

市价交易
//binance
$exchanges->trader()->buy([
    '_symbol'=>'BTCUSDT',
    '_number'=>'0.01',
]);
//支持原生参数
$exchanges->trader()->buy([
    'symbol'=>'BTCUSDT',
    'type'=>'MARKET',
    'quantity'=>'0.01',
]);

//okex
$exchanges->trader()->buy([
    '_symbol'=>'BTC-USDT',
    '_price'=>'10',
]);
//支持原生参数
$exchanges->trader()->buy([
    'instrument_id'=>'btc-usdt',
    'type'=>'market',
    'notional'=>'10'
]);

//huobi
$exchanges->trader()->buy([
    '_symbol'=>'btcusdt',
    '_price'=>'10',
]);
//支持原生参数
$exchanges->trader()->buy([
    'account-id'=>$account_id,
    'symbol'=>'btcusdt',
    'type'=>'buy-market',
    'amount'=>10
]);
限价交易
//binance
$exchanges->trader()->buy([
    '_symbol'=>'BTCUSDT',
    '_number'=>'0.01',
    '_price'=>'2000',
]); 
//支持原生参数
$exchanges->trader()->buy([
    'symbol'=>'BTCUSDT',
    'type'=>'LIMIT',
    'quantity'=>'0.01',
    'price'=>'2000',
    'timeInForce'=>'GTC',
]);

//okex
$exchanges->trader()->buy([
    '_symbol'=>'BTC-USDT',
    '_number'=>'0.001',
    '_price'=>'2000',
]);
//支持原生参数
$exchanges->trader()->buy([
    'instrument_id'=>'btc-usdt',
    'price'=>'100',
    'size'=>'0.001',
]);

//huobi
$exchanges->trader()->buy([
    '_symbol'=>'btcusdt',
    '_number'=>'0.001',
    '_price'=>'2000',
]);
//支持原生参数
$exchanges->trader()->buy([
    'account-id'=>$account_id,
    'symbol'=>'btcusdt',
    'type'=>'buy-limit',
    'amount'=>'0.001',
    'price'=>'2001',
]);

期货交易

市价交易
//bitmex
$exchanges->trader()->buy([
    '_symbol'=>'XBTUSD',
    '_number'=>'1',
]);
//支持原生参数
$exchanges->trader()->buy([
    'symbol'=>'XBTUSD',
    'orderQty'=>'1',
    'ordType'=>'Market',
]);

//okex
$exchanges->trader()->buy([
    '_symbol'=>'BTC-USD-190628',
    '_number'=>'1',
    '_entry'=>true,//open long
]);
//支持原生参数
$exchanges->trader()->buy([
    'instrument_id'=>'BTC-USD-190628',
    'size'=>1,
    'type'=>1,//1:open long 2:open short 3:close long 4:close short
    //'price'=>2000,
    'leverage'=>10,//10x or 20x leverage
    'match_price' => 1,
    'order_type'=>0,
]);
限价交易
//bitmex
$exchanges->trader()->buy([
    '_symbol'=>'XBTUSD',
    '_number'=>'1',
    '_price'=>100
]);
//支持原生参数
$exchanges->trader()->buy([
    'symbol'=>'XBTUSD',
    'price'=>'100',
    'orderQty'=>'1',
    'ordType'=>'Limit',
]);

//okex
$exchanges->trader()->buy([
    '_symbol'=>'BTC-USD-190628',
    '_number'=>'1',
    '_price'=>'2000',
    '_entry'=>true,//open long
]);
//支持原生参数
$exchanges->trader()->buy([
    'instrument_id'=>'BTC-USD-190628',
    'size'=>1,
    'type'=>1,//1:open long 2:open short 3:close long 4:close short
    'price'=>2000,
    'leverage'=>10,//10x or 20x leverage
    'match_price' => 0,
    'order_type'=>0,
]);

账号余额与仓位获取

//binance
//Get current account information.
$exchanges->account()->get();

//bitmex
//bargaining transaction
$exchanges->account()->get([
    //不填写默认返回所有仓位
    //'_symbol'=>'XBTUSD'
]);

//okex  spot
//This endpoint supports getting the balance, amount available/on hold of a token in spot account.
$exchanges->account()->get([
    '_symbol'=>'BTC',
]);

//okex future
//Get the information of holding positions of a contract.
$exchanges->account()->get([
    '_symbol'=>'BTC-USD-190628',
]);

//huobi spot
$exchanges->account()->get([
    '_symbol'=>'btcusdt',
]);

支持原始对象请求

//binance
$exchanges->getPlatform()->trade()->postOrder([
    'symbol'=>'BTCUSDT',
    'side'=>'BUY',
    'type'=>'LIMIT',
    'quantity'=>'0.01',
    'price'=>'2000',
    'timeInForce'=>'GTC',
]);

//bitmex
$exchanges->getPlatform()->order()->post([
    'symbol'=>'XBTUSD',
    'price'=>'100',
    'side'=>'Buy',
    'orderQty'=>'1',
    'ordType'=>'Limit',
]);

//okex
$exchanges->getPlatform('spot')->order()->post([
    'instrument_id'=>'btc-usdt',
    'side'=>'buy',
    'price'=>'100',
    'size'=>'0.001',
    //'type'=>'market',
    //'notional'=>'100'
]);
$exchanges->getPlatform('future')->order()->post([
    'instrument_id'=>'btc-usd-190628',
    'type'=>'1',
    'price'=>'100',
    'size'=>'1',
]);

//huobi
$exchanges->getPlatform('spot')->order()->postPlace([
    'account-id'=>$account_id,
    'symbol'=>'btcusdt',
    'type'=>'buy-limit',
    'amount'=>'0.001',
    'price'=>'100',
]);

$exchanges->getPlatform('future')->contract()->postOrder([
    'symbol'=>'BTC',//string    false   "BTC","ETH"...
    'contract_type'=>'quarter',//   string  false   Contract Type ("this_week": "next_week": "quarter":)
    'contract_code'=>'BTC190628',// string  false   BTC180914
    'price'=>'100',//   decimal true    Price
    'volume'=>'1',//    long    true    Numbers of orders (amount)
    'direction'=>'buy',//   string  true    Transaction direction
    'offset'=>'open',// string  true    "open", "close"
    //'client_order_id'=>'',//long  false   Clients fill and maintain themselves, and this time must be greater than last time
    //lever_rate    int true    Leverage rate [if“Open”is multiple orders in 10 rate, there will be not multiple orders in 20 rate
    //order_price_type   string true    "limit", "opponent"
]);

更多用例请查看 more

更多API请查看 more

本帖由系统于 1周前 自动加精
一个菜鸟
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 13
ibucoin

你有什么特殊的优化速度技巧嘛?

1个月前 评论
一个菜鸟

@ibucoin 单从接口上的优化,还真的没什么可以优化的,网络IO以及各个平台的限制,这个硬性的条件。 主要优化的方向是你用PHP如果 怎么来进行操作,比如队列,php-cli模式,你用的框架自带的一些优化方案等等。

1个月前 评论
一个菜鸟

文档更新

1个月前 评论

请问一下。你们拿来做量化的基准是什么?什么情况下触发买入卖出。之前我有考虑过php 量化 但是,php trader 计算的macd ema 有偏差。 一般的话 量化程序都是根据 指标切入买卖点。请问您的包中指标是如何集成的

1个月前 评论
一个菜鸟

@laaa 我理解你的意思是精度问题? 如果是精度问题你用PHP高精度函数,和金钱相关的也必须用高精度函数,不然会有精度丢失的。 再说你这个问题是业务层面的东西了,对于接口来说,我这边是不做任何操作的,只返回你交易所的数据给你,得到数据由你自己处理判断的。 就目前来说 PHP开发这一块请求接口得到数据~就算做到后期也没压力的

1个月前 评论
一个菜鸟

@laaa 不同项目策略不同,我们的基准说简单点就是在什么点位买进,什么点位卖出,是基于行情数据的,交易所都提供了websocket。 现在这个SDK 还差一个行情数据的获取,后面我们也会开源, 也会集成多个交易所的数据。

1个月前 评论
巴啦啦

我觉得我可以提供各种指标类接口 :joy:

1个月前 评论
一个菜鸟

@巴啦啦 可以啊,支持开源。让PHP做量化这块更完美。

1个月前 评论

@一个菜鸟 :joy: 首先感谢您的回复,请问您那边的交易策略基准是什么?人工输入买卖点位? 还是根据交易所数据计算macd kdj 等指标金叉死叉作为买卖点? 我的想法是根据指标进行系统自动托管量化,但是又很难找到php相关的指标资料

4周前 评论

@巴啦啦 您可以出一些教程 或者 接口 ,我觉得量化是趋势 ,咱们phper做量化相比较python go node 还是相关资料很少。如果您愿意出一些教程 那真是感激不尽 :joy:

4周前 评论
1 巴啦啦: dif , dea , macd , ma , ub , lb , k , d , j , ma5 , ma10 , rsi6 , rsi12 , rsi24 这几个我已经做完了, 后期我还会整理几个指标做到接口里面去。这是目前已经做了的,macd 顶底背离之前做过,要找下代码。整理好了,我会开放某一个平台的某一个交易对的指标出来。教程这个不好教,这已经没有涉及到太多编程知识了。误差在小数点后2位范围内波动,这个是没办法的。 2周前

@一个菜鸟 https://github.com/ccxt/ccxt 这边有一个交易所接口整合包您可以参考一下

4周前 评论
一个菜鸟

@laaa 前期还是需要人的干预,完全自动化其实是很难的。主要还是你的策略指标等等是什么。比如说高卖低买这个策略你就可以一直玩下去,所以这个没有范围的讨论是很难说的。 教程或者接口这个不好说看后期吧,其实任何一门语言都可以做量化交易程序的,就是看你有没有好的”产品人“,毕竟我们都是做技术的。 ccxt我看过了的,它确实很好很棒,但是毕竟不是我们自己的,文档也很少,还有一些特别的需求不好扩展

4周前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!