Commit e4a5d77f authored by ml's avatar ml

新管理后台-部分接口逻辑调整、项目方交易量统计定时任务

parent b66ba41a
...@@ -148,9 +148,10 @@ export const changeUserSpotFee = async function (user_id, symbol, fee_model, mak ...@@ -148,9 +148,10 @@ export const changeUserSpotFee = async function (user_id, symbol, fee_model, mak
await checkUser(user_id); await checkUser(user_id);
await sleep(1000); await sleep(1000);
//请求撮合 修改费率 //请求撮合 修改费率 maker_fee 和 taker_fee 同时为1 代表初始化费率
let tmp_maker_fee = Number(maker_fee) == 0.001 ? 1 : maker_fee;
let res = await changeTradingFee(pair, user_id, maker_fee, taker_fee, "spot",opt_market); let tmp_taker_fee = Number(taker_fee) == 0.002 ? 1 : taker_fee;
let res = await changeTradingFee(pair, user_id, tmp_maker_fee, tmp_taker_fee, "spot", opt_market);
return res.is_success; return res.is_success;
}; };
...@@ -194,8 +195,10 @@ export const changeUserContractFee = async function (user_id, symbol, fee_model, ...@@ -194,8 +195,10 @@ export const changeUserContractFee = async function (user_id, symbol, fee_model,
await checkUser(user_id); await checkUser(user_id);
await sleep(1000); await sleep(1000);
//请求撮合 修改费率 //请求撮合 修改费率 maker_fee 和 taker_fee 同时为1 代表初始化费率
let res = await changeTradingFee(pair, user_id, maker_fee, taker_fee, "lpc",opt_market); let tmp_maker_fee = Number(maker_fee) == 0.0004 ? 1 : maker_fee;
let tmp_taker_fee = Number(taker_fee) == 0.0006 ? 1 : taker_fee;
let res = await changeTradingFee(pair, user_id, tmp_maker_fee, tmp_taker_fee, "lpc", opt_market);
return res.is_success; return res.is_success;
}; };
......
// 每日定时统计项目方 指定交易对做市信息, 并根据成交量信息进行费率分档优惠; // 每日定时统计项目方 指定交易对做市信息, 并根据成交量信息进行费率分档优惠;
import { ormDB, commonUserFeeSetting, feeRateSpotLog, userInfoSon, spotPairs, contractPairs, userInfo } from "@madex/ex-ts-dao"; import {
ormDB, commonUserFeeSetting, feeRateSpotLog, userInfoSon, spotPairs, contractPairs, userInfo,
dwdExFill, dwdMadOrmDB
} from "@madex/ex-ts-dao";
import { FEE_RATE_LOG_STATUS } from "../../src/constant/feeRateLogConst"; import { FEE_RATE_LOG_STATUS } from "../../src/constant/feeRateLogConst";
import * as RobotUtil from "../../src/utils/robotUtils";
let Op = ormDB.Op; let Op = ormDB.Op;
let { tickerUtils, redisUtilsCommon } = require('@madex/ex-js-common'); let { tickerUtils, redisUtilsCommon } = require('@madex/ex-js-common');
...@@ -11,8 +15,6 @@ const SonStatus = userInfoSon.STATUS; ...@@ -11,8 +15,6 @@ const SonStatus = userInfoSon.STATUS;
const logger = require('@madex/ex-js-public').logger; const logger = require('@madex/ex-js-public').logger;
let feeRateCheckStatus = FEE_RATE_LOG_STATUS; let feeRateCheckStatus = FEE_RATE_LOG_STATUS;
//对btc价格,缓存 {coinSymbol: priceInfo}
var price2BTC = {};
//价格缓存时间 2分钟 //价格缓存时间 2分钟
const CACHE_TIMEOUT = 2 * 60 * 1000; const CACHE_TIMEOUT = 2 * 60 * 1000;
...@@ -34,47 +36,55 @@ const BTC_AMOUNT = { ...@@ -34,47 +36,55 @@ const BTC_AMOUNT = {
"Free": 0, "Free": 0,
}, },
Market_Maker_FEE = { Market_Maker_FEE = {
init_taker: 0.0002, init_taker: 0.002,
init_maker: 0, init_maker: 0.001,
} }
async function delayPromise(time) { async function delayPromise(time: any) {
return new Promise((resolve) => setTimeout(resolve, time)); return new Promise((resolve) => setTimeout(resolve, time));
} }
export const statisProjectMakerDeals = async function (now = Date.now()) { export const statisticsProjectMakerDeals = async function (now = Date.now()) {
try { try {
//TODO:按之前代码来看,只有现货相关的,这里怎么做 let ticker_map: any = {};
let users = await projectMaker(); let users = await projectMaker();
let startTime = now - now % DAY - DAY;// 当前统计昨天的成交数据 // 当前统计昨天的成交数据
let btc2usdt = await getDealOneDayInUSDT(startTime, startTime + DAY); let startTime = now - now % DAY - DAY;
let fatherFeeObj = {}; // { fatherid_pair: {maker, taker}} // { father_id_pair: {maker, taker}}
let fatherFeeObj = {};
for (let i = 0; i < users.length; i++) { for (let i = 0; i < users.length; i++) {
let { user_id, pair, status, statis_period, amount_require_usdt, type } = users[i]; //status 2 生效时才统计
let pairs = pair == 'all' ? await getPairsByType(type) : [pair]; let { user_id, pair, status, statis_period, amount_require_usdt, maker_fee, taker_fee } = users[i];
for (let onePair of pairs) { if (pair == 'all') {
if (user_id && onePair) { let msg = `统计项目方交易量发生错误:user_id:${user_id},pair:${pair}`;
let redisKey = user_id + "_" + onePair + "_projectMaker_FeeRate"; logger.error(msg);
RobotUtil.sendRobotMessage(RobotUtil.ROBOT_KEYS.COMMON_KEY, msg);
continue;
}
if (user_id && pair) {
//取汇率
let coin_symbol = pair.split('_')[0];
let coin_symbol_usdt_rate = ticker_map[coin_symbol] ? ticker_map[coin_symbol] : await tickerUtils.rateCoin2USDT(coin_symbol);
ticker_map[coin_symbol] = coin_symbol_usdt_rate;
let redisKey = user_id + "_" + pair + "_projectMaker_FeeRate";
await delayPromise(100); await delayPromise(100);
let [statis, statisUsdt] = await statisUserPairSpot(user_id, onePair, startTime, btc2usdt); let statisUsdt = await statisUserPairSpot(user_id, pair, startTime, coin_symbol_usdt_rate);
let feeObjBtc = getUserFeeRateFromStatis(statis); // old let feeObjUsdt = getUserFeeRateFromUsdtStatis(statisUsdt, statis_period, amount_require_usdt, taker_fee, maker_fee);
let feeObjUsdt = getUserFeeRateFromUsdtStatis(statisUsdt, statis_period, amount_require_usdt) await adjustMakerFeeRate(now, user_id, pair, status, feeObjUsdt, fatherFeeObj);
await adjustMakerFeeRate(now, user_id, onePair, status, feeObjBtc, feeObjUsdt, fatherFeeObj); redisUtilsCommon.write(redisKey, JSON.stringify(Object.assign({}, feeObjUsdt)), 0, () => {
redisUtilsCommon.write(redisKey, JSON.stringify(Object.assign({}, feeObjUsdt, feeObjBtc)), 0, () => {
}); });
} }
}
} }
now = Date.now(); now = Date.now();
let expired = now + DAY - 30000; let expired = now + DAY - 30000;
for (let key in fatherFeeObj) { for (let key in fatherFeeObj) {
let [user_id, pair] = key.split('@'); let [user_id, pair] = key.split('@');
let faterFee = fatherFeeObj[key]; let fatherFee = fatherFeeObj[key];
if (faterFee) { if (fatherFee) {
let { maker_fee, taker_fee } = faterFee; let { maker_fee, taker_fee } = fatherFee;
await setExpiredFeeSettingActiveOver(user_id, pair); await setExpiredFeeSettingActiveOver(user_id, pair);
await addFeeRate(user_id, pair, FEE_MODEL.fixedingain, maker_fee, taker_fee, now, expired, Market_Maker_FEE.init_maker, Market_Maker_FEE.init_taker, "项目方做市商策略根据子账户交易量设置父账户费率"); await addFeeRate(user_id, pair, FEE_MODEL.fixedingain, maker_fee, taker_fee, now, expired, "项目方做市商策略根据子账户交易量设置父账户费率");
} }
} }
} }
...@@ -83,7 +93,9 @@ export const statisProjectMakerDeals = async function (now = Date.now()) { ...@@ -83,7 +93,9 @@ export const statisProjectMakerDeals = async function (now = Date.now()) {
} }
} }
// 统计 项目方 7日, 15日 指定币种对 做市 /**
* 查询项目方 (只有现货的)
*/
async function projectMaker() { async function projectMaker() {
let res: any = []; let res: any = [];
try { try {
...@@ -104,144 +116,57 @@ async function projectMaker() { ...@@ -104,144 +116,57 @@ async function projectMaker() {
return res; return res;
} }
// 获取交易对USDT交易量
async function getDealOneDayInUSDT(startTime, endTime) {
let price = await tickerUtils.rateCoin2USDT('BTC');
//TODO:查询交易数据
/*let priceRes = await ex_kline.find({
attributes: [[ormDBSpot.literal('AVG(close)'), 'closePrice']],
where: {
pair: "BTC_USDT",
period: '1hour',
createdAt: {
[Op.gte]: new Date(startTime),
[Op.lt]: new Date(endTime),
}
},
raw: true,
});
if(priceRes && Number(priceRes.closePrice) > 0) {
price = Number(priceRes.closePrice).toFixed(4);
}*/
return Number(price);
}
// 统计币币成交量信息 // 统计币币成交量信息
async function statisUserPairSpot(user_id, pair, timestamp, btc2usdt) { async function statisUserPairSpot(user_id: number, pair: string, timestamp: any, coin_symbol_usdt_rate: any) {
let redisKey = user_id + "_" + pair + '_projectMaker_spot';
let redisKeyUsdt = user_id + "_" + pair + '_projectMaker_spot_usdt'; let redisKeyUsdt = user_id + "_" + pair + '_projectMaker_spot_usdt';
let resultCache = {}, resultCacheInUsdt = {}; let resultCacheInUsdt = {};
try { try {
[resultCache, resultCacheInUsdt] = await Promise.all([redisUtilsCommon.getSync(redisKey), redisUtilsCommon.getSync(redisKeyUsdt)]); let resultCacheInUsdt = await redisUtilsCommon.getSync(redisKeyUsdt);
let userDeals = await getDealOneDay(pair, new Date(timestamp), timestamp + DAY); let usdtAmount = await getDealOneDay(pair, new Date(timestamp), timestamp + DAY, coin_symbol_usdt_rate);
resultCache = updateCache(resultCache, timestamp, userDeals);
let usdtAmount = Number(userDeals) * btc2usdt
resultCacheInUsdt = updateCache(resultCacheInUsdt, timestamp, usdtAmount); resultCacheInUsdt = updateCache(resultCacheInUsdt, timestamp, usdtAmount);
redisUtilsCommon.write(redisKey, JSON.stringify(resultCache), 0, () => {
});
redisUtilsCommon.write(redisKeyUsdt, JSON.stringify(resultCacheInUsdt), 0, () => { redisUtilsCommon.write(redisKeyUsdt, JSON.stringify(resultCacheInUsdt), 0, () => {
}); });
} }
catch (error) { catch (error) {
logger.warn(' 统计项目做市上成交总和 error ', error); logger.warn(' 统计项目做市上成交总和 error ', error);
} }
return [resultCache, resultCacheInUsdt]; return resultCacheInUsdt;
} }
// 获取昨天一天的的统计交易量 // 获取昨天一天的的统计交易量
// 该交易对对所有交易量都归该做市帐号 // 该交易对对所有交易量都归该做市帐号
async function getDealOneDay(pair, startTime, endTime) { async function getDealOneDay(pair: string, startTime: any, endTime: any, coin_symbol_usdt_rate: any) {
let resCountInBTC = 0; let resCountInUsdt = 0;
try { try {
//查哪里 let dbOne = await dwdExFill.prototype.findOne({
/*let tradeDetail = await ex_trade_detail_spot.find({ attributes: ['product', dwdMadOrmDB.literal('SUM(ABS(quantity)) as quantity')],
attributes: ['currency_symbol', [ormDBSpot.literal('SUM(deal_money)'), 'deal_money']],
where: { where: {
pair: pair, product: pair,
createdAt: { time: {
[Op.gte]: startTime, [dwdMadOrmDB.Op.gte]: startTime,
[Op.lt]: endTime, [dwdMadOrmDB.Op.lt]: endTime,
} }
}, },
group: ['currency_symbol'], group: ['product'],
raw: true, raw: true
}); });
if (tradeDetail && tradeDetail.deal_money > 0.00000001) {
let currencySymbol = tradeDetail.currency_symbol;
let currencyAmount = tradeDetail.deal_money;
let price = await coinPriceInBTC(currencySymbol, startTime, endTime);
let equalBTC = currencyAmount * price;
// let equalBTC = currencyAmount * 0.001;
if (equalBTC >= 0.00000001) {
resCountInBTC = equalBTC;
}
}*/
}
catch (error) {
logger.error(" 查询用户每天做市量出错 ", error);
}
return resCountInBTC;
}
async function coinPriceInBTC(coinSymbol, startTime, endTime) { if (dbOne && dbOne.quantity > 0.00000001) {
let time = Date.now(); let equalUsdt = dbOne.quantity * coin_symbol_usdt_rate;
if (!coinSymbol) { if (equalUsdt >= 0.00000001) {
logger.error(' coinSymbol illegal, coinSymbol is: ', coinSymbol); resCountInUsdt = equalUsdt;
}
let priceInfo = price2BTC[coinSymbol];
if (coinSymbol === 'BTC') {
//BTC无转换
return 1;
} }
else if (priceInfo && (time - priceInfo.updatedTime) <= CACHE_TIMEOUT) {
return priceInfo.price;
} }
else {
//拉取24小时平均价格
let tickerPair, lastPrice = 0;
if (coinSymbol === 'USDT' || coinSymbol === 'DAI' || coinSymbol === 'GUSD') {
tickerPair = 'BTC_' + coinSymbol;
}
else {
tickerPair = coinSymbol + '_BTC';
}
try {
//TODO:查哪里
/*let priceRes = await ex_kline.find({
attributes: [[ormDBSpot.literal('AVG(close)'), 'closePrice']],
where: {
pair: tickerPair,
period: '1hour',
createdAt: {
[Op.gte]: startTime,
[Op.lt]: endTime,
}
},
raw: true,
});
if (priceRes && priceRes.closePrice > 0) {
if (coinSymbol === 'USDT' || coinSymbol === 'DAI' || coinSymbol === 'GUSD') {
lastPrice = 1 / priceRes.closePrice;
} else {
lastPrice = priceRes.closePrice;
}
price2BTC[coinSymbol] = { updatedTime: Date.now(), price: lastPrice };
} else {
logger.warn(` 未查询到交易对${tickerPair} 24hour均值`, priceRes);
}*/
return lastPrice;
} }
catch (error) { catch (error) {
logger.warn(` 查询到交易对${tickerPair} 24hour均值出错 `, error); logger.error(" 查询用户每天做市量出错 ", error);
price2BTC[coinSymbol] = { updatedTime: Date.now(), price: 0 };
return 0;
}
} }
return resCountInUsdt;
} }
function updateCache(resultCache, timestamp, userDeals) { function updateCache(resultCache: any, timestamp: any, userDeals: any) {
if (resultCache) { if (resultCache) {
let timesArr = Object.keys(resultCache); let timesArr = Object.keys(resultCache);
if (!timesArr.includes(String(timestamp)) && userDeals > 0) {//是否存在今天的数据 if (!timesArr.includes(String(timestamp)) && userDeals > 0) {//是否存在今天的数据
...@@ -266,70 +191,11 @@ function updateCache(resultCache, timestamp, userDeals) { ...@@ -266,70 +191,11 @@ function updateCache(resultCache, timestamp, userDeals) {
} }
// 从统计结果中获取用户费率, 旧btc交易量统计会逐渐改为usdt统计 //从统计结果中获取用户费率, usdt统计
function getUserFeeRateFromStatis(dealAmountCache) { function getUserFeeRateFromUsdtStatis(dealAmount: any, statis_period: any, requireAmount: any, taker_fee: any, maker_fee: any) {
let feeRate = FEE_RATE.Default, avg7 = 0, avg15 = 0, canAjustFeeRateBTC = false;
try {
const day7 = 7, day15 = 15;
let timeArr = Object.keys(dealAmountCache), len = timeArr.length, sum;
let feeRate7 = FEE_RATE.Default, feeRate15 = FEE_RATE.Default;
if (len > 0 && len < day7) {// 低于 7 天
sum = 0;
for (let i = 0; i < len; i++) {
let ts = timeArr[i];
sum += Number(dealAmountCache[ts]) || 0;
}
avg7 = sum / len;
}
if (len >= day7) {
canAjustFeeRateBTC = true;
sum = 0;
for (let i = len - 1, stopIndex = len - day7; i >= stopIndex; i--) {
let ts = timeArr[i];
sum += Number(dealAmountCache[ts]) || 0;
}
avg7 = sum / day7;
if (avg7 >= BTC_AMOUNT.BTC30) {
feeRate7 = FEE_RATE.Wan1;
}
else if (avg7 >= BTC_AMOUNT.BTC5) {
feeRate7 = FEE_RATE.Wan2;
}
else if (avg7 > BTC_AMOUNT.BTC0) {
feeRate7 = FEE_RATE.Default;
}
}
if (len >= day15) {
sum = 0;
for (let i = len - 1, stopIndex = len - day15; i >= stopIndex; i--) {
let ts = timeArr[i];
sum += Number(dealAmountCache[ts]) || 0;
}
avg15 = sum / day15;
if (avg15 >= BTC_AMOUNT.BTC30) {
feeRate15 = FEE_RATE.Free;
}
else if (avg15 >= BTC_AMOUNT.BTC5) {
feeRate15 = FEE_RATE.Wan2;
}
else if (avg15 > BTC_AMOUNT.BTC0) {
feeRate15 = FEE_RATE.Default;
}
}
feeRate = Math.min(feeRate7, feeRate15);
}
catch (error) {
logger.warn(' getUserFeeRateFromStatis error', error);
}
return { feeRate, avg7, avg15, canAjustFeeRateBTC };
}
// 增加usdt统计需求,
function getUserFeeRateFromUsdtStatis(dealAmount, statis_period, requireAmount = 100000) {
let timeArr = Object.keys(dealAmount), len = timeArr.length, canAjustFeeRateUsdt = false, sum = 0, avg = 0; let timeArr = Object.keys(dealAmount), len = timeArr.length, canAjustFeeRateUsdt = false, sum = 0, avg = 0;
let taker_rate = 0.0002, maker_rate = 0; // 新项目做市商需求,如果<100K, taker 0.02%, maker = 0; let taker_rate = taker_fee, maker_rate = maker_fee;
//未到统计周期 按原来设置的费率走
if (len > 0 && len < statis_period) { if (len > 0 && len < statis_period) {
for (let i = 0; i < len; i++) { for (let i = 0; i < len; i++) {
let ts = timeArr[i]; let ts = timeArr[i];
...@@ -338,15 +204,18 @@ function getUserFeeRateFromUsdtStatis(dealAmount, statis_period, requireAmount = ...@@ -338,15 +204,18 @@ function getUserFeeRateFromUsdtStatis(dealAmount, statis_period, requireAmount =
avg = sum / len; avg = sum / len;
} }
else if (len >= statis_period) { else if (len >= statis_period) {
canAjustFeeRateUsdt = true;
sum = 0; sum = 0;
for (let i = len - 1, stopIndex = len - statis_period; i >= stopIndex; i--) { for (let i = len - 1, stopIndex = len - statis_period; i >= stopIndex; i--) {
let ts = timeArr[i]; let ts = timeArr[i];
sum += Number(dealAmount[ts]) || 0; sum += Number(dealAmount[ts]) || 0;
} }
avg = sum / statis_period; avg = sum / statis_period;
if (avg >= requireAmount) { //到达统计周期 但是不满足 承诺交易量
taker_rate = 0; if (avg < requireAmount) {
//需要调整为普通费率
canAjustFeeRateUsdt = true;
taker_rate = Market_Maker_FEE.init_taker;
maker_rate = Market_Maker_FEE.init_maker;
} }
} }
return { taker_rate, maker_rate, avg_usdt: avg, canAjustFeeRateUsdt }; return { taker_rate, maker_rate, avg_usdt: avg, canAjustFeeRateUsdt };
...@@ -354,85 +223,29 @@ function getUserFeeRateFromUsdtStatis(dealAmount, statis_period, requireAmount = ...@@ -354,85 +223,29 @@ function getUserFeeRateFromUsdtStatis(dealAmount, statis_period, requireAmount =
// 调整做市商费率最佳 // 调整做市商费率最佳
async function adjustMakerFeeRate(now, user_id, pair, enableAjustFee, feeObjBtc: any = {}, feeObjUsdt: any = {}, fatherFeeObj: any = {}) { async function adjustMakerFeeRate(now: any, user_id: any, pair: any, status: any, feeObjUsdt: any = {}, fatherFeeObj: any = {}) {
// let now = Date.now(); // let now = Date.now();
let expired = new Date(now).getTime() + DAY - 30000; // 有效期提前30s,早于新费率开始时间 let expired = new Date(now).getTime() + DAY - 30000; // 有效期提前30s,早于新费率开始时间
console.error(' 执行项目做市商 uid %s , %s 费率调整 ', user_id, pair); console.error(' 执行项目做市商 uid %s , %s 费率调整 ', user_id, pair);
let maker_fee = Market_Maker_FEE.init_maker, taker_fee = Market_Maker_FEE.init_taker; //status 2 生效时才统计
let { maker, taker } = await getProjectSpotFeeRate(user_id, pair, now - 3600000);// 查询费率变更前的费率 0 则继续免费 if (Number(status) == 2) {
if (enableAjustFee) { if (feeObjUsdt && feeObjUsdt.canAjustFeeRateUsdt) {
if (feeObjUsdt && feeObjUsdt.canAjustFeeRateUsdt) { // 新版usdt计量策略优先
console.error(' 新做市策略 ', JSON.stringify(feeObjUsdt)); console.error(' 新做市策略 ', JSON.stringify(feeObjUsdt));
if (taker_fee > feeObjUsdt.taker_rate) { // taker_rate, maker_rate, let taker_fee = feeObjUsdt.taker_rate;
taker_fee = feeObjUsdt.taker_rate; let maker_fee = feeObjUsdt.maker_rate;
}
if (maker_fee > feeObjUsdt.maker_rate) {
maker_fee = feeObjUsdt.maker_rate;
}
await storeFatherFeeSet(user_id, pair, maker_fee, taker_fee, fatherFeeObj);
await setExpiredFeeSettingActiveOver(user_id, pair);
return await addFeeRate(user_id, pair, FEE_MODEL.fixedingain, maker_fee, taker_fee, now, expired, Market_Maker_FEE.init_maker, Market_Maker_FEE.init_taker, "项目方做市商根据usdt成交量自动调整");
}
else if (feeObjBtc && feeObjBtc.canAjustFeeRateBTC) { // 执行老版 btc 计量策略
console.error(' 早期做市策略 ', JSON.stringify(feeObjBtc));
if (maker == FEE_RATE.Free && taker == FEE_RATE.Free && feeObjBtc.feeRate == FEE_RATE.Wan1) {//手动设置,默认免手续费;若项目单个交易对连续7天日均交易量达到30BTC以上,该交易对手续费保持免费;(运营加需求)
await storeFatherFeeSet(user_id, pair, FEE_RATE.Free, FEE_RATE.Free, fatherFeeObj);
await setExpiredFeeSettingActiveOver(user_id, pair);
return await addFeeRate(user_id, pair, FEE_MODEL.fixedingain, FEE_RATE.Free, FEE_RATE.Free, now, expired, Market_Maker_FEE.init_maker, Market_Maker_FEE.init_taker, "项目方做市商根据btc成交量自动调整");
}
else {
console.error(' 早期做市策略 ', JSON.stringify(feeObjBtc));
// maker_fee = feeObjBtc.feeRate, taker_fee = feeObjBtc.feeRate;
maker_fee = Math.min(maker_fee, feeObjBtc.feeRate), taker_fee = Math.min(taker_fee, feeObjBtc.feeRate);
await storeFatherFeeSet(user_id, pair, maker_fee, taker_fee, fatherFeeObj); await storeFatherFeeSet(user_id, pair, maker_fee, taker_fee, fatherFeeObj);
await setExpiredFeeSettingActiveOver(user_id, pair); await setExpiredFeeSettingActiveOver(user_id, pair);
return await addFeeRate(user_id, pair, FEE_MODEL.fixedingain, maker_fee, taker_fee, now, expired, Market_Maker_FEE.init_maker, Market_Maker_FEE.init_taker, "项目方做市商策略根据btc成交量自动调整"); return await addFeeRate(user_id, pair, FEE_MODEL.fixedingain, maker_fee, taker_fee, now, expired, "项目方做市商根据usdt成交量自动调整");
}
} }
} }
} }
/** async function storeFatherFeeSet(user_id: any, pair: any, maker_fee: any, taker_fee: any, fatherFeeObj = {}) {
* 如果用户设置前7日>30BTC并且享受免费, 则一直为免费 let fatherObj = await getFatherUID(user_id);
* @param {*} user_id if (fatherObj && fatherObj.father_id) {
* @param {*} pair let key = fatherObj.father_id + "@" + pair;
* @param {*} time
*/
async function getProjectSpotFeeRate(user_id, pair, time) {
let maker = FEE_RATE.maker_default, taker = FEE_RATE.Default;
try {
let res = await feeRateSpotLog.prototype.findOne({
attributes: ['maker_fee', 'taker_fee'],
where: {
user_id: user_id,
pair: pair,
is_check: 1,
beginAt: { [Op.lt]: new Date(time), },
expireAt: { [Op.gte]: new Date(time), }
},
raw: true,
});
if (res && Number(res.maker_fee) >= 0 && Number(res.taker_fee) >= 0) {
maker = Number(res.maker_fee);
taker = Number(res.taker_fee);
}
}
catch (error) {
logger.warn(' marketMarkerMgr.service ', error);
}
return {
taker,
maker,
}
}
async function storeFatherFeeSet(user_id, pair, maker_fee, taker_fee, fatherFeeObj = {}) {
let faterObj = await getFaterUID(user_id);
if (faterObj && faterObj.father_id) {
let key = faterObj.father_id + "@" + pair;
if (!fatherFeeObj[key]) { if (!fatherFeeObj[key]) {
fatherFeeObj[key] = { fatherFeeObj[key] = {
pair, pair,
...@@ -453,7 +266,7 @@ async function storeFatherFeeSet(user_id, pair, maker_fee, taker_fee, fatherFeeO ...@@ -453,7 +266,7 @@ async function storeFatherFeeSet(user_id, pair, maker_fee, taker_fee, fatherFeeO
// 获取某个子账户的父账户 // 获取某个子账户的父账户
async function getFaterUID(user_id) { async function getFatherUID(user_id: any) {
return user_info_son.findOne({ return user_info_son.findOne({
attributes: ['father_id'], attributes: ['father_id'],
where: { where: {
...@@ -466,7 +279,7 @@ async function getFaterUID(user_id) { ...@@ -466,7 +279,7 @@ async function getFaterUID(user_id) {
// 将即过期默认为生效的置为生效完成, 防止覆盖新的费率 // 将即过期默认为生效的置为生效完成, 防止覆盖新的费率
async function setExpiredFeeSettingActiveOver(user_id, pair) { async function setExpiredFeeSettingActiveOver(user_id: any, pair: any) {
try { try {
let now = new Date(); let now = new Date();
// console.log(' 更新做市商即将到期生效的费率', user_id, pair); // console.log(' 更新做市商即将到期生效的费率', user_id, pair);
...@@ -490,25 +303,8 @@ async function setExpiredFeeSettingActiveOver(user_id, pair) { ...@@ -490,25 +303,8 @@ async function setExpiredFeeSettingActiveOver(user_id, pair) {
} }
} }
async function getPairsByType(type: number) {
let dbList: any;
//现货
if (type == 1) {
dbList = await spotPairs.prototype.findAll({
where: { status: 2 },
raw: true
});
}
else {
dbList = await contractPairs.prototype.findAll({
where: { status: 2 },
raw: true
});
}
return dbList.map(item => item.symbol);
}
async function addFeeRate(user_id, pair, fee_model, maker_fee, taker_fee, beginAt, expireAt, maker_fee_late, taker_fee_late, comment = '') { async function addFeeRate(user_id: any, pair: any, fee_model: any, maker_fee: any, taker_fee: any, beginAt: any, expireAt: any, comment = '') {
if (comment && String(comment).length > 512) { if (comment && String(comment).length > 512) {
throw '3000'; throw '3000';
} }
......
...@@ -208,7 +208,7 @@ async function setExpiredDefault() { ...@@ -208,7 +208,7 @@ async function setExpiredDefault() {
}, },
raw: true, raw: true,
}); });
let init_maker_rate = 1, init_taker_rate = 1; // maker_fee 和 taker_fee 同时为1 代表初始化用户费率 let init_maker_rate = 0.0004, init_taker_rate = 0.0006; // 初始用户费率
let newFeeArr: any = []; let newFeeArr: any = [];
let beginAt = new Date(); let beginAt = new Date();
......
...@@ -206,7 +206,7 @@ async function setExpiredDefault() { ...@@ -206,7 +206,7 @@ async function setExpiredDefault() {
unCheckCountObj[user_id] = amount; unCheckCountObj[user_id] = amount;
} }
let init_maker_rate = 1, init_taker_rate = 1; // maker_fee 和 taker_fee 同时为1 代表初始化用户费率 let init_maker_rate = 0.0004, init_taker_rate = 0.0006; // 初始用户费率
let newFeeArr: any = []; let newFeeArr: any = [];
let beginAt = new Date(); let beginAt = new Date();
......
...@@ -231,7 +231,7 @@ async function setExpiredDefault() { ...@@ -231,7 +231,7 @@ async function setExpiredDefault() {
}, },
raw: true, raw: true,
}); });
let init_maker_rate = 1, init_taker_rate = 1; // maker_fee 和 taker_fee 同时为1 代表初始化用户费率 let init_maker_rate = 0.001, init_taker_rate = 0.002; // 初始用户费率
let activePairs: any = ['all']; let activePairs: any = ['all'];
for (let i = 0; i < defaultPairFee.length; i++) { for (let i = 0; i < defaultPairFee.length; i++) {
let { symbol} = defaultPairFee[i]; let { symbol} = defaultPairFee[i];
......
import { statisProjectMakerDeals } from "../service/task.market.maker.statis.service"; import { statisticsProjectMakerDeals } from "../service/task.market.maker.statis.service";
const schedule = require('node-schedule'); const schedule = require('node-schedule');
const logger = require('@madex/ex-js-public').logger; const logger = require('@madex/ex-js-public').logger;
...@@ -14,7 +14,7 @@ let setFeeRateJob = schedule.scheduleJob('0 10 0 * * *', async function () { ...@@ -14,7 +14,7 @@ let setFeeRateJob = schedule.scheduleJob('0 10 0 * * *', async function () {
} }
inJob = true; inJob = true;
try { try {
await statisProjectMakerDeals(); await statisticsProjectMakerDeals();
inJob = false; inJob = false;
} catch (error) { } catch (error) {
inJob = false; inJob = false;
......
...@@ -65,7 +65,7 @@ export const update = async (req: any, commonUserFeeVO: CommonUserFeeVO) => { ...@@ -65,7 +65,7 @@ export const update = async (req: any, commonUserFeeVO: CommonUserFeeVO) => {
try { try {
let ip = isIp(req.ip) ? req.ip : '*.*.*.*'; let ip = isIp(req.ip) ? req.ip : '*.*.*.*';
let currentUserId = await getCurrentUserId(req.cookies.session_id); let currentUserId = await getCurrentUserId(req.cookies.session_id);
if (!commonUserFeeVO.id){ if (!commonUserFeeVO.id) {
throw ErrorCode.PARAM_MISS; throw ErrorCode.PARAM_MISS;
} }
await addParamValid(commonUserFeeVO); await addParamValid(commonUserFeeVO);
...@@ -103,7 +103,6 @@ export const del = async (req: any, commonUserFeeVO: CommonUserFeeVO) => { ...@@ -103,7 +103,6 @@ export const del = async (req: any, commonUserFeeVO: CommonUserFeeVO) => {
}; };
/** /**
* 用户等级费率列表 * 用户等级费率列表
* @param req * @param req
...@@ -141,12 +140,13 @@ async function addParamValid(commonUserFeeVO: CommonUserFeeVO) { ...@@ -141,12 +140,13 @@ async function addParamValid(commonUserFeeVO: CommonUserFeeVO) {
throw ErrorCode.PAIR_NOT_SUPPORT; throw ErrorCode.PAIR_NOT_SUPPORT;
}*/ }*/
//校验费率范围 //校验费率范围
if (type == FEE_TYPE.FEE_TYPE_SPOT){ if (type == FEE_TYPE.FEE_TYPE_SPOT) {
if (Number(makerFee) < 0.0002 || Number(takerFee) < 0.0005){ if (Number(makerFee) < 0.0002 || Number(takerFee) < 0.0005) {
throw ErrorCode.FEE_TOO_LOW_OR_HIGH; throw ErrorCode.FEE_TOO_LOW_OR_HIGH;
} }
}else { }
if (Number(makerFee) < -0.00015 || Number(takerFee) < 0.00035){ else {
if (Number(makerFee) < -0.00015 || Number(takerFee) < 0.00035) {
throw ErrorCode.FEE_TOO_LOW_OR_HIGH; throw ErrorCode.FEE_TOO_LOW_OR_HIGH;
} }
} }
...@@ -232,6 +232,10 @@ async function checkMaker(commonUserFeeVO: CommonUserFeeVO) { ...@@ -232,6 +232,10 @@ async function checkMaker(commonUserFeeVO: CommonUserFeeVO) {
} }
//项目方 //项目方
if (userChannel == 2) { if (userChannel == 2) {
//项目方只允许现货并且单个交易对
if (Number(commonUserFeeVO.type) != 1 || commonUserFeeVO.pair == 'all') {
throw ErrorCode.PARAM_MISS;
}
let statisPeriod = commonUserFeeVO.statis_period; let statisPeriod = commonUserFeeVO.statis_period;
let amount_require_usdt = commonUserFeeVO.amount_require_usdt; let amount_require_usdt = commonUserFeeVO.amount_require_usdt;
if (!statisPeriod || Number(statisPeriod) < 0 || Number(statisPeriod) > 30) { if (!statisPeriod || Number(statisPeriod) < 0 || Number(statisPeriod) > 30) {
......
...@@ -98,6 +98,15 @@ export async function list(pageVO: CommonUserFeePageVO) { ...@@ -98,6 +98,15 @@ export async function list(pageVO: CommonUserFeePageVO) {
where['status'] = pageVO.status; where['status'] = pageVO.status;
} }
} }
if (pageVO.user_id) {
where['user_id'] = pageVO.user_id;
}
if (pageVO.type) {
where['type'] = pageVO.type;
}
if (pageVO.user_channel) {
where['user_channel'] = pageVO.user_channel;
}
if (pageVO.export) { if (pageVO.export) {
let resList = await commonUserFeeSetting.prototype.findAll({ let resList = await commonUserFeeSetting.prototype.findAll({
...@@ -107,12 +116,7 @@ export async function list(pageVO: CommonUserFeePageVO) { ...@@ -107,12 +116,7 @@ export async function list(pageVO: CommonUserFeePageVO) {
}); });
return resList; return resList;
} }
if (pageVO.user_id) {
where['user_id'] = pageVO.user_id;
}
if (pageVO.type) {
where['type'] = pageVO.type;
}
let resList = await commonUserFeeSetting.prototype.findAndCount({ let resList = await commonUserFeeSetting.prototype.findAndCount({
...@@ -131,8 +135,6 @@ export async function list(pageVO: CommonUserFeePageVO) { ...@@ -131,8 +135,6 @@ export async function list(pageVO: CommonUserFeePageVO) {
if (userChannel == 2) { if (userChannel == 2) {
cacheData = await getProjectMakerTradeStat(userId, pair); cacheData = await getProjectMakerTradeStat(userId, pair);
} }
item.avg7 = cacheData ? cacheData.avg7 : 0;
item.avg15 = cacheData ? cacheData.avg15 : 0;
item.avgUsdt = cacheData ? cacheData.avgUsdt : 0; item.avgUsdt = cacheData ? cacheData.avgUsdt : 0;
} }
} }
...@@ -524,16 +526,12 @@ async function checkContractPair(pair: string) { ...@@ -524,16 +526,12 @@ async function checkContractPair(pair: string) {
async function getProjectMakerTradeStat(user_id: number, pair: string) { async function getProjectMakerTradeStat(user_id: number, pair: string) {
let res = { let res = {
avg7: 0,
avg15: 0,
avgUsdt: 0, avgUsdt: 0,
}; };
let key = user_id + "_" + pair + "_projectMaker_FeeRate"; let key = user_id + "_" + pair + "_projectMaker_FeeRate";
let redisData = await RedisClient.getSync(key); let redisData = await RedisClient.getSync(key);
if (redisData) { if (redisData) {
let obj = JSON.parse(redisData); let obj = JSON.parse(redisData);
res.avg7 = obj.avg7;
res.avg15 = obj.avg15;
res.avgUsdt = obj.avgUsdt; res.avgUsdt = obj.avgUsdt;
} }
return res; return res;
......
...@@ -143,7 +143,7 @@ export async function kycList(queryVO: QueryVO) { ...@@ -143,7 +143,7 @@ export async function kycList(queryVO: QueryVO) {
} }
let resList = await userRealName.prototype.findAndCount({ let resList = await userRealName.prototype.findAndCount({
attributes: ['id', 'user_id', 'status', 'createdAt'], attributes: ['id', 'user_id', 'status', 'createdAt','auditor'],
where: where, where: where,
limit: queryVO.size, limit: queryVO.size,
offset: (Number(queryVO.page) - 1) * Number(queryVO.size), offset: (Number(queryVO.page) - 1) * Number(queryVO.size),
......
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