|
|
|
@ -2,29 +2,20 @@ package com.sztzjy.forex.trading_trading.controller;
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
|
|
import com.github.pagehelper.PageHelper;
|
|
|
|
|
import com.sztzjy.forex.trading_trading.annotation.AnonymousAccess;
|
|
|
|
|
import com.sztzjy.forex.trading_trading.common.mql5API.Mql5API;
|
|
|
|
|
import com.sztzjy.forex.trading_trading.entity.Member;
|
|
|
|
|
import com.sztzjy.forex.trading_trading.entity.TakeStash;
|
|
|
|
|
import com.sztzjy.forex.trading_trading.entity.mql5Entity.ExchangeFrateEntity;
|
|
|
|
|
import com.sztzjy.forex.trading_trading.entity.mql5Entity.ForexData;
|
|
|
|
|
import com.sztzjy.forex.trading_trading.service.MemberService;
|
|
|
|
|
import com.sztzjy.forex.trading_trading.service.TakeStashService;
|
|
|
|
|
import io.swagger.models.auth.In;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.web.bind.annotation.PostMapping;
|
|
|
|
|
import org.springframework.web.bind.annotation.RequestBody;
|
|
|
|
|
import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
|
|
import org.springframework.web.bind.annotation.RestController;
|
|
|
|
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
import java.time.LocalDateTime;
|
|
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
|
|
import java.util.Date;
|
|
|
|
|
import java.util.LinkedHashMap;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
|
|
|
|
//学生端 交易
|
|
|
|
|
@RestController
|
|
|
|
@ -57,19 +48,28 @@ public class TradingController {
|
|
|
|
|
|
|
|
|
|
//市场报价交易 交易量为1为1000美元
|
|
|
|
|
@AnonymousAccess
|
|
|
|
|
@PostMapping("TransactionMarketQuotation")
|
|
|
|
|
@PostMapping("transactionMarketQuotation")
|
|
|
|
|
public JSONObject getMarketQuotation(@RequestBody JSONObject jsonObject) {
|
|
|
|
|
String tradingCode = String.valueOf(jsonObject.get("tradingCode")); //交易品种
|
|
|
|
|
String transactionType = String.valueOf(jsonObject.get("transactionType")); //交易类型
|
|
|
|
|
Double transactionVolume = (Double) jsonObject.get("transactionVolume"); //买卖手(量)
|
|
|
|
|
String buySellType = String.valueOf(jsonObject.get("buySellType")); //买入卖出类型
|
|
|
|
|
String stopLoss = String.valueOf(jsonObject.get("stopLoss"));
|
|
|
|
|
String stopWin = String.valueOf(jsonObject.get("stopWin"));
|
|
|
|
|
Double stopLoss = (Double) jsonObject.get("stopLoss");
|
|
|
|
|
Double stopWin = (Double) jsonObject.get("stopWin");
|
|
|
|
|
String memberId = String.valueOf(jsonObject.get("memberId"));
|
|
|
|
|
String trainingId = jsonObject.get("trainingId").toString();
|
|
|
|
|
String trainingId = jsonObject.get("trainingId").toString();
|
|
|
|
|
Member member = memberService.getMemberByMemberIdAndTrainingId(memberId, trainingId);
|
|
|
|
|
Double availableFunds = member.getAvailableFunds(); //获取账户可用资金
|
|
|
|
|
ForexData forexData = getMarketQuotationByCode(tradingCode); //获取当前买卖价格
|
|
|
|
|
|
|
|
|
|
if (null != stopLoss || null != stopWin) { //判断止损止赢是否合理 如果stopLoss stopWin都为null则跳过
|
|
|
|
|
boolean winOrLossStopBoolean = getWinOrLossStop(stopLoss, stopWin, buySellType, forexData);
|
|
|
|
|
if (winOrLossStopBoolean == false) {
|
|
|
|
|
return JSONObject.parseObject("止损或获利输入错误");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//如果方式为卖 则止损高于卖价 获利低于买价
|
|
|
|
|
if (transactionType.equals("sjkc")) {//市价开仓
|
|
|
|
|
if (tradingCode.startsWith("USD")) { //美元在前
|
|
|
|
|
if (availableFunds < transactionVolume * 1000) { //判断可用资金是否足够
|
|
|
|
@ -85,26 +85,26 @@ public class TradingController {
|
|
|
|
|
takeStashService.insertTakeStash(takeStash);
|
|
|
|
|
}
|
|
|
|
|
availableFunds = availableFunds - transactionVolume * 1000;
|
|
|
|
|
updateMemberAvailableFundsAndMarginUsed(member,availableFunds);
|
|
|
|
|
updateMemberAvailableFundsAndMarginUsed(member, availableFunds);
|
|
|
|
|
} else { //美元在后 使用可用资金表达式为 买卖手*1000*卖/买价 判断可用资金是否足够 先判断是买还是卖
|
|
|
|
|
if ("buy".equals(buySellType)) {
|
|
|
|
|
Double buyPic = Double.valueOf(forexData.getBuyPic());
|
|
|
|
|
if(availableFunds<transactionVolume * 1000*buyPic){
|
|
|
|
|
if (availableFunds < transactionVolume * 1000 * buyPic) {
|
|
|
|
|
return JSONObject.parseObject("可用资金不足");
|
|
|
|
|
}
|
|
|
|
|
TakeStash takeStash = returnTakeStash(memberId, trainingId, tradingCode, buySellType, transactionVolume, buyPic, stopLoss, stopWin);
|
|
|
|
|
takeStashService.insertTakeStash(takeStash);
|
|
|
|
|
availableFunds = availableFunds - transactionVolume * 1000*buyPic;
|
|
|
|
|
availableFunds = availableFunds - transactionVolume * 1000 * buyPic;
|
|
|
|
|
} else if ("sell".equals(buySellType)) {
|
|
|
|
|
Double sellPic = Double.valueOf(forexData.getSellPic());
|
|
|
|
|
if(availableFunds<transactionVolume * 1000*sellPic){
|
|
|
|
|
if (availableFunds < transactionVolume * 1000 * sellPic) {
|
|
|
|
|
return JSONObject.parseObject("可用资金不足");
|
|
|
|
|
}
|
|
|
|
|
TakeStash takeStash = returnTakeStash(memberId, trainingId, tradingCode, buySellType, transactionVolume, sellPic, stopLoss, stopWin);
|
|
|
|
|
takeStashService.insertTakeStash(takeStash);
|
|
|
|
|
availableFunds = availableFunds - transactionVolume * 1000*sellPic;
|
|
|
|
|
availableFunds = availableFunds - transactionVolume * 1000 * sellPic;
|
|
|
|
|
}
|
|
|
|
|
updateMemberAvailableFundsAndMarginUsed(member,availableFunds);
|
|
|
|
|
updateMemberAvailableFundsAndMarginUsed(member, availableFunds);
|
|
|
|
|
}
|
|
|
|
|
} else if (transactionType.equals("gdkc")) {//挂单开仓
|
|
|
|
|
//限价买进
|
|
|
|
@ -120,9 +120,39 @@ public class TradingController {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//修改当前持仓
|
|
|
|
|
@AnonymousAccess
|
|
|
|
|
@PostMapping("updateTakeStash")
|
|
|
|
|
public JSONObject updateTakeStash(@RequestBody JSONObject jsonObject){
|
|
|
|
|
String stashId= String.valueOf(jsonObject.get("stashId"));
|
|
|
|
|
Double stopLoss = (Double) jsonObject.get("stopLoss");
|
|
|
|
|
Double stopWin = (Double) jsonObject.get("stopWin");
|
|
|
|
|
String tradingCode = String.valueOf(jsonObject.get("tradingCode"));
|
|
|
|
|
String buySellType = String.valueOf(jsonObject.get("buySellType"));
|
|
|
|
|
ForexData forexData = getMarketQuotationByCode(tradingCode);
|
|
|
|
|
if (null != stopLoss || null != stopWin) { //判断止损止赢是否合理 如果stopLoss stopWin都为null则跳过
|
|
|
|
|
boolean winOrLossStopBoolean = getWinOrLossStop(stopLoss, stopWin, buySellType, forexData);
|
|
|
|
|
if (winOrLossStopBoolean == false) {
|
|
|
|
|
return JSONObject.parseObject("止损或获利输入错误");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
TakeStash takeStash=new TakeStash();
|
|
|
|
|
takeStash.setStashId(stashId);
|
|
|
|
|
takeStash.setStopLoss(stopLoss);
|
|
|
|
|
takeStashService.updateByPrimaryKey(takeStash);
|
|
|
|
|
return JSONObject.parseObject("修改持仓成功");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//当前持仓平仓 status设置为2
|
|
|
|
|
public JSONObject pingcangTakeStash(@RequestBody JSONObject jsonObject){
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//返回持仓对象
|
|
|
|
|
private TakeStash returnTakeStash(String memberId, String trainingId, String tradingCode, String buySellType, Double transactionVolume, Double buyOrSellPic, String stopLoss, String stopWin) {
|
|
|
|
|
private TakeStash returnTakeStash(String memberId, String trainingId, String tradingCode, String buySellType, Double transactionVolume, Double buyOrSellPic, Double stopLoss, Double stopWin) {
|
|
|
|
|
TakeStash takeStash = new TakeStash();
|
|
|
|
|
Date now = new Date();
|
|
|
|
|
String orderNumberStr = DateUtil.format(now, "yyyyMMddHHmmss") + System.currentTimeMillis();
|
|
|
|
@ -133,18 +163,67 @@ public class TradingController {
|
|
|
|
|
takeStash.setBuySellType(buySellType);
|
|
|
|
|
takeStash.setVolumeTransaction(transactionVolume);
|
|
|
|
|
takeStash.setPriceTransaction(buyOrSellPic);
|
|
|
|
|
takeStash.setStopLoss(Double.parseDouble(stopLoss));
|
|
|
|
|
takeStash.setStopWin(Double.parseDouble(stopWin));
|
|
|
|
|
takeStash.setStopLoss(stopLoss);
|
|
|
|
|
takeStash.setStopWin(stopWin);
|
|
|
|
|
takeStash.setTimeTransaction(now);
|
|
|
|
|
takeStash.setStatus(0);
|
|
|
|
|
return takeStash;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//更新可用资金及已用保证金
|
|
|
|
|
private void updateMemberAvailableFundsAndMarginUsed(Member member,Double availableFunds){
|
|
|
|
|
private void updateMemberAvailableFundsAndMarginUsed(Member member, Double availableFunds) {
|
|
|
|
|
member.setAvailableFunds(availableFunds); //设置可用资金
|
|
|
|
|
Double marginUsed = member.getMarginUsed();
|
|
|
|
|
member.setMarginUsed(marginUsed + availableFunds); //设置已用保证金
|
|
|
|
|
memberService.updateByPrimaryKey(member);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//判断止损止赢 逻辑:如果方式为买 则止损低于买价 获利高于买价 / 如果方式为卖 则止损高于卖价 获利低于买价 (可以只传一个参数)
|
|
|
|
|
private boolean getWinOrLossStop(Double stopLoss, Double stopWin, String buySellType, ForexData forexData) {
|
|
|
|
|
if ("buy".equals(buySellType)) {
|
|
|
|
|
Double buyPic = Double.valueOf(forexData.getBuyPic());
|
|
|
|
|
//判断stopLoss 和stopWin 是否为空
|
|
|
|
|
if(null!=stopLoss && null!=stopWin){
|
|
|
|
|
if (stopLoss < buyPic && stopWin > buyPic) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (null == stopLoss) {
|
|
|
|
|
if (stopWin > buyPic) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (null == stopWin) {
|
|
|
|
|
if (stopLoss < buyPic) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} else if ("sell".equals(buySellType)) {
|
|
|
|
|
Double sellPic = Double.valueOf(forexData.getSellPic());
|
|
|
|
|
if(null!=stopLoss && null!=stopWin){
|
|
|
|
|
if (stopLoss > sellPic && stopWin < sellPic) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (null == stopLoss) {
|
|
|
|
|
if(stopWin<sellPic){
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (null == stopWin) {
|
|
|
|
|
if(stopLoss > sellPic){
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|