手把手教你如何使用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);
### Python与欧易交易所API对接实现量化交易平台搭建 #### 了解欧易交易所API接口 为了能够通过Python操作欧易交易所开发者需要先注册成为该平台用户并获取API密钥。API提供了多种功能调用方式,包括市场数据查询、账户信息读取以及下单等功能[^1]。 #### 安装必要的库文件 在开始编写代码之前,需安装一些第三方库来简化HTTP请求处理过程和JSON解析工作。可以利用`pip install requests`命令完成对requests库的安装;另外还需要引入pandas用于数据分析处理[^2]。 ```bash pip install requests pandas ``` #### 获取行情数据 下面展示了一段简单的Python脚本用来获取最新价格: ```python import requests def get_latest_price(symbol='BTCUSDT'): url = f"https://api.okex.com/api/v5/market/ticker?instId={symbol}" response = requests.get(url).json() if 'data' not in response or len(response['data']) == 0: raise Exception('Failed to fetch latest price') ticker_data = response['data'][0] last_trade_price = float(ticker_data['last']) return last_trade_price ``` 这段程序定义了一个名为`get_latest_price()` 的函数,它接受一个参数`symbols`(默认为比特币/美元),并通过发送GET请求到指定URL地址获得最新的成交价[^3]。 #### 下单交易指令 当准备执行买卖动作时,则要构建更复杂的POST请求向服务器提交订单详情。这里给出一个简单例子说明如何创建限价买单: ```python import hashlib, hmac, time from urllib.parse import urlencode class OkexClient(object): def __init__(self, api_key=None, secret_key=None, passphrase=None): self.base_url = "https://www.okex.com" self.api_key = api_key self.secret_key = secret_key self.passphrase = passphrase def _sign(self, method, path, query_params=None, body=None): timestamp = str(time.time()).split('.')[0]+'.'+str(int(round(time.time()*1000)))[-3:] message = timestamp + method.upper() + path + (f"?{urlencode(query_params)}" if query_params else "") + (body if body else "") signature = base64.b64encode(hmac.new(bytes(self.secret_key,'utf8'), bytes(message,'utf8'), digestmod=hashlib.sha256).digest()) headers = { "OK-ACCESS-KEY": self.api_key, "OK-ACCESS-SIGN": signature.decode(), "OK-ACCESS-TIMESTAMP": timestamp, "OK-ACCESS-PASSPHRASE": self.passphrase, "Content-Type": "application/json", } return headers def place_order(self, side="buy", instrument_id="BTC-USDT", size=1, order_type="limit", price=None): endpoint = "/api/spot/v3/orders" params = {"side": side,"instrument_id": instrument_id,"type":order_type} if order_type=="limit": params["price"]=str(price) params["size"]=str(size) header=self._sign("POST",endpoint,params,json.dumps(params)) resp=requests.post(f"{self.base_url}{endpoint}",headers=header,data=json.dumps(params)).json() try: result={"status":"success","message":"","order_id":""} result.update(resp) return result except KeyError as e: error_msg=f"Error placing order: {e}. Response was:\n{resp}" logging.error(error_msg) return {"status":"failure","message":error_msg} client = OkexClient(api_key='your_apikey',secret_key='your_secretkey',passphrase='your_passphrase') print(client.place_order(side="buy", instrument_id="ETH-USDT", size=.01, order_type="market")) ``` 上述类实现了签名算法,并封装了下单逻辑。注意替换掉示例中的API Key等相关字段为自己实际申请得到的信息[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员大猩猩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值