| | |
| | | import com.xcong.excoin.modules.member.dao.MemberWalletContractDao; |
| | | import com.xcong.excoin.modules.member.entity.MemberEntity; |
| | | import com.xcong.excoin.modules.member.entity.MemberWalletContractEntity; |
| | | import com.xcong.excoin.modules.platform.entity.PlatformTradeSettingEntity; |
| | | import com.xcong.excoin.rabbit.pricequeue.whole.HoldOrderDataModel; |
| | | import com.xcong.excoin.rabbit.pricequeue.whole.WholeDataQueue; |
| | | import com.xcong.excoin.rabbit.pricequeue.whole.WholePriceDataModel; |
| | | import com.xcong.excoin.rabbit.producer.OrderProducer; |
| | | import com.xcong.excoin.utils.*; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.collections.CollectionUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Component; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.math.BigDecimal; |
| | |
| | | private MemberDao memberDao; |
| | | @Resource |
| | | private MemberWalletContractDao memberWalletContractDao; |
| | | |
| | | @Resource |
| | | private CacheSettingUtils cacheSettingUtils; |
| | | /** |
| | | * @param symbol |
| | | * @param price |
| | |
| | | } |
| | | } |
| | | |
| | | public void wholeBomb() { |
| | | Map<String, WholePriceDataModel> dataModelMap = WholeDataQueue.MAP; |
| | | if (CollUtil.isEmpty(dataModelMap)) { |
| | | return; |
| | | } |
| | | |
| | | for (Map.Entry<String, WholePriceDataModel> entry : dataModelMap.entrySet()) { |
| | | WholePriceDataModel wholePriceData = entry.getValue(); |
| | | List<HoldOrderDataModel> list = wholePriceData.getList(); |
| | | |
| | | if (CollUtil.isNotEmpty(list)) { |
| | | BigDecimal totalProfitOrLoss = BigDecimal.ZERO; |
| | | |
| | | MemberEntity memberEntity = memberDao.selectById(Long.parseLong(entry.getKey())); |
| | | Map<String, BigDecimal> prices = new HashMap<>(); |
| | | for (HoldOrderDataModel holdOrderData : list) { |
| | | String price = redisUtils.getString(CoinTypeConvert.convertToKey(holdOrderData.getSymbol())); |
| | | BigDecimal newPrice = new BigDecimal(price); |
| | | // BigDecimal newPrice = new BigDecimal("29958.46627789"); |
| | | |
| | | BigDecimal rewardRatio = null; |
| | | if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderData.getOpeningType()) { |
| | | // (最新价-开仓价)*规格*张数 |
| | | rewardRatio = newPrice.subtract(holdOrderData.getOpeningPrice()).multiply(holdOrderData.getSymbolSku()).multiply(new BigDecimal(holdOrderData.getSymbolCntSale())); |
| | | // 开空 |
| | | } else { |
| | | // (开仓价-最新价)*规格*张数 |
| | | rewardRatio = holdOrderData.getOpeningPrice().subtract(newPrice).multiply(holdOrderData.getSymbolSku()).multiply(new BigDecimal(holdOrderData.getSymbolCntSale())); |
| | | } |
| | | |
| | | if (memberEntity.getIsProfit() == MemberEntity.IS_PROFIT_Y) { |
| | | PlatformTradeSettingEntity tradeSettingEntity = cacheSettingUtils.getTradeSetting(); |
| | | if (rewardRatio.compareTo(BigDecimal.ZERO) > -1) { |
| | | rewardRatio = rewardRatio.multiply(BigDecimal.ONE.subtract(tradeSettingEntity.getProfitParam())); |
| | | } else { |
| | | // rewardRatio = rewardRatio.multiply(BigDecimal.ONE.add(tradeSettingEntity.getProfitParam())); |
| | | } |
| | | } |
| | | |
| | | holdOrderData.setRewardAmount(rewardRatio); |
| | | holdOrderData.setClosingPrice(newPrice); |
| | | totalProfitOrLoss = totalProfitOrLoss.add(rewardRatio).setScale(8, BigDecimal.ROUND_DOWN); |
| | | prices.put(holdOrderData.getSymbol(), newPrice); |
| | | } |
| | | |
| | | BigDecimal holdBond = wholePriceData.getHoldBond(); |
| | | BigDecimal balance = wholePriceData.getBalance(); |
| | | if (balance.add(totalProfitOrLoss).compareTo(holdBond) > 0) { |
| | | continue; |
| | | } |
| | | |
| | | log.info("过来过来"); |
| | | synchronized(this) { |
| | | log.info("爆仓啥的:{}", entry.getKey()); |
| | | boolean b = redisUtils.setNotExist(AppContants.WHOLE_BOMB_PREFIX + entry.getKey(), 1, 5); |
| | | if (b) { |
| | | dataModelMap.remove(entry.getKey()); |
| | | wholePriceData.setEquity(wholePriceData.getBalance().add(totalProfitOrLoss)); |
| | | redisUtils.set(AppContants.WHOLE_BOMB_MAP, JSONObject.toJSONString(dataModelMap)); |
| | | log.info("全仓爆仓触发:{}", JSONObject.toJSONString(wholePriceData)); |
| | | wholePriceData.setPrices(prices); |
| | | contractHoldOrderDao.updateMemberAllHoldOrderClosingStatus(wholePriceData.getMemberId()); |
| | | orderProducer.sendWholeBomb(JSONObject.toJSONString(wholePriceData)); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | public void wholeBomb(String symbol, String price) { |
| | | List<Long> memberIds = contractHoldOrderDao.selectMemberHasWholeOrder(); |
| | |
| | | |
| | | BigDecimal sub = wallet.getTotalBalance().add(totalProfitOrLess); |
| | | BigDecimal target = wallet.getTotalBalance().multiply(BigDecimal.valueOf(0.01)); |
| | | log.info("sub : {}, target : {}", sub, target); |
| | | // log.info("sub : {}, target : {}", sub, target); |
| | | if (sub.compareTo(target) <= 0) { |
| | | List<OrderModel> list = new ArrayList<>(); |
| | | OrderModel orderModel = new OrderModel(null, 0, price, symbol, memberId); |
| | |
| | | String key = AppContants.WHOLE_BOMB_PREFIX + memberId; |
| | | Map<Object, Object> value = redisUtils.hmget(key); |
| | | if (MapUtil.isEmpty(value)) { |
| | | log.info("priceMap -- {}", priceMap); |
| | | orderProducer.sendWholeBomb(content); |
| | | contractHoldOrderDao.updateMemberAllHoldOrderClosingStatus(memberId); |
| | | |