首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过R下Binance订单

如何通过R下Binance订单
EN

Stack Overflow用户
提问于 2021-01-11 06:52:29
回答 2查看 1.4K关注 0票数 0

我正尝试通过R studio,package Binancer下新订单,我已正确连接到Binance Api (我在Binancer::credentials中添加了密钥和密钥),但当我键入以下内容时:

代码语言:javascript
复制
binancer::binance_new_order(symbol="WAVESBTC",side="BUY",type="MARKET",quantity = 1)

我得到这个错误: binancer::binance_new_order(symbol = "WAVESBTC",side = "BUY",:abs(quot - round(quot)) < 1e-10不是真的

我已经尝试更改数量和放置我想购买的waves数量,或我想花费的BTC数量,但我总是得到这个错误。我想按这个顺序把我的比特币100%花在Waves上,我哪里错了?有没有其他方法可以通过R在Binance中下单?

EN

回答 2

Stack Overflow用户

发布于 2021-02-21 16:45:57

使用binanceR下单的方式有几个问题。与Binance本身不同,您不能指定您想要在加密上花费的钱包百分比,而必须计算加密的确切金额。这非常简单,如下所示:

代码语言:javascript
复制
#Fetching the current price of crypto of interest
curr_price <- binance_ticker_price("WAVEBTC")
curr_price <- curr_price$price
#Fetch your wallet balances
avail_btc <- binance_balances()
avail_btc <- filter(avail_btc, asset == "BTC")
avail_btc <- as.numeric(avail_usdt$free)
#Calculate possible coin quantity
buy_quantity<- avail_btc/curr_price

在这种情况下,我们使用所有可用的钱包加密(100%+/-)来计算我们想要购买的加密数量,即数量。你可以通过划分你需要的钱包来选择更少的钱包(即50%的钱包avail_btc/2)。

代码语言:javascript
复制
#Reduce quantity of coins by 0.5% to avoid insufficient balance error NBNB!!
calc_price <- function(price, growth) {
  new_price <- (price*growth)+price
  return(new_price)
}
buy_quantity <- calc_price(buy_quantity, -0.005)

有一些方法可以压缩这个过程,但在我看来,逐步解决问题更好。

现在我们已经确定了正确的数量,我们可以下订单了:

代码语言:javascript
复制
binance_new_order("WAVEBTC", 
    side = "BUY", 
    type = "LIMIT", 
    quantity = buy_quantity, 
    price = b_price, 
    time_in_force = "GTC", 
    test = FALSE) 

但是我们得到了一个非常恼人的错误:Error in binance_new_order("WAVEBTC", side = "BUY", type = "LIMIT", quantity = buy_quant, : abs(quot - round(quot)) < 1e-10 is not TRUE

这是因为所有硬币都有数量或价格的大小限制,您想要传递给Binance。我不确定,但是Binance会帮你解决这个问题,这就是为什么你在那里从来没有遇到过这个问题。例如:WAVEBTC将接受数量为3.2234但不接受3.223456的数量,您将看到额外的两个小数...您可以手动尝试猜测数量或价格的正确格式,但对于自动化来说,这是一项痛苦的工作。

解决方案很简单,但并不明显。我必须访问binanceR的源代码,并找到生成错误的部分。这里分别是数量和价格:

代码语言:javascript
复制
#Price
quot <- (price - filters[filterType == 'PRICE_FILTER', minPrice]) / filters[filterType == 'PRICE_FILTER', tickSize]
            stopifnot(abs(quot - round(quot)) < 1e-10)

#Quantity
quot <- (buy_quantity - filters[filterType == 'LOT_SIZE', minQty]) / filters[filterType == 'LOT_SIZE', stepSize]
    stopifnot(abs(quot - round(quot)) < 1e-10)

这些代码基本上检查您的数量或价格是否有任何不需要的小数。如果我们使用"ONTUSDT“在一个例子上运行它,你会看到,如果我们使用332.44543buy_quantity并计算quot,我们得到的值是33243.54。如果我们运行stopifnot(abs(quot - round(quot)) < 1e-10),我们会得到错误。但是为什么呢?不符合错误代码标准的abs(quot - round(quot)0.457的值是什么,这就是我们得到错误的原因。如果将buy_quantity更改为332.44,则不会收到错误消息,因为我们的abs(quot - round(quot)值为0。这是解决问题的关键!

我们需要做的是确定我们的硬币的“正确”小数位数是多少。为此,我们将使用一个简单的函数来计算数字和/或字符的小数位置(您将看到原因):

代码语言:javascript
复制
decimalplaces <- function(x) {
  if (class(x)=="character") {
    x<-gsub("(.*)(\\.)|([0]*$)","",x)
    nchar(x)
  } else if (abs(x - round(x)) > .Machine$double.eps^0.5) {
    nchar(strsplit(sub('0+$', '', as.character(x)), ".", fixed = TRUE)[[1]][[2]])
  } else {
    return(0)
  }
}

接下来,我们需要获取这些代码使用的过滤器,以确定我们的数量或价格是否正确:

代码语言:javascript
复制
filters <- binance_filters("WAVEBTC")

现在我们需要将方程重新格式化为quot,这样我们就可以计算出未知量,如下所示(请记住,我们需要一个值为0quot ):

代码语言:javascript
复制
quantity <- (quot*filters[filterType == 'LOT_SIZE', stepSize])+filters[filterType == 'LOT_SIZE', minQty])
#Remember to change quot to 0
quantity <- (0*filters[filterType == 'LOT_SIZE', stepSize])+filters[filterType == 'LOT_SIZE', minQty])
#Since anything * by 0 = 0, our final equation is: 
quantity <- filters[filterType == 'LOT_SIZE', minQty]

再次以"ONTUSDT“为例,quantity值将为0.01。这是您的buy_quantity需要的小数位数。所以很简单:

代码语言:javascript
复制
#Sometimes the value will be in scientific notation, so we convert it which creates a character string and this is why the decimalplaces function accommodates numbers and character strings.  
t <- format(quantity, scientific = FALSE)
dec <- decimalplaces(t)
buy_quantity<- round(buy_quantity, digits = dec)

注意!对于您的价格,请遵循相同的流程!

如果我们在错误代码中使用buy_quantity,您将看到我们没有收到错误消息,并且下单正常!

代码语言:javascript
复制
binance_new_order("WAVEBTC", 
                  side = "BUY", 
                  type = "LIMIT", 
                  quantity = buy_quantity, 
                  price = b_price, 
                  time_in_force = "GTC", 
                  test = TRUE)

祝你好运,交易安全!

票数 1
EN

Stack Overflow用户

发布于 2021-06-08 02:58:26

在这种情况下,我认为问题出在type="MARKET"筛选器中,在大多数情况下,quot最终为Inf赋值,因此它不会传递该类型的binance_new_order条件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65659346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档