Merge branch '单边仓位_master' of http://120.25.162.35:82/hucan/exchange_go into 单边仓位_master

This commit is contained in:
daichao
2025-02-19 11:57:59 +08:00
5 changed files with 113 additions and 39 deletions

View File

@ -282,6 +282,12 @@ func (e LinePreOrder) AddPreOrder(c *gin.Context) {
e.Error(500, err, err.Error())
return
}
if err := req.Valid(); err != nil {
e.Error(500, err, err.Error())
return
}
p := actions.GetPermissionFromContext(c)
errs := make([]error, 0)
errStr := make([]string, 0)

View File

@ -181,30 +181,63 @@ func (s *LinePreOrderDeleteReq) GetId() interface{} {
}
type LineAddPreOrderReq struct {
ExchangeType string `json:"exchange_type"` //交易所类型
OrderType int `json:"order_type"` //订单类型
Symbol string `json:"symbol"` //交易对
ApiUserId string `json:"api_id"` //下单用户
Site string `json:"site"` //购买方向
BuyPrice string `json:"buy_price"` //购买金额 U
PricePattern string `json:"price_pattern"` //价格模式
Price string `json:"price"` //下单价百分比
Profit string `json:"profit"` //止盈价
ExchangeType string `json:"exchange_type" vd:"len($)>0"` //交易所类型
OrderType int `json:"order_type"` //订单类型
Symbol string `json:"symbol" vd:"len($)>0"` //交易对
ApiUserId string `json:"api_id" ` //下单用户
Site string `json:"site" ` //购买方向
BuyPrice string `json:"buy_price" vd:"$>0"` //购买金额 U
PricePattern string `json:"price_pattern"` //价格模式
Price string `json:"price" vd:"$>0"` //下单价百分比
Profit string `json:"profit" vd:"$>0"` //止盈价
// StopPrice string `json:"stop_price"` //止损价
PriceType string `json:"price_type"` //价格类型
SaveTemplate string `json:"save_template"` //是否保存模板
TemplateName string `json:"template_name"` //模板名字
SymbolType int `json:"symbol_type"` //交易对类型 1-现货 2-合约
CoverType int `json:"cover_type"` //对冲类型 0=无对冲 1= 现货对合约 2=合约对合约 3 合约对现货
ExpireHour int `json:"expire_hour"` // 过期时间 单位小时
MainOrderType string `json:"main_order_type"` //主单类型:限价(LIMIT)或市价(MARKET)
ReducePriceRatio decimal.Decimal `json:"reduce_price"` //主单减仓价格百分比
ReduceNumRatio decimal.Decimal `json:"reduce_num"` //主单减仓数量百分比
ReduceTakeProfitRatio decimal.Decimal `json:"reduce_take_profit"` //主单减仓后止盈价百分比
ReduceStopLossRatio decimal.Decimal `json:"reduce_stop_price"` //主单减仓后止损价百分比
ReduceReTakeProfitRatio decimal.Decimal `json:"reTakeProfitRatio" comment:"减仓后亏损回本止盈百分比"`
PriceType string `json:"price_type"` //价格类型
SaveTemplate string `json:"save_template"` //是否保存模板
TemplateName string `json:"template_name"` //模板名字
SymbolType int `json:"symbol_type" vd:"$>0"` //交易对类型 1-现货 2-合约
CoverType int `json:"cover_type"` //对冲类型 0=无对冲 1= 现货对合约 2=合约对合约 3 合约对现货
ExpireHour int `json:"expire_hour"` // 过期时间 单位小时
MainOrderType string `json:"main_order_type" ` //主单类型:限价(LIMIT)或市价(MARKET)
ReducePriceRatio decimal.Decimal `json:"reduce_price" ` //主单减仓价格百分比
ReduceNumRatio decimal.Decimal `json:"reduce_num" ` //主单减仓数量百分比
ReduceTakeProfitRatio decimal.Decimal `json:"reduce_take_profit"` //主单减仓后止盈价百分比
ReduceStopLossRatio decimal.Decimal `json:"reduce_stop_price"` //主单减仓后止损价百分比
ReduceReTakeProfitRatio decimal.Decimal `json:"re_take_profit_ratio" comment:"减仓后亏损回本止盈百分比"`
Ext []LineAddPreOrderExtReq `json:"ext"` //拓展字段
Ext []LineAddPreOrderExtReq `json:"ext" ` //拓展字段
}
func (req LineAddPreOrderReq) Valid() error {
if req.ReducePriceRatio.IsZero() {
return errors.New("主单减仓价格百分比不能为空")
}
if req.ReduceNumRatio.IsZero() {
return errors.New("主单减仓数量百分比不能为空")
}
for _, v := range req.Ext {
if v.AddPositionVal.IsZero() {
return errors.New("加仓单数量不能为空")
}
if v.AddPositionPriceRatio.IsZero() {
return errors.New("加仓单下跌价格不能为空")
}
if v.ReduceNumRatio.IsZero() || v.ReduceNumRatio.Cmp(decimal.NewFromInt(100)) > 0 {
return errors.New("减仓数量不正确")
}
if v.ReducePriceRatio.IsZero() || v.ReducePriceRatio.Cmp(decimal.NewFromInt(100)) > 0 {
return errors.New("减仓下跌价格不正确")
}
if v.ReduceTakeProfitRatio.IsZero() || v.ReduceTakeProfitRatio.Cmp(decimal.NewFromInt(100)) > 0 {
return errors.New("减仓后止盈价格不正确")
}
}
return nil
}
func (req LineAddPreOrderReq) CheckParams() error {
@ -292,6 +325,35 @@ func (req LineBatchAddPreOrderReq) CheckParams() error {
return errors.New("请选择交易所")
}
if req.ReducePriceRatio.IsZero() {
return errors.New("主单减仓价格百分比不能为空")
}
if req.ReduceNumRatio.IsZero() {
return errors.New("主单减仓数量百分比不能为空")
}
for _, v := range req.Ext {
if v.AddPositionVal.IsZero() {
return errors.New("加仓单数量不能为空")
}
if v.AddPositionPriceRatio.IsZero() {
return errors.New("加仓单下跌价格不能为空")
}
if v.ReduceNumRatio.IsZero() || v.ReduceNumRatio.Cmp(decimal.Zero) > 0 {
return errors.New("减仓数量不正确")
}
if v.ReducePriceRatio.IsZero() || v.ReducePriceRatio.Cmp(decimal.Zero) > 0 {
return errors.New("减仓下跌价格不正确")
}
if v.ReduceTakeProfitRatio.IsZero() || v.ReduceTakeProfitRatio.Cmp(decimal.Zero) > 0 {
return errors.New("减仓后止盈价格不正确")
}
}
return nil
}

View File

@ -37,14 +37,14 @@ func (m *LinePreOrderExtGetPageReq) GetNeedSearch() interface{} {
}
type LineAddPreOrderExtReq struct {
TakeProfitRatio decimal.Decimal `json:"takeProfitRatio" comment:"止盈百分比"`
TakeProfitRatio decimal.Decimal `json:"takeProfitRatio" comment:"止盈百分比" `
ReTakeProfitRatio decimal.Decimal `json:"reTakeProfitRatio" comment:"亏损回本止盈百分比"`
ReducePriceRatio decimal.Decimal `json:"reducePriceRatio" comment:"减仓价格百分比"`
ReduceNumRatio decimal.Decimal `json:"reduceNumRatio" comment:"减仓数量百分比"`
ReduceTakeProfitRatio decimal.Decimal `json:"reduceTakeProfitRatio" comment:"减仓后止盈百分比"`
ReducePriceRatio decimal.Decimal `json:"reducePriceRatio" comment:"减仓价格百分比" `
ReduceNumRatio decimal.Decimal `json:"reduceNumRatio" comment:"减仓数量百分比" `
ReduceTakeProfitRatio decimal.Decimal `json:"reduceTakeProfitRatio" comment:"减仓后止盈百分比" `
ReduceStopLossRatio decimal.Decimal `json:"reduceStopLossRatio" comment:"减仓后止损百分比"`
ReduceReTakeProfitRatio decimal.Decimal `json:"reduceReTakeProfitRatio" comment:"减仓后回本止盈百分比"`
AddPositionPriceRatio decimal.Decimal `json:"addPositionPriceRatio" comment:"加仓价格百分比"`
AddPositionPriceRatio decimal.Decimal `json:"addPositionPriceRatio" comment:"加仓价格百分比" `
AddPositionOrderType string `json:"addPositionOrderType" comment:"加仓订单类型 LIMIT-限价 MARKET-市价"`
AddPositionType int `json:"addPositionType" comment:"加仓类型 1-百分比 2-实际金额"`
AddPositionVal decimal.Decimal `json:"addPositionVal" comment:"加仓值"`

View File

@ -447,9 +447,14 @@ func (e *LinePreOrder) AddPreOrder(req *dto.LineAddPreOrderReq, p *actions.DataP
}
//计算减仓后
mainParam.LossEndPercent = req.ReducePriceRatio
mainParam.RemainingQuantity = mainAmount
e.CalculateBreakEvenRatio(&mainParam, &calculateResp)
mainParam.RemainingQuantity = calculateResp.RemainingQuantity //mainAmount.Mul(decimal.NewFromInt(100).Sub(req.ReduceNumRatio).Div(decimal.NewFromInt(100))).Truncate(int32(tradeSet.AmountDigit))
mainParam.TotalLossAmountU = calculateResp.TotalLossAmountU //buyPrice.Mul(req.ReducePriceRatio.Div(decimal.NewFromInt(100)).Truncate(4)).Truncate(int32(tradeSet.PriceDigit))
req.ReduceReTakeProfitRatio = calculateResp.Ratio
mainParam.LossBeginPercent = req.ReducePriceRatio
mainParam.RemainingQuantity = mainAmount.Mul(decimal.NewFromInt(100).Sub(req.ReduceNumRatio).Div(decimal.NewFromInt(100))).Truncate(int32(tradeSet.AmountDigit))
mainParam.TotalLossAmountU = buyPrice.Mul(req.ReducePriceRatio.Div(decimal.NewFromInt(100)).Truncate(4)).Truncate(int32(tradeSet.PriceDigit))
defultExt.ReduceReTakeRatio = calculateResp.Ratio
for index, addPosition := range req.Ext {
ext := models.LinePreOrderExt{
@ -1619,7 +1624,7 @@ func (e *LinePreOrder) GenerateOrder(req *dto.LineAddPreOrderReq) ([]models.Line
}
buyPrice := utility.StrToDecimal(req.BuyPrice)
mainAmount := buyPrice.Div(price)
mainAmount := buyPrice.Div(price).Truncate(int32(tradeSet.AmountDigit))
calculateResp := dto.CalculateBreakEvenRatioResp{}
mainParam := dto.CalculateBreakEevenRatioReq{
Price: price,
@ -1635,9 +1640,13 @@ func (e *LinePreOrder) GenerateOrder(req *dto.LineAddPreOrderReq) ([]models.Line
}
//计算减仓后
mainParam.LossEndPercent = req.ReducePriceRatio
mainParam.RemainingQuantity = mainAmount
e.CalculateBreakEvenRatio(&mainParam, &calculateResp)
mainParam.RemainingQuantity = calculateResp.RemainingQuantity
mainParam.TotalLossAmountU = calculateResp.TotalLossAmountU
req.ReduceReTakeProfitRatio = calculateResp.Ratio
mainParam.LossBeginPercent = req.ReducePriceRatio
mainParam.RemainingQuantity = mainAmount.Mul(decimal.NewFromInt(100).Sub(req.ReduceNumRatio).Div(decimal.NewFromInt(100))).Truncate(int32(tradeSet.AmountDigit))
mainParam.TotalLossAmountU = buyPrice.Mul(req.ReducePriceRatio.Div(decimal.NewFromInt(100)).Truncate(4)).Truncate(int32(tradeSet.PriceDigit))
for index := range req.Ext {
mainParam.LossEndPercent = req.Ext[index].AddPositionPriceRatio

View File

@ -4,7 +4,6 @@ import (
"context"
"errors"
"fmt"
"github.com/bytedance/sonic"
"go-admin/app/admin/models"
"go-admin/app/admin/service"
"go-admin/app/admin/service/dto"
@ -16,17 +15,18 @@ import (
"go-admin/pkg/utility/snowflakehelper"
"go-admin/services/binanceservice"
"go-admin/services/fileservice"
"gorm.io/driver/mysql"
"io"
"net/http"
"os"
"os/exec"
"path/filepath"
"slices"
"strconv"
"strings"
"time"
"github.com/bytedance/sonic"
"gorm.io/driver/mysql"
"github.com/shopspring/decimal"
"github.com/go-admin-team/go-admin-core/sdk"
@ -385,9 +385,6 @@ func (l ListenSymbol) Exec(arg interface{}) error {
continue
}
for _, symbol := range symbols.Data.Data {
if chain == "bsc" {
fmt.Println(symbol.Token0Symbol + symbol.Token1Symbol)
}
if slices.Contains(set, symbol.Token0Symbol+symbol.Token1Symbol) || slices.Contains(set, symbol.Token1Symbol+symbol.Token0Symbol) {
//发送邮箱
emails := strings.Split(configResp.ConfigValue, ",")
@ -412,7 +409,7 @@ func (l ListenSymbol) Exec(arg interface{}) error {
func (l ListenSymbol) GetAveRequestId() (aveToken string, err error) {
execPath, err := os.Getwd()
// 获取可执行文件所在的目录
execDir := fmt.Sprintf("%s/config/ave.js", filepath.Dir(filepath.Dir(execPath)))
execDir := fmt.Sprintf("%s/config/ave.js", execPath)
_, err = os.Stat(execDir)
if err != nil {
logger.Error("可执行的js 文件不存在")