资讯专栏INFORMATION COLUMN

Java比特币开发教程:在开放式交易所限价买卖比特币

lanffy / 2742人阅读

摘要:如果你想限定价格买卖,或者买卖一些不支持的资产,你需要。完整的步骤如下检查比特币或的余额,钱包地址。从第三方交易所或者你的冷钱包中,将币充到上述钱包地址。比特币的到帐时间是个区块的高度,约分钟。


上一章介绍了Exincore,你可以1秒完成资产的市价买卖。如果你想限定价格买卖,或者买卖一些exincore不支持的资产,你需要OceanOne。

方案二: 挂单Ocean.One交易所

Ocean.one是基于Mixin Network的去中心化交易所,它中心化交易所一样友好。
你可以在OceanOne上交易任何资产,只需要将你的币转给OceanOne, 将交易信息写在交易的memo里,OceanOne会在市场里列出你的交易需求,
交易成功后,会将目标币转入到你的MixinNetwork帐上,它有三大特点与优势:

不需要在OceanOne注册

不需要存币到交易所

支持所有Mixin Network上能够转账的资产,所有的ERC20 EOS代币。

预备知识:

你先需要创建一个机器人, 方法在 教程一.

安装依赖包

正如教程一里我们介绍过的, 我们需要依赖 mixin-java-sdk, 你应该先安装过它了,zhang/mixin_labs-java-bot/blob/master/README.md).

Install required packages

第四课, 在上一课中已经安装好了.

充币到 Mixin Network, 并读出它的余额.

此处演示用 USDT购买BTC 或者 用BTC购买USDT。交易前,先检查一下钱包地址。
完整的步骤如下:

检查比特币或USDT的余额,钱包地址。并记下钱包地址。

从第三方交易所或者你的冷钱包中,将币充到上述钱包地址。

再检查一下币的余额,看到帐与否。(比特币的到帐时间是5个区块的高度,约100分钟)。

比特币与USDT的充值地址是一样的。

</>复制代码

  1. private static final String BTC_ASSET_ID = "c6d0c728-2624-429b-8e0d-d9d19b6592fa";
  2. private static final String EOS_ASSET_ID = "6cfe566e-4aad-470b-8c9a-2fd35b49c68d";
  3. private static final String USDT_ASSET_ID = "815b0b1a-2764-3736-8faa-42d694fa620a";
  4. MixinAPI mixinApiUser = generateAPI_FromCSV();
  5. JsonObject asset = mixinApiUser.getAsset(BTC_ASSET_ID);
  6. System.out.println(asset);
  7. System.out.println("------------------------BTC------Information---------------------------");
  8. System.out.println("The BTC wallet address is " + asset.get("public_key").getAsString());
  9. System.out.println("The BTC wallet balance is " + asset.get("balance").getAsString());
  10. System.out.println("-----------------------------------------------------------------------");
取得Ocean.one的市场价格信息

如何来查询Ocean.one市场的价格信息呢?你要先了解你交易的基础币是什么,如果你想买比特币,卖出USDT,那么基础货币就是USDT;如果你想买USDT,卖出比特币,那么基础货币就是比特币.

</>复制代码

  1. if ( subinput.equals("1") ) {
  2. FetchOceanMarketInfos(BTC_ASSET_ID,USDT_ASSET_ID);
  3. }
  4. private static void FetchOceanMarketInfos(String targetAssetID, String baseAssetID) {
  5. OkHttpClient client = new OkHttpClient();
  6. String baseUrl = "https://events.ocean.one/markets/%s-%s/book ";
  7. String fullUrl = String.format(baseUrl,targetAssetID,baseAssetID);
  8. // String fullUrl = baseUrl + url;
  9. System.out.println(fullUrl);
  10. Request request = new Request.Builder()
  11. .url(fullUrl)
  12. .build();
  13. try {
  14. Response response = client.newCall(request).execute();
  15. if (!response.isSuccessful()) {
  16. throw new IOException("Unexpected code " + response);
  17. }
  18. String res = response.body().string();
  19. // System.out.println(res);
  20. JsonParser parser = new JsonParser();
  21. JsonElement jsonTree = parser.parse(res);
  22. JsonObject orders;
  23. orders = jsonTree.getAsJsonObject();
  24. JsonArray asksOrders = orders.get("data").getAsJsonObject().
  25. get("data").getAsJsonObject().
  26. get("asks").getAsJsonArray();
  27. JsonArray bidsOrders = orders.get("data").getAsJsonObject().
  28. get("data").getAsJsonObject().
  29. get("bids").getAsJsonArray();
  30. // System.out.println(orders.get("data").getAsJsonObject().get("data").getAsJsonObject().get("bids").getAsJsonArray());
  31. System.out.println("--Side--Price--Amount--Funds---");
  32. asksOrders.forEach((element) -> {
  33. JsonObject jsonObj = element.getAsJsonObject();
  34. System.out.println(jsonObj.get("side").getAsString() + " " +
  35. jsonObj.get("price").getAsString() + " " +
  36. jsonObj.get("amount").getAsString() + " " +
  37. jsonObj.get("funds").getAsString() );
  38. });
  39. bidsOrders.forEach((element) -> {
  40. JsonObject jsonObj = element.getAsJsonObject();
  41. System.out.println(jsonObj.get("side").getAsString() + " " +
  42. jsonObj.get("price").getAsString() + " " +
  43. jsonObj.get("amount").getAsString() + " " +
  44. jsonObj.get("funds").getAsString() );
  45. });
  46. System.out.println("----endo--of--btc/usdt----");
  47. return;
  48. } catch(Exception e) { e.printStackTrace(); }
  49. return;
  50. }
交易前,创建一个Memo!

在第二章里,基于Mixin Network的 Java 比特币开发教程: 机器人接受比特币并立即退还用户, 我们学习过转帐,这儿我们介绍如何告诉Ocean.one,我们给它转帐的目的是什么,信息全部放在memo里.

Side 方向,"B" 或者 "A", "B"是购买, "A"是出售.

AssetUUID 目标虚拟资产的UUID.

Price 价格,如果操作方向是"B", 价格就是AssetUUID的价格; 如果操作方向是"B", 价格就是转给Ocean.one币的价格.

</>复制代码

  1. public static String GenerateOrderMemo(String Side, String AssetUUID, String Price) {
  2. try {
  3. MessageBufferPacker m = MessagePack.newDefaultBufferPacker();
  4. UUID myAssetUUID = UUID.fromString(AssetUUID);
  5. Value map = ValueFactory.newMap(ValueFactory.newString("S"), ValueFactory.newString(Side),
  6. ValueFactory.newString("A"), ValueFactory.newBinary(asBytes(myAssetUUID)),
  7. ValueFactory.newString("P"), ValueFactory.newString(Price),
  8. ValueFactory.newString("T"), ValueFactory.newString("L") );
  9. m.packValue(map);
  10. return Base64.getEncoder().encodeToString(m.toByteArray());
  11. } catch (Exception e) { e.printStackTrace(); }
  12. return "";
  13. }
出售BTC的例子

转打算出售的BTC给Ocean.one(OCEANONE_BOT),将你打算换回来的目标虚拟资产的UUID放入memo.

</>复制代码

  1. private static final String OCEANONE_BOT = "aaff5bef-42fb-4c9f-90e0-29f69176b7d4";
  2. private static final String BTC_ASSET_ID = "c6d0c728-2624-429b-8e0d-d9d19b6592fa";
  3. private static final String EOS_ASSET_ID = "6cfe566e-4aad-470b-8c9a-2fd35b49c68d";
  4. private static final String USDT_ASSET_ID = "815b0b1a-2764-3736-8faa-42d694fa620a";
  5. private static final String BTC_WALLET_ADDR = "14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C";
  6. private static final String MASTER_UUID = "0b4f49dc-8fb4-4539-9a89-fb3afc613747";
  7. if ( subinput.equals("s1") ) {
  8. System.out.print("Please input the BTC price base USDT: ");
  9. String pinput = System.console().readLine();
  10. System.out.println(pinput);
  11. System.out.print("Please input the BTC amount: ");
  12. String aminput = System.console().readLine();
  13. System.out.println(aminput);
  14. float amountf = Float.valueOf(aminput.trim()).floatValue();
  15. String buyMemo = GenerateOrderMemo("A",USDT_ASSET_ID,pinput);
  16. MixinAPI mixinApiUser = generateAPI_FromCSV();
  17. // UUID usdtUUID = UUID.fromString(USDT_ASSET_ID);
  18. // String memoTarget = encodeUUID(usdtUUID);
  19. System.out.println("------------------Ocean.one-USDT-BTC-EXCHANGE----------------------------");
  20. System.out.println(buyMemo);
  21. JsonObject asset = mixinApiUser.getAsset(BTC_ASSET_ID);
  22. System.out.println(asset);
  23. System.out.println(asset.get("balance").getAsFloat());
  24. if ( asset.get("balance").getAsFloat() > 0 && asset.get("balance").getAsFloat() >= amountf ) {
  25. JsonObject transInfo = mixinApiUser.transfer(BTC_ASSET_ID, OCEANONE_BOT,
  26. aminput,
  27. buyMemo);
  28. System.out.println("------------------------BTC Transfer To EXCHANGE Information----------------------");
  29. System.out.println(transInfo);
  30. System.out.println("-----------------------------------------------------------------------");
  31. } else System.out.println("----------------Not enough BTC--------------------------------------------");
  32. }

如果你是打算买BTC,操作如下:

</>复制代码

  1. if ( subinput.equals("b1") ) {
  2. System.out.print("Please input the BTC price base USDT: ");
  3. String pinput = System.console().readLine();
  4. System.out.println(pinput);
  5. System.out.print("Please input the USDT amount: ");
  6. String aminput = System.console().readLine();
  7. System.out.println(aminput);
  8. float amountf = Float.valueOf(aminput.trim()).floatValue();
  9. String buyMemo = GenerateOrderMemo("B",BTC_ASSET_ID,pinput);
  10. MixinAPI mixinApiUser = generateAPI_FromCSV();
  11. // UUID usdtUUID = UUID.fromString(USDT_ASSET_ID);
  12. // String memoTarget = encodeUUID(usdtUUID);
  13. System.out.println("------------------Ocean.one-USDT-BTC-EXCHANGE----------------------------");
  14. System.out.println(buyMemo);
  15. JsonObject asset = mixinApiUser.getAsset(USDT_ASSET_ID);
  16. System.out.println(asset);
  17. System.out.println(asset.get("balance").getAsFloat());
  18. if ( asset.get("balance").getAsFloat() >= 1 && asset.get("balance").getAsFloat() >= amountf ) {
  19. JsonObject transInfo = mixinApiUser.transfer(USDT_ASSET_ID, OCEANONE_BOT,
  20. aminput,
  21. buyMemo);
  22. System.out.println("------------------------BTC Transfer To EXCHANGE Information----------------------");
  23. System.out.println(transInfo);
  24. System.out.println("-----------------------------------------------------------------------");
  25. } else System.out.println("----------------Not enough USDT--------------------------------------------");
  26. }

一个成功的挂单如下:

</>复制代码

  1. ------------------Ocean.one--EXCHANGE----------------------------
  2. hKFToUKhQcQQyUrIj0ZxOXa2CgkGTxgR6KFQojExoVShTA==
  3. {"type":"asset","asset_id":"815b0b1a-2764-3736-8faa-42d694fa620a","chain_id":"c6d0c728-2624-429b-8e0d-d9d19b6592fa","symbol":"USDT","name":"Tether USD","icon_url":"https://images.mixin.one/ndNBEpObYs7450U08oAOMnSEPzN66SL8Mh-f2pPWBDeWaKbXTPUIdrZph7yj8Z93Rl8uZ16m7Qjz-E-9JFKSsJ-F=s128","balance":"2","public_key":"15RNBb5GzoXWRoEMT5MJL3pqzSjdPoXf6J","account_name":"","account_tag":"","price_btc":"0.00018747","price_usd":"0.98731224","change_btc":"0.021985715750932774","change_usd":"-0.01843154053058167","asset_key":"815b0b1a-2764-3736-8faa-42d694fa620a","confirmations":6,"capitalization":0}
  4. 2.0
  5. --------------815b0b1a-2764-3736-8faa-42d694fa620a Transfer To EXCHANGE Information---------
  6. {"type":"transfer","snapshot_id":"f526fd18-c3d2-4a6d-a0f0-3a720e93c48e","opponent_id":"aaff5bef-42fb-4c9f-90e0-29f69176b7d4","asset_id":"815b0b1a-2764-3736-8faa-42d694fa620a","amount":"-2","trace_id":"6cf37ca6-4efa-4e78-bea1-53c5c5d54d2b","memo":"hKFToUKhQcQQyUrIj0ZxOXa2CgkGTxgR6KFQojExoVShTA==","created_at":"2019-04-26T01:56:00.803572612Z","counter_user_id":"0b4f49dc-8fb4-4539-9a89-fb3afc613747"}
  7. ---Order is 6cf37ca6-4efa-4e78-bea1-53c5c5d54d2b: ------
取消挂单

Ocean.one将trace_id当做订单,比如上面的例子, 6cf37ca6-4efa-4e78-bea1-53c5c5d54d2b 就是订单号,我们用他来取消订单。

</>复制代码

  1. public static String GenerateOrderCancelMemo(String myUuid) {
  2. try {
  3. MessageBufferPacker m = MessagePack.newDefaultBufferPacker();
  4. UUID AssetUUID = UUID.fromString(myUuid);
  5. Value map = ValueFactory.newMap(
  6. ValueFactory.newString("O"), ValueFactory.newBinary(asBytes(AssetUUID)) );
  7. m.packValue(map);
  8. return Base64.getEncoder().encodeToString(m.toByteArray());
  9. } catch (Exception e) { e.printStackTrace(); }
  10. return "";
  11. }
通过读取资产余额,来确认到帐情况

Check the wallet"s balance.

</>复制代码

  1. MixinAPI mixinApiUser = generateAPI_FromCSV();
  2. JsonObject asset = mixinApiUser.getAsset(BTC_ASSET_ID);
源代码执行

编译执行,即可开始交易了.

gradle build 编译项目.

java -cp 运行项目.

</>复制代码

  1. java -cp .:build/libs/bitcoin_wallet-java.jar:libs/* bitcoin_wallet.java.App

注意:不能使用gradle run来运行,因为我们使用的System.console().readLine()不被Gradle支持,只能使用java -cp
来运行!

本代码执行时的命令列表:

1: Create Bitcoin Wallet and update PIN

2: Read Bitcoin balance & address

3: Read USDT balance & address

4: Read EOS balance & address

tbb:Transfer BTC from Bot to Wallet

tbm:Transfer BTC from Wallet to Master

teb:Transfer EOS from Bot to Wallet

tem:Transfer EOS from Wallet to Master

tub:Transfer USDT from Bot to Wallet

tum:Transfer USDT from Wallet to Master

5: pay 0.0001 BTC buy USDT

6: pay $1 USDT buy BTC

7: Read Snapshots

8: Fetch market price(USDT)

9: Fetch market price(BTC)

v: Verify Wallet Pin

wb: Withdraw BTC

we: WitchDraw EOS

a: Read All Assets Infos

o: Ocean.One Exchange

q: Exit

Make your choose(eg: q for Exit!):

1: Orders-Book of BTC/USDT

b1: Buy BTC pay USDT

s1: Sell BTC get USDT

2: Orders-Book of EOS/USDT

b2: Buy EOS pay USDT

s2: Sell EOS get USDT

3: Orders-Book of XIN/USDT

b3: Buy XIN pay USDT

s3: Sell XIN get USDT

4: Orders-Book of XIN/BTC

b4: Buy XIN pay BTC

s4: Sell XIN get BTC

5: Orders-Book of EOS/BTC

b4: Buy EOS pay BTC

s4: Sell EOS get BTC

6: Orders-Book of SC/BTC

b6: Buy SC pay BTC

s6: Sell SC get BTC

7: Orders-Book of EOS/XIN

b7: Buy EOS pay XIN

s7: Sell EOS get XIN

8: Orders-Book of ETH/XIN

b8: Buy ETH pay XIN

s8: Sell EOS get XIN

9: Orders-Book of SC/XIN

b9: Buy SC pay XIN

s9: Sell SC get XIN

c: Cancel the order

q: Exit

完整代码

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/24671.html

相关文章

  • 使用 Node.js 开放交易OceanOne上挂单买卖奔驰

    摘要:在上一课中,我们介绍了如何在交易比特币。支持交易任何上的,包括所有的和,不需要任何手续和费用,直接挂单即可。掌握了代币的交易方法,就可以交易任何其他代币了。 showImg(https://segmentfault.com/img/remote/1460000018771566?w=1200&h=659); 在上一课中,我们介绍了如何在OceanOne交易比特币。OceanOne支持交...

    tigerZH 评论0 收藏0
  • php 比特教程大更新,包括交易和闪兑

    摘要:课程简介创建一个机器人机器人接受比特币并立即退还用户创建比特币钱包买卖实时兑换买卖在自由市场挂单买卖买卖任意在自由市场挂单买卖其他编程语言比特币开发教程如下比特币开发教程比特币开发教程比特币开发教程比特币开发教程比特币开发教程比特币开发教程 showImg(https://segmentfault.com/img/bVboFQ6?w=1200&h=659); 课程简介 PHP 创建一...

    avwu 评论0 收藏0
  • php 比特教程大更新,包括交易和闪兑

    摘要:课程简介创建一个机器人机器人接受比特币并立即退还用户创建比特币钱包买卖实时兑换买卖在自由市场挂单买卖买卖任意在自由市场挂单买卖其他编程语言比特币开发教程如下比特币开发教程比特币开发教程比特币开发教程比特币开发教程比特币开发教程比特币开发教程 showImg(https://segmentfault.com/img/bVboFQ6?w=1200&h=659); 课程简介 PHP 创建一...

    andot 评论0 收藏0
  • Java比特开发教程Java编程买卖比特

    摘要:完整的步骤如下检查比特币或的余额,钱包地址。比特币的到帐时间是个块的高度,约分钟。 showImg(https://segmentfault.com/img/remote/1460000018952144?w=1200&h=659); 方案一: 通过ExinCore API进行币币交易 Exincore 提供了基于Mixin Network的币币交易API. 你可以支付USDT给Exi...

    xiaowugui666 评论0 收藏0
  • Java比特开发教程Java编程买卖比特

    摘要:完整的步骤如下检查比特币或的余额,钱包地址。比特币的到帐时间是个块的高度,约分钟。 showImg(https://segmentfault.com/img/remote/1460000018952144?w=1200&h=659); 方案一: 通过ExinCore API进行币币交易 Exincore 提供了基于Mixin Network的币币交易API. 你可以支付USDT给Exi...

    msup 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<