通过 Ruby 买卖Bitcoin:使用开放交易所OceanOne
上一章介绍了Exincore,你可以1秒完成资产的市价买卖。如果你想限定价格买卖,或者买卖一些exincore不支持的资产,你需要OceanOne。
方案二: 挂单Ocean.One交易所
Ocean.one是基于Mixin Network的去中心化交易所,它性能一流。 你可以在OceanOne上交易任何资产,只需要将你的币转给OceanOne, 将交易信息写在交易的memo里,OceanOne会在市场里列出你的交易需求, 交易成功后,会将目标币转入到你的MixinNetwork帐上,它有三大特点与优势:
- 不需要在OceanOne注册
- 不需要存币到交易所
- 支持所有Mixin Network上能够转账的资产,所有的ERC20 EOS代币。
预备知识:
你先需要创建一个机器人, 方法在 教程一.
安装依赖包
我们需要依赖 msgpack and mixin-bot ,第四章 已经做过介绍, 你应该先安装过它了.
充币到 Mixin Network, 并读出它的余额.
此处演示用 USDT购买BTC 或者 用BTC购买USDT。交易前,先检查一下钱包地址。 完整的步骤如下:
- 检查比特币或USDT的余额,钱包地址。并记下钱包地址。
- 从第三方交易所或者你的冷钱包中,将币充到上述钱包地址。
- 再检查一下币的余额,看到帐与否。(比特币的到帐时间是5个区块的高度,约100分钟)。
比特币与USDT的充值地址是一样的。
if cmd == "aw"assetsInfo = walletAccount.read_assets()p "--------The Wallet Assets List-----------------"assetsInfo["data"].each { |x| puts x["symbol"] + " " +x["balance"] + " " + x["public_key"] +x["account_name"] + " " + x["account_tag"]}p "----------End of Wallet Assets --------------"
end
复制代码
取得Ocean.one的市场价格信息
如何来查询Ocean.one市场的价格信息呢?你要先了解你交易的基础币是什么,如果你想买比特币,卖出USDT,那么基础货币就是USDT;如果你想买USDT,卖出比特币,那么基础货币就是比特币.
if ocmd == "1"Utils.OceanOneMarketPriceRequest(BTC_ASSET_ID, USDT_ASSET_ID)
end
def self.OceanOneMarketPriceRequest(asset_id, base_asset_id)full_url = "https://events.ocean.one/markets/" + asset_id + "-" + base_asset_id + "/book"data = HTTP.get(full_url).bodybody = ""redData = data.readpartialwhile redData != nilbody = body + redDataredData = data.readpartialendresult = ActiveSupport::JSON.decode(body).with_indifferent_accessresult["data"]["data"]["asks"].each { |x|puts x["side"] + " " + x["price"] + " " +x["amount"] + " " + x["funds"]}result["data"]["data"]["bids"].each { |x|puts x["side"] + " " + x["price"] + " " +x["amount"] + " " + x["funds"]}
end
复制代码
交易前,创建一个Memo!
在第二章里,Ruby比特币开发教程: 机器人接受比特币并立即退还用户, 我们学习过转帐,这儿我们介绍如何告诉Ocean.one,我们给它转帐的目的是什么,信息全部放在memo里.
- side 方向,"B" 或者 "A", "B"是购买, "A"是出售.
- targetAsset 目标虚拟资产的UUID.
- price 价格,如果操作方向是"B", 价格就是AssetUUID的价格; 如果操作方向是"B", 价格就是转给Ocean.one币的价格.
def self.GenerateOceanMemo(targetAsset,side,price)memo = Base64.encode64(MessagePack.pack({'A' => UUID.parse(targetAsset).to_raw,'S' => side,'P' => price,'T' => "L"}))return memo.sub("\n","")
end
复制代码
买入BTC的代码如下:
if ocmd == "b1"p "Input the price of BTC/USDT: "bprice = gets.chompp "Input the amount of USDT: "amount = gets.chompmemo = Utils.GenerateOceanMemo(BTC_ASSET_ID,"B",bprice)p memoassetsInfo = walletAccount.read_asset(USDT_ASSET_ID)if assetsInfo["data"]["balance"].to_f >= 1 && assetsInfo["data"]["balance"].to_f >= amount.to_ftransInfo = walletAccount.create_transfer(walletAccount.encrypt_pin(DEFAULT_PIN),{asset_id: USDT_ASSET_ID,opponent_id: OCEANONE_BOT,amount: amount,trace_id: SecureRandom.uuid,memo: memo})p transInfop "The Order id is " + transInfo["data"]["trace_id"] + " It's needed by cancel-order!"elsep "Not enough USDT"end
end
复制代码
出售BTC的例子
转打算出售的XIN给Ocean.one(OCEANONE_BOT),将你打算换回来的目标虚拟资产的UUID放入memo.
if ocmd == "s1"p "Input the price of BTC/USDT: "bprice = gets.chompp "Input the amount of BTC: "amount = gets.chompmemo = Utils.GenerateOceanMemo(USDT_ASSET_ID,"A",bprice)p memoassetsInfo = walletAccount.read_asset(BTC_ASSET_ID)if assetsInfo["data"]["balance"].to_f > 0 && assetsInfo["data"]["balance"].to_f >= amount.to_ftransInfo = walletAccount.create_transfer(walletAccount.encrypt_pin(DEFAULT_PIN),{asset_id: BTC_ASSET_ID,opponent_id: OCEANONE_BOT,amount: amount,trace_id: SecureRandom.uuid,memo: memo})p transInfop "The Order id is " + transInfo["data"]["trace_id"] + " It's needed by cancel-order!"elsep "Not enough BTC"end
end
复制代码
一个成功的挂单如下:
Make your choose(eg: q for Exit!):
b1
"Input the price of BTC/USDT: "
7777
"Input the amount of USDT: "
1
"hKFBxBDG0McoJiRCm44N2dGbZZL6oVOhQqFQpDc3NzehVKFM"
{"data"=>{"type"=>"transfer", "snapshot_id"=>"10178f11-4e05-4076-b7c9-006e95919a1b",
"opponent_id"=>"aaff5bef-42fb-4c9f-90e0-29f69176b7d4", "asset_id"=>"815b0b1a-2764-3736-8faa-42d694fa620a",
"amount"=>"-1", "trace_id"=>"89025aab-598f-43e5-834a-2feaa01797ff",
"memo"=>"hKFBxBDG0McoJiRCm44N2dGbZZL6oVOhQqFQpDc3NzehVKFM", "created_at"=>"2019-05-27T06:53:07.135709255Z", "counter_user_id"=>"aaff5bef-42fb-4c9f-90e0-29f69176b7d4"}}
"The Order id is 89025aab-598f-43e5-834a-2feaa01797ff It's needed by cancel-order!"
复制代码
取消挂单
Ocean.one将trace_id当做订单,比如上面的例子, 89025aab-598f-43e5-834a-2feaa01797ff 就是订单号,我们用他来取消订单。
if ocmd == "c"p "Input the Order ID: "orderid = gets.chompmemo1 = Base64.encode64(MessagePack.pack({'O' => UUID.parse(orderid).to_raw}))memo = memo1.sub("\n","")assetsInfo = walletAccount.read_asset(CNB_ASSET_ID)if assetsInfo["data"]["balance"].to_f > 0transInfo = walletAccount.create_transfer(walletAccount.encrypt_pin(DEFAULT_PIN),{asset_id: CNB_ASSET_ID,opponent_id: OCEANONE_BOT,amount: "0.00000001",trace_id: SecureRandom.uuid,memo: memo})p transInfoelsep "Not enough CNB!"end
end
复制代码
通过读取资产余额,来确认到帐情况
if cmd == "aw"assetsInfo = walletAccount.read_assets()p "--------The Wallet Assets List-----------------"assetsInfo["data"].each { |x| puts x["symbol"] + " " +x["balance"] + " " + x["public_key"] +x["account_name"] + " " + x["account_tag"]}p "----------End of Wallet Assets --------------"
end
复制代码
源代码执行
编译执行,即可开始交易了.
源代码执行
编译执行,即可开始交易了.
- ruby bitcoin-wallet-ruby.rb 运行.
本代码执行时的命令列表:
- 1: Fetch BTC/USDT Order Book
- 2: Fetch XIN/USDT Order Book
- 3: Fetch ERC20/USDT Order Book
- s1: Sell BTC/USDT
- b1: Buy BTC/USDT
- s2: Sell XIN/USDT
- b2: Buy XIN/USDT
- s3: Sell ERC20/USDT
- s3: Buy ERC20/USDT
- c: Cancel the order
- q: Exit Make your choose(eg: q for Exit!):
完整代码
转载于:https://juejin.im/post/5cebd60751882504fc0a65b3
通过 Ruby 买卖Bitcoin:使用开放交易所OceanOne相关推荐
- 用 Ruby 买卖Bitcoin: 闪兑交易所 Exincore
方案一: 通过ExinCore API进行币币交易 Exincore 提供了基于Mixin Network的币币交易API. 你可以支付USDT给ExinCore, ExinCore会以最低的价格,最 ...
- 挂单的java处理方案_用Java在去中心化交易所OceanOne上挂单买卖任意ERC20 token
在上一课中,我们介绍了如何在OceanOne交易比特币.OceanOne支持交易任何Mixin Network上的token,包括所有的ERC20和EOS token,不需要任何手续和费用,直接挂单即 ...
- 股市币市:数据分析与交易所最新公告
投资原则: 极端牛市是攒钱的时候(分位数达到100),极端熊市是攒票的时候(分位数低于40%),股指已经屡创新高,你再不攒钱就不对了,同理,股指屡创新低,你再不入场攒票也就不对了.当然,连接这两端(从 ...
- 股市币市:数据分析与交易所最新公告(20190302)
BTC比特币 1. 比特币分位数数据 2. 比特币交易图 3. 比特币分位数图 4. 比特币筹码分布图 数据来源: https://coinmarketcap.com/currencies/bitco ...
- 股市币市:数据分析与交易所最新公告(20190301)
沪深300 1. 沪深300分位数数据 2. 沪深300股指图 3. 沪深300分位数图 4. 沪深300筹码分布图 数据来源: https://finance.sina.com.cn/stock/ ...
- 股市币市:数据分析与交易所最新公告(20190228)
沪深300 1. 沪深300分位数数据 2. 沪深300股指图 3. 沪深300分位数图 4. 沪深300筹码分布图 数据来源: https://finance.sina.com.cn/stock/ ...
- 股市币市:数据分析与交易所公告(20190227)
沪深300 1. 沪深300分位数数据 2. 沪深300股指图 3. 沪深300分位数图 4. 沪深300筹码分布图 数据来源: https://finance.sina.com.cn/stock/ ...
- 股市币市:数据分析与交易所公告(20190226)
沪深300 1. 沪深300分位数数据 2. 沪深300股指图 3. 沪深300分位数图 4. 沪深300筹码分布图 数据来源: https://finance.sina.com.cn/stock/ ...
- 股市币市:数据分析与交易所公告(20190225)
沪深300 1. 沪深300分位数数据 2. 沪深300股指图 3. 沪深300分位数图 4. 沪深300筹码分布图 数据来源: https://finance.sina.com.cn/stock/ ...
最新文章
- Nat. Mach. Intell. | 基于深度学习预测DNA甲基化位点
- css select-style属性,beautifulsoupcss Select查找不存在特定属性(style for ex)的标记
- MoeCTF 2021Re部分------time2go
- 使用Picasso实现图片圆角和图片圆形
- php计算程序运行时间的简单例子分享
- php 清除缓存的操作,注意 Laravel 清除缓存 PHP artisan cache:clear 的使用
- 确认类是否可以在运行期使用
- 学生汽车网页设计作品静态HTML网页模板源码 大学生汽车网站制作 简单汽车网页设计成品
- 给定一个排序后的数组,包含n个整数,但这个数组已被旋转过多次,找出数组中的某个元素...
- 14 事务控制和锁定语句
- python编程例子-几个python编程例子
- (转)ApplicationDomain
- 百度排名规则及算法(百度内部资料)
- 浅谈医院HIS系统审计
- PJzhang:微软出口管制条例
- jQuery停止动画——stop()方法的使用
- 计算机常见的运算符,常见运算符
- libjvm.so stripped
- 用windbg内核模式调试用户态程序
- Babel转码时报错 Unexpected EOF at line 1 column 2 of the JSON5 data. Still to read:“”