Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
T
ts-api-demo
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wmvm
ts-api-demo
Commits
e4a5d77f
Commit
e4a5d77f
authored
Jan 09, 2025
by
ml
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
新管理后台-部分接口逻辑调整、项目方交易量统计定时任务
parent
b66ba41a
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
126 additions
and
325 deletions
+126
-325
task.fee.rate.log.model.ts
cron/model/task.fee.rate.log.model.ts
+12
-9
task.market.maker.statis.service.ts
cron/service/task.market.maker.statis.service.ts
+88
-292
task_fee_rate_base_coin_contract_log.ts
cron/task/task_fee_rate_base_coin_contract_log.ts
+1
-1
task_fee_rate_contract_log.ts
cron/task/task_fee_rate_contract_log.ts
+1
-1
task_fee_rate_spot_log.ts
cron/task/task_fee_rate_spot_log.ts
+1
-1
task_market_maker_statis.ts
cron/task/task_market_maker_statis.ts
+2
-2
commonUserFeeSetting.control.ts
src/functional/mvc/control/commonUserFeeSetting.control.ts
+10
-6
commonUserFeeSetting.service.ts
src/functional/mvc/service/commonUserFeeSetting.service.ts
+10
-12
mUserRealName.service.ts
src/functional/mvc/service/mUserRealName.service.ts
+1
-1
No files found.
cron/model/task.fee.rate.log.model.ts
View file @
e4a5d77f
...
...
@@ -148,9 +148,10 @@ export const changeUserSpotFee = async function (user_id, symbol, fee_model, mak
await
checkUser
(
user_id
);
await
sleep
(
1000
);
//请求撮合 修改费率
let
res
=
await
changeTradingFee
(
pair
,
user_id
,
maker_fee
,
taker_fee
,
"spot"
,
opt_market
);
//请求撮合 修改费率 maker_fee 和 taker_fee 同时为1 代表初始化费率
let
tmp_maker_fee
=
Number
(
maker_fee
)
==
0.001
?
1
:
maker_fee
;
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
;
};
...
...
@@ -194,8 +195,10 @@ export const changeUserContractFee = async function (user_id, symbol, fee_model,
await
checkUser
(
user_id
);
await
sleep
(
1000
);
//请求撮合 修改费率
let
res
=
await
changeTradingFee
(
pair
,
user_id
,
maker_fee
,
taker_fee
,
"lpc"
,
opt_market
);
//请求撮合 修改费率 maker_fee 和 taker_fee 同时为1 代表初始化费率
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
;
};
...
...
cron/service/task.market.maker.statis.service.ts
View file @
e4a5d77f
// 每日定时统计项目方 指定交易对做市信息, 并根据成交量信息进行费率分档优惠;
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
*
as
RobotUtil
from
"../../src/utils/robotUtils"
;
let
Op
=
ormDB
.
Op
;
let
{
tickerUtils
,
redisUtilsCommon
}
=
require
(
'@madex/ex-js-common'
);
...
...
@@ -11,8 +15,6 @@ const SonStatus = userInfoSon.STATUS;
const
logger
=
require
(
'@madex/ex-js-public'
).
logger
;
let
feeRateCheckStatus
=
FEE_RATE_LOG_STATUS
;
//对btc价格,缓存 {coinSymbol: priceInfo}
var
price2BTC
=
{};
//价格缓存时间 2分钟
const
CACHE_TIMEOUT
=
2
*
60
*
1000
;
...
...
@@ -34,47 +36,55 @@ const BTC_AMOUNT = {
"Free"
:
0
,
},
Market_Maker_FEE
=
{
init_taker
:
0.00
0
2
,
init_maker
:
0
,
init_taker
:
0.002
,
init_maker
:
0
.001
,
}
async
function
delayPromise
(
time
)
{
async
function
delayPromise
(
time
:
any
)
{
return
new
Promise
((
resolve
)
=>
setTimeout
(
resolve
,
time
));
}
export
const
statisProjectMakerDeals
=
async
function
(
now
=
Date
.
now
())
{
export
const
statis
tics
ProjectMakerDeals
=
async
function
(
now
=
Date
.
now
())
{
try
{
//TODO:按之前代码来看,只有现货相关的,这里怎么做
let
ticker_map
:
any
=
{};
let
users
=
await
projectMaker
();
let
startTime
=
now
-
now
%
DAY
-
DAY
;
// 当前统计昨天的成交数据
let
btc2usdt
=
await
getDealOneDayInUSDT
(
startTime
,
startTime
+
DAY
);
let
fatherFeeObj
=
{};
// { fatherid_pair: {maker, taker}}
// 当前统计昨天的成交数据
let
startTime
=
now
-
now
%
DAY
-
DAY
;
// { father_id_pair: {maker, taker}}
let
fatherFeeObj
=
{};
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
];
for
(
let
onePair
of
pairs
)
{
if
(
user_id
&&
onePair
)
{
let
redisKey
=
user_id
+
"_"
+
onePair
+
"_projectMaker_FeeRate"
;
let
{
user_id
,
pair
,
status
,
statis_period
,
amount_require_usdt
,
maker_fee
,
taker_fee
}
=
users
[
i
];
if
(
pair
==
'all'
)
{
let
msg
=
`统计项目方交易量发生错误:user_id:
${
user_id
}
,pair:
${
pair
}
`
;
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
);
let
[
statis
,
statisUsdt
]
=
await
statisUserPairSpot
(
user_id
,
onePair
,
startTime
,
btc2usdt
);
let
feeObjBtc
=
getUserFeeRateFromStatis
(
statis
);
// old
let
feeObjUsdt
=
getUserFeeRateFromUsdtStatis
(
statisUsdt
,
statis_period
,
amount_require_usdt
)
await
adjustMakerFeeRate
(
now
,
user_id
,
onePair
,
status
,
feeObjBtc
,
feeObjUsdt
,
fatherFeeObj
);
redisUtilsCommon
.
write
(
redisKey
,
JSON
.
stringify
(
Object
.
assign
({},
feeObjUsdt
,
feeObjBtc
)),
0
,
()
=>
{
let
statisUsdt
=
await
statisUserPairSpot
(
user_id
,
pair
,
startTime
,
coin_symbol_usdt_rate
);
let
feeObjUsdt
=
getUserFeeRateFromUsdtStatis
(
statisUsdt
,
statis_period
,
amount_require_usdt
,
taker_fee
,
maker_fee
);
await
adjustMakerFeeRate
(
now
,
user_id
,
pair
,
status
,
feeObjUsdt
,
fatherFeeObj
);
redisUtilsCommon
.
write
(
redisKey
,
JSON
.
stringify
(
Object
.
assign
({},
feeObjUsdt
)),
0
,
()
=>
{
});
}
}
}
now
=
Date
.
now
();
let
expired
=
now
+
DAY
-
30000
;
for
(
let
key
in
fatherFeeObj
)
{
let
[
user_id
,
pair
]
=
key
.
split
(
'@'
);
let
faterFee
=
fatherFeeObj
[
key
];
if
(
faterFee
)
{
let
{
maker_fee
,
taker_fee
}
=
faterFee
;
let
fat
h
erFee
=
fatherFeeObj
[
key
];
if
(
fat
h
erFee
)
{
let
{
maker_fee
,
taker_fee
}
=
fat
h
erFee
;
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()) {
}
}
// 统计 项目方 7日, 15日 指定币种对 做市
/**
* 查询项目方 (只有现货的)
*/
async
function
projectMaker
()
{
let
res
:
any
=
[];
try
{
...
...
@@ -104,144 +116,57 @@ async function projectMaker() {
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
)
{
let
redisKey
=
user_id
+
"_"
+
pair
+
'_projectMaker_spot'
;
async
function
statisUserPairSpot
(
user_id
:
number
,
pair
:
string
,
timestamp
:
any
,
coin_symbol_usdt_rate
:
any
)
{
let
redisKeyUsdt
=
user_id
+
"_"
+
pair
+
'_projectMaker_spot_usdt'
;
let
resultCache
=
{},
resultCache
InUsdt
=
{};
let
resultCacheInUsdt
=
{};
try
{
[
resultCache
,
resultCacheInUsdt
]
=
await
Promise
.
all
([
redisUtilsCommon
.
getSync
(
redisKey
),
redisUtilsCommon
.
getSync
(
redisKeyUsdt
)]);
let
userDeals
=
await
getDealOneDay
(
pair
,
new
Date
(
timestamp
),
timestamp
+
DAY
);
resultCache
=
updateCache
(
resultCache
,
timestamp
,
userDeals
);
let
usdtAmount
=
Number
(
userDeals
)
*
btc2usdt
let
resultCacheInUsdt
=
await
redisUtilsCommon
.
getSync
(
redisKeyUsdt
);
let
usdtAmount
=
await
getDealOneDay
(
pair
,
new
Date
(
timestamp
),
timestamp
+
DAY
,
coin_symbol_usdt_rate
);
resultCacheInUsdt
=
updateCache
(
resultCacheInUsdt
,
timestamp
,
usdtAmount
);
redisUtilsCommon
.
write
(
redisKey
,
JSON
.
stringify
(
resultCache
),
0
,
()
=>
{
});
redisUtilsCommon
.
write
(
redisKeyUsdt
,
JSON
.
stringify
(
resultCacheInUsdt
),
0
,
()
=>
{
});
}
catch
(
error
)
{
logger
.
warn
(
' 统计项目做市上成交总和 error '
,
error
);
}
return
[
resultCache
,
resultCacheInUsdt
]
;
return
resultCacheInUsdt
;
}
// 获取昨天一天的的统计交易量
// 该交易对对所有交易量都归该做市帐号
async
function
getDealOneDay
(
pair
,
startTime
,
endTime
)
{
let
resCountIn
BTC
=
0
;
async
function
getDealOneDay
(
pair
:
string
,
startTime
:
any
,
endTime
:
any
,
coin_symbol_usdt_rate
:
any
)
{
let
resCountIn
Usdt
=
0
;
try
{
//查哪里
/*let tradeDetail = await ex_trade_detail_spot.find({
attributes: ['currency_symbol', [ormDBSpot.literal('SUM(deal_money)'), 'deal_money']],
let
dbOne
=
await
dwdExFill
.
prototype
.
findOne
({
attributes
:
[
'product'
,
dwdMadOrmDB
.
literal
(
'SUM(ABS(quantity)) as quantity'
)],
where
:
{
p
air
: pair,
createdAt
: {
[Op.gte]: startTime,
[Op.lt]: endTime,
p
roduct
:
pair
,
time
:
{
[
dwdMadOrmDB
.
Op
.
gte
]:
startTime
,
[
dwdMadOrmDB
.
Op
.
lt
]:
endTime
,
}
},
group: ['
currency_symbol
'],
raw: true
,
group
:
[
'
product
'
],
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
)
{
let
time
=
Date
.
now
();
if
(
!
coinSymbol
)
{
logger
.
error
(
' coinSymbol illegal, coinSymbol is: '
,
coinSymbol
);
}
let
priceInfo
=
price2BTC
[
coinSymbol
];
if
(
coinSymbol
===
'BTC'
)
{
//BTC无转换
return
1
;
if
(
dbOne
&&
dbOne
.
quantity
>
0.00000001
)
{
let
equalUsdt
=
dbOne
.
quantity
*
coin_symbol_usdt_rate
;
if
(
equalUsdt
>=
0.00000001
)
{
resCountInUsdt
=
equalUsdt
;
}
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
)
{
logger
.
warn
(
` 查询到交易对
${
tickerPair
}
24hour均值出错 `
,
error
);
price2BTC
[
coinSymbol
]
=
{
updatedTime
:
Date
.
now
(),
price
:
0
};
return
0
;
}
logger
.
error
(
" 查询用户每天做市量出错 "
,
error
);
}
return
resCountInUsdt
;
}
function
updateCache
(
resultCache
,
timestamp
,
userDeals
)
{
function
updateCache
(
resultCache
:
any
,
timestamp
:
any
,
userDeals
:
any
)
{
if
(
resultCache
)
{
let
timesArr
=
Object
.
keys
(
resultCache
);
if
(
!
timesArr
.
includes
(
String
(
timestamp
))
&&
userDeals
>
0
)
{
//是否存在今天的数据
...
...
@@ -266,70 +191,11 @@ function updateCache(resultCache, timestamp, userDeals) {
}
// 从统计结果中获取用户费率, 旧btc交易量统计会逐渐改为usdt统计
function
getUserFeeRateFromStatis
(
dealAmountCache
)
{
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
)
{
//从统计结果中获取用户费率, usdt统计
function
getUserFeeRateFromUsdtStatis
(
dealAmount
:
any
,
statis_period
:
any
,
requireAmount
:
any
,
taker_fee
:
any
,
maker_fee
:
any
)
{
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
)
{
for
(
let
i
=
0
;
i
<
len
;
i
++
)
{
let
ts
=
timeArr
[
i
];
...
...
@@ -338,15 +204,18 @@ function getUserFeeRateFromUsdtStatis(dealAmount, statis_period, requireAmount =
avg
=
sum
/
len
;
}
else
if
(
len
>=
statis_period
)
{
canAjustFeeRateUsdt
=
true
;
sum
=
0
;
for
(
let
i
=
len
-
1
,
stopIndex
=
len
-
statis_period
;
i
>=
stopIndex
;
i
--
)
{
let
ts
=
timeArr
[
i
];
sum
+=
Number
(
dealAmount
[
ts
])
||
0
;
}
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
};
...
...
@@ -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
expired
=
new
Date
(
now
).
getTime
()
+
DAY
-
30000
;
// 有效期提前30s,早于新费率开始时间
console
.
error
(
' 执行项目做市商 uid %s , %s 费率调整 '
,
user_id
,
pair
);
let
maker_fee
=
Market_Maker_FEE
.
init_maker
,
taker_fee
=
Market_Maker_FEE
.
init_taker
;
let
{
maker
,
taker
}
=
await
getProjectSpotFeeRate
(
user_id
,
pair
,
now
-
3600000
);
// 查询费率变更前的费率 0 则继续免费
if
(
enableAjustFee
)
{
if
(
feeObjUsdt
&&
feeObjUsdt
.
canAjustFeeRateUsdt
)
{
// 新版usdt计量策略优先
//status 2 生效时才统计
if
(
Number
(
status
)
==
2
)
{
if
(
feeObjUsdt
&&
feeObjUsdt
.
canAjustFeeRateUsdt
)
{
console
.
error
(
' 新做市策略 '
,
JSON
.
stringify
(
feeObjUsdt
));
if
(
taker_fee
>
feeObjUsdt
.
taker_rate
)
{
// taker_rate, maker_rate,
taker_fee
=
feeObjUsdt
.
taker_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
);
let
taker_fee
=
feeObjUsdt
.
taker_rate
;
let
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
,
"项目方做市商策略根据btc成交量自动调整"
);
}
return
await
addFeeRate
(
user_id
,
pair
,
FEE_MODEL
.
fixedingain
,
maker_fee
,
taker_fee
,
now
,
expired
,
"项目方做市商根据usdt成交量自动调整"
);
}
}
}
/**
* 如果用户设置前7日>30BTC并且享受免费, 则一直为免费
* @param {*} user_id
* @param {*} 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
;
async
function
storeFatherFeeSet
(
user_id
:
any
,
pair
:
any
,
maker_fee
:
any
,
taker_fee
:
any
,
fatherFeeObj
=
{})
{
let
fatherObj
=
await
getFatherUID
(
user_id
);
if
(
fatherObj
&&
fatherObj
.
father_id
)
{
let
key
=
fatherObj
.
father_id
+
"@"
+
pair
;
if
(
!
fatherFeeObj
[
key
])
{
fatherFeeObj
[
key
]
=
{
pair
,
...
...
@@ -453,7 +266,7 @@ async function storeFatherFeeSet(user_id, pair, maker_fee, taker_fee, fatherFeeO
// 获取某个子账户的父账户
async
function
getFat
erUID
(
user_id
)
{
async
function
getFat
herUID
(
user_id
:
any
)
{
return
user_info_son
.
findOne
({
attributes
:
[
'father_id'
],
where
:
{
...
...
@@ -466,7 +279,7 @@ async function getFaterUID(user_id) {
// 将即过期默认为生效的置为生效完成, 防止覆盖新的费率
async
function
setExpiredFeeSettingActiveOver
(
user_id
,
pair
)
{
async
function
setExpiredFeeSettingActiveOver
(
user_id
:
any
,
pair
:
any
)
{
try
{
let
now
=
new
Date
();
// console.log(' 更新做市商即将到期生效的费率', 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
)
{
throw
'3000'
;
}
...
...
cron/task/task_fee_rate_base_coin_contract_log.ts
View file @
e4a5d77f
...
...
@@ -208,7 +208,7 @@ async function setExpiredDefault() {
},
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
beginAt
=
new
Date
();
...
...
cron/task/task_fee_rate_contract_log.ts
View file @
e4a5d77f
...
...
@@ -206,7 +206,7 @@ async function setExpiredDefault() {
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
beginAt
=
new
Date
();
...
...
cron/task/task_fee_rate_spot_log.ts
View file @
e4a5d77f
...
...
@@ -231,7 +231,7 @@ async function setExpiredDefault() {
},
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'
];
for
(
let
i
=
0
;
i
<
defaultPairFee
.
length
;
i
++
)
{
let
{
symbol
}
=
defaultPairFee
[
i
];
...
...
cron/task/task_market_maker_statis.ts
View file @
e4a5d77f
import
{
statisProjectMakerDeals
}
from
"../service/task.market.maker.statis.service"
;
import
{
statis
tics
ProjectMakerDeals
}
from
"../service/task.market.maker.statis.service"
;
const
schedule
=
require
(
'node-schedule'
);
const
logger
=
require
(
'@madex/ex-js-public'
).
logger
;
...
...
@@ -14,7 +14,7 @@ let setFeeRateJob = schedule.scheduleJob('0 10 0 * * *', async function () {
}
inJob
=
true
;
try
{
await
statisProjectMakerDeals
();
await
statis
tics
ProjectMakerDeals
();
inJob
=
false
;
}
catch
(
error
)
{
inJob
=
false
;
...
...
src/functional/mvc/control/commonUserFeeSetting.control.ts
View file @
e4a5d77f
...
...
@@ -65,7 +65,7 @@ export const update = async (req: any, commonUserFeeVO: CommonUserFeeVO) => {
try
{
let
ip
=
isIp
(
req
.
ip
)
?
req
.
ip
:
'*.*.*.*'
;
let
currentUserId
=
await
getCurrentUserId
(
req
.
cookies
.
session_id
);
if
(
!
commonUserFeeVO
.
id
){
if
(
!
commonUserFeeVO
.
id
)
{
throw
ErrorCode
.
PARAM_MISS
;
}
await
addParamValid
(
commonUserFeeVO
);
...
...
@@ -103,7 +103,6 @@ export const del = async (req: any, commonUserFeeVO: CommonUserFeeVO) => {
};
/**
* 用户等级费率列表
* @param req
...
...
@@ -141,12 +140,13 @@ async function addParamValid(commonUserFeeVO: CommonUserFeeVO) {
throw ErrorCode.PAIR_NOT_SUPPORT;
}*/
//校验费率范围
if
(
type
==
FEE_TYPE
.
FEE_TYPE_SPOT
){
if
(
Number
(
makerFee
)
<
0.0002
||
Number
(
takerFee
)
<
0.0005
){
if
(
type
==
FEE_TYPE
.
FEE_TYPE_SPOT
)
{
if
(
Number
(
makerFee
)
<
0.0002
||
Number
(
takerFee
)
<
0.0005
)
{
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
;
}
}
...
...
@@ -232,6 +232,10 @@ async function checkMaker(commonUserFeeVO: CommonUserFeeVO) {
}
//项目方
if
(
userChannel
==
2
)
{
//项目方只允许现货并且单个交易对
if
(
Number
(
commonUserFeeVO
.
type
)
!=
1
||
commonUserFeeVO
.
pair
==
'all'
)
{
throw
ErrorCode
.
PARAM_MISS
;
}
let
statisPeriod
=
commonUserFeeVO
.
statis_period
;
let
amount_require_usdt
=
commonUserFeeVO
.
amount_require_usdt
;
if
(
!
statisPeriod
||
Number
(
statisPeriod
)
<
0
||
Number
(
statisPeriod
)
>
30
)
{
...
...
src/functional/mvc/service/commonUserFeeSetting.service.ts
View file @
e4a5d77f
...
...
@@ -98,6 +98,15 @@ export async function list(pageVO: CommonUserFeePageVO) {
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
)
{
let
resList
=
await
commonUserFeeSetting
.
prototype
.
findAll
({
...
...
@@ -107,12 +116,7 @@ export async function list(pageVO: CommonUserFeePageVO) {
});
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
({
...
...
@@ -131,8 +135,6 @@ export async function list(pageVO: CommonUserFeePageVO) {
if
(
userChannel
==
2
)
{
cacheData
=
await
getProjectMakerTradeStat
(
userId
,
pair
);
}
item
.
avg7
=
cacheData
?
cacheData
.
avg7
:
0
;
item
.
avg15
=
cacheData
?
cacheData
.
avg15
:
0
;
item
.
avgUsdt
=
cacheData
?
cacheData
.
avgUsdt
:
0
;
}
}
...
...
@@ -524,16 +526,12 @@ async function checkContractPair(pair: string) {
async
function
getProjectMakerTradeStat
(
user_id
:
number
,
pair
:
string
)
{
let
res
=
{
avg7
:
0
,
avg15
:
0
,
avgUsdt
:
0
,
};
let
key
=
user_id
+
"_"
+
pair
+
"_projectMaker_FeeRate"
;
let
redisData
=
await
RedisClient
.
getSync
(
key
);
if
(
redisData
)
{
let
obj
=
JSON
.
parse
(
redisData
);
res
.
avg7
=
obj
.
avg7
;
res
.
avg15
=
obj
.
avg15
;
res
.
avgUsdt
=
obj
.
avgUsdt
;
}
return
res
;
...
...
src/functional/mvc/service/mUserRealName.service.ts
View file @
e4a5d77f
...
...
@@ -143,7 +143,7 @@ export async function kycList(queryVO: QueryVO) {
}
let
resList
=
await
userRealName
.
prototype
.
findAndCount
({
attributes
:
[
'id'
,
'user_id'
,
'status'
,
'createdAt'
],
attributes
:
[
'id'
,
'user_id'
,
'status'
,
'createdAt'
,
'auditor'
],
where
:
where
,
limit
:
queryVO
.
size
,
offset
:
(
Number
(
queryVO
.
page
)
-
1
)
*
Number
(
queryVO
.
size
),
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment