Administrator
2026-05-28 b3b9edaf5eb570a899ce90d05310f6a1aef11807
src/main/java/com/xcong/excoin/modules/gateApi/GateConfig.java
@@ -5,41 +5,42 @@
import java.util.List;
/**
 * Gate 模块统一配置。
 * Gate 交易模块全局配置,策略的唯一参数入口。
 *
 * <p>通过 Builder 模式集中管理所有运行参数,避免参数散落在多个文件中。
 * 提供 REST API 和 WebSocket 地址的自动环境切换(测试网/生产网)。
 * <h3>定位</h3>
 * 通过 Builder 模式将所有运行参数集中管理,避免策略参数散落在多个类中。
 * 运行时动态参数(step、gridElements、baseLongTraderParam、baseShortTraderParam)
 * 由 {@link GateGridTradeService} 在策略执行过程中写入。
 *
 * <h3>关键参数</h3>
 * <h3>参数分类</h3>
 * <table>
 *   <tr><th>类别</th><th>参数</th><th>用途</th></tr>
 *   <tr><td>认证</td><td>apiKey, apiSecret</td><td>REST/WS 签名认证</td></tr>
 *   <tr><td>交易标的</td><td>contract, leverage, quantity, contractMultiplier</td><td>合约、杠杆、张数、乘数</td></tr>
 *   <tr><td>持仓</td><td>marginMode, positionMode</td><td>全仓/逐仓、单向/双向</td></tr>
 *   <tr><td>网格策略</td><td>gridRate, gridQueueSize, priceScale</td><td>间距比例、队列容量、价格精度(交易所tick)</td></tr>
 *   <tr><td>止盈止损</td><td>overallTp, maxLoss</td><td>整体止盈/亏损阈值(USDT),触发后策略停止</td></tr>
 *   <tr><td>风控</td><td>marginRatioLimit, reopenMaxRetries</td><td>保证金占比上限、补仓重试次数</td></tr>
 *   <tr><td>盈亏计算</td><td>contractMultiplier, unrealizedPnlPriceMode</td><td>合约乘数、未实现盈亏计价模式</td></tr>
 *   <tr><td>运行时</td><td>step, gridElements, baseLongTraderParam, baseShortTraderParam</td><td>由策略动态填充</td></tr>
 * </table>
 *
 * <h3>priceScale 说明</h3>
 * 价格精度表示交易所允许的最小价格单位的小数位数:
 * <ul>
 *   <li><b>网格参数</b>:gridRate(比例间距)、step(绝对步长 = shortBaseEntryPrice × gridRate,运行时计算)、
 *       gridQueueSize(队列容量)</li>
 *   <li><b>止盈止损</b>:overallTp(整体止盈 USDT)、maxLoss(最大亏损 USDT)</li>
 *   <li><b>风险控制</b>:marginRatioLimit(保证金占比上限,超限跳过开仓)、leverage(杠杆)、
 *       marginMode(全仓/逐仓)、positionMode(单向/双向)</li>
 *   <li><b>盈亏计算</b>:contractMultiplier(合约乘数)、unrealizedPnlPriceMode(计价模式:最新价/标记价)</li>
 *   <li>XAU_USDT: tick=0.1 → priceScale=1</li>
 *   <li>ETH_USDT: tick=0.01 → priceScale=2</li>
 * </ul>
 * 所有价格计算必须对齐到 tick 整数倍,否则 Gate API 返回
 * {@code invalid argument: trigger.price price is not an integer multiple of a price unit}。
 *
 * <h3>使用示例</h3>
 * <pre>
 *   GateConfig config = GateConfig.builder()
 *       .apiKey("...")
 *       .apiSecret("...")
 *       .contract("ETH_USDT")
 *       .leverage("100")
 *       .gridRate(new BigDecimal("0.0035"))
 *       .contractMultiplier("0.01")
 *       .isProduction(false)
 *       .build();
 * </pre>
 *
 * <h3>默认值</h3>
 * <ul>
 *   <li>合约: BTC_USDT, 杠杆: 10x, 全仓, 双向持仓</li>
 *   <li>网格间距: 0.35%, 队列容量: 50, 保证金比例上限: 20%</li>
 *   <li>止盈: 0.5 USDT, 亏损上限: 7.5 USDT</li>
 *   <li>数量: 1 张, 合约乘数: 0.001, 环境: 测试网</li>
 * </ul>
 * <h3>gridElements 生命周期</h3>
 * <ol>
 *   <li>项目启动时初始化为空 ArrayList</li>
 *   <li>{@code tryGenerateQueues()} 中通过 {@code updateGridElements()} 填充,同时触发
 *       {@link GridElement#rebuildIndex(List)} 建立全局 O(1) 索引</li>
 *   <li>每次挂单/止盈操作后通过 {@link GridElement#refreshIndices()} 更新索引</li>
 * </ol>
 *
 * @author Administrator
 */
@@ -313,6 +314,10 @@
        public Builder contractMultiplier(BigDecimal contractMultiplier) { this.contractMultiplier = contractMultiplier; return this; }
        /** 设置价格精度(交易所价格的小数位数,如 1=0.1精度,2=0.01精度) */
        public Builder priceScale(int priceScale) { this.priceScale = priceScale; return this; }
        /** 设置保证金占初始本金比例上限 */
        public Builder marginRatioLimit(BigDecimal marginRatioLimit) { this.marginRatioLimit = marginRatioLimit; return this; }
        /** 设置网格队列容量 */
        public Builder gridQueueSize(int gridQueueSize) { this.gridQueueSize = gridQueueSize; return this; }
        /** 设置未实现盈亏计价模式 */
        public Builder unrealizedPnlPriceMode(PnLPriceMode mode) { this.unrealizedPnlPriceMode = mode; return this; }