Commit 6ac5c75f by rongjun

bug

parent 35b378b1
...@@ -7,14 +7,14 @@ const agent = proxy ? new SocksProxyAgent(proxy) : null; ...@@ -7,14 +7,14 @@ const agent = proxy ? new SocksProxyAgent(proxy) : null;
const request = require('request'); const request = require('request');
// const host = 'https://api.kucoin.com'; // const host = 'https://api.kucoin.com';
const host = 'https://api.kucoin.com'; const host = 'https://api.kucoin.com';
const CrytoJS = require('crypto-js'); const CryptoJS = require('crypto-js');
const constants = require('./constants'); const constants = require('./constants');
class biboxApi { class biboxApi {
constructor() { constructor() {
this.apiKey = '61e6fa70476199d7245e2993b01d33ef14cb24dd'; this.apiKey = '5ba054d2e0abb830dee81e1d';
this.apiSecret = '269bdc93d18f9215814a6a25dc38a4a8915cd63a'; this.apiSecret = 'baa55ba9-7290-431e-9fd4-42aa4598887f';
this.allowRequest = true; this.allowRequest = true;
} }
...@@ -57,6 +57,24 @@ class biboxApi { ...@@ -57,6 +57,24 @@ class biboxApi {
// }) // })
// } // }
transform(obj) {
var str = [];
for (var p in obj)
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
return str.join("&");
}
objKeySort(obj) {//排序的函数
var newkey = Object.keys(obj).sort();
//先用Object内置类的keys方法获取要排序对象的属性名,再利用Array原型上的sort方法对获取的属性名进行排序,newkey是一个数组
var newObj = {};//创建一个新的对象,用于存放排好序的键值对
for (var i = 0; i < newkey.length; i++) {//遍历newkey数组
newObj[newkey[i]] = obj[newkey[i]];//向新创建的对象中按照排好的顺序依次增加键值对
}
return newObj;//返回排好序的新对象
}
_publicRequest(path, params, callback) { _publicRequest(path, params, callback) {
if(!this.allowRequest){ if(!this.allowRequest){
callback({code:"-2",message:"出现超频情况,暂停提交请求"}); callback({code:"-2",message:"出现超频情况,暂停提交请求"});
...@@ -98,19 +116,33 @@ class biboxApi { ...@@ -98,19 +116,33 @@ class biboxApi {
}); });
} }
_request(method, path, cmd, params, callback) { _request(method, path, params, callback) {
if(!this.allowRequest){ if(!this.allowRequest){
callback({code:"-2",message:"出现超频情况,暂停提交请求"}); callback({code:"-2",message:"出现超频情况,暂停提交请求"});
return; return;
} }
const url = host + path; let url = host + path;
const cmdStr = JSON.stringify([{"cmd": cmd, "body": params}]); const nonce = new Date().getTime();
const sign = CrytoJS.HmacMD5(cmdStr, this.apiSecret).toString(); const strParams = this.transform(this.objKeySort(params));
const form = {"cmds": cmdStr, "apikey": this.apiKey, "sign": sign}; const strForSign = path + '/' + nonce + '/' + strParams;
const strForSign2 = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(strForSign))
const sign = CryptoJS.HmacSHA256(strForSign2, this.apiSecret).toString(CryptoJS.enc.Hex);
const headers = {
"Accept-Language": "zh_CN",
'KC-API-KEY': this.apiKey,
'KC-API-NONCE': nonce,
'KC-API-SIGNATURE': sign
}
console.log(headers)
const requestParams = {}; const requestParams = {};
let form = params
if (method === 'GET'){
url += '?' + this.transform(params);
form = {}
}
requestParams["url"] = url; requestParams["url"] = url;
requestParams["method"] = method; requestParams["method"] = method;
requestParams["headers"] = headers;
requestParams["form"] = form; requestParams["form"] = form;
requestParams["timeout"] = 10000; requestParams["timeout"] = 10000;
requestParams["forever"] = true; requestParams["forever"] = true;
...@@ -120,25 +152,19 @@ class biboxApi { ...@@ -120,25 +152,19 @@ class biboxApi {
} else { } else {
try { try {
const result = JSON.parse(body); const result = JSON.parse(body);
if (result.error) { if (result.success && result.code === 'OK') {
callback(result.error, null); callback(null, result);
if(result.error.code == '2091' && this.allowRequest){
this.allowRequest = false;
console.log("请求超频,将会暂停发送请求");
setTimeout(()=>{
this.allowRequest = true;
},1000 * 60 * 5);
}
} else { } else {
callback(null, result.result[0]); callback(result, null);
} }
} catch (e) { } catch (e) {
console.error("parse body时出错"); console.error("parse body时出错");
console.error("status code:" + response.statusCode + ",body:" + response.body); console.error("status code:" + response.statusCode + ",body:" + response.body);
callback(e, null)
// if (response.statusCode === 429) { // if (response.statusCode === 429) {
// callback({statusCode: response.statusCode}) // callback({statusCode: response.statusCode})
// } else { // } else {
callback(e, null); // callback(e, null);
// } // }
} }
} }
...@@ -155,44 +181,40 @@ class biboxApi { ...@@ -155,44 +181,40 @@ class biboxApi {
//交易类型,1-市价单,2-限价单 //交易类型,1-市价单,2-限价单
//交易方向,1-买,2-卖 //交易方向,1-买,2-卖
const params = { const params = {
pair: symbol, symbol: symbol,
account_type: 0, type: side === constants.OrderSideBuy ? 'BUY' : 'SELL',
order_type: 2,
order_side: side === constants.OrderSideBuy ? 1 : 2,
pay_bix: 1, pay_bix: 1,
price, price,
amount, amount,
// money:parseFloat(price) * parseFloat(amount)
}; };
this._request("POST", "/v1/orderpending", "orderpending/trade", params, callback) this._request("POST", "/v1/order", params, callback)
} }
balance(callback) { balance(limit, page, callback) {
this._request("POST", "/v1/transfer", "transfer/assets", {select: 1}, callback); this._request("GET", "/v1/account/balances",{limit: limit || 20, page: page || 1}, callback);
} }
getTrades(symbol, callback) { getTrades(symbol, callback) {
const params = { callback(null, null)
"cmd": "deals",
"pair": symbol,
"size": 10
}
this._publicRequest("/v1/mdata", params, callback);
} }
searchOrder(orderId, callback) { searchOrder(orderId, symbol, side, callback) {
const params = { const params = {
id: orderId symbol: symbol,
type: side === constants.OrderSideBuy ? 'BUY' : 'SELL',
orderOid: orderId
} }
this._request("POST", "/v1/orderpending", "orderpending/order", params, callback); this._request("GET", "/v1/order/detail", params, callback);
} }
cancelOrder(orderId, callback) { cancelOrder(orderId, symbol, side, callback) {
const params = { const params = {
orders_id: orderId symbol: symbol,
orderOid: orderId,
type: side === constants.OrderSideBuy ? 'BUY' : 'SELL',
} }
this._request("POST", "/v1/orderpending", "orderpending/cancelTrade", params, callback); this._request("POST", "/v1/cancel-order", params, callback);
} }
fetchHistorOrders(page,size,symbol,side,callback){ fetchHistorOrders(page,size,symbol,side,callback){
......
const WebSocket = require('ws');
const SocksProxyAgent = require('socks-proxy-agent');
const proxy = process.env.agent;
const agent = proxy ? new SocksProxyAgent(proxy) : null;
// const zlib = require('zlib');
const wsUrl = 'wss://api.lbkex.com/ws/V2/';
const request = require('request');
const host = 'https://api.lbkex.com';
const CrytoJS = require('crypto-js');
const constants = require('./constants');
class lbankApi {
constructor() {
this.apiKey = '926468ad-9a27-4226-ae05-b23a22520f1d';
this.apiSecret = 'MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAK0KVME06yIf/HeFyCnsVXX39UsUogBJr1HYgD6K3AgCBFLDq2ItF/xPrn1smkG8IiIl2qjxNIkykc74BWNGDhboftrPniPz+eshl+zWkTb1QEizbIs6h4Rcjfd1z0KF0/lgh5EnrMRT/V6x9JVkg9bSzOZPLNnWtX9nkJnE32UNAgMBAAECgYA9tnqFsWbOc9PpmJfLg9Ly0Kz1yvT/30eci/co1wMkA/wgvFIKIIT2YkCb0LivCvatcQyrxeJzr8paow/g2OI66Qw4eSfyKXjp5H+IfZ1xgP1hF+HnwHrP+CAGKa/PgqRhD9CTrU7a9keKeJ7Kuj1Q6iA3MucO+yvL573BzHanwQJBANtvjxj/PqCFjLXqM0qt9Tq83bS93obU1HaPXDXeQjr91CE37+vMLxyx5Xwr3IGgEI82cLCyUMmA2IX6ga3E1/0CQQDJ37Brma3Ezeo9WsHkDv1xquFIRjXyhzBG57NynAFT8IMcWoiO+GyXLl/leaZrZOU71Ot1gygP29LiOasbfaZRAkB7vte1wwswPt/xHpe6P4uRijyE1qYM5yzBh2r6vdIfrlDYQtE76jOPPQsrERkSyI9OE+dM3eINIGn6dCB5PA6JAkA1G4TU+cvuH2HFHFAvyAXC1nqHwfjFQe1gaeoad5Id3AMR/Xs5aX9f0lJmEzfFvvhTYjNDaeqrKWB0JUmvZMHRAkEAqbmHUVn8qOqeX7cSxJPgmquEvq0wAD5Wl8cYSM0hloB2EWQ0Z9BGliRq0u0j/qdM1GK/xyAPzBIuhD5/McldZQ==';
}
subscribeSymbols(symbols, callback) {
const channels = symbols.map((item) => {
return JSON.stringify({action: "subscribe", subscribe: "depth", depth: 10, pair: item});
});
const wss = new WebSocket(wsUrl, {agent});
wss.on('open', () => {
console.log("websocket on open");
for (let channel of channels) {
wss.send(channel);
}
});
wss.on('message', (data) => {
const response = JSON.parse(data);
if (response['type'] === "depth") {
callback(null, response);
} else if(response['ping']){
console.log('lbank ping')
wss.send(JSON.stringify({"action": "pong", "pong": response['ping']}));
} else {
console.log(data);
callback(response, null);
}
});
wss.on('error', (error) => {
console.log(" websocket error:");
console.log(error);
})
wss.on('close', () => {
console.log("websocket closed");
this.subscribeSymbols(symbols, callback);
})
}
transform(obj) {
var str = [];
for (var p in obj)
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
return str.join("&");
}
objKeySort(obj) {//排序的函数
var newkey = Object.keys(obj).sort();
//先用Object内置类的keys方法获取要排序对象的属性名,再利用Array原型上的sort方法对获取的属性名进行排序,newkey是一个数组
var newObj = {};//创建一个新的对象,用于存放排好序的键值对
for (var i = 0; i < newkey.length; i++) {//遍历newkey数组
newObj[newkey[i]] = obj[newkey[i]];//向新创建的对象中按照排好的顺序依次增加键值对
}
return newObj;//返回排好序的新对象
}
_publicRequest(path, params, callback) {
let url = host + path;
if (params) {
url += "?";
const keys = Object.keys(params);
for (let i = 0; i < keys.length; i++) {
url += `${keys[i]}=${params[keys[i]]}`;
if (i !== keys.length - 1) {
url += "&";
}
}
}
const options = {
url,
method: 'GET',
timeout: 8000,
forever: true,
};
request(options, (error, response, body) => {
if (error) {
callback(error);
} else {
try {
const result = JSON.parse(body);
callback(null, result);
} catch (e) {
callback(e, null);
}
}
});
}
_request(method, path, params, callback) {
const url = host + path;
params['apikey'] = this.apiKey;
const md5Str = CrytoJS.MD5(this.transform(this.objKeySort(params))).toString();
const sign = CrytoJS.HmacSHA256(md5Str, this.apiSecret).toString();
params['sign'] = sign;
const requestParams = {}
requestParams["url"] = url;
requestParams["method"] = method;
requestParams["form"] = params;
requestParams["timeout"] = 10000;
requestParams["forever"] = true;
request(requestParams, (error, response, body) => {
if (error) {
callback(error);
} else {
try {
const result = JSON.parse(body);
if (result.result) {
callback(result, null);
} else {
callback(null, result);
}
} catch (e) {
console.error("parse body时出错");
console.error("status code:" + response.statusCode + ",body:" + response.body);
// if (response.statusCode === 429) {
// callback({statusCode: response.statusCode})
// } else {
callback(e, null);
// }
}
}
});
}
fetchSymbols(callback) {
this._publicRequest('/v1/ticker.do', {"symbol": 'all'}, callback);
}
order(price, amount, symbol, side, callback) {
//账户类型,0-普通账户,1-信用账户
//交易类型,1-市价单,2-限价单
//交易方向,1-买,2-卖
const params = {
type: side,
symbol,
price,
amount
// money:parseFloat(price) * parseFloat(amount)
};
this._request("POST", "/v1/create_order.do", params, callback)
}
balance(callback) {
// this._request("POST", "/v1/user_info.do", {}, callback);
const result = {
"result": "true",
"info": {
"freeze": {},
"asset": {},
"free": {}
}
}
callback(null, result);
}
getTrades(symbol, callback) {
const params = {
"symbol": symbol,
"size": 10
}
this._publicRequest("/v1/trades.do", params, callback);
}
searchOrder(orderId, symbol, callback) {
const params = {
order_id: orderId,
symbol
}
this._request("POST", "/v1/orders_info.do", params, callback);
}
cancelOrder(orderId, symbol, callback) {
const params = {
orders_id: orderId,
symbol
}
this._request("POST", "/v1/cancel_order.do", params, callback);
}
fetchHistorOrders(page, size, symbol, side, callback) {
const params = {
symbol: symbol,
current_page: page,
page_length: size,
};
this._request("POST", "/v1/orders_info_history.do", params, callback);
}
}
module.exports = lbankApi;
\ No newline at end of file
...@@ -224,25 +224,25 @@ class BaseCollector { ...@@ -224,25 +224,25 @@ class BaseCollector {
runStrategy3(){ runStrategy3(){
console.log("启动成功"); console.log("启动成功");
this._fetchSymbols(this._handleFetchSymbolResult.bind(this)); // this._fetchSymbols(this._handleFetchSymbolResult.bind(this));
// setInterval(()=>{ setInterval(()=>{
// redisClient.get(this.machine + "_STOP", (err, value) => { redisClient.get(this.machine + "_STOP", (err, value) => {
// if (value) { if (value) {
// this.allowTrade = false; this.allowTrade = false;
// console.log("滑点过多,停止交易"); console.log("滑点过多,停止交易");
// } else { } else {
// this.allowTrade = true; this.allowTrade = true;
// } }
// }); });
// },1000 *10); },1000 *10);
// setInterval(()=>{ setInterval(()=>{
// this._runMonitor((data)=>{ this._runMonitor((data)=>{
// if(data){ if(data){
// this.balanceMap = {...data}; this.balanceMap = {...data};
// redisClient.set(this.machine,JSON.stringify(this.balanceMap),"EX",30); redisClient.set(this.machine,JSON.stringify(this.balanceMap),"EX",30);
// } }
// }); });
// },this._runMonitorInterval()); },this._runMonitorInterval());
} }
runStrategy2(){ runStrategy2(){
......
const BaseCollector = require('./baseCollector'); const BaseCollector = require('./baseCollector');
const baseCurrencies = ["ETH","BTC","USDT", "NEO", "KCS"]; const baseCurrencies = ["ETH","BTC","USDT", "NEO", "KCS"];
const restCurrencies = ["PRA","AAC","AT","RED","BU","QTUM","EOSDAC","HPB","ORME","TRX","TTC", "USDT","BTC","ETH", "NEO", "KCS", ]; const restCurrencies = ["PRA","AAC","AT","RED","BU","QTUM","EOSDAC","HPB","ORME","TRX","TTC", "USDT","BTC","ETH", "NEO", "KCS", ];
// const machine = process.env['MACHINE']; const machine = process.env['MACHINE'];
const machine = 'K'
const biboxApi = require('./api_kucoin'); const biboxApi = require('./api_kucoin');
const zlib = require('zlib'); const zlib = require('zlib');
const Strategy3MaxAmountMap = { const Strategy3MaxAmountMap = {
USDT: 1000, USDT: 3000,
BTC: 0.15, BTC: 0.3,
ETH: 1.5, ETH: 2,
BIX:600 NEO: 0,
KCS: 0,
} }
class BiboxCollector extends BaseCollector{ class BiboxCollector extends BaseCollector{
...@@ -66,7 +66,7 @@ class BiboxCollector extends BaseCollector{ ...@@ -66,7 +66,7 @@ class BiboxCollector extends BaseCollector{
// restSymbols.push(symbol); // restSymbols.push(symbol);
// } // }
// } // }
const perInterval = 10; const perInterval = 8;
const totalInterval = perInterval * restSymbols.length; const totalInterval = perInterval * restSymbols.length;
setInterval(()=>{ setInterval(()=>{
const sortedSymbols = restSymbols.sort(()=>{ const sortedSymbols = restSymbols.sort(()=>{
...@@ -89,36 +89,56 @@ class BiboxCollector extends BaseCollector{ ...@@ -89,36 +89,56 @@ class BiboxCollector extends BaseCollector{
} }
},totalInterval); },totalInterval);
} }
_runMonitor(callback){ _runMonitor(callback){
callback(null) let balanceMap = {};
// let need = 1;
// this.api.balance((error,result)=>{ this.api.balance(20, 1, (error,result)=>{
// if(error){ if(error){
// console.error("get balance error"); console.error("get balance by rest error:");
// console.error(error); console.error(error);
// callback(null); return;
// }else{ }else{
// const balanceList = result.free; const balanceList = result.data.datas;
// const balanceMap = {}; for(let detail of balanceList){
// for(let detail in balanceList){ balanceMap[detail.coinType] = {available:(detail.balance - detail.freezeBalance),onOrder:detail.freezeBalance};
// balanceMap[detail] = {available:balanceList[detail],onOrder:0}; }
// } let pageNos = result.data.pageNos
// const freezes = result.info.freeze; if(pageNos > 1){
// for(let fz in freezes){ need = pageNos - 1;
// if(balanceMap[fz]){ let amount = 0
// balanceMap[fz]['onOrder'] = freezes[fz]; for(let i=2;i<=pageNos;i++){
// }else{ this.api.balance(20, i, (error,result)=>{
// balanceMap[fz] = {available:0,onOrder:freezes[fz]}; amount += 1;
// } if(error){
// } console.error("get balance by rest error:");
// callback(balanceMap); console.error(error);
// } return;
// }) }else{
const balanceList = result.data.datas;
for(let detail of balanceList){
balanceMap[detail.coinType] = {available:(detail.balance - detail.freezeBalance),onOrder:detail.freezeBalance};
}
}
if(need === amount){
callback(balanceMap)
}
})
}
}else{
const balanceList = result.data.datas;
for(let detail of balanceList){
balanceMap[detail.coinType] = {available:(detail.balance - detail.freezeBalance),onOrder:detail.freezeBalance};
}
callback(balanceMap)
}
}
})
} }
getSymbol(fromCurrency,toCurrency){ getSymbol(fromCurrency,toCurrency){
let symbolDetail = this._getSymbolDetail(fromCurrency,toCurrency); let symbolDetail = this._getSymbolDetail(fromCurrency,toCurrency);
return symbolDetail.pair; return symbolDetail.symbol;
} }
getFeeRate(fromCurrency,toCurrency){ getFeeRate(fromCurrency,toCurrency){
return 0.0009; return 0.0009;
...@@ -127,8 +147,8 @@ class BiboxCollector extends BaseCollector{ ...@@ -127,8 +147,8 @@ class BiboxCollector extends BaseCollector{
//有可能会由于数值过小,传进来的amount被表示为科学计数法法 //有可能会由于数值过小,传进来的amount被表示为科学计数法法
const amountStr = parseFloat(amount).toFixed(10); const amountStr = parseFloat(amount).toFixed(10);
const nums = amountStr.split('.'); const nums = amountStr.split('.');
if(nums.length ===2 && nums[1].length>4){ if(nums.length ===2 && nums[1].length>8){
return nums[0]+"."+nums[1].slice(0,4); return nums[0]+"."+nums[1].slice(0,8);
} }
return amount; return amount;
} }
......
const Strategy3 = require('./strategy3'); const Strategy3 = require('./strategy3');
const machine = process.env['MACHINE']; const machine = process.env['MACHINE'];
const Order = require('./order'); const Order = require('./order_kucoin');
const constants = require('./constants'); const constants = require('./constants');
const STRATEGY3_RETURN_MIN_AMOUNT_MAP = { const STRATEGY3_RETURN_MIN_AMOUNT_MAP = {
USDT: 20, USDT: 600,
BTC: 0.002, BTC: 0.1,
ETH: 0.03, ETH: 1,
BIX: 15, NEO: 30,
KCS: 600,
}; };
class BiboxStrategy3 extends Strategy3 { class BiboxStrategy3 extends Strategy3 {
...@@ -83,9 +84,7 @@ class BiboxStrategy3 extends Strategy3 { ...@@ -83,9 +84,7 @@ class BiboxStrategy3 extends Strategy3 {
if (order.executedQty === order.origQty) { if (order.executedQty === order.origQty) {
console.log("买入全部成交"); console.log("买入全部成交");
createdBuyOrder = true; createdBuyOrder = true;
setTimeout(()=>{
sellOrder(); sellOrder();
},95);
returnOrder(); returnOrder();
} else if (parseFloat(order.executedQty) > 0) { } else if (parseFloat(order.executedQty) > 0) {
returnAmount = parseFloat(returnAmount) * parseFloat(order.executedQty) / parseFloat(amount); returnAmount = parseFloat(returnAmount) * parseFloat(order.executedQty) / parseFloat(amount);
...@@ -95,9 +94,7 @@ class BiboxStrategy3 extends Strategy3 { ...@@ -95,9 +94,7 @@ class BiboxStrategy3 extends Strategy3 {
order.remark = "部分成交@amount " + order.executedQty + ";"; order.remark = "部分成交@amount " + order.executedQty + ";";
createdBuyOrder = true; createdBuyOrder = true;
if (parseFloat(amount) > 0) if (parseFloat(amount) > 0)
setTimeout(()=>{
sellOrder(); sellOrder();
},95);
if (parseFloat(returnAmount) > 0) if (parseFloat(returnAmount) > 0)
returnOrder(); returnOrder();
else { else {
...@@ -118,7 +115,9 @@ class BiboxStrategy3 extends Strategy3 { ...@@ -118,7 +115,9 @@ class BiboxStrategy3 extends Strategy3 {
// } // }
// } // }
} }
_isFeeDeducedByOther(){
return false;
}
_getTrades(order, callback) { _getTrades(order, callback) {
callback([]); callback([]);
} }
...@@ -128,7 +127,7 @@ class BiboxStrategy3 extends Strategy3 { ...@@ -128,7 +127,7 @@ class BiboxStrategy3 extends Strategy3 {
} }
_getMinTradeInterval(){ _getMinTradeInterval(){
return 5000; return 2*60*1000;
} }
_needConsiderDepthCount(){ _needConsiderDepthCount(){
......
const BaseCollector = require('./baseCollector');
const baseCurrencies = ["BIX","ETH","BTC","USDT"];
const machine = process.env['MACHINE'];
const biboxApi = require('./api_lbank');
const zlib = require('zlib');
const Strategy3MaxAmountMap = {
USDT: 1000,
BTC: 0.15,
ETH: 1.5,
BIX:600
}
class BiboxCollector extends BaseCollector{
constructor(wantedSymbols){
super("LBANK",baseCurrencies,machine,wantedSymbols);
this.api = new biboxApi('','');
}
_convertSymbolName(symbol){
return symbol.replace("_","").toUpperCase();
}
_fetchSymbols(callback){
this.api.fetchSymbols((error,data)=>{
if(error){
console.error("fetch symbol error");
console.error(error);
this._fetchSymbols(callback);
}else{
const symbolDetails = data;
const symbolMap = {};
for(let detail of symbolDetails){
symbolMap[detail.symbol] = detail;
}
callback(null,symbolMap);
}
})
}
_runMonitorInterval(){
return 10 *1000;
}
_subscribeSymbols(symbols,callback,subscribeDepth){
this.api.subscribeSymbols(symbols,(error,data)=>{
if(error){
console.error("subscribe error");
console.error(error);
}else{
const symbol = data['pair'];
// const symbol = result.pair.replace("_","");
const timeStamp = data['TS'];
const depth = data['depth'];
const asks = depth.asks.slice(0,subscribeDepth).map((item)=>[item[0],item[1]]);
const bids = depth.bids.slice(0,subscribeDepth).map((item)=>[item[0],item[1]]);
callback(asks, bids, symbol, timeStamp);
}
})
}
_runMonitor(callback){
this.api.balance((error,result)=>{
if(error){
console.error("get balance error");
console.error(error);
callback(null);
}else{
const balanceList = result.free;
const balanceMap = {};
for(let detail in balanceList){
balanceMap[detail] = {available:balanceList[detail],onOrder:0};
}
const freezes = result.info.freeze;
for(let fz in freezes){
if(balanceMap[fz]){
balanceMap[fz]['onOrder'] = freezes[fz];
}else{
balanceMap[fz] = {available:0,onOrder:freezes[fz]};
}
}
callback(balanceMap);
}
})
}
getSymbol(fromCurrency,toCurrency){
let symbolDetail = this._getSymbolDetail(fromCurrency,toCurrency);
return symbolDetail.pair;
}
getFeeRate(fromCurrency,toCurrency){
return 0.001;
}
processAmount(fromCurrency,toCurrency,amount){
//有可能会由于数值过小,传进来的amount被表示为科学计数法法
const amountStr = parseFloat(amount).toFixed(10);
const nums = amountStr.split('.');
if(nums.length ===2 && nums[1].length>4){
return nums[0]+"."+nums[1].slice(0,4);
}
return amount;
}
processPrice(fromCurrency,toCurrency,price){
// const amountStr = price+'';
// const nums = amountStr.split('.');
// if(nums.length ===2 && nums[1].length>4){
// return nums[0]+"."+nums[1].slice(0,4);
// }
return price;
}
getCurrencyMaxReturnAmount(currency){
const balance = this.getCurrencyBalance(currency);
return Math.min(Strategy3MaxAmountMap[currency],balance);
}
getDepthPrintStr(fromCurrency,toCurrency,depth=1){
return super.getDepthPrintStr(fromCurrency,toCurrency,3);
}
}
module.exports = BiboxCollector;
const Strategy3 = require('./strategy3');
const machine = process.env['MACHINE'];
const Order = require('./order');
const constants = require('./constants');
const STRATEGY3_RETURN_MIN_AMOUNT_MAP = {
USDT: 20,
BTC: 0.002,
ETH: 0.03,
BIX: 15,
};
class BiboxStrategy3 extends Strategy3 {
constructor(collector) {
super(collector, machine);
this.orderService = new Order();
}
_doTrade(baseCurrency1, midCurrency, baseCurrency2, buyPrice, sellPrice, returnPrice, amount, returnAmount, doSaveOrder) {
const buySymbol = this.collector.getSymbol(baseCurrency1, midCurrency);
const buyStartTime = Date.now();
const collector = this.collector;
const orderService = this.orderService;
const sellSymbol = this.collector.getSymbol(midCurrency, baseCurrency2);
const returnSymbol = this.collector.getSymbol(baseCurrency2, baseCurrency1);
let createdSellOrder = false;
let createdBuyOrder = false;
let retryTime = 8;
function sellOrder() {
console.log("sell@" + sellSymbol + " amount:" + amount + " price:" + sellPrice);
const sellStartTime = Date.now();
orderService.order(
sellSymbol, sellPrice, amount, constants.OrderSideSell
, (error, order) => {
if (error) {
if(error.code === "2027"){
if(retryTime>0 && !createdSellOrder){
console.log("提示余额不足,再次尝试");
retryTime -- ;
// setTimeout(()=>{
sellOrder();
// },50);
}else if(!createdSellOrder && createdBuyOrder){
console.log("已没有重试次数,但是买单已创建成功,继续重试");
setTimeout(()=>{
sellOrder();
},500);
}
}
console.error("sell error:" + JSON.stringify(error) + ";sell price:" + sellPrice + " @amount:" + amount);
return;
}
createdSellOrder = true;
doSaveOrder(order, midCurrency, baseCurrency2, constants.OrderTypeSell);
console.log("sell start@" + sellStartTime + " end@" + Date.now() + " symbol:" + sellSymbol);
})
}
function returnOrder() {
console.log("return@" + returnSymbol + " amount:" + returnAmount + " price:" + returnPrice);
const returnStartTime = Date.now();
orderService.order(returnSymbol, returnPrice, returnAmount, collector.getTradeSide(baseCurrency2, baseCurrency1)
, (error, order) => {
if (error) {
console.error("return error:");
console.error(error);
return;
}
console.log("return start@" + returnStartTime + " end@" + Date.now() + " symbol:" + returnSymbol);
doSaveOrder(order, baseCurrency2, baseCurrency1, constants.OrderTypeReturn);
}, true);
}
console.log("buy@" + buySymbol + " amount:" + amount + " price:" + buyPrice);
orderService.FOKLikeOrder(buySymbol, buyPrice, amount, constants.OrderSideBuy
, (error, order) => {
if (error) {
console.error("buy error:");
console.error(error);
return;
}
console.log("buy start@" + buyStartTime + " end@" + Date.now() + " symbol:" + buySymbol);
if (order.executedQty === order.origQty) {
console.log("买入全部成交");
createdBuyOrder = true;
setTimeout(()=>{
sellOrder();
},95);
returnOrder();
} else if (parseFloat(order.executedQty) > 0) {
returnAmount = parseFloat(returnAmount) * parseFloat(order.executedQty) / parseFloat(amount);
returnAmount = collector.processAmount(baseCurrency2, baseCurrency1, returnAmount);
amount = collector.processAmount(midCurrency, baseCurrency2, parseFloat(order.executedQty));
console.log(`买入部分成交${order.executedQty} 回归量调整为${returnAmount}`);
order.remark = "部分成交@amount " + order.executedQty + ";";
createdBuyOrder = true;
if (parseFloat(amount) > 0)
setTimeout(()=>{
sellOrder();
},95);
if (parseFloat(returnAmount) > 0)
returnOrder();
else {
console.log("回归数量太小,不执行回归");
}
} else {
console.warn("买入失败");
retryTime = 0;
}
doSaveOrder(order, baseCurrency1, midCurrency, constants.OrderTypeBuy);
})
// if(!this.collector.isBaseCurrency(midCurrency) && this.collector.getCurrencyBalance(midCurrency,true) < amount){
// for(let i=0;i<2;i++){
// setTimeout(()=>{
// sellOrder();
// },i*200+100);
// }
// }
}
_getTrades(order, callback) {
callback([]);
}
_getMinReturnAmount(currency) {
return STRATEGY3_RETURN_MIN_AMOUNT_MAP[currency] || 1;
}
_getMinTradeInterval(){
return 5000;
}
_needConsiderDepthCount(){
return [[2,1],[3,2,1],[2,1]];
}
}
const BiboxCollector = require('./lbankCollector');
const collector = new BiboxCollector(null);
collector.runStrategy3();
const strategy3 = new BiboxStrategy3(collector);
strategy3.run();
...@@ -136,7 +136,7 @@ class Order { ...@@ -136,7 +136,7 @@ class Order {
timeout = 2000; timeout = 2000;
} }
setTimeout(() => { setTimeout(() => {
this.api.searchOrder(orderId, this._handleFOKSearchResult.bind(this, orderId, finalCallback)); this.api.searchOrder(orderId, this.handleSearchResult.bind(this, orderId, callback));
}, timeout); }, timeout);
} }
if(!result.result.amount){ if(!result.result.amount){
......
const constants = require('./constants');
const biboxApi = require('./api_kucoin');
const StateFilled = 3;
const StateNew = 1;
const StatePartiallyFilled = 2;
const StatePartiallyCancelled = 4;
const StateCancelled = 5;
const StateCancelling = 6;
function returnFakeOrder(symbol, price, amount) {
return {
orderId: "testOrder",
price: price,
status: constants.OrderStatusCanceled,
transactTime: Date.now(),
origQty: amount,
executedQty: 0,
symbol: symbol,
}
}
function convertToRecordOrder(order) {
let status = constants.OrderStatusNew;
if(!order.isActive){
status = constants.OrderStatusCanceled;
}else{
if(order.pendingAmount === 0){
status = constants.OrderStatusFilled;
}
// if(order.dealAmount === 0){
// status = constants.OrderStatusNew;
// }
if(order.dealAmount > 0 && order.pendingAmount >0){
status = constants.OrderStatusPartiallyFilled;
}
}
return {
orderId: order.orderOid + '',
price: order.dealPriceAverage,
status: status,
transactTime: order.createdAt,
origQty: order.pendingAmount + order.dealAmount,
executedQty: order.dealAmount,
symbol: order.coinType + '-' + order.coinTypePair,
type: order.type,
}
}
function isTimeOutError(error){
return error.code === 'ESOCKETTIMEDOUT' || error.code === 'ETIMEDOUT';
}
class Order {
constructor() {
this.api = new biboxApi();
}
_handleFOKSearchResult(orderId, symbol, side, finalCallback, error, result) {
if (error) {
console.error("搜索订单出错");
console.error(error);
let timeout = 100;
if(error.code == '2091' || error.code == '4003'){
console.log("2秒后再继续搜索");
timeout = 2000;
}
setTimeout(() => {
this.api.searchOrder(orderId, symbol, side, this._handleFOKSearchResult.bind(this, orderId, symbol, side, finalCallback));
}, timeout);
return;
}
const order = result.data || {};
if(!order.dealAmount & !order.pendingAmount){
console.error("没有返回amount 和deal amount字段,继续搜索");
this.api.searchOrder(orderId, symbol, side, this._handleFOKSearchResult.bind(this, orderId, symbol, side, finalCallback));
}else if (order.pendingAmount === 0 || !order.isActive) {
finalCallback(null, convertToRecordOrder(order));
} else if (order.dealAmount === 0 || (order.dealAmount > 0 && order.pendingAmount >0)) {
this.api.cancelOrder(orderId, symbol, side, (error, result) => {
// setTimeout(() => {
console.log("尝试取消,准备搜索订单");
this.api.searchOrder(orderId, symbol, side, this._handleFOKSearchResult.bind(this, orderId, symbol, side, finalCallback));
// }, 80)
})
} else {
setTimeout(() => {
console.log("订单尚未完成或取消,再次搜索");
this.api.searchOrder(orderId, symbol, side, this._handleFOKSearchResult.bind(this, orderId, symbol, side, finalCallback));
}, 500);
}
}
FOKLikeOrder(symbol, price, amount, side, callback) {
if (!constants.RealOrder) {
callback(null, returnFakeOrder(symbol, price, amount));
return;
}
this.api.order(price, amount, symbol, side, (error, result) => {
if (error) {
callback(error, null);
return;
}
const orderId = result.result;
setTimeout(()=>{
this.api.searchOrder(orderId, symbol, side, this._handleFOKSearchResult.bind(this, orderId, symbol, side, callback));
},50);
})
}
order(symbol, price, amount, side, callback,mustSuccess = false) {
if (!constants.RealOrder) {
callback(null, returnFakeOrder(symbol, price, amount));
return;
}
this.api.order(price, amount, symbol, side, (error, result) => {
if (error) {
callback(error, null);
return;
}
const orderId = result.data.orderOid;
const api2 = this.api;
function handleSearchResult(error, result) {
if (error) {
console.error("搜索订单出错");
console.error(error);
let timeout = 100;
if(error.code == '2091' || error.code == '4003'){
console.log("2秒后再继续搜索");
timeout = 2000;
}
setTimeout(() => {
this.api.searchOrder(orderId, this.handleSearchResult.bind(this, orderId, symbol, side, callback));
}, timeout);
}
if(!result.data){
console.error("没有返回amount,再次搜索");
api2.searchOrder(orderId, symbol, side, handleSearchResult.bind(this));
return;
}
callback(null, convertToRecordOrder(result.data));
}
this.api.searchOrder(orderId, symbol, side, handleSearchResult.bind(this));
})
}
}
module.exports = Order;
\ No newline at end of file
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"strategy2": "node $NODE_DEBUG_OPTION strategy2.js", "strategy2": "node $NODE_DEBUG_OPTION strategy2.js",
"test": "node $NODE_DEBUG_OPTION test_kucoin.js", "test": "export MACHINE=K; export http_proxy='http://localhost:8118';export https_proxy='http://localhost:8118';export agent='socks:127.0.0.1:1086';node $NODE_DEBUG_OPTION test_kucoin.js",
"strategy3": "export http_proxy='http://localhost:8118';export https_proxy='http://localhost:8118';export agent='socks:127.0.0.1:1086';node $NODE_DEBUG_OPTION kucoinStrategy3.js" "strategy3": "export http_proxy='http://localhost:8118';export https_proxy='http://localhost:8118';export agent='socks:127.0.0.1:1086';node $NODE_DEBUG_OPTION kucoinStrategy3.js"
}, },
"author": "", "author": "",
......
...@@ -40,11 +40,11 @@ function testCollector(){ ...@@ -40,11 +40,11 @@ function testCollector(){
const collector = new BiboxCollector(null); const collector = new BiboxCollector(null);
collector.runStrategy3(); collector.runStrategy3();
const BiboxStrategy3 = require('./lbankStrategy3'); // const BiboxStrategy3 = require('./lbankStrategy3');
const strategy3 = new BiboxStrategy3(collector); // const strategy3 = new BiboxStrategy3(collector);
strategy3.run(); // strategy3.run();
} }
testCollector(); // testCollector();
function printCurrency(){ function printCurrency(){
const currentArray = [,'ETH','BTC','LTC','BCH','USDT','USD','RMB',"RCN","WINGS","TRX","LEND","CMT","POWR","HSR","GAS","RDN","TNT","OAX" const currentArray = [,'ETH','BTC','LTC','BCH','USDT','USD','RMB',"RCN","WINGS","TRX","LEND","CMT","POWR","HSR","GAS","RDN","TNT","OAX"
...@@ -105,24 +105,24 @@ function printCurrency(){ ...@@ -105,24 +105,24 @@ function printCurrency(){
api.fetchSymbols((error,data)=>{ api.fetchSymbols((error,data)=>{
if (!error) { if (!error) {
const unknowCurrencies = []; const unknowCurrencies = [];
for (let detail of data.result) { for (let detail of data.data) {
const symbol = detail.pair; const symbol = detail.symbol;
const currencies = symbol.split("_"); const currencies = symbol.split("-");
const midCurrency = currencies[0].toUpperCase(); const midCurrency = currencies[0].toUpperCase();
const baseCurrency = currencies[1].toUpperCase(); const baseCurrency = currencies[1].toUpperCase();
if (!currentArray.includes(midCurrency) && !unknowCurrencies.includes(midCurrency)) { if (!currentArray.includes(midCurrency) && !unknowCurrencies.includes(midCurrency)) {
console.log(`CNY_${midCurrency} = '${midCurrency}'`); // console.log(`CNY_${midCurrency} = '${midCurrency}'`);
unknowCurrencies.push(midCurrency) unknowCurrencies.push(midCurrency)
// console.log(`(CNY_${midCurrency}, CNY_${midCurrency})`); // console.log(`(CNY_${midCurrency}, CNY_${midCurrency})`);
} }
if (!currentArray.includes(baseCurrency) && !unknowCurrencies.includes(baseCurrency)) { if (!currentArray.includes(baseCurrency) && !unknowCurrencies.includes(baseCurrency)) {
console.log(`CNY_${baseCurrency} = '${baseCurrency}'`); // console.log(`CNY_${baseCurrency} = '${baseCurrency}'`);
unknowCurrencies.push(baseCurrency); unknowCurrencies.push(baseCurrency);
// console.log(`(CNY_${baseCurrency}, CNY_${baseCurrency})`); // console.log(`(CNY_${baseCurrency}, CNY_${baseCurrency})`);
} }
} }
console.log("========================") console.log("========================")
unknowCurrencies.map((item) => console.log(`(CNY_${item}, CNY_${item}),`)) unknowCurrencies.map((item) => console.log(`CNY_${item} = '${item}'`))
} }
}) })
} }
...@@ -164,10 +164,18 @@ function testOrder(){ ...@@ -164,10 +164,18 @@ function testOrder(){
function test() { function test() {
const api = new biboxApi(); const api = new biboxApi();
api.fetchSymbols((error,result)=>{ api.searchOrder('5ba32161c958a62bc8ce606c', 'KCS-USDT', constants.OrderSideBuy, (error,result)=>{
console.log(error); console.log(error);
console.log(result); console.log(result);
}) })
// api.cancelOrder('5ba32161c958a62bc8ce606c', 'KCS-USDT', constants.OrderSideBuy, (error,result)=>{
// console.log(error);
// console.log(result);
// })
// api.order(0.1, 1, 'KCS-USDT', constants.OrderSideBuy, (error,result)=>{
// console.log(error);
// console.log(result);
// })
} }
// test() test()
\ No newline at end of file \ No newline at end of file
const WebSocket = require('ws');
const SocksProxyAgent = require('socks-proxy-agent');
const proxy = process.env.agent;
const agent = proxy ? new SocksProxyAgent(proxy) : null;
const zlib = require('zlib');
const BiboxCollector = require('./lbankCollector');
const biboxApi = require('./api_lbank');
const constants = require('./constants');
const Order = require('./order');
function testWs() {
this.ws = new WebSocket('wss://api.lbkex.com/ws/V2/', {agent});
const wss = this.ws;
this.ws.on('open', () => {
console.log("成功启动collector");
wss.send(JSON.stringify({"action":"subscribe","subscribe":"depth","depth":10,"pair": "dx_eth"}));
});
this.ws.on('message', (data)=>{
console.log(data);
});
this.ws.on('error', (error) => {
console.log("collector websocket error:");
console.log(error);
})
this.ws.on('close', () => {
console.log("websocket closed");
})
}
// testWs();
function testCollector(){
const collector = new BiboxCollector(null);
collector.runStrategy3();
}
// testCollector();
function printCurrency(){
const currentArray = [,'ETH','BTC','LTC','BCH','USDT','USD','RMB',"RCN","WINGS","TRX","LEND","CMT","POWR","HSR","GAS","RDN","TNT","OAX"
,"ELF","GXS","ETC","FUN","ENG","LUN","BRD","ADA","RLC","SUB","REQ","SNT","SALT","QTUM","VIB","ARN","BCD","EOS"
,"AST","LRC","APPC","VIA","STEEM","LINK","XRP","ADX","XZC"
,"INS","STRAT","LTC","TRIG","GVT","CDT","ENJ","IOST","BNT","SNM","TNB","BTS","EDO","DNT","ICN","VIBE","RPX","ARK","NAV","DGD"
,"AION","CTR","OST","VEN","BLZ","MOD","XMR","NULS","NCASH","BNB","XVG","MCO"
,"IOTA","AE","OMG","WTC","NEBL","BCPT","DLT","ZRX","PIVX","CND","BCC","XLM","BAT"
,"FUEL","GTO","YOYO","SNGLS","ICX","STORJ","QSP"
,"BQX","PPT","MANA","MDA","MTL","WABI","DASH","WAVES","ZEC","KNC","NANO","EVX","CHAT","LSK","BTG"
,"NEO","POE","MTH","AMB","KMD","POA","ONT","ZIL","STORM","BCN","DOGE","DSH","EMC"
,"FCN","NXT","QCN","SBD","SC","XDN","XEM","ARDR","MAID","AMP","BUS","1ST","TRST","TIME","GNO"
,"REP","ZRC","BOS","DCT","ANT","AEON","GUP","PLU","TAAS","NXC","EDG","SWT","TKN","XAUR","PTOY","CFI"
,"PLBT","XDNCO","FYN","CVC","PAY","XTZ","DICE","NET","SNC","BET","DENT","SAN","MNE"
,"MSP","DDF","UET","MYB","SUR","IXT","PLR","TIX","NDC","PRO","AVT","COSS","QAU","FYP","OPT","STX","CAT","XUC","BAS","RVT","ICOS","PPC","VERI"
,"IGNIS","PRG","BMC","SKIN","EMGO","HVN","MCAP","AIR","NTO","ICO","PING"
,"RKC","GAME","TKR","HPC","WMGO","CSNO","ORME","PIX","IND","KICK","YOYOW","MIPS","DGB","DCN","LAT","CCT","EBET","VOISE","ZSC"
,"ETBS","ART","QVT", "EBTCOLD","BKB","EXN","TGT","ATS","BMT","CNX","ATB","ODN"
,"BTM","B2X","ATM","LIFE","DRT","STU","SMART","CL","LA","CLD"
,"ELM","HGT","POLL","SCL","ATL","EBTC","ETP","OTX","CDX","DRPU","HAC","CTX","ELE","SISA"
,"INDI","BTX","ITS","AMM","DBIX","PRE","KBR","TBT","ERO","SMS","ZAP","DOV","FRD","OTN","SPF"
,"SBTC","BTCA","WRC","LOC","SWFTC","STAR","DIM","NGC","ECH","CPAY","DATA"
,"UTT","EKO","TIO","WAX","ULTC","EET","C20","IDH","IPL","COV","SENT","SMT","W3C","CAS"
,"GRMD","AVH","TRAC","JNT","PCL","CLOUT","UTK","GNX","CHSB","NEU","TAU","MEK","BAR","FLP","R","PKT","WLK","EVN","CPG","BPTN","BETR"
,"ARCT","DBET","RNTB","HAND","BEZ","ACO","CTE","UTNP"
,"CPY","CHP","ACT","HIRE","SIG","RPM","MTX","BGG","SETH","WIZ","DADI","BDG","DATX","TRUE","DRG","BANCA","AUTO","NOAH","SOC","WILD"
,"INSUR","OCN","STQ","CVH","IFT","CGC","WAN","QLC","SYS","WPR","GRS","CLOAK","GNT","LOOM","BCN","BIFI","DBC","SRN","TOPC"
,"MDS","DAT","MEET","BCX","HT","PROPY","LET","EDU","ELA"
,"QUN","CTXC","ABT","AIDOC","THETA","ZLA","NAS","YEE","STK","QASH","RUFF"
,"MTN","DTA","BFT","ITC","WICC","REP","TUSD","ZEN","SKY","IOTX","QKC","AGI","NXS","ZB","QC"
,'UBTC','INK','TV','BTH','LBTC','HLC','BCW','BTP'
,'BITCNY','ENT','SAFE','BTN','CDC','DDM','BITE','HOTC'
,'EPC','BDS','GRAM','HPY','MITH','EOSDAC','KAN',"NPXS","SUNC"
,"ADH","AXP","BERRY","BSTN","DAXT","BMH","BUBO"
,"CAPP","DAY","CLR","WEALTH","CRPT","CVT","DAN","XDNICCO"
,"ERT","FOTA","WTT","GBX","HRB","HDG","HLW","HQX"
,"IHT","IML","MPK","KIN","LDC","XLC","LNC","MRV","MESH","MLD","XMO","NCT"
,"PQT","PBKX","PREMINE","ROOTS","GRPH","SHIP","CRS","SCC"
,"TEL","8BT","TFL","UGT","UNC","VIT","YCC","BBC","GET","TKY","ACAT","TCN","VIO","WIKI"
,"CVCOIN","FTX","FREC","NAVI","VME","BTCP"
,"LND","CSM","NANJ","MTC","NTK","AUC","CMCT"
,"MAN","TKA","PNT","FXT","NEXO","CHX","PAT","XMC"
,"EJOY","TBAR","HERO","STAK","FDZ","SPD","LUC","MITX"
,"TIV","B2G","LATX","ZPT","HBZ","FACE","MORPH","EBKC","CPT","WITH"
,"HTML","JOT","JBC","BNK","CBC","COIN","PMNT","ABYSS","BCI"
,"PITCH","TDS","DPN","UUU","KBC","BTV","XBP","CLN"
,"IVY","TTU","DOR","SPC","KEY",'OKB',"MFT",
,'AAC','ACE','BEC','BKX','CAG','CAI','CAN','CBT','CIC','DCR','DNA','DPY','EGT', 'FAIR','GSC','GTC'
,'HMC','HOT','INT','IPC','KCASH','LBA','LEV','LIGHT','MAG'
,'MDT','MKR','MOF','MOT','MVP','OF','OK06ETT','ORS','PRA','PST','RCT', 'READ','REF','REN','RFR','RNT', 'SHOW','SSC','STC','TCT','TRA'
, 'TRIO','UCT','UGC','UKG','VEE','VIU', 'WFEE','WIN','XAS','YOU'
,'ZIP','HPB','CIT','HYC','SDA','TESTA','TESTB','TESTC'
,'BT2', 'KRM', 'LCC', 'ELEC', 'QNTU','CENNZ', 'SWM', 'CLO', 'MXM', 'DAI', 'DWS', 'PROC', 'BIT', 'REX', 'COSM', 'DCNT', 'EURS', 'MNX', 'WBTC'
,'ZCO','BIX','BTO','SNOV','BLT','SXUT','CZR','TNC','CPC','FSN','BBN','MED','DXT','LGO','NPER','IPSX','BOT','MT'
,'LKN','INSTAR','RED','PAI','CWV','BCV','HDAC','BOE','AT','UPP','SGC','HER','DCC','RTE','TTC','CAR','BZNT','BU'
,'AC3','TTT','XNK'];
const api = new biboxApi('','');
api.fetchSymbols((error,data)=>{
if (!error) {
const unknowCurrencies = [];
for (let detail of data.result) {
const symbol = detail.pair;
const currencies = symbol.split("_");
const midCurrency = currencies[0].toUpperCase();
const baseCurrency = currencies[1].toUpperCase();
if (!currentArray.includes(midCurrency) && !unknowCurrencies.includes(midCurrency)) {
console.log(`CNY_${midCurrency} = '${midCurrency}'`);
unknowCurrencies.push(midCurrency)
// console.log(`(CNY_${midCurrency}, CNY_${midCurrency})`);
}
if (!currentArray.includes(baseCurrency) && !unknowCurrencies.includes(baseCurrency)) {
console.log(`CNY_${baseCurrency} = '${baseCurrency}'`);
unknowCurrencies.push(baseCurrency);
// console.log(`(CNY_${baseCurrency}, CNY_${baseCurrency})`);
}
}
console.log("========================")
unknowCurrencies.map((item) => console.log(`(CNY_${item}, CNY_${item}),`))
}
})
}
// printCurrency()
function testOrder(){
const order = new Order();
// order.order("BTC_USDT","0.01","0.01",constants.OrderSideBuy,(error,result)=>{
// console.log(error);
// console.log(result);
// })
// api.balance((error,data)=>{
// console.log(error);
// console.log(data);
// })
// api.getTrades("BTC_USDT",(error,data)=>{
// console.log(error);
// console.log(data);
// })
const api = new biboxApi();
// api.fetchHistorOrders(1,20,"BU_ETH",constants.OrderSideSell,(error,result)=>{
// console.log(error);
// console.log(result);
// })
api.searchOrder('873502366',(error,result)=>{
console.log(result);
})
}
// testOrder();
function testAPI() {
const api = new biboxApi();
// api.fetchSymbols((error,result)=>{
// console.log(error);
// console.log(result);
// })
api.balance((error,result)=>{
console.log(error);
console.log(result);
})
}
testAPI();
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment