> 技术文档 > 手把手教你如何使用Java开发区块链交易所交易跟单系统----欧易篇_okx殴易官网

手把手教你如何使用Java开发区块链交易所交易跟单系统----欧易篇_okx殴易官网

图片

大家好,我是程序员大猩猩。

很久之前做过类似的跟单业务,基本上是浮萍飘摇,不了了之的系统,最近又有人跟我提【区块链交易所交易操作,我们可以跟着大佬做单吗?】,我一听,这个不就是我的强项吗!?

搬到这里讲一讲如何实现吧。。。此教程完全是技术相关文档哦!~~~

一、API申请

想要交易程序化,不管是怎么做,起始目的我们必须联通交易所的账户信息,还有查看它的相关API是否可以支持我们程序化,这一点相关交易所也许是为了更好的交互性,他们都开放了自己的接口,并且一直在维护增强,使得我们开发人员能更好的进行对接。

欧易的API之前是V3现在已经更新到V5了,接口更方便和快捷。

那么我们如何程序化呢?那就是申请开通它的内部API,API申请也是很简单的,只要我们在欧易平台申请账号注册,登陆进去后便可以点击头像,即可看到API按钮。

图片

按照操作步骤就可以完成API的操作了。

图片

这里必须要注意API的权限设置,权限有【读取】、【交易】、【提现】三个多选选择。

一般做单者的API权限,只需要选择【读取】就可以。只需要拿取跟单者的交易订单进行跟单操作。而跟单者权限就需要多选择一个【交易】,毕竟我们需要这个权限来跟单的。

【提现】哪个角色都不要选择

API申请好之后,记得一定要妥善保存相关密码信息。

二、开发API对接

API这块申请完毕之后,程序员开发者这里,就分为俩步了。

参考文档:

https://www.okx.com/docs-v5/zh/#overview-websocket

a. 获取做单者的交易信息

为了快速获取到做单者的做单信息,显然对于程序来说,如何快速的获取是个难题,API文档有俩种方式,一种是http访问接口方式,另一种是websocket方式。显然,websocket方式更适合快速的获取方式。

注意:我这里使用okhttp3 websocket组件来进行实现

aa. 首先进行websocket连接,并进行登录验证

OkHttpClient client =newOkHttpClient.Builder().readTimeout(5, TimeUnit.SECONDS).build();Request request =newRequest.Builder().url(url).build();

登录验证,三个参数都是申请API时的信息,辨识填入即可。

//登录public void login(String apiKey, String passPhrase, String secretKey){String timestamp = System.currentTimeMillis() /1000+\"\";String message = timestamp +\"GET\"+\"/users/self/verify\";sign = sha256_HMAC(message, secretKey);String str =\"{\\\"op\\\"\"+\":\"+\"\\\"login\\\"\"+\",\"+\"\\\"args\\\"\"+\":\"+\"[{\"+\"\\\"apiKey\\\"\"+\":\"+\"\\\"\" + apiKey + \"\\\"\"+\",\"+\"\\\"passphrase\\\"\"+\":\"+\"\\\"\" + passPhrase + \"\\\"\"+\",\"+\"\\\"timestamp\\\"\"+\":\"+\"\\\"\" + timestamp + \"\\\"\"+\",\"+\"\\\"sign\\\"\"+\":\"+\"\\\"\" + sign + \"\\\"\"+\"}]}\";sendMessage(str);}

​​​​​​​然后,我们根据websocket订阅的性质,写一个订阅和取消订阅的方法.

//订阅,参数为频道组成的集合publicvoidsubscribe(List list) {Strings = listToJson(list);Stringstr =\"{\\\"op\\\": \\\"subscribe\\\", \\\"args\\\":\"+ s +\"}\";if(null!= webSocket) sendMessage(str);}//取消订阅,参数为频道组成的集合publicvoidunsubscribe(List list) { Strings = listToJson(list); Stringstr =\"{\\\"op\\\": \\\"unsubscribe\\\", \\\"args\\\":\"+ s +\"}\"; if(null!= webSocket) {       sendMessage(str); }}private StringlistToJson(List list) { JSONArray jsonArray =newJSONArray(); for(Mapmap : list) { jsonArray.add(JSONObject.fromObject(map)); } returnjsonArray.toJSONString();}

​​​​​​​根据以上方法,就可以使逻辑跑通了,如下实施订阅:

List channel = Lists.newArrayList();List channel2 = Lists.newArrayList();//添加订阅频道Map orderMap =newHashMap();orderMap.put(\"channel\",\"orders\");orderMap.put(\"instType\",\"SWAP\");channel.add(orderMap);//订单订阅webSocketClient.subscribe(channel);log.info(\"订阅订单socket频道\");//添加订阅频道MapalgoOrders =newHashMap();algoOrders.put(\"channel\",\"orders-algo\");algoOrders.put(\"instType\",\"SWAP\");channel2.add(algoOrders);//委托订阅webSocketClient.subscribe(channel2);

​​​​​​​假如做单者有做单行为,那么在websocket块的onMessage方法内就会收到做单行为的订单信息。以下是订单的关键信息,根据api文档内的字段进行比较具体表示含义!~

OkexSocketOrder order = new OkexSocketOrder();//canceled:撤单成功//live:等待成交//partially_filled:部分成交//filled:完全成交order.setState(switchState(item.getState()));//side//posSideorder.setType(switchSide(item.getSide(), item.getPosSide()));//instIdorder.setInstrument_id(item.getInstId());//ordIdorder.setOrder_id(item.getOrdId());//pxorder.setPrice(item.getPx());//ordTypeorder.setOrder_type(switchOrdType(item.getOrdType()));//szorder.setSize(item.getSz());//leverorder.setLeverage(item.getLever());//仓位模式order.setTdMode(item.getTdMode());//uTimeorder.setTimestamp(DateUtil.date(Long.parseLong(item.getUTime())));

​​​​​​​至此以上做单者的订单信息获取完成,而且实现在毫秒级内,完全适用。

b. 根据做单者的订单信息,我们可以根据预期的特定增值和减量来处理我们的订单,然后进行跟单。

因为每一张单子分别有 下单 撤单 以及成交的状态标识,那么开发者也需要根据这些状态来处理我们的跟单状态。

意味做单者如何做跟单者也如何做的操作。

这里贴一些订单的操作接口方法,供参考:

/** * 功能描述:下单
*/@POST(\"/api/v5/trade/order\")Call placeOrder(@Body JSONObject jsonObject);/** * 功能描述:修改订单
*/@POST(\"/api/v5/trade/amend-order\")Call amendOrder(@Body V5AmendOrder var1);/** * 获取杠杆倍数 Get Leverage */@GET(\"/api/v5/account/leverage-info\")Call getLeverage(@Query(\"instId\") String instId, @Query(\"mgnMode\") String mgnMode);/** * 功能描述:撤单
*/@POST(\"/api/v5/trade/cancel-order\")Call cancelOrder(@Body CancelOrder cancelOrder);