Commit a669f277 by zihan

代码基本改完了

parent 306c5779
...@@ -3,8 +3,10 @@ const SocksProxyAgent = require('socks-proxy-agent'); ...@@ -3,8 +3,10 @@ const SocksProxyAgent = require('socks-proxy-agent');
const proxy = process.env.agent; const proxy = process.env.agent;
const agent = proxy ? new SocksProxyAgent(proxy) : null; const agent = proxy ? new SocksProxyAgent(proxy) : null;
const request = require('request'); const request = require('request');
const host = 'https://api.kucoin.com'; const proHost = 'https://api.kucoin.com';
const testHost = 'https://openapi-sandbox.kucoin.com';
const CryptoJS = require('crypto-js'); const CryptoJS = require('crypto-js');
const crypto = require('crypto');
const constants = require('./constants'); const constants = require('./constants');
const {IPs, mergeDepthAsk, mergeDepthBids, mergeDepth} = require('./util'); const {IPs, mergeDepthAsk, mergeDepthBids, mergeDepth} = require('./util');
let totalOrderbook = {}; let totalOrderbook = {};
...@@ -44,8 +46,12 @@ let getUpdatedData = function (currentData, response) { ...@@ -44,8 +46,12 @@ let getUpdatedData = function (currentData, response) {
class biboxApi { class biboxApi {
constructor() { constructor() {
this.apiKey = '5ba054d2e0abb830dee81e1d'; this.apiKey = '5ce8b7ae134ab72e8c06b112';
this.apiSecret = 'baa55ba9-7290-431e-9fd4-42aa4598887f'; this.apiSecret = 'd355354d-eac5-46fb-a2cf-4342f5bc7055';
this.pass = 'Kinming0123@#$%';
// this.apiKey = '5c2db93503aa674c74a31734';
// this.apiSecret = 'f03a5284-5c39-4aaa-9b20-dea10bdcf8e3';
// this.pass = 'Abc123456';
this.allowRequest = true; this.allowRequest = true;
this.index = 0; this.index = 0;
} }
...@@ -248,33 +254,36 @@ class biboxApi { ...@@ -248,33 +254,36 @@ class biboxApi {
}); });
} }
_request(method, path, params, callback) { _genSign(timestamp,method,path,params){
const signStr = timestamp+method+path+JSON.stringify(params);
const signed = crypto.createHmac('sha256',this.apiSecret).update(signStr).digest('base64');
return signed
}
_request(method, path, params, callback,host=proHost) {
if (!this.allowRequest) { if (!this.allowRequest) {
callback({code: "-2", message: "出现超频情况,暂停提交请求"}); callback({code: "-2", message: "出现超频情况,暂停提交请求"});
return; return;
} }
let url = host + path; let url = host + path;
const nonce = new Date().getTime(); const timestamp = Date.now()+'';
const strParams = this.transform(this.objKeySort(params)); const sign = this._genSign(timestamp,method,path,params);
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 = { const headers = {
"Accept-Language": "zh_CN",
'KC-API-KEY': this.apiKey, 'KC-API-KEY': this.apiKey,
'KC-API-NONCE': nonce, 'KC-API-SIGN': sign,
'KC-API-SIGNATURE': sign 'KC-API-TIMESTAMP':timestamp,
'KC-API-PASSPHRASE':this.pass,
"Content-Type": "application/json"
} }
const requestParams = {}; const requestParams = {};
let form = params if (method === 'GET' && params) {
if (method === 'GET') {
url += '?' + this.transform(params); url += '?' + this.transform(params);
form = {} }else{
requestParams["body"] = JSON.stringify(params);
} }
requestParams["url"] = url; requestParams["url"] = url;
requestParams["method"] = method; requestParams["method"] = method;
requestParams["headers"] = headers; requestParams["headers"] = headers;
requestParams["form"] = form;
requestParams["timeout"] = 10000; requestParams["timeout"] = 10000;
requestParams["forever"] = true; requestParams["forever"] = true;
request(requestParams, (error, response, body) => { request(requestParams, (error, response, body) => {
...@@ -283,7 +292,7 @@ class biboxApi { ...@@ -283,7 +292,7 @@ class biboxApi {
} else { } else {
try { try {
const result = JSON.parse(body); const result = JSON.parse(body);
if (result && result.success && result.code === 'OK') { if (result && result.code === '200000') {
callback(null, result); callback(null, result);
} else { } else {
callback(result, null); callback(result, null);
...@@ -307,50 +316,43 @@ class biboxApi { ...@@ -307,50 +316,43 @@ class biboxApi {
this._publicRequest('/api/v1/symbols', {}, callback); this._publicRequest('/api/v1/symbols', {}, callback);
} }
order(price, amount, symbol, side, callback) { order(cliordId,price, amount, symbol, side,timeInForce, callback) {
//账户类型,0-普通账户,1-信用账户
//交易类型,1-市价单,2-限价单
//交易方向,1-买,2-卖
const params = { const params = {
symbol: symbol, clientOid:cliordId,
type: side === constants.OrderSideBuy ? 'BUY' : 'SELL', side,
pay_bix: 1, symbol,
price, price,
amount, size:amount,
timeInForce
}; };
this._request("POST", "/v1/order", params, callback) this._request("POST", "/api/v1/orders", params, callback);
} }
balance(limit, page, callback) { balance(callback) {
this._request("GET", "/v1/account/balances", {limit: limit || 20, page: page || 1}, callback); this._request("GET", "/api/v1/accounts", null, callback);
} }
coins_info(callback) { // coins_info(callback) {
this._publicRequest("/v1/market/open/coins", {}, callback); // this._publicRequest("/v1/market/open/coins", {}, callback);
} // }
getTrades(symbol, callback) { getTrades(symbol, callback) {
callback(null, null) callback(null, null)
} }
searchOrder(orderId, symbol, side, callback) { searchOrder(orderId,callback) {
const params = { this._request("GET", `/api/v1/orders/${orderId}`, null, callback);
symbol: symbol,
type: side === constants.OrderSideBuy ? 'BUY' : 'SELL',
orderOid: orderId
}
this._request("GET", "/v1/order/detail", params, callback);
} }
cancelOrder(orderId, symbol, side, callback) { // cancelOrder(orderId, symbol, side, callback) {
const params = { // const params = {
symbol: symbol, // symbol: symbol,
orderOid: orderId, // orderOid: orderId,
type: side === constants.OrderSideBuy ? 'BUY' : 'SELL', // type: side === constants.OrderSideBuy ? 'BUY' : 'SELL',
} // }
this._request("POST", "/v1/cancel-order", params, callback); // this._request("POST", "/v1/cancel-order", params, callback);
} // }
fetchHistorOrders(page, size, symbol, side, callback) { fetchHistorOrders(page, size, symbol, side, callback) {
const params = { const params = {
......
...@@ -105,77 +105,21 @@ class KucoinCollector extends BaseCollector{ ...@@ -105,77 +105,21 @@ class KucoinCollector extends BaseCollector{
} }
} }
_getCoinsInfo(){
console.log('start get coin info...');
this.api.coins_info((error,result)=>{
if(error){
console.error('get coins info error');
this._getCoinsInfo();
}else {
if(result.data){
coinInfoMap = {}
for(let d of result.data){
coinInfoMap[d.coin] = d
}
console.log('get coin info ok');
}
}
});
}
_runMonitor(callback){ _runMonitor(callback){
callback({}); this.api.balance( (error,result)=>{
return;
//todo 接口也改了
let balanceMap = {};
let need = 1;
// if(!coinInfoMap){
// this._getCoinsInfo()
// }
this.api.balance(20, 1, (error,result)=>{
if(error){ if(error){
console.error("get balance by rest error:"); console.error("get balance by rest error:");
if(!error.data){ if(!error.data){
console.error(error); console.error(error);
} }
callback(null); callback(null);
return;
}else{ }else{
const balanceList = result.data.datas; const balanceData = result.data;
for(let detail of balanceList){ const balanceMap = {};
balanceMap[detail.coinType] = {available:detail.balance,onOrder:detail.freezeBalance}; for(const balance of balanceData){
} balanceMap[balance.currency] = {available:balance.available, onOrder:balance.holds};
let pageNos = result.data.pageNos
if(pageNos > 1){
need = pageNos - 1;
let amount = 0
for(let i=2;i<=pageNos;i++){
this.api.balance(20, i, (error,result)=>{
amount += 1;
if(error){
console.error("get balance by rest error:");
if(!error.data){
console.error(error);
}
callback(null);
return;
}else{
const balanceList = result.data.datas;
for(let detail of balanceList){
balanceMap[detail.coinType] = {available:detail.balance,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,onOrder:detail.freezeBalance};
}
callback(balanceMap)
} }
callback(balanceMap);
} }
}) })
} }
......
...@@ -89,22 +89,21 @@ class BiboxStrategy3 extends Strategy3 { ...@@ -89,22 +89,21 @@ class BiboxStrategy3 extends Strategy3 {
if (order.executedQty === order.origQty) { if (order.executedQty === order.origQty) {
console.log("买入全部成交"); console.log("买入全部成交");
createdBuyOrder = true; createdBuyOrder = true;
amount = collector.processAmount(midCurrency, baseCurrency2, parseFloat(order.executedQty * 0.999)); // amount = collector.processAmount(midCurrency, baseCurrency2, parseFloat(order.executedQty * 0.999));
setTimeout(() => { // setTimeout(() => {
sellOrder(); sellOrder();
}, 120); // }, 120);
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);
returnAmount = collector.processAmount(baseCurrency2, baseCurrency1, returnAmount); returnAmount = collector.processAmount(baseCurrency2, baseCurrency1, returnAmount);
amount = collector.processAmount(midCurrency, baseCurrency2, parseFloat(order.executedQty * 0.999)); amount = collector.processAmount(midCurrency, baseCurrency2, order.executedQty);
console.log(`买入部分成交${order.executedQty} 回归量调整为${returnAmount}`); console.log(`买入部分成交${order.executedQty} 回归量调整为${returnAmount}`);
order.remark = "部分成交@amount " + order.executedQty + ";";
createdBuyOrder = true; createdBuyOrder = true;
if (parseFloat(amount) > 0) if (parseFloat(amount) > 0)
setTimeout(() => { // setTimeout(() => {
sellOrder(); sellOrder();
}, 120); // }, 120);
if (parseFloat(returnAmount) > 0) if (parseFloat(returnAmount) > 0)
returnOrder(); returnOrder();
else { else {
......
...@@ -22,10 +22,10 @@ function returnFakeOrder(symbol, price, amount) { ...@@ -22,10 +22,10 @@ function returnFakeOrder(symbol, price, amount) {
function convertToRecordOrder(order, price) { function convertToRecordOrder(order, price) {
let status = constants.OrderStatusNew; let status = constants.OrderStatusNew;
if(order.pendingAmount === 0){ if(order.dealSize == order.size){
status = constants.OrderStatusFilled; status = constants.OrderStatusFilled;
}else{ }else{
if(order.dealAmount > 0){ if(order.dealSize > 0){
status = constants.OrderStatusPartiallyFilled; status = constants.OrderStatusPartiallyFilled;
} }
if(!order.isActive){ if(!order.isActive){
...@@ -33,14 +33,15 @@ function convertToRecordOrder(order, price) { ...@@ -33,14 +33,15 @@ function convertToRecordOrder(order, price) {
} }
} }
return { return {
orderId: order.orderOid + '', orderId: order.id + '',
price: price, price: price,
status: status, status: status,
transactTime: order.createdAt, transactTime: order.createdAt,
origQty: order.pendingAmount + order.dealAmount, origQty: order.size,
executedQty: order.dealAmount, executedQty: order.dealSize,
symbol: order.coinType + '-' + order.coinTypePair, symbol: order.symbol,
type: order.type, side: order.side,
fee:order.fee,
} }
} }
...@@ -101,17 +102,14 @@ class Order { ...@@ -101,17 +102,14 @@ class Order {
}) })
} }
order(symbol, price, amount, side, callback,mustSuccess = false) { order(symbol, price, amount, side,timeInForce, callback) {
if (!constants.RealOrder) { const cliordId = Date.now()+Math.floor(Math.random() * 100)+'';
callback(null, returnFakeOrder(symbol, price, amount)); this.api.order(cliordId, price, amount, symbol, side, timeInForce, (error, result) => {
return;
}
this.api.order(price, amount, symbol, side, (error, result) => {
if (error) { if (error) {
callback(error, null); callback(error, null);
return; return;
} }
const orderId = result.data.orderOid; const orderId = result.data.orderId;
const api2 = this.api; const api2 = this.api;
function handleSearchResult(error, result) { function handleSearchResult(error, result) {
...@@ -120,15 +118,21 @@ class Order { ...@@ -120,15 +118,21 @@ class Order {
console.error(error); console.error(error);
// let timeout = 100; // let timeout = 100;
// setTimeout(() => { // setTimeout(() => {
api2.searchOrder(orderId,symbol, side, handleSearchResult.bind(this)); api2.searchOrder(orderId, handleSearchResult.bind(this));
// }, timeout); // }, timeout);
} }
if(!result || !result.data){ if(!result || !result.data){
console.error("没有返回数据,再次搜索"); console.error("没有返回数据,再次搜索");
api2.searchOrder(orderId, symbol, side, handleSearchResult.bind(this)); api2.searchOrder(orderId, handleSearchResult.bind(this));
return; return;
} }
callback(null, convertToRecordOrder(result.data, price)); if(timeInForce === constants.TimeInForceFOK && result.data.isActive){
setTimeout(()=>{
api2.searchOrder(orderId, handleSearchResult.bind(this));
},200);
}else{
callback(null, convertToRecordOrder(result.data, price));
}
} }
this.api.searchOrder(orderId, symbol, side, handleSearchResult.bind(this)); this.api.searchOrder(orderId, symbol, side, handleSearchResult.bind(this));
......
...@@ -43,7 +43,7 @@ function testCollector(){ ...@@ -43,7 +43,7 @@ function testCollector(){
// 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"
...@@ -124,11 +124,20 @@ function printCurrency(){ ...@@ -124,11 +124,20 @@ function printCurrency(){
// printCurrency() // printCurrency()
function testOrder(){ function testOrder(){
const order = new Order(); // const order = new Order();
order.order("BTC_USDT","0.01","0.01",constants.OrderSideBuy,(error,result)=>{ const biboxApi = require('./api_kucoin');
const api = new biboxApi();
const ordid = Date.now()+'';
// api.order(ordid, "1","1","BTC-USDT",'buy',constants.TimeInForceFOK,(error,result)=>{
// console.log(error);
// console.log(result);
// })
api.balance((error,result)=>{
console.log(error); console.log(error);
console.log(result); console.log(result);
}) })
// const sign = api._genSign('1547015186532','POST', '/api/v1/deposit-addresses',{'currency':'BTC'})
// console.log(sign === '7QP/oM0ykidMdrfNEUmng8eZjg/ZvPafjIqmxiVfYu4=');
// api.balance((error,data)=>{ // api.balance((error,data)=>{
// console.log(error); // console.log(error);
// console.log(data); // console.log(data);
...@@ -146,7 +155,7 @@ function testOrder(){ ...@@ -146,7 +155,7 @@ function testOrder(){
// console.log(result); // console.log(result);
// }) // })
} }
// testOrder(); testOrder();
// const amount = (0.0917 * parseFloat(0.00001005)).toFixed(10); // const amount = (0.0917 * parseFloat(0.00001005)).toFixed(10);
// console.log(amount); // console.log(amount);
......
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