1
This commit is contained in:
		| @ -150,7 +150,7 @@ | ||||
|         /> | ||||
|  | ||||
|         <!-- 添加或修改对话框 --> | ||||
|         <el-dialog :title="title" :visible.sync="open" width="1200px" :close-on-click-modal="false"> | ||||
|         <el-dialog :title="title" :visible.sync="open" width="1300px" :close-on-click-modal="false"> | ||||
|           <el-form ref="form" :model="form" :rules="rules" label-width="80px"> | ||||
|             <el-form-item label="模板名称" prop="name"> | ||||
|               <el-input v-model="form.name" placeholder="模板名称" /> | ||||
| @ -428,109 +428,151 @@ | ||||
|                   @click="onCalculate" | ||||
|                 >计算</el-button></el-col> | ||||
|               </el-row> | ||||
|               <div v-for="(item, index) in inForm.ext" :key="index" class="exts"> | ||||
|                 <el-row v-if="item.addType === 1" :gutter="20" style="margin-bottom: 20px;"> | ||||
|                   <el-col :span="5"> | ||||
|                     <div style="margin-bottom: 8px;">{{ item.addType === 1 ? '加仓类型' : '减仓类型' }}</div> | ||||
|                     <el-radio-group v-model="item.orderType" size="mini"> | ||||
|                       <el-radio label="LIMIT">限价</el-radio> | ||||
|                       <el-radio label="MARKET">市价</el-radio> | ||||
|                     </el-radio-group> | ||||
|                   </el-col> | ||||
|                   <el-col :span="5"> | ||||
|                     <div style="margin-bottom: 8px;">{{ item.addType === 1 ? '加仓方式' : '减仓方式' }}</div> | ||||
|                     <el-radio-group v-model="item.addPositionType" size="mini"> | ||||
|                       <el-radio :label="1">百分比</el-radio> | ||||
|                       <el-radio :label="2" :disabled="item.addType === 2">实际金额</el-radio> | ||||
|                     </el-radio-group> | ||||
|                   </el-col> | ||||
|               <el-form ref="extForm" :model="inForm" label-position="top" :rules="inRules" class="ext-form"> | ||||
|                 <div v-for="(item, index) in inForm.ext" :key="index" class="exts"> | ||||
|                   <el-row v-if="item.addType === 1" :gutter="20" style="margin-bottom: 20px;"> | ||||
|                     <el-col :span="5"> | ||||
|                       <div style="margin-bottom: 8px;">{{ item.addType === 1 ? '加仓类型' : '减仓类型' }}</div> | ||||
|                       <el-radio-group v-model="item.orderType" size="mini"> | ||||
|                         <el-radio label="LIMIT">限价</el-radio> | ||||
|                         <el-radio label="MARKET">市价</el-radio> | ||||
|                       </el-radio-group> | ||||
|                     </el-col> | ||||
|                     <el-col :span="5"> | ||||
|                       <div style="margin-bottom: 8px;">{{ item.addType === 1 ? '加仓方式' : '减仓方式' }}</div> | ||||
|                       <el-radio-group v-model="item.addPositionType" size="mini"> | ||||
|                         <el-radio :label="1">百分比</el-radio> | ||||
|                         <el-radio :label="2" :disabled="item.addType === 2">实际金额</el-radio> | ||||
|                       </el-radio-group> | ||||
|                     </el-col> | ||||
|  | ||||
|                 </el-row> | ||||
|                 <el-row :gutter="20"> | ||||
|                   <el-col :span="3">{{ item.addType === 1 ? '加仓下跌百分比' : '减仓下跌百分比' }} | ||||
|                     <el-input | ||||
|                       v-model.number="item.priceRatio" | ||||
|                       min="0" | ||||
|                       size="mini" | ||||
|                       type="number" | ||||
|                       :placeholder="item.addType === 1 ? '加仓下跌百分比' : '减仓下跌百分比'" | ||||
|                     /></el-col> | ||||
|                   <el-col :span="3">{{ item.addType === 1 ? '加仓数值' : '减仓百分比' }} | ||||
|                     <el-input | ||||
|                       v-model.number="item.addPositionVal" | ||||
|                       min="0" | ||||
|                       size="mini" | ||||
|                       type="number" | ||||
|                       :placeholder="item.addType === 1 ? '加仓数值' : '减仓百分比'" | ||||
|                     /> | ||||
|                   </el-col> | ||||
|                   <el-col :span="6"> | ||||
|                     <span>止盈/止损百分比</span> | ||||
|                     <div> | ||||
|                       <el-input | ||||
|                         v-model="item.takeProfitRatio" | ||||
|                         min="0" | ||||
|                         style="width:50%;" | ||||
|                         size="mini" | ||||
|                         type="number" | ||||
|                         placeholder="止盈百分比" | ||||
|                       > | ||||
|                         <template v-if="form.type === 1" #append>{{ ext[index] ? ext[index].reTakeProfitRatio : 0 | ||||
|                         }}</template> | ||||
|                       </el-input> | ||||
|                       — | ||||
|                       <el-input | ||||
|                         v-model.number="item.stopLossRatio" | ||||
|                         style="width:42%;" | ||||
|                         size="mini" | ||||
|                         type="number" | ||||
|                         placeholder="止损百分比" | ||||
|                       /> | ||||
|                     </div> | ||||
|                   </el-col> | ||||
|                   <!-- <el-col :span="3">止损百分比<el-input v-model.number="item.stopLossRatio" size="mini" type="number" placeholder="止损百分比" /></el-col> --> | ||||
|  | ||||
|                   <template v-if="item.addType === 1"> | ||||
|                   </el-row> | ||||
|                   <el-row :gutter="20"> | ||||
|                     <el-col :span="3"> | ||||
|                       止盈数量百分比<el-input | ||||
|                         v-model.number="item.takeProfitNumRatio" | ||||
|                         size="mini" | ||||
|                         type="number" | ||||
|                         placeholder="止盈数量百分比" | ||||
|                       /> | ||||
|                       <!-- {{ item.addType === 1 ? '加仓下跌百分比' : '减仓下跌百分比' }} --> | ||||
|                       <el-form-item | ||||
|                         :prop="'ext.' + index + '.priceRatio'" | ||||
|                         :rules="inRules.priceRatio" | ||||
|                         class="ext-form-item" | ||||
|                         :label="item.addType === 1 ? '加仓下跌百分比' : '减仓下跌百分比'" | ||||
|                       > | ||||
|                         <el-input | ||||
|                           v-model.number="item.priceRatio" | ||||
|                           min="0" | ||||
|                           size="mini" | ||||
|                           type="number" | ||||
|                           :placeholder="item.addType === 1 ? '加仓下跌百分比' : '减仓下跌百分比'" | ||||
|                         /> | ||||
|                       </el-form-item> | ||||
|                     </el-col> | ||||
|                     <el-col :span="3"> | ||||
|                       <!-- {{ item.addType === 1 ? '加仓数值' : '减仓百分比' }} --> | ||||
|                       <el-form-item | ||||
|                         :prop="'ext.' + index + '.addPositionVal'" | ||||
|                         :label="item.addType === 1 ? '加仓数值' : '减仓百分比'" | ||||
|                         :rules="inRules.addPositionVal" | ||||
|                         class="ext-form-item" | ||||
|                       > | ||||
|                         <el-input | ||||
|                           v-model.number="item.addPositionVal" | ||||
|                           min="0" | ||||
|                           size="mini" | ||||
|                           type="number" | ||||
|                           :placeholder="item.addType === 1 ? '加仓数值' : '减仓百分比'" | ||||
|                         /> | ||||
|                       </el-form-item> | ||||
|                     </el-col> | ||||
|                     <el-col :span="6"> | ||||
|                       <span>第二止盈/止损百分比</span> | ||||
|                       <div> | ||||
|                         <el-input | ||||
|                           v-model.number="item.tpTpPriceRatio" | ||||
|                           min="0" | ||||
|                           style="width:42%" | ||||
|                           size="mini" | ||||
|                           type="number" | ||||
|                           placeholder="第二止盈价百分比" | ||||
|                         /> | ||||
|                         — | ||||
|                         <el-input | ||||
|                           v-model.number="item.tpSlPriceRatio" | ||||
|                           min="0" | ||||
|                           style="width:42%" | ||||
|                           size="mini" | ||||
|                           type="number" | ||||
|                           placeholder="第二止损价百分比" | ||||
|                         /> | ||||
|                       </div> | ||||
|                       <!-- <span>止盈/止损百分比</span> --> | ||||
|                       <el-form-item | ||||
|                         label="止盈/止损百分比" | ||||
|                         :prop="'ext.' + index + '.takeProfitRatio'" | ||||
|                         :rules="[{ validator: validateTakeProfitAndStopLoss, trigger: 'blur' }]" | ||||
|                         class="ext-form-item" | ||||
|                       > | ||||
|                         <div> | ||||
|                           <el-input | ||||
|                             v-model="item.takeProfitRatio" | ||||
|                             min="0" | ||||
|                             style="width:50%;" | ||||
|                             size="mini" | ||||
|                             type="number" | ||||
|                             placeholder="止盈百分比" | ||||
|                           > | ||||
|                             <template v-if="form.type === 1" #append>{{ ext[index] ? ext[index].reTakeProfitRatio : 0 | ||||
|                             }}</template> | ||||
|                           </el-input> | ||||
|                           — | ||||
|                           <el-input | ||||
|                             v-model.number="item.stopLossRatio" | ||||
|                             style="width:42%;" | ||||
|                             size="mini" | ||||
|                             type="number" | ||||
|                             placeholder="止损百分比" | ||||
|                           /> | ||||
|                         </div> | ||||
|                       </el-form-item> | ||||
|                     </el-col> | ||||
|                   </template> | ||||
|                   <el-col :span="3"> | ||||
|                     <div style="margin-bottom: 14px;" /><el-button | ||||
|                       size="mini" | ||||
|                       type="danger" | ||||
|                       @click="onAddExt(1, index)" | ||||
|                     >删除</el-button> | ||||
|                   </el-col> | ||||
|                 </el-row> | ||||
|               </div> | ||||
|                     <!-- <el-col :span="3">止损百分比<el-input v-model.number="item.stopLossRatio" size="mini" type="number" placeholder="止损百分比" /></el-col> --> | ||||
|  | ||||
|                     <template v-if="item.addType === 1"> | ||||
|                       <el-col :span="3"> | ||||
|                         <!-- 止盈数量百分比 --> | ||||
|                         <el-form-item | ||||
|                           label="止盈数量百分比" | ||||
|                           :prop="'ext.' + index + '.takeProfitNumRatio'" | ||||
|                           :rules="inRules.takeProfitNumRatio" | ||||
|                           class="ext-form-item" | ||||
|                         > | ||||
|                           <el-input | ||||
|                             v-model.number="item.takeProfitNumRatio" | ||||
|                             size="mini" | ||||
|                             type="number" | ||||
|                             placeholder="止盈数量百分比" | ||||
|                           /> | ||||
|                         </el-form-item> | ||||
|                       </el-col> | ||||
|                       <el-col :span="6"> | ||||
|                         <!-- <span>第二止盈/止损百分比</span> --> | ||||
|                         <el-form-item | ||||
|                           label="第二止盈/止损百分比" | ||||
|                           :prop="'ext.' + index + '.tpTpPriceRatio'" | ||||
|                           :rules="[{ validator: validateTp, trigger: 'blur' }]" | ||||
|                           class="ext-form-item" | ||||
|                         > | ||||
|                           <div> | ||||
|                             <el-input | ||||
|                               v-model.number="item.tpTpPriceRatio" | ||||
|                               min="0" | ||||
|                               style="width:42%" | ||||
|                               size="mini" | ||||
|                               type="number" | ||||
|                               placeholder="第二止盈价百分比" | ||||
|                             /> | ||||
|                             — | ||||
|                             <el-input | ||||
|                               v-model.number="item.tpSlPriceRatio" | ||||
|                               min="0" | ||||
|                               style="width:42%" | ||||
|                               size="mini" | ||||
|                               type="number" | ||||
|                               placeholder="第二止损价百分比" | ||||
|                             /> | ||||
|                           </div> | ||||
|                         </el-form-item> | ||||
|                       </el-col> | ||||
|                     </template> | ||||
|                     <el-col :span="3"> | ||||
|                       <div style="margin-bottom: 14px;" /><el-button | ||||
|                         size="mini" | ||||
|                         type="danger" | ||||
|                         @click="onAddExt(1, index)" | ||||
|                       >删除</el-button> | ||||
|                     </el-col> | ||||
|                   </el-row> | ||||
|                 </div> | ||||
|               </el-form> | ||||
|  | ||||
|               <!-- <el-form-item label="是否保存模板" prop="save_template"> | ||||
|                 <el-radio-group v-model="inForm.save_template"> | ||||
|                   <el-radio label="0">否</el-radio> | ||||
| @ -636,17 +678,53 @@ export default { | ||||
|       percenter: undefined, | ||||
|       symbolGroups: [], | ||||
|       inRules: { | ||||
|         reduce_price: [{ required: true, message: '主单亏损减仓百分比不能为空', trigger: 'blur' }], | ||||
|         reduce_num: [{ required: true, message: '主单减仓数量百分比不能为空', trigger: 'blur' }], | ||||
|         reduce_take_profit: [{ required: true, message: '主单减仓后止盈价百分比不能为空', trigger: 'blur' }], | ||||
|         // reduce_stop_price: [{ required: true, message: '主单减仓后止损价不能为空', trigger: 'blur' }], | ||||
|         buy_price: [{ required: true, message: '购买金额不能为空', trigger: 'blur' }], | ||||
|         profit: [{ required: true, message: '请输入止盈百分比', trigger: 'blur' }, | ||||
|           { validator: this.validateProfit, trigger: 'blur' }], | ||||
|         reduce_price: [ | ||||
|           { required: true, message: '主单亏损减仓百分比不能为空', trigger: 'blur' }, | ||||
|           { validator: this.validateReducePrice, trigger: 'blur' }], | ||||
|         reduce_num: [ | ||||
|           { required: true, message: '主单减仓数量百分比不能为空', trigger: 'blur' }, | ||||
|           { validator: this.validateReduceNum, trigger: 'blur' }], | ||||
|         reduce_take_profit: [ | ||||
|           { required: true, message: '主单减仓后止盈价百分比不能为空', trigger: 'blur' }, | ||||
|           { validator: this.validateReduceTakeProfit, trigger: 'blur' }], | ||||
|         buy_price: [ | ||||
|           { required: true, message: '购买金额不能为空', trigger: 'blur' }, | ||||
|           { validator: this.validateBuyPrice, trigger: 'blur' } | ||||
|         ], | ||||
|         exchange_type: [{ required: true, message: '交易所不能为空', trigger: 'blur' }], | ||||
|         api_id: [{ required: true, message: 'api用户不能为空', trigger: 'blur' }], | ||||
|         symbol: [{ required: true, message: '交易对不能为空', trigger: 'blur' }], | ||||
|         symbol_group_id: [{ required: true, message: '交易对组不能为空', trigger: 'blur' }], | ||||
|         quote_symbol: [{ required: true, message: '计较货币不能为空', trigger: 'blur' }], | ||||
|         order_sn: [{ required: true, message: '订单号不能为空', trigger: 'blur' }] | ||||
|         quote_symbol: [{ required: true, message: '计价货币不能为空', trigger: 'blur' }], | ||||
|         order_sn: [{ required: true, message: '订单号不能为空', trigger: 'blur' }], | ||||
|         profit_num_ratio: [ | ||||
|           { required: true, message: '止盈数量百分比不能为空', trigger: 'blur' }, | ||||
|           { validator: this.validateProfitNumRatio, trigger: 'blur' } | ||||
|         ], | ||||
|         profit_tp_tp_price_ratio: [{ validator: this.validateTptpPriceRatio, trigger: 'blur' }], | ||||
|  | ||||
|         priceRatio: [{ required: true, message: '下跌百分比不能为空', trigger: 'blur' }, { validator: this.validateExtPriceRatio, trigger: 'blur' }], | ||||
|         addPositionVal: [ | ||||
|           { required: true, message: '追加仓位不能为空', trigger: 'blur' }, | ||||
|           { validator: this.validateAddPosition, trigger: 'blur' }], | ||||
|         takeProfitRatio: [ | ||||
|           { required: true, message: '请输入止盈百分比', trigger: 'blur' }, | ||||
|           { type: 'number', message: '止盈百分比必须为数字', trigger: 'blur' }, | ||||
|           { min: 0, message: '止盈百分比不能小于 0', trigger: 'blur' } | ||||
|         ], | ||||
|         stopLossRatio: [ | ||||
|           { required: true, message: '请输入止损百分比', trigger: 'blur' }, | ||||
|           { type: 'number', message: '止损百分比必须为数字', trigger: 'blur' }, | ||||
|           { min: 0, message: '止损百分比不能小于 0', trigger: 'blur' } | ||||
|         ], | ||||
|         takeProfitNumRatio: [ | ||||
|           { required: true, message: '止盈数量不能为空', trigger: 'blur' }, | ||||
|           { validator: this.validateExtTakeProfitNumRatio, trigger: 'blur' } | ||||
|         ], | ||||
|         tpTpPriceRatio: [{ required: true, message: '第二止盈价格百分比不能为空', trigger: 'blur' }], | ||||
|         slSlPriceRatio: [{ required: true, message: '第二止损价格百分比不能为空', trigger: 'blur' }] | ||||
|       }, | ||||
|       inForm: {}, | ||||
|       searchLoding: false, | ||||
| @ -688,6 +766,145 @@ export default { | ||||
|     }) | ||||
|   }, | ||||
|   methods: { | ||||
|     validateExtTakeProfitNumRatio(rule, value, callback) { | ||||
|       if (value === 0 || value === undefined || value === null || value === '') { | ||||
|         callback(new Error('止盈数量百分比必须大于0')) | ||||
|       } else { | ||||
|         callback() | ||||
|       } | ||||
|     }, | ||||
|     validateReducePrice(rule, value, callback) { | ||||
|       if (value === 0 || value === undefined || value === null || value === '') { | ||||
|         callback(new Error('亏损百分比必须大于0')) | ||||
|       } else { | ||||
|         callback() | ||||
|       } | ||||
|     }, | ||||
|     validateBuyPrice(rule, value, callback) { | ||||
|       if (value === 0) { | ||||
|         callback(new Error('购买金额必须大于0')) | ||||
|       } else { | ||||
|         callback() | ||||
|       } | ||||
|     }, | ||||
|     validateReduceTakeProfit(rule, value, callback) { | ||||
|       if (this.inForm.reduce_num > 0 && this.inForm.reduce_num < 100 && this.inForm.reduce_take_profit === 0) { | ||||
|         callback(new Error('主单减仓后止盈必须大于0')) | ||||
|       } else if (this.inForm.reduce_num === 100 && this.inForm.reduce_take_profit > 0) { | ||||
|         callback(new Error('主单减仓全部后无需止盈')) | ||||
|       } else { | ||||
|         callback() | ||||
|       } | ||||
|     }, | ||||
|     /** 主单减仓数量 */ | ||||
|     validateReduceNum(rule, value, callback) { | ||||
|       if (value <= 0) { | ||||
|         callback(new Error('主单减仓数量必须大于0')) | ||||
|       } else { | ||||
|         callback() | ||||
|       } | ||||
|     }, | ||||
|     /** 主单止盈数量 */ | ||||
|     validateProfitNumRatio(rule, value, callback) { | ||||
|       if (value <= 0) { | ||||
|         callback(new Error('止盈数量比例必须大于0')) | ||||
|       } else { | ||||
|         callback() | ||||
|       } | ||||
|     }, | ||||
|     /** 验证第二止盈止损 */ | ||||
|     validateTptpPriceRatio(rule, value, callback) { | ||||
|       if (!this.inForm) { | ||||
|         callback(new Error('表单未初始化')) | ||||
|         return | ||||
|       } | ||||
|  | ||||
|       if (this.inForm.profit_num_ratio > 0 && this.inForm.profit_num_ratio < 100 && (!value || value <= 0)) { | ||||
|         callback(new Error('第二止盈百分比不能为空且必须大于 0')) | ||||
|       } else if (this.inForm.profit_num_ratio === 100 && value > 0) { | ||||
|         callback(new Error('第一止盈已经全部止盈了,不需要第二止盈百分比')) | ||||
|       } else { | ||||
|         callback() | ||||
|       } | ||||
|     }, | ||||
|     validateProfit(rule, value, callback) { | ||||
|       if (this.inForm.profit === '' || this.inForm.profit === undefined || this.inForm.profit === null) { | ||||
|         callback(new Error('止盈百分比不能为空')) | ||||
|       } else if (this.inForm.profit <= 0) { | ||||
|         callback(new Error('止盈百分比不能小于0')) | ||||
|       } else { | ||||
|         callback() | ||||
|       } | ||||
|     }, | ||||
|     validateExtPriceRatio(rule, value, callback) { | ||||
|       const index = rule.fullField.split('.')[1] // 获取索引 | ||||
|       const item = this.inForm.ext[index] | ||||
|       const message = item.addType === 1 ? '加仓下跌百分比' : '减仓下跌百分比' | ||||
|  | ||||
|       if (item.priceRatio === '') { | ||||
|         callback(new Error(message + '不能为空')) | ||||
|       } else if (isNaN(item.priceRatio)) { | ||||
|         callback(new Error('必须输入数字')) | ||||
|       } else if (item.priceRatio < 0) { | ||||
|         callback(new Error('百分比不能小于 0')) | ||||
|       } | ||||
|  | ||||
|       if (index === 0 && item.priceRatio <= this.inForm.reduce_price) { | ||||
|         callback(new Error('下跌百分比不能小于上一节点')) | ||||
|       } else if (index > 0 && item.priceRatio <= this.inForm.ext[index - 1].priceRatio) { | ||||
|         callback(new Error('下跌百分比不能小于上一节点')) | ||||
|       } else { | ||||
|         callback() | ||||
|       } | ||||
|     }, | ||||
|     validateAddPosition(rule, value, callback) { | ||||
|       const index = rule.fullField.split('.')[1] // 获取索引 | ||||
|       const item = this.inForm.ext[index] | ||||
|       const message = item.addType === 1 ? '加仓数值' : '减仓百分比' | ||||
|  | ||||
|       if (item.addPositionVal === '') { | ||||
|         callback(new Error(message + '不能为空')) | ||||
|       } else if (isNaN(item.addPositionVal)) { | ||||
|         callback(new Error('必须输入数字')) | ||||
|       } else if (item.addPositionVal <= 0) { | ||||
|         callback(new Error(message + '必须大于 0')) | ||||
|       } else { | ||||
|         callback() // 校验通过 | ||||
|       } | ||||
|     }, | ||||
|     // 自定义校验逻辑 | ||||
|     validateTakeProfitAndStopLoss(rule, value, callback) { | ||||
|       const index = rule.fullField.split('.')[1] // 获取索引 | ||||
|       const item = this.inForm.ext[index] | ||||
|  | ||||
|       if (item.takeProfitRatio === '' || item.stopLossRatio === '') { | ||||
|         callback(new Error('止盈和止损百分比都不能为空')) | ||||
|       } else if (isNaN(item.takeProfitRatio) || isNaN(item.stopLossRatio)) { | ||||
|         callback(new Error('必须输入数字')) | ||||
|       } else if (item.takeProfitRatio < 0 || item.stopLossRatio < 0) { | ||||
|         callback(new Error('百分比不能小于 0')) | ||||
|       } else if (item.takeProfitRatio === 0) { | ||||
|         callback(new Error('止盈百分比不能为0')) | ||||
|       } else { | ||||
|         callback() // 校验通过 | ||||
|       } | ||||
|     }, | ||||
|     // 自定义 第二止盈止损校验 | ||||
|     validateTp(rule, value, callback) { | ||||
|       const index = rule.fullField.split('.')[1] // 获取索引 | ||||
|       const item = this.inForm.ext[index] | ||||
|       if (item.tpTpPriceRatio === '' || item.tpSlPriceRatio === '') { | ||||
|         callback(new Error('第二止盈、止损百分比不能为空')) | ||||
|       } else if (isNaN(item.tpTpPriceRatio) || isNaN(item.tpSlPriceRatio)) { | ||||
|         callback(new Error('必须输入数字')) | ||||
|       } else if (item.tpTpPriceRatio < 0 || item.tpSlPriceRatio < 0) { | ||||
|         callback(new Error('百分比不能小于 0')) | ||||
|       } else if (item.takeProfitNumRatio < 100 && item.takeProfitNumRatio > 0 && item.tpTpPriceRatio <= 0) { | ||||
|         callback(new Error('第二止盈百分比必须大于0')) | ||||
|       } else { | ||||
|         callback() // 校验通过 | ||||
|       } | ||||
|     }, | ||||
|     onChangeSymbolType() { | ||||
|       if (this.inForm.symbol_type === 1) { | ||||
|         this.inForm.cover_type = 0 | ||||
| @ -747,7 +964,7 @@ export default { | ||||
|         takeProfitRatio: 0, | ||||
|         stopLossRatio: 0, | ||||
|         // 止盈数量百分比 止盈后止盈价格百分比 止盈后止损价格百分比 | ||||
|         takeProfitNumRatio: 0, | ||||
|         takeProfitNumRatio: 100, | ||||
|         tpTpPriceRatio: 0, | ||||
|         tpSlPriceRatio: 0 | ||||
|  | ||||
| @ -812,7 +1029,7 @@ export default { | ||||
|         res = (1 + (this.percenter / 100)) * Number(this.inForm.price) | ||||
|       } | ||||
|       const [num, decimal] = String(res).split('.') | ||||
|       console.log(num, decimal, '?') | ||||
|       // console.log(num, decimal, '?') | ||||
|       if (decimal) { | ||||
|         this.inForm.price = decimal.length > 4 ? `${num}.${decimal.substring(0, 4)}` : res | ||||
|       } else { | ||||
| @ -854,7 +1071,8 @@ export default { | ||||
|         userId: undefined, | ||||
|         params: undefined, | ||||
|         type: 1, | ||||
|         switch: '0' | ||||
|         switch: '0', | ||||
|         ext: [] | ||||
|       } | ||||
|       this.resetForm('form') | ||||
|     }, | ||||
| @ -922,37 +1140,53 @@ export default { | ||||
|     }, | ||||
|     /** 提交按钮 */ | ||||
|     submitForm: function() { | ||||
|       this.$refs['form'].validate(valid => { | ||||
|         if (valid) { | ||||
|           this.inForm.price = this.inForm.price ? String(this.inForm.price) : '' | ||||
|           if (this.form.id !== undefined) { | ||||
|             this.$refs['inForm'].validate(valided => { | ||||
|               if (!valided) return false | ||||
|               const params = JSON.stringify({ | ||||
|                 ...this.inForm, | ||||
|                 reduce_price: this.inForm.reduce_price || 0, | ||||
|                 reduce_num: this.inForm.reduce_num || 0, | ||||
|                 reduce_take_profit: this.inForm.reduce_take_profit || 0, | ||||
|                 reduce_stop_price: this.inForm.reduce_stop_price || 0, | ||||
|                 symbol_group_id: String(this.inForm.symbol_group_id), | ||||
|                 profit_num_ratio: this.inForm.profit_num_ratio || 100, | ||||
|                 profit_tp_tp_price_ratio: this.inForm.profit_tp_tp_price_ratio || 0, | ||||
|                 profit_tp_sl_price_ratio: this.inForm.profit_tp_sl_price_ratio || 0, | ||||
|                 api_id: this.inForm.api_id.toString(), | ||||
|                 hedge_trigger_percent: Number(this.inForm.hedge_trigger_percent), | ||||
|                 hedge_trigger_percent_max: Number(this.inForm.hedge_trigger_percent_max), | ||||
|                 ext: Array.isArray(this.inForm.ext) | ||||
|                   ? this.inForm.ext.map(item => ({ | ||||
|                     ...item, | ||||
|                     stopLossRatio: item.stopLossRatio || 0, | ||||
|                     takeProfitNumRatio: item.takeProfitNumRatio || 0, | ||||
|                     tpTpPriceRatio: item.tpTpPriceRatio || 0, | ||||
|                     tpSlPriceRatio: item.tpSlPriceRatio || 0 | ||||
|                   })) | ||||
|                   : [] | ||||
|               }) | ||||
|       console.log('this.inForm', this.inForm) | ||||
|       Promise.all([ | ||||
|         this.$refs['inForm'].validate(), // 验证第一个表单 | ||||
|         this.$refs['extForm'].validate() // 验证第二个表单 | ||||
|       ]) | ||||
|         .then((formValid) => { | ||||
|           if (formValid.every(valid => valid)) { | ||||
|             this.inForm.price = this.inForm.price ? String(this.inForm.price) : '' | ||||
|             if (this.form.id !== undefined) { | ||||
|               this.$refs['inForm'].validate(valided => { | ||||
|                 if (!valided) return false | ||||
|                 const params = JSON.stringify({ | ||||
|                   ...this.inForm, | ||||
|                   reduce_price: this.inForm.reduce_price || 0, | ||||
|                   reduce_num: this.inForm.reduce_num || 0, | ||||
|                   reduce_take_profit: this.inForm.reduce_take_profit || 0, | ||||
|                   reduce_stop_price: this.inForm.reduce_stop_price || 0, | ||||
|                   symbol_group_id: String(this.inForm.symbol_group_id), | ||||
|                   profit_num_ratio: this.inForm.profit_num_ratio || 100, | ||||
|                   profit_tp_tp_price_ratio: this.inForm.profit_tp_tp_price_ratio || 0, | ||||
|                   profit_tp_sl_price_ratio: this.inForm.profit_tp_sl_price_ratio || 0, | ||||
|                   api_id: this.inForm.api_id.toString(), | ||||
|                   hedge_trigger_percent: Number(this.inForm.hedge_trigger_percent), | ||||
|                   hedge_trigger_percent_max: Number(this.inForm.hedge_trigger_percent_max), | ||||
|                   ext: Array.isArray(this.inForm.ext) | ||||
|                     ? this.inForm.ext.map(item => ({ | ||||
|                       ...item, | ||||
|                       stopLossRatio: item.stopLossRatio || 0, | ||||
|                       takeProfitNumRatio: item.takeProfitNumRatio || 0, | ||||
|                       tpTpPriceRatio: item.tpTpPriceRatio || 0, | ||||
|                       tpSlPriceRatio: item.tpSlPriceRatio || 0 | ||||
|                     })) | ||||
|                     : [] | ||||
|                 }) | ||||
|  | ||||
|               updateLineOrderTemplateLogs({ ...this.form, params }).then(response => { | ||||
|                 updateLineOrderTemplateLogs({ ...this.form, params }).then(response => { | ||||
|                   if (response.code === 200) { | ||||
|                     this.msgSuccess(response.msg) | ||||
|                     this.open = false | ||||
|                     this.getList() | ||||
|                   } else { | ||||
|                     this.msgError(response.msg) | ||||
|                   } | ||||
|                 }) | ||||
|               }) | ||||
|             } else { | ||||
|               addLineOrderTemplateLogs({ ...this.inForm, symbol_group_id: String(this.inForm.symbol_group_id), api_id: this.inForm.api_id.toString() }).then(response => { | ||||
|                 if (response.code === 200) { | ||||
|                   this.msgSuccess(response.msg) | ||||
|                   this.open = false | ||||
| @ -961,20 +1195,9 @@ export default { | ||||
|                   this.msgError(response.msg) | ||||
|                 } | ||||
|               }) | ||||
|             }) | ||||
|           } else { | ||||
|             addLineOrderTemplateLogs({ ...this.inForm, symbol_group_id: String(this.inForm.symbol_group_id), api_id: this.inForm.api_id.toString() }).then(response => { | ||||
|               if (response.code === 200) { | ||||
|                 this.msgSuccess(response.msg) | ||||
|                 this.open = false | ||||
|                 this.getList() | ||||
|               } else { | ||||
|                 this.msgError(response.msg) | ||||
|               } | ||||
|             }) | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|       }) | ||||
|         }) | ||||
|     }, | ||||
|     /** 删除按钮操作 */ | ||||
|     handleDelete(row) { | ||||
| @ -1033,6 +1256,20 @@ export default { | ||||
|   } | ||||
| } | ||||
|  | ||||
| ::v-deep.ext-form-item { | ||||
|   .el-form-item__label { | ||||
|     padding: 0px !important; | ||||
|   } | ||||
| } | ||||
|  | ||||
| .el-form--label-top .el-form-item__label { | ||||
|   padding: 0px !important; | ||||
| } | ||||
|  | ||||
| .ext-form .el-form-item__content .el-input-group { | ||||
|   vertical-align: middle; | ||||
| } | ||||
|  | ||||
| .page { | ||||
|   .pagination-container { | ||||
|     padding: 0 !important; | ||||
|  | ||||
| @ -711,109 +711,146 @@ | ||||
|                   @click="onCalculate" | ||||
|                 >计算</el-button></el-col> | ||||
|               </el-row> | ||||
|               <div v-for="(item, index) in form.ext" :key="index" class="exts"> | ||||
|                 <el-row v-if="item.addType === 1" :gutter="20" style="margin-bottom: 20px;"> | ||||
|                   <el-col :span="4"> | ||||
|                     <div style="margin-bottom: 8px;">{{ item.addType === 1 ? '加仓类型' : '减仓类型' }}</div> | ||||
|                     <el-radio-group v-model="item.orderType" size="mini"> | ||||
|                       <el-radio label="LIMIT">限价</el-radio> | ||||
|                       <el-radio label="MARKET">市价</el-radio> | ||||
|                     </el-radio-group> | ||||
|                   </el-col> | ||||
|                   <el-col :span="4"> | ||||
|                     <div style="margin-bottom: 8px;">{{ item.addType === 1 ? '加仓方式' : '减仓方式' }}</div> | ||||
|                     <el-radio-group v-model="item.addPositionType" size="mini"> | ||||
|                       <el-radio :label="1">百分比</el-radio> | ||||
|                       <el-radio :label="2" :disabled="item.addType === 2">实际金额</el-radio> | ||||
|                     </el-radio-group> | ||||
|                   </el-col> | ||||
|               <el-form ref="extForm" :model="form" label-position="top" :rules="rules" class="ext-form"> | ||||
|                 <div v-for="(item, index) in form.ext" :key="index" class="exts"> | ||||
|  | ||||
|                 </el-row> | ||||
|                 <el-row :gutter="20"> | ||||
|                   <el-col :span="3">{{ item.addType === 1 ? '加仓下跌百分比' : '减仓下跌百分比' }} | ||||
|                     <el-input | ||||
|                       v-model.number="item.priceRatio" | ||||
|                       min="0" | ||||
|                       size="mini" | ||||
|                       type="number" | ||||
|                       :placeholder="item.addType === 1 ? '加仓下跌百分比' : '减仓下跌百分比'" | ||||
|                     /></el-col> | ||||
|                   <el-col :span="3">{{ item.addType === 1 ? '加仓数值' : '减仓百分比' }} | ||||
|                     <el-input | ||||
|                       v-model.number="item.addPositionVal" | ||||
|                       min="0" | ||||
|                       size="mini" | ||||
|                       type="number" | ||||
|                       :placeholder="item.addType === 1 ? '加仓数值' : '减仓百分比'" | ||||
|                     /> | ||||
|                   </el-col> | ||||
|                   <el-col :span="6"> | ||||
|                     <span>止盈/止损百分比</span> | ||||
|                     <div> | ||||
|                       <el-input | ||||
|                         v-model.number="item.takeProfitRatio" | ||||
|                         min="0" | ||||
|                         style="width:50%;" | ||||
|                         size="mini" | ||||
|                         type="number" | ||||
|                         placeholder="止盈百分比" | ||||
|                       > | ||||
|                         <template v-if="title !== '批量添加'" #append>{{ ext[index] ? ext[index].reTakeProfitRatio : 0 | ||||
|                         }}</template> | ||||
|                       </el-input> | ||||
|                       — | ||||
|                       <el-input | ||||
|                         v-model.number="item.stopLossRatio" | ||||
|                         style="width:42%;" | ||||
|                         size="mini" | ||||
|                         type="number" | ||||
|                         placeholder="止损百分比" | ||||
|                       /> | ||||
|                     </div> | ||||
|                   </el-col> | ||||
|                   <!-- <el-col :span="3">止损百分比<el-input v-model.number="item.stopLossRatio" size="mini" type="number" placeholder="止损百分比" /></el-col> --> | ||||
|                   <el-row v-if="item.addType === 1" :gutter="20" style="margin-bottom: 20px;"> | ||||
|                     <el-col :span="4"> | ||||
|                       <div style="margin-bottom: 8px;">{{ item.addType === 1 ? '加仓类型' : '减仓类型' }}</div> | ||||
|                       <el-radio-group v-model="item.orderType" size="mini"> | ||||
|                         <el-radio label="LIMIT">限价</el-radio> | ||||
|                         <el-radio label="MARKET">市价</el-radio> | ||||
|                       </el-radio-group> | ||||
|                     </el-col> | ||||
|                     <el-col :span="4"> | ||||
|                       <div style="margin-bottom: 8px;">{{ item.addType === 1 ? '加仓方式' : '减仓方式' }}</div> | ||||
|                       <el-radio-group v-model="item.addPositionType" size="mini"> | ||||
|                         <el-radio :label="1">百分比</el-radio> | ||||
|                         <el-radio :label="2" :disabled="item.addType === 2">实际金额</el-radio> | ||||
|                       </el-radio-group> | ||||
|                     </el-col> | ||||
|  | ||||
|                   <template v-if="item.addType === 1"> | ||||
|                   </el-row> | ||||
|                   <el-row :gutter="20"> | ||||
|                     <el-col :span="3"> | ||||
|                       止盈数量百分比<el-input | ||||
|                         v-model.number="item.takeProfitNumRatio" | ||||
|                         size="mini" | ||||
|                         type="number" | ||||
|                         placeholder="止盈数量百分比" | ||||
|                       /> | ||||
|                       <el-form-item | ||||
|                         :prop="'ext.' + index + '.priceRatio'" | ||||
|                         :rules="rules.priceRatio" | ||||
|                         class="ext-form-item" | ||||
|                         :label="item.addType === 1 ? '加仓下跌百分比' : '减仓下跌百分比'" | ||||
|                       > | ||||
|                         <el-input | ||||
|                           v-model.number="item.priceRatio" | ||||
|                           min="0" | ||||
|                           size="mini" | ||||
|                           type="number" | ||||
|                           :placeholder="item.addType === 1 ? '加仓下跌百分比' : '减仓下跌百分比'" | ||||
|                         /> | ||||
|                       </el-form-item> | ||||
|                     </el-col> | ||||
|                     <el-col :span="3"> | ||||
|                       <el-form-item | ||||
|                         :prop="'ext.' + index + '.addPositionVal'" | ||||
|                         :label="item.addType === 1 ? '加仓数值' : '减仓百分比'" | ||||
|                         :rules="rules.addPositionVal" | ||||
|                         class="ext-form-item" | ||||
|                       > | ||||
|                         <el-input | ||||
|                           v-model.number="item.addPositionVal" | ||||
|                           min="0" | ||||
|                           size="mini" | ||||
|                           type="number" | ||||
|                           :placeholder="item.addType === 1 ? '加仓数值' : '减仓百分比'" | ||||
|                         /> | ||||
|                       </el-form-item> | ||||
|                     </el-col> | ||||
|                     <el-col :span="6"> | ||||
|                       <span>第二止盈/止损百分比</span> | ||||
|                       <div> | ||||
|                         <el-input | ||||
|                           v-model.number="item.tpTpPriceRatio" | ||||
|                           min="0" | ||||
|                           style="width:42%" | ||||
|                           size="mini" | ||||
|                           type="number" | ||||
|                           placeholder="止盈后止盈价百分比" | ||||
|                         /> | ||||
|                         — | ||||
|                         <el-input | ||||
|                           v-model.number="item.tpSlPriceRatio" | ||||
|                           min="0" | ||||
|                           style="width:42%" | ||||
|                           size="mini" | ||||
|                           type="number" | ||||
|                           placeholder="止盈后止损价百分比" | ||||
|                         /> | ||||
|                       </div> | ||||
|                       <el-form-item | ||||
|                         label="止盈/止损百分比" | ||||
|                         :prop="'ext.' + index + '.takeProfitRatio'" | ||||
|                         :rules="[{ validator: validateTakeProfitAndStopLoss, trigger: 'blur' }]" | ||||
|                         class="ext-form-item" | ||||
|                       > | ||||
|                         <div> | ||||
|                           <el-input | ||||
|                             v-model.number="item.takeProfitRatio" | ||||
|                             min="0" | ||||
|                             style="width:50%;" | ||||
|                             size="mini" | ||||
|                             type="number" | ||||
|                             placeholder="止盈百分比" | ||||
|                             :rules="rules.takeProfitRatio" | ||||
|                           > | ||||
|                             <template v-if="title !== '批量添加'" #append>{{ ext[index] ? ext[index].reTakeProfitRatio : 0 | ||||
|                             }}</template> | ||||
|                           </el-input> | ||||
|                           — | ||||
|                           <el-input | ||||
|                             v-model.number="item.stopLossRatio" | ||||
|                             style="width:42%;" | ||||
|                             size="mini" | ||||
|                             type="number" | ||||
|                             placeholder="止损百分比" | ||||
|                             :rules="rules.stopLossRatio" | ||||
|                           /> | ||||
|                         </div> | ||||
|                       </el-form-item> | ||||
|                     </el-col> | ||||
|                   </template> | ||||
|                   <el-col :span="3"> | ||||
|                     <div style="margin-bottom: 14px;" /><el-button | ||||
|                       size="mini" | ||||
|                       type="danger" | ||||
|                       @click="onAddExt(1, index)" | ||||
|                     >删除</el-button> | ||||
|                   </el-col> | ||||
|                 </el-row> | ||||
|               </div> | ||||
|                     <template v-if="item.addType === 1"> | ||||
|                       <el-col :span="3"> | ||||
|                         <el-form-item | ||||
|                           label="止盈数量百分比" | ||||
|                           :prop="'ext.' + index + '.takeProfitNumRatio'" | ||||
|                           :rules="rules.takeProfitNumRatio" | ||||
|                           class="ext-form-item" | ||||
|                         > | ||||
|                           <el-input | ||||
|                             v-model.number="item.takeProfitNumRatio" | ||||
|                             size="mini" | ||||
|                             type="number" | ||||
|                             placeholder="止盈数量百分比" | ||||
|                           /> | ||||
|                         </el-form-item> | ||||
|                       </el-col> | ||||
|                       <el-col :span="6"> | ||||
|                         <el-form-item | ||||
|                           label="第二止盈/止损百分比" | ||||
|                           :prop="'ext.' + index + '.tpTpPriceRatio'" | ||||
|                           :rules="[{ validator: validateTp, trigger: 'blur' }]" | ||||
|                           class="ext-form-item" | ||||
|                         > | ||||
|                           <div> | ||||
|                             <el-input | ||||
|                               v-model.number="item.tpTpPriceRatio" | ||||
|                               min="0" | ||||
|                               style="width:42%" | ||||
|                               size="mini" | ||||
|                               type="number" | ||||
|                               placeholder="止盈后止盈价百分比" | ||||
|                             /> | ||||
|                             — | ||||
|                             <el-input | ||||
|                               v-model.number="item.tpSlPriceRatio" | ||||
|                               min="0" | ||||
|                               style="width:42%" | ||||
|                               size="mini" | ||||
|                               type="number" | ||||
|                               placeholder="止盈后止损价百分比" | ||||
|                             /> | ||||
|                           </div> | ||||
|                         </el-form-item> | ||||
|                       </el-col> | ||||
|                     </template> | ||||
|                     <el-col :span="3"> | ||||
|                       <div style="margin-bottom: 14px;" /><el-button | ||||
|                         size="mini" | ||||
|                         type="danger" | ||||
|                         @click="onAddExt(1, index)" | ||||
|                       >删除</el-button> | ||||
|                     </el-col> | ||||
|                   </el-row> | ||||
|                 </div> | ||||
|               </el-form> | ||||
|               <el-form-item label="是否保存模板" prop="save_template"> | ||||
|                 <el-radio-group v-model="form.save_template"> | ||||
|                   <el-radio label="0">否</el-radio> | ||||
| @ -1118,7 +1155,7 @@ | ||||
|                   v-for="(item, index) in sideList" | ||||
|                   :key="'position_side' + index" | ||||
|                   :label="item.value" | ||||
|                   :disabled="item.value=='SELL'&&positionForm.close_type==1" | ||||
|                   :disabled="item.value === 'SELL' && positionForm.close_type === 1" | ||||
|                 >{{ item.label }}</el-radio> | ||||
|               </el-radio-group> | ||||
|             </el-form-item> | ||||
| @ -1331,18 +1368,51 @@ export default { | ||||
|       }, | ||||
|       // 表单校验 | ||||
|       rules: { | ||||
|         reduce_price: [{ required: true, message: '主单亏损减仓百分比不能为空', trigger: 'blur' }], | ||||
|         reduce_num: [{ required: true, message: '主单减仓数量百分比不能为空', trigger: 'blur' }], | ||||
|         reduce_take_profit: [{ required: true, message: '主单减仓后止盈价百分比不能为空', trigger: 'blur' }], | ||||
|         // reduce_stop_price: [{ required: true, message: '主单减仓后止损价不能为空', trigger: 'blur' }], | ||||
|         buy_price: [{ required: true, message: '购买金额不能为空', trigger: 'blur' }], | ||||
|         profit: [{ required: true, message: '请输入止盈百分比', trigger: 'blur' }, { validator: this.validateProfit, trigger: 'blur' }], | ||||
|         reduce_price: [ | ||||
|           { required: true, message: '主单亏损减仓百分比不能为空', trigger: 'blur' }, | ||||
|           { validator: this.validateReducePrice, trigger: 'blur' }], | ||||
|         reduce_num: [ | ||||
|           { required: true, message: '主单减仓数量百分比不能为空', trigger: 'blur' }, | ||||
|           { validator: this.validateReduceNum, trigger: 'blur' }], | ||||
|         reduce_take_profit: [ | ||||
|           { required: true, message: '主单减仓后止盈价百分比不能为空', trigger: 'blur' }, | ||||
|           { validator: this.validateReduceTakeProfit, trigger: 'blur' }], | ||||
|         buy_price: [ | ||||
|           { required: true, message: '购买金额不能为空', trigger: 'blur' }, | ||||
|           { validator: this.validateBuyPrice, trigger: 'blur' } | ||||
|         ], | ||||
|         exchange_type: [{ required: true, message: '交易所不能为空', trigger: 'blur' }], | ||||
|         api_id: [{ required: true, message: 'api用户不能为空', trigger: 'blur' }], | ||||
|         symbol: [{ required: true, message: '交易对不能为空', trigger: 'blur' }], | ||||
|         symbol_group_id: [{ required: true, message: '交易对组不能为空', trigger: 'blur' }], | ||||
|         quote_symbol: [{ required: true, message: '计价货币不能为空', trigger: 'blur' }], | ||||
|         order_sn: [{ required: true, message: '订单号不能为空', trigger: 'blur' }], | ||||
|         profit_num_ratio: [{ required: true, message: '止盈数量百分比不能为空', trigger: 'blur' }] | ||||
|         profit_num_ratio: [ | ||||
|           { required: true, message: '止盈数量百分比不能为空', trigger: 'blur' }, | ||||
|           { validator: this.validateProfitNumRatio, trigger: 'blur' } | ||||
|         ], | ||||
|         profit_tp_tp_price_ratio: [{ validator: this.validateTptpPriceRatio, trigger: 'blur' }], | ||||
|  | ||||
|         priceRatio: [{ validator: this.validateExtPriceRatio, trigger: 'blur' }], | ||||
|         addPositionVal: [ | ||||
|           { required: true, message: '追加仓位不能为空', trigger: 'blur' }, | ||||
|           { validator: this.validateAddPosition, trigger: 'blur' }], | ||||
|         takeProfitRatio: [ | ||||
|           { required: true, message: '请输入止盈百分比', trigger: 'blur' }, | ||||
|           { type: 'number', message: '止盈百分比必须为数字', trigger: 'blur' }, | ||||
|           { min: 0, message: '止盈百分比不能小于 0', trigger: 'blur' } | ||||
|         ], | ||||
|         stopLossRatio: [ | ||||
|           { required: true, message: '请输入止损百分比', trigger: 'blur' }, | ||||
|           { type: 'number', message: '止损百分比必须为数字', trigger: 'blur' }, | ||||
|           { min: 0, message: '止损百分比不能小于 0', trigger: 'blur' } | ||||
|         ], | ||||
|         takeProfitNumRatio: [{ required: true, message: '止盈数量不能为空', trigger: 'blur' }, | ||||
|           { validator: this.validateExtTakeProfitNumRatio, trigger: 'blur' } | ||||
|         ], | ||||
|         tpTpPriceRatio: [{ required: true, message: '第二止盈价格百分比不能为空', trigger: 'blur' }], | ||||
|         slSlPriceRatio: [{ required: true, message: '第二止损价格百分比不能为空', trigger: 'blur' }] | ||||
|       }, | ||||
|       currentExpandId: undefined, | ||||
|       cacheRefresh: {}, | ||||
| @ -1382,7 +1452,6 @@ export default { | ||||
|       positionRules: { | ||||
|         exchangeType: [{ required: true, message: '交易所不能为空', trigger: 'blur' }], | ||||
|         api_id: [{ required: true, message: 'api用户不能为空', trigger: 'blur' }] | ||||
|         // symbol: [{ required: true, message: '交易对不能为空', trigger: 'blur' }] | ||||
|       }, | ||||
|       searchLoding: false, | ||||
|       // 取消委托 | ||||
| @ -1523,7 +1592,7 @@ export default { | ||||
|         takeProfitRatio: 0, | ||||
|         stopLossRatio: 0, | ||||
|         // 止盈数量百分比 止盈后止盈价格百分比 止盈后止损价格百分比 | ||||
|         takeProfitNumRatio: 0, | ||||
|         takeProfitNumRatio: 100, | ||||
|         tpTpPriceRatio: 0, | ||||
|         tpSlPriceRatio: 0 | ||||
|  | ||||
| @ -1914,6 +1983,146 @@ export default { | ||||
|       } | ||||
|       this.resetForm('form') | ||||
|     }, | ||||
|     validateExtTakeProfitNumRatio(rule, value, callback) { | ||||
|       if (value === 0 || value === undefined || value === null || value === '') { | ||||
|         callback(new Error('止盈数量百分比必须大于0')) | ||||
|       } else { | ||||
|         callback() | ||||
|       } | ||||
|     }, | ||||
|     validateReducePrice(rule, value, callback) { | ||||
|       if (value === 0 || value === undefined || value === null || value === '') { | ||||
|         callback(new Error('亏损百分比必须大于0')) | ||||
|       } else { | ||||
|         callback() | ||||
|       } | ||||
|     }, | ||||
|     validateBuyPrice(rule, value, callback) { | ||||
|       if (value === 0) { | ||||
|         callback(new Error('购买金额必须大于0')) | ||||
|       } else { | ||||
|         callback() | ||||
|       } | ||||
|     }, | ||||
|     validateReduceTakeProfit(rule, value, callback) { | ||||
|       if (this.form.reduce_num > 0 && this.form.reduce_num < 100 && this.form.reduce_take_profit === 0) { | ||||
|         callback(new Error('主单减仓后止盈必须大于0')) | ||||
|       } else if (this.form.reduce_num === 100 && this.form.reduce_take_profit > 0) { | ||||
|         callback(new Error('主单减仓全部后无需止盈')) | ||||
|       } else { | ||||
|         callback() | ||||
|       } | ||||
|     }, | ||||
|     /** 主单减仓数量 */ | ||||
|     validateReduceNum(rule, value, callback) { | ||||
|       if (value <= 0) { | ||||
|         callback(new Error('主单减仓数量必须大于0')) | ||||
|       } else { | ||||
|         callback() | ||||
|       } | ||||
|     }, | ||||
|     /** 主单止盈数量 */ | ||||
|     validateProfitNumRatio(rule, value, callback) { | ||||
|       if (value <= 0) { | ||||
|         callback(new Error('止盈数量比例必须大于0')) | ||||
|       } else { | ||||
|         callback() | ||||
|       } | ||||
|     }, | ||||
|     /** 验证第二止盈止损 */ | ||||
|     validateTptpPriceRatio(rule, value, callback) { | ||||
|       if (!this.form) { | ||||
|         callback(new Error('表单未初始化')) | ||||
|         return | ||||
|       } | ||||
|  | ||||
|       if (this.form.profit_num_ratio > 0 && this.form.profit_num_ratio < 100 && (!value || value <= 0)) { | ||||
|         callback(new Error('第二止盈百分比不能为空且必须大于 0')) | ||||
|       } else if (this.form.profit_num_ratio === 100 && value > 0) { | ||||
|         callback(new Error('第一止盈已经全部止盈了,不需要第二止盈百分比')) | ||||
|       } else { | ||||
|         callback() | ||||
|       } | ||||
|     }, | ||||
|     validateProfit(rule, value, callback) { | ||||
|       console.log(this.form) | ||||
|       if (this.form.profit === '' || this.form.profit === undefined || this.form.profit === null) { | ||||
|         callback(new Error('止盈百分比不能为空')) | ||||
|       } else if (this.form.profit <= 0) { | ||||
|         callback(new Error('止盈百分比不能小于0')) | ||||
|       } else { | ||||
|         callback() | ||||
|       } | ||||
|     }, | ||||
|     validateExtPriceRatio(rule, value, callback) { | ||||
|       const index = rule.fullField.split('.')[1] // 获取索引 | ||||
|       const item = this.form.ext[index] | ||||
|       const message = item.addType === 1 ? '加仓下跌百分比' : '减仓下跌百分比' | ||||
|  | ||||
|       if (item.priceRatio === '') { | ||||
|         callback(new Error(message + '不能为空')) | ||||
|       } else if (isNaN(item.priceRatio)) { | ||||
|         callback(new Error('必须输入数字')) | ||||
|       } else if (item.priceRatio < 0) { | ||||
|         callback(new Error('百分比不能小于 0')) | ||||
|       } | ||||
|  | ||||
|       if (index === 0 && item.priceRatio <= this.form.reduce_price) { | ||||
|         callback(new Error('下跌百分比不能小于上一节点')) | ||||
|       } else if (index > 0 && item.priceRatio <= this.form.ext[index - 1].priceRatio) { | ||||
|         callback(new Error('下跌百分比不能小于上一节点')) | ||||
|       } else { | ||||
|         callback() | ||||
|       } | ||||
|     }, | ||||
|     validateAddPosition(rule, value, callback) { | ||||
|       const index = rule.fullField.split('.')[1] // 获取索引 | ||||
|       const item = this.form.ext[index] | ||||
|       const message = item.addType === 1 ? '加仓数值' : '减仓百分比' | ||||
|  | ||||
|       if (item.addPositionVal === '') { | ||||
|         callback(new Error(message + '不能为空')) | ||||
|       } else if (isNaN(item.addPositionVal)) { | ||||
|         callback(new Error('必须输入数字')) | ||||
|       } else if (item.addPositionVal <= 0) { | ||||
|         callback(new Error(message + '必须大于 0')) | ||||
|       } else { | ||||
|         callback() // 校验通过 | ||||
|       } | ||||
|     }, | ||||
|     // 自定义校验逻辑 | ||||
|     validateTakeProfitAndStopLoss(rule, value, callback) { | ||||
|       const index = rule.fullField.split('.')[1] // 获取索引 | ||||
|       const item = this.form.ext[index] | ||||
|  | ||||
|       if (item.takeProfitRatio === '' || item.stopLossRatio === '') { | ||||
|         callback(new Error('止盈和止损百分比都不能为空')) | ||||
|       } else if (isNaN(item.takeProfitRatio) || isNaN(item.stopLossRatio)) { | ||||
|         callback(new Error('必须输入数字')) | ||||
|       } else if (item.takeProfitRatio < 0 || item.stopLossRatio < 0) { | ||||
|         callback(new Error('百分比不能小于 0')) | ||||
|       } else if (item.takeProfitRatio === 0) { | ||||
|         callback(new Error('止盈百分比不能为0')) | ||||
|       } else { | ||||
|         callback() // 校验通过 | ||||
|       } | ||||
|     }, | ||||
|     // 自定义 第二止盈止损校验 | ||||
|     validateTp(rule, value, callback) { | ||||
|       const index = rule.fullField.split('.')[1] // 获取索引 | ||||
|       const item = this.form.ext[index] | ||||
|       if (item.tpTpPriceRatio === '' || item.tpSlPriceRatio === '') { | ||||
|         callback(new Error('第二止盈、止损百分比不能为空')) | ||||
|       } else if (isNaN(item.tpTpPriceRatio) || isNaN(item.tpSlPriceRatio)) { | ||||
|         callback(new Error('必须输入数字')) | ||||
|       } else if (item.tpTpPriceRatio < 0 || item.tpSlPriceRatio < 0) { | ||||
|         callback(new Error('百分比不能小于 0')) | ||||
|       } else if (item.takeProfitNumRatio < 100 && item.takeProfitNumRatio > 0 && item.tpTpPriceRatio <= 0) { | ||||
|         callback(new Error('第二止盈百分比必须大于0')) | ||||
|       } else { | ||||
|         callback() // 校验通过 | ||||
|       } | ||||
|     }, | ||||
|     getImgList: function() { | ||||
|       this.form[this.fileIndex] = this.$refs['fileChoose'].resultList[0].fullUrl | ||||
|     }, | ||||
| @ -1971,75 +2180,84 @@ export default { | ||||
|       }) | ||||
|     }, | ||||
|     /** 提交按钮 */ | ||||
|     submitForm: function() { | ||||
|       this.$refs['form'].validate(valid => { | ||||
|         if (valid) { | ||||
|           this.formLoading = true | ||||
|           if (this.form.price) { | ||||
|             this.form.price = String(this.form.price) | ||||
|           } | ||||
|     submitForm: async function() { | ||||
|       const formValid = await Promise.all([ | ||||
|         this.$refs['form'].validate(), // 验证第一个表单 | ||||
|         this.$refs['extForm'].validate() // 验证第二个表单 | ||||
|       ]) | ||||
|  | ||||
|           if (this.form.id !== undefined) { | ||||
|             updateLinePreOrder(this.form).then(response => { | ||||
|               if (response.code === 200) { | ||||
|                 this.msgSuccess(response.msg) | ||||
|                 this.open = false | ||||
|                 this.getList() | ||||
|               } else { | ||||
|                 this.msgError(response.msg) | ||||
|               } | ||||
|             }).finally(() => { | ||||
|               this.formLoading = false | ||||
|             }) | ||||
|           } else { | ||||
|             if (this.title === '批量添加') { | ||||
|               const params = JSON.parse(JSON.stringify({ | ||||
|                 ...this.form, | ||||
|                 symbol_group_id: String(this.form.symbol_group_id), | ||||
|                 api_id: this.form.api_id.toString(), | ||||
|                 profit_num_ratio: this.form.profit_num_ratio || 100, | ||||
|                 profit_tp_tp_price_ratio: this.form.profit_tp_tp_price_ratio || 0, | ||||
|                 profit_tp_sl_price_ratio: this.form.profit_tp_sl_price_ratio || 0 | ||||
|               })) | ||||
|               delete params.symbol | ||||
|               batchAddOrder(params).then(response => { | ||||
|                 if (response.code === 200) { | ||||
|                   this.msgSuccess(response.msg) | ||||
|                   this.open = false | ||||
|                   this.getList() | ||||
|                 } else { | ||||
|                   this.msgError(response.msg) | ||||
|                 } | ||||
|               }).finally(() => { | ||||
|                 this.formLoading = false | ||||
|               }) | ||||
|               return false | ||||
|       console.log(formValid) | ||||
|       if (formValid.every(valid => valid)) { | ||||
|         this.formLoading = true | ||||
|         if (this.form.price) { | ||||
|           this.form.price = String(this.form.price) | ||||
|         } | ||||
|  | ||||
|         if (this.form.id !== undefined) { | ||||
|           updateLinePreOrder(this.form).then(response => { | ||||
|             if (response.code === 200) { | ||||
|               this.msgSuccess(response.msg) | ||||
|               this.open = false | ||||
|               this.getList() | ||||
|             } else { | ||||
|               this.msgError(response.msg) | ||||
|             } | ||||
|             addOrder({ | ||||
|           }).finally(() => { | ||||
|             this.formLoading = false | ||||
|           }) | ||||
|         } else { | ||||
|           if (this.title === '批量添加') { | ||||
|             const params = JSON.parse(JSON.stringify({ | ||||
|               ...this.form, | ||||
|               reduce_price: this.form.reduce_price || 0, | ||||
|               reduce_num: this.form.reduce_num || 0, | ||||
|               reduce_take_profit: this.form.reduce_take_profit || 0, | ||||
|               reduce_stop_price: this.form.reduce_stop_price || 0, | ||||
|               symbol_group_id: String(this.form.symbol_group_id), | ||||
|               api_id: this.form.api_id.toString(), | ||||
|               profit_num_ratio: this.form.profit_num_ratio || 100, | ||||
|               profit_tp_tp_price_ratio: this.form.profit_tp_tp_price_ratio || 0, | ||||
|               profit_tp_sl_price_ratio: this.form.profit_tp_sl_price_ratio || 0, | ||||
|               api_id: this.form.api_id.toString() | ||||
|             }).then(response => { | ||||
|               profit_tp_sl_price_ratio: this.form.profit_tp_sl_price_ratio || 0 | ||||
|             })) | ||||
|             delete params.symbol | ||||
|             batchAddOrder(params).then(response => { | ||||
|               if (response.code === 200) { | ||||
|                 this.msgSuccess(response.msg) | ||||
|                 this.open = false | ||||
|                 this.getList() | ||||
|               } else { | ||||
|                 this.formLoadng = false | ||||
|                 this.msgError(response.msg) | ||||
|               } | ||||
|             }).finally(() => { | ||||
|               this.formLoading = false | ||||
|             }) | ||||
|             return false | ||||
|           } | ||||
|           addOrder({ | ||||
|             ...this.form, | ||||
|             reduce_price: this.form.reduce_price || 0, | ||||
|             reduce_num: this.form.reduce_num || 0, | ||||
|             reduce_take_profit: this.form.reduce_take_profit || 0, | ||||
|             reduce_stop_price: this.form.reduce_stop_price || 0, | ||||
|             profit_num_ratio: this.form.profit_num_ratio || 100, | ||||
|             profit_tp_tp_price_ratio: this.form.profit_tp_tp_price_ratio || 0, | ||||
|             profit_tp_sl_price_ratio: this.form.profit_tp_sl_price_ratio || 0, | ||||
|             api_id: this.form.api_id.toString() | ||||
|           }).then(response => { | ||||
|             if (response.code === 200) { | ||||
|               this.msgSuccess(response.msg) | ||||
|               this.open = false | ||||
|               this.getList() | ||||
|             } else { | ||||
|               this.formLoadng = false | ||||
|               this.msgError(response.msg) | ||||
|             } | ||||
|           }).finally(() => { | ||||
|             this.formLoading = false | ||||
|           }) | ||||
|         } | ||||
|       }) | ||||
|       } | ||||
|       // this.$refs['form'].validate(valid => { | ||||
|       //   if (valid) { | ||||
|  | ||||
|       //   } | ||||
|       // }) | ||||
|     }, | ||||
|     onCancel() { | ||||
|       this.cancelOpen = true | ||||
| @ -2162,6 +2380,20 @@ export default { | ||||
|   } | ||||
| } | ||||
|  | ||||
| ::v-deep.ext-form-item { | ||||
|   .el-form-item__label { | ||||
|     padding: 0px !important; | ||||
|   } | ||||
| } | ||||
|  | ||||
| .el-form--label-top .el-form-item__label { | ||||
|   padding: 0px !important; | ||||
| } | ||||
|  | ||||
| .ext-form .el-form-item__content .el-input-group { | ||||
|   vertical-align: middle; | ||||
| } | ||||
|  | ||||
| .page { | ||||
|   .pagination-container { | ||||
|     padding: 0 !important; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user