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

图片

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

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

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

一、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<Map> list) {
Strings = listToJson(list);
Stringstr ="{\"op\": \"subscribe\", \"args\":"+ s +"}";

if(null!= webSocket)
     sendMessage(str);
}

//取消订阅,参数为频道组成的集合
publicvoidunsubscribe(List<Map> list) {
    Strings = listToJson(list);
    Stringstr ="{\"op\": \"unsubscribe\", \"args\":"+ s +"}";
    if(null!= webSocket) {
       sendMessage(str);
    }
}

private StringlistToJson(List<Map> list) {
    JSONArray jsonArray =newJSONArray();
    for(Mapmap : list) {
    jsonArray.add(JSONObject.fromObject(map));
    }
    returnjsonArray.toJSONString();
}

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

List<Map> channel = Lists.newArrayList();
List<Map> channel2 = Lists.newArrayList();
//添加订阅频道
Map<String,String> 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
//posSide
order.setType(switchSide(item.getSide(), item.getPosSide()));
//instId
order.setInstrument_id(item.getInstId());
//ordId
order.setOrder_id(item.getOrdId());
//px
order.setPrice(item.getPx());
//ordType
order.setOrder_type(switchOrdType(item.getOrdType()));
//sz
order.setSize(item.getSz());
//lever
order.setLeverage(item.getLever());
//仓位模式
order.setTdMode(item.getTdMode());
//uTime
order.setTimestamp(DateUtil.date(Long.parseLong(item.getUTime())));

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

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

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

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

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

/**
 * <b>功能描述:</b>下单<br>
 */
@POST("/api/v5/trade/order")
Call<JSONObject> placeOrder(@Body JSONObject jsonObject);


/**
 * <b>功能描述:</b>修改订单<br>
 */
@POST("/api/v5/trade/amend-order")
Call<JSONObject> amendOrder(@Body V5AmendOrder var1);

/**
 * 获取杠杆倍数 Get Leverage
 */
@GET("/api/v5/account/leverage-info")
Call<JSONObject> getLeverage(@Query("instId") String instId, @Query("mgnMode") String mgnMode);


/**
 * <b>功能描述:</b>撤单<br>
 */
@POST("/api/v5/trade/cancel-order")
Call<JSONObject> cancelOrder(@Body CancelOrder cancelOrder);
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员大猩猩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值