爬取币安公告自动出售将要下架币

爬取币安公告自动出售将要下架币

策略目的:

2月15日,币安发布下架公告,将下架CLOAK、MOD、SALT、SUB、WINGS。公告发出后,所涉及的币立即开始了下跌,一个小时普遍下跌了15%,并且随着知道此消息的用户越来越多,下跌继续且无反弹,至今已经跌了一半。若能在公告发出后第一时间卖出持有的这些币,能挽回不少损失。

本策略运行在发明者量化平台(原BotVS).

思路:

爬取币安公告页面,观察近两次的下架信息,具体格式为“Binance将下架CLOAK、MOD、SALT、SUB、WINGS”、“Binance将下架BCN,CHAT,ICN,TRIG”。

爬虫将以“将下架”为关键词爬取新的下架公告,当然不排除币安更改公告格式,可参考此策略加以完善。由于爬虫任务过于简单,将用简单的JavaScript编写。爬取到下架币后,将检查账户信息,如果存在下架币,以较低的价格全部卖出,如果存在未完成订单,先撤销。直到将所持有的下架币完全卖出。

爬虫代码:

var html = HttpQuery('https://support.binance.com/hc/zh-cn/sections/115000202591-%E6%9C%80%E6%96%B0%E5%85%AC%E5%91%8A')//公告页面
html = html.slice(html.indexOf('article-list'),html.indexOf('pagination')) // 文章列表部分
if(html.indexOf('将下架')>0){
    if(html.slice(html.indexOf('将下架')+3,html.indexOf('</a>')) != title){ //只爬取第一个下架信息
        var title = html.slice(html.indexOf('将下架')+3,html.indexOf('</a>'))
        var downList = title.split('、')
        Log('检测到新公告,将要下架币:', title, '@')//微信推送下架公告
    }
}

撤单代码:

function cancellOrder(){
    var openOrders = exchange.IO('api', 'GET', '/api/v3/openOrders')//获取所有未成交订单
    for (var i=0; i<openOrders.length; i++){
        var order = openOrders[i];
        for (var j=0;j<downList.length;j++){
            if(order.symbol.startsWith(downList[j])){
                var currency = downList[j] + '_' + order.symbol.slice(downList[j].length);
                Log('存在下架币订单,撤销', currency)
                exchange.IO("currency", currency)//撤单需要交易对信息,因此要先切换交易对
                exchange.CancelOrder(order.orderId)
            }
        }
    }
}

检查账户代码:

function checkAccount(){
    var done = false
    while(!done){
        account = _C(exchange.GetAccount)
        done = true
        for (var i=0; i<account.Info.balances.length; i++){
            if(downList.indexOf(account.Info.balances[i].asset)>-1 && parseFloat(account.Info.balances[i].free)>pairInfo[account.Info.balances[i].asset+'BTC'].minQty){
                Log('下架币将会清空', account.Info.balances[i].asset)
                sellAll(account.Info.balances[i].asset, parseFloat(account.Info.balances[i].free))
                done = false
            }
        }
        Sleep(1000)
    }
    Log('售卖完成')
}

下单代码:

var exchangeInfo = JSON.parse(HttpQuery('https://api.binance.com/api/v1/exchangeInfo'))
var pairInfo = {}  //交易对信息,储存交易进度、最小交易量等相关信息,下单是需要
if(exchangeInfo){
    for (var i=0; i<exchangeInfo.symbols.length; i++){
        var info = exchangeInfo.symbols[i];
        pairInfo[info.symbol] = {minQty:parseFloat(info.filters[2].minQty),tickerSize:parseFloat(info.filters[0].tickSize), 
            stepSize:parseFloat(info.filters[2].stepSize), minNotional:parseFloat(info.filters[3].minNotional)}
    }
}else{
    Log('获取交易信息失败')
}
function sellAll(coin, free){
    var symbol = coin + 'BTC'
    exchange.IO("currency", coin+'_BTC') //切换交易对
    var ticker = _C(exchange.GetTicker)
    var sellPrice = _N(ticker.Buy*0.7, parseInt((Math.log10(1.1/pairInfo[symbol].tickerSize))))
    var sellAmount = _N(free, parseInt((Math.log10(1.1/pairInfo[symbol].stepSize))))
    if (sellAmount > pairInfo[symbol].minQty && sellPrice*sellAmount > pairInfo[symbol].minNotional){
        exchange.Sell(sellPrice, sellAmount, symbol)
    }
}

总结:

以上代码只是展示,完整代码可以到发明者量化复制,地址 FMZ - 发明者量化 。公告页面可以一分钟爬取一次,即可抢在普通用户之前卖出。

但也而可能存在一些问题,如爬虫被封、公告格式更改等等。如果币不在币安,也可以参考此策略编写,毕竟下架币将影响所有平台。

发布于 2019-02-18

文章被以下专栏收录