gridConfig.ts 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. import { DualGridConfig } from './gridDualExecutor';
  2. /**
  3. * 超详细中文说明(把你当第一次用的朋友来写):
  4. *
  5. * 这个文件做的事:
  6. * - 从环境变量(.env 或启动命令里的 GRID_XXX)读取参数
  7. * - 设定“保守、安全”的默认值(就算你一个都不配,也能跑)
  8. * - 把这些参数转换成网格机器人能理解的配置对象
  9. *
  10. * 一句话原则:宁可慢,别炸;先活下来,有单边也要能退。
  11. *
  12. * 如何使用:
  13. * - 不懂就什么都不改,直接跑,默认值很保守。
  14. * - 想改某个参数:在 .env 里加一行,比如:
  15. * GRID_BASE_NOTIONAL=3
  16. * 这样就把“每笔名义金额”从默认 2 美元改为 3 美元。
  17. * - 想恢复默认:把这一行删掉或注释掉即可。
  18. *
  19. * 参数大类(直白解释):
  20. * - 基础参数:交易品种、杠杆、每笔下多少美金、网格步长(间隔)
  21. * - 节奏控制:多久下一个单、每次下几个、是否激进、是否并发
  22. * - 成本/点差:点差太小就不做、成本上限(避免越做越亏)
  23. * - 高频控制:高频模式开不开、每侧最多并发几个、持有多久就平
  24. * - 做市(限价)参数:优先用限价省手续费,超时就撤掉走市价
  25. * - 再平衡:两个账户/双向仓位的净敞口太偏时,把它往中间拉
  26. * - 去杠杆:资金吃紧(可用资金/钱包余额 比例低)就自动减仓
  27. * - Taker 爆发:在很短时间窗口内快速打几单,但有并发和冷却限制
  28. * - 保护单:持续维护止盈/止损(可开/可关),避免裸奔
  29. * - 审计日志:把每次开/平、资金、仓位写日志,方便复盘
  30. *
  31. * 提醒:
  32. * - 你看到的“默认值”都是偏保守,不追求收益最大化,先把风险压住。
  33. * - 真想冲,就把“每笔名义金额”、“网格步长”、“并发”等逐步往上调,
  34. * 但务必结合你的资金体量与风险偏好。
  35. */
  36. export interface GridEnv {
  37. GRID_SYMBOL?: string;
  38. GRID_LEVERAGE?: string;
  39. GRID_BASE_NOTIONAL?: string;
  40. GRID_STEP_BPS?: string;
  41. GRID_COUNT?: string;
  42. GRID_TICK_MS?: string;
  43. GRID_MAX_OPEN?: string;
  44. GRID_TP_BPS?: string;
  45. GRID_SL_BPS?: string;
  46. GRID_WORKING_TYPE?: 'MARK_PRICE' | 'CONTRACT_PRICE' | string;
  47. GRID_STATE_FILE?: string;
  48. GRID_PERSIST_MS?: string;
  49. GRID_MIN_NOTIONAL_USD?: string;
  50. GRID_FORCE_OPEN_ON_START?: string;
  51. GRID_MIN_OPEN_INTERVAL_MS?: string;
  52. GRID_ORDERS_PER_TICK_PER_SIDE?: string;
  53. GRID_AGGRESSIVE?: string;
  54. GRID_PARALLEL_PLACEMENT?: string;
  55. GRID_MAX_EXPOSURE_USD?: string;
  56. GRID_REDUCE_WHEN_EXPOSURE_ABOVE_USD?: string;
  57. GRID_REDUCE_CHUNK_USD?: string;
  58. GRID_MIN_REDUCE_INTERVAL_MS?: string;
  59. GRID_USE_MAX_LEVERAGE?: string;
  60. GRID_CONTINUOUS_PROTECT?: string;
  61. GRID_PROTECT_REFRESH_MS?: string;
  62. GRID_HF_MODE?: string;
  63. GRID_HF_HOLD_MS?: string;
  64. GRID_HF_MAX_CONCURRENT_PER_SIDE?: string;
  65. GRID_AUDIT_ENABLED?: string;
  66. GRID_AUDIT_LOG_FILE?: string;
  67. GRID_MAKER_MODE?: string; // 入场使用限价GTX(post-only)
  68. GRID_MAKER_OFFSET_BPS?: string; // 入场挂价相对中价偏移bps
  69. GRID_MAKER_TIMEOUT_MS?: string; // 入场挂单超时取消
  70. GRID_REBALANCE_ENABLED?: string; // 是否启用净敞口再平衡
  71. GRID_REBALANCE_THRESHOLD_QTY?: string; // 触发再平衡的净持仓阈值(基础币数量)
  72. GRID_REBALANCE_CHUNK_QTY?: string; // 每次再平衡数量(基础币数量)
  73. GRID_REBALANCE_MIN_INTERVAL_MS?: string; // 再平衡最小间隔
  74. GRID_DELEVERAGE_AFTER_2019?: string; // -2019 后是否尝试减仓
  75. GRID_DELEVERAGE_CHUNK_QTY?: string; // 每次减仓数量(基础币)
  76. GRID_DELEVERAGE_MIN_INTERVAL_MS?: string;// 减仓最小间隔
  77. GRID_DELEVERAGE_STEPS_ON_2019?: string; // -2019 时连击步数
  78. GRID_DELEVERAGE_MULTIPLIER?: string; // 连击步进系数
  79. GRID_DELEVERAGE_MAX_CHUNK_QTY?: string; // 单次最大减仓数量
  80. GRID_TAKER_RATIO?: string; // Taker 触发比例(0~1)
  81. GRID_TAKER_BURST_MS?: string; // Taker 爆发时窗(ms)
  82. GRID_TAKER_MAX_CONCURRENT?: string; // Taker 每侧最大并发
  83. GRID_COST_CAP_BPS?: string; // 成本上限(费率+点差+滑点)bps
  84. GRID_MIN_SPREAD_BPS?: string; // 最小点差 bps
  85. GRID_TAKER_COOLDOWN_MS?: string; // Taker 连续失败后的冷却(ms)
  86. GRID_MAX_GROSS_QTY_PER_SIDE?: string; // 每侧最大总持仓数量(基础币),超过则优先减仓
  87. GRID_DERISK_ENABLED?: string; // 启用利用率去杠杆器
  88. GRID_DERISK_AVAIL_RATIO?: string; // 可用/钱包 低于该比例时去杠杆(0~1)
  89. GRID_DERISK_CHUNK_QTY?: string; // 每次去杠杆数量(基础币)
  90. GRID_DERISK_INTERVAL_MS?: string; // 去杠杆最小间隔
  91. GRID_MAX_NET_QTY?: string; // 允许的最大净敞口(基础币)
  92. GRID_ENTRY_ALIGN_ENABLED?: string; // 启用开仓均价动态回归(成对刷新)
  93. GRID_ENTRY_ALIGN_BPS?: string; // 触发阈值:两侧开仓均价差(bps)
  94. GRID_ENTRY_ALIGN_CHUNK_RATIO?: string; // 每次回归的成对刷新比例(0~1)
  95. GRID_ENTRY_ALIGN_MIN_INTERVAL_MS?: string; // 回归的最小间隔
  96. GRID_ENTRY_ALIGN_MODE?: 'ADD' | 'REPLACE' | 'AUTO' | string; // 回归模式:ADD=同向加仓,REPLACE=先反向平仓再同向重开,AUTO=自适应
  97. GRID_ENTRY_ALIGN_ADD_BPS?: string; // AUTO模式:ADD触发阈值(bps)
  98. GRID_ENTRY_ALIGN_REPLACE_BPS?: string; // AUTO模式:REPLACE触发阈值(bps)
  99. GRID_ENTRY_ALIGN_SUSTAIN_TICKS?: string; // AUTO模式:REPLACE需连续满足阈值的tick数
  100. // 薄盘口优化
  101. GRID_SPREAD_AWARE?: string; // 启用点差感知
  102. GRID_TAKER_MAX_SPREAD_BPS?: string; // 允许吃单的最大点差(bps)
  103. GRID_MAKER_JOIN_BEST?: string; // maker 价格跟随盘口最优
  104. GRID_MAKER_INSIDE_TICKS?: string; // maker 相对最优内移的 tick 数
  105. }
  106. export function loadGridEnv(env: NodeJS.ProcessEnv = process.env): GridEnv {
  107. return {
  108. GRID_SYMBOL: env.GRID_SYMBOL,
  109. GRID_LEVERAGE: env.GRID_LEVERAGE,
  110. GRID_BASE_NOTIONAL: env.GRID_BASE_NOTIONAL,
  111. GRID_STEP_BPS: env.GRID_STEP_BPS,
  112. GRID_COUNT: env.GRID_COUNT,
  113. GRID_TICK_MS: env.GRID_TICK_MS,
  114. GRID_MAX_OPEN: env.GRID_MAX_OPEN,
  115. GRID_TP_BPS: env.GRID_TP_BPS,
  116. GRID_SL_BPS: env.GRID_SL_BPS,
  117. GRID_WORKING_TYPE: env.GRID_WORKING_TYPE as any,
  118. GRID_STATE_FILE: env.GRID_STATE_FILE,
  119. GRID_PERSIST_MS: env.GRID_PERSIST_MS,
  120. GRID_MIN_NOTIONAL_USD: env.GRID_MIN_NOTIONAL_USD,
  121. GRID_FORCE_OPEN_ON_START: env.GRID_FORCE_OPEN_ON_START,
  122. GRID_MIN_OPEN_INTERVAL_MS: env.GRID_MIN_OPEN_INTERVAL_MS,
  123. GRID_ORDERS_PER_TICK_PER_SIDE: env.GRID_ORDERS_PER_TICK_PER_SIDE,
  124. GRID_AGGRESSIVE: env.GRID_AGGRESSIVE,
  125. GRID_PARALLEL_PLACEMENT: env.GRID_PARALLEL_PLACEMENT,
  126. GRID_MAX_EXPOSURE_USD: env.GRID_MAX_EXPOSURE_USD,
  127. GRID_REDUCE_WHEN_EXPOSURE_ABOVE_USD: env.GRID_REDUCE_WHEN_EXPOSURE_ABOVE_USD,
  128. GRID_REDUCE_CHUNK_USD: env.GRID_REDUCE_CHUNK_USD,
  129. GRID_MIN_REDUCE_INTERVAL_MS: env.GRID_MIN_REDUCE_INTERVAL_MS,
  130. GRID_USE_MAX_LEVERAGE: env.GRID_USE_MAX_LEVERAGE,
  131. GRID_CONTINUOUS_PROTECT: env.GRID_CONTINUOUS_PROTECT,
  132. GRID_PROTECT_REFRESH_MS: env.GRID_PROTECT_REFRESH_MS,
  133. GRID_HF_MODE: env.GRID_HF_MODE,
  134. GRID_HF_HOLD_MS: env.GRID_HF_HOLD_MS,
  135. GRID_HF_MAX_CONCURRENT_PER_SIDE: env.GRID_HF_MAX_CONCURRENT_PER_SIDE,
  136. GRID_AUDIT_ENABLED: env.GRID_AUDIT_ENABLED,
  137. GRID_AUDIT_LOG_FILE: env.GRID_AUDIT_LOG_FILE,
  138. GRID_TAKER_RATIO: env.GRID_TAKER_RATIO,
  139. GRID_TAKER_BURST_MS: env.GRID_TAKER_BURST_MS,
  140. GRID_TAKER_MAX_CONCURRENT: env.GRID_TAKER_MAX_CONCURRENT,
  141. GRID_COST_CAP_BPS: env.GRID_COST_CAP_BPS,
  142. GRID_MIN_SPREAD_BPS: env.GRID_MIN_SPREAD_BPS,
  143. GRID_TAKER_COOLDOWN_MS: env.GRID_TAKER_COOLDOWN_MS
  144. ,GRID_MAX_GROSS_QTY_PER_SIDE: env.GRID_MAX_GROSS_QTY_PER_SIDE
  145. ,GRID_DERISK_ENABLED: env.GRID_DERISK_ENABLED
  146. ,GRID_DERISK_AVAIL_RATIO: env.GRID_DERISK_AVAIL_RATIO
  147. ,GRID_DERISK_CHUNK_QTY: env.GRID_DERISK_CHUNK_QTY
  148. ,GRID_DERISK_INTERVAL_MS: env.GRID_DERISK_INTERVAL_MS
  149. ,GRID_MAX_NET_QTY: env.GRID_MAX_NET_QTY
  150. ,GRID_ENTRY_ALIGN_ENABLED: env.GRID_ENTRY_ALIGN_ENABLED
  151. ,GRID_ENTRY_ALIGN_BPS: env.GRID_ENTRY_ALIGN_BPS
  152. ,GRID_ENTRY_ALIGN_CHUNK_RATIO: env.GRID_ENTRY_ALIGN_CHUNK_RATIO
  153. ,GRID_ENTRY_ALIGN_MIN_INTERVAL_MS: env.GRID_ENTRY_ALIGN_MIN_INTERVAL_MS
  154. ,GRID_ENTRY_ALIGN_MODE: env.GRID_ENTRY_ALIGN_MODE as any
  155. ,GRID_ENTRY_ALIGN_ADD_BPS: env.GRID_ENTRY_ALIGN_ADD_BPS
  156. ,GRID_ENTRY_ALIGN_REPLACE_BPS: env.GRID_ENTRY_ALIGN_REPLACE_BPS
  157. ,GRID_ENTRY_ALIGN_SUSTAIN_TICKS: env.GRID_ENTRY_ALIGN_SUSTAIN_TICKS
  158. ,GRID_SPREAD_AWARE: env.GRID_SPREAD_AWARE
  159. ,GRID_TAKER_MAX_SPREAD_BPS: env.GRID_TAKER_MAX_SPREAD_BPS
  160. ,GRID_MAKER_JOIN_BEST: env.GRID_MAKER_JOIN_BEST
  161. ,GRID_MAKER_INSIDE_TICKS: env.GRID_MAKER_INSIDE_TICKS
  162. };
  163. }
  164. // 参数默认值(保守):
  165. // - baseNotionalUsd=2:单笔名义低,减少 -2019
  166. // - gridStepBps=60:较大步长,覆盖成本/点差
  167. // - hfMaxConcurrentPerSide=2、ordersPerTickPerSide=1:降低并发
  168. // - minSpreadBps=25:点差较小时不吃单
  169. // - takerCooldownMs=10000:-2019 后适度冷却
  170. // - maxGrossQtyPerSide=0.02、maxNetQty=0.003:限制总仓与净敞口
  171. // - 去杠杆阈值=25%,步长0.006,间隔6s:保证金吃紧时主动释压
  172. export function toDualGridConfig(env: GridEnv): DualGridConfig {
  173. const symbol = (env.GRID_SYMBOL || 'BTCUSDT').toUpperCase();
  174. const leverage = parseInt(env.GRID_LEVERAGE || '100');
  175. const baseNotionalUsd = parseFloat(env.GRID_BASE_NOTIONAL || '2');
  176. const gridStepBps = parseInt(env.GRID_STEP_BPS || '60');
  177. const gridCount = parseInt(env.GRID_COUNT || '1');
  178. const tickIntervalMs = parseInt(env.GRID_TICK_MS || '700');
  179. const maxOpenPerSide = parseInt(env.GRID_MAX_OPEN || '1');
  180. const tpBps = env.GRID_TP_BPS ? parseInt(env.GRID_TP_BPS) : undefined;
  181. const slBps = env.GRID_SL_BPS ? parseInt(env.GRID_SL_BPS) : undefined;
  182. const workingType = env.GRID_WORKING_TYPE as 'MARK_PRICE' | 'CONTRACT_PRICE' | undefined;
  183. const stateFile = env.GRID_STATE_FILE || undefined;
  184. const persistIntervalMs = env.GRID_PERSIST_MS ? parseInt(env.GRID_PERSIST_MS) : 8000;
  185. const minNotionalUsd = env.GRID_MIN_NOTIONAL_USD ? parseFloat(env.GRID_MIN_NOTIONAL_USD) : undefined;
  186. const forceOpenOnStart = env.GRID_FORCE_OPEN_ON_START ? env.GRID_FORCE_OPEN_ON_START === '1' : true;
  187. const minOpenIntervalMs = env.GRID_MIN_OPEN_INTERVAL_MS ? parseInt(env.GRID_MIN_OPEN_INTERVAL_MS) : 1000;
  188. const ordersPerTickPerSide = env.GRID_ORDERS_PER_TICK_PER_SIDE ? parseInt(env.GRID_ORDERS_PER_TICK_PER_SIDE) : 1;
  189. const aggressive = env.GRID_AGGRESSIVE ? env.GRID_AGGRESSIVE === '1' : true;
  190. const parallelPlacement = env.GRID_PARALLEL_PLACEMENT ? env.GRID_PARALLEL_PLACEMENT === '1' : true;
  191. const maxExposureUsdPerSide = env.GRID_MAX_EXPOSURE_USD ? parseFloat(env.GRID_MAX_EXPOSURE_USD) : undefined;
  192. const reduceWhenExposureAboveUsd = env.GRID_REDUCE_WHEN_EXPOSURE_ABOVE_USD ? parseFloat(env.GRID_REDUCE_WHEN_EXPOSURE_ABOVE_USD) : undefined;
  193. const reduceChunkUsd = env.GRID_REDUCE_CHUNK_USD ? parseFloat(env.GRID_REDUCE_CHUNK_USD) : undefined;
  194. const minReduceIntervalMs = env.GRID_MIN_REDUCE_INTERVAL_MS ? parseInt(env.GRID_MIN_REDUCE_INTERVAL_MS) : undefined;
  195. const useMaxLeverage = env.GRID_USE_MAX_LEVERAGE ? env.GRID_USE_MAX_LEVERAGE === '1' : true;
  196. const continuousProtect = env.GRID_CONTINUOUS_PROTECT ? env.GRID_CONTINUOUS_PROTECT === '1' : false;
  197. const protectRefreshMs = env.GRID_PROTECT_REFRESH_MS ? parseInt(env.GRID_PROTECT_REFRESH_MS) : 15000;
  198. const hfMode = env.GRID_HF_MODE ? env.GRID_HF_MODE === '1' : true;
  199. const hfHoldMs = env.GRID_HF_HOLD_MS ? parseInt(env.GRID_HF_HOLD_MS) : 800;
  200. const hfMaxConcurrentPerSide = env.GRID_HF_MAX_CONCURRENT_PER_SIDE ? parseInt(env.GRID_HF_MAX_CONCURRENT_PER_SIDE) : 2;
  201. const hfSymmetric = true;
  202. // 为进一步减少进场漂移,默认关闭 makerMode,成对下单强制用市价同步成交
  203. const makerMode = env.GRID_MAKER_MODE ? env.GRID_MAKER_MODE === '1' : false;
  204. // 为减少价差与滑点:加大挂单偏移、缩短挂单超时
  205. const makerOffsetBps = env.GRID_MAKER_OFFSET_BPS ? parseInt(env.GRID_MAKER_OFFSET_BPS) : 8;
  206. const makerTimeoutMs = env.GRID_MAKER_TIMEOUT_MS ? parseInt(env.GRID_MAKER_TIMEOUT_MS) : 800;
  207. const rebalanceEnabled = env.GRID_REBALANCE_ENABLED ? env.GRID_REBALANCE_ENABLED === '1' : true;
  208. const rebalanceThresholdQty = env.GRID_REBALANCE_THRESHOLD_QTY ? parseFloat(env.GRID_REBALANCE_THRESHOLD_QTY) : 0.005; // 0.005 BTC
  209. const rebalanceChunkQty = env.GRID_REBALANCE_CHUNK_QTY ? parseFloat(env.GRID_REBALANCE_CHUNK_QTY) : 0.005;
  210. const rebalanceMinIntervalMs = env.GRID_REBALANCE_MIN_INTERVAL_MS ? parseInt(env.GRID_REBALANCE_MIN_INTERVAL_MS) : 3000;
  211. const deleverageAfter2019 = env.GRID_DELEVERAGE_AFTER_2019 ? env.GRID_DELEVERAGE_AFTER_2019 === '1' : true;
  212. const deleverageChunkQty = env.GRID_DELEVERAGE_CHUNK_QTY ? parseFloat(env.GRID_DELEVERAGE_CHUNK_QTY) : 0.002;
  213. const deleverageMinIntervalMs = env.GRID_DELEVERAGE_MIN_INTERVAL_MS ? parseInt(env.GRID_DELEVERAGE_MIN_INTERVAL_MS) : 8000;
  214. const deleverageStepsOn2019 = env.GRID_DELEVERAGE_STEPS_ON_2019 ? parseInt(env.GRID_DELEVERAGE_STEPS_ON_2019) : 3;
  215. const deleverageMultiplier = env.GRID_DELEVERAGE_MULTIPLIER ? parseFloat(env.GRID_DELEVERAGE_MULTIPLIER) : 2.0;
  216. const deleverageMaxChunkQty = env.GRID_DELEVERAGE_MAX_CHUNK_QTY ? parseFloat(env.GRID_DELEVERAGE_MAX_CHUNK_QTY) : 0.02;
  217. const takerRatio = env.GRID_TAKER_RATIO ? parseFloat(env.GRID_TAKER_RATIO) : 0.6;
  218. const takerBurstMs = env.GRID_TAKER_BURST_MS ? parseInt(env.GRID_TAKER_BURST_MS) : 1000;
  219. const takerMaxConcurrent = env.GRID_TAKER_MAX_CONCURRENT ? parseInt(env.GRID_TAKER_MAX_CONCURRENT) : 1;
  220. const costCapBps = env.GRID_COST_CAP_BPS ? parseInt(env.GRID_COST_CAP_BPS) : 30;
  221. const minSpreadBps = env.GRID_MIN_SPREAD_BPS ? parseInt(env.GRID_MIN_SPREAD_BPS) : 35;
  222. const takerCooldownMs = env.GRID_TAKER_COOLDOWN_MS ? parseInt(env.GRID_TAKER_COOLDOWN_MS) : 10000;
  223. const maxGrossQtyPerSide = env.GRID_MAX_GROSS_QTY_PER_SIDE ? parseFloat(env.GRID_MAX_GROSS_QTY_PER_SIDE) : 0.02; // 0.02 BTC
  224. const deRiskEnabled = env.GRID_DERISK_ENABLED ? env.GRID_DERISK_ENABLED === '1' : true;
  225. const deRiskAvailRatio = env.GRID_DERISK_AVAIL_RATIO ? parseFloat(env.GRID_DERISK_AVAIL_RATIO) : 0.30; // 可用/钱包 < 30%
  226. const deRiskChunkQty = env.GRID_DERISK_CHUNK_QTY ? parseFloat(env.GRID_DERISK_CHUNK_QTY) : 0.008; // 每次去杠杆更多
  227. const deRiskIntervalMs = env.GRID_DERISK_INTERVAL_MS ? parseInt(env.GRID_DERISK_INTERVAL_MS) : 4000; // 更频繁检查
  228. const maxNetQty = env.GRID_MAX_NET_QTY ? parseFloat(env.GRID_MAX_NET_QTY) : 0.002; // 更紧净敞口
  229. const entryAlignEnabled = env.GRID_ENTRY_ALIGN_ENABLED ? env.GRID_ENTRY_ALIGN_ENABLED === '1' : true; // 默认开启
  230. const entryAlignDeltaBps = env.GRID_ENTRY_ALIGN_BPS ? parseInt(env.GRID_ENTRY_ALIGN_BPS) : 15; // 均价差>15bps回归
  231. const entryAlignChunkRatio = env.GRID_ENTRY_ALIGN_CHUNK_RATIO ? parseFloat(env.GRID_ENTRY_ALIGN_CHUNK_RATIO) : 0.15; // 每次回滚15%
  232. const entryAlignMinIntervalMs = env.GRID_ENTRY_ALIGN_MIN_INTERVAL_MS ? parseInt(env.GRID_ENTRY_ALIGN_MIN_INTERVAL_MS) : 8000;
  233. // 默认 AUTO:小差用 ADD(更少实亏),大差且持续时用 REPLACE(更快回归)
  234. const entryAlignMode = ((env.GRID_ENTRY_ALIGN_MODE as any) === 'ADD' || (env.GRID_ENTRY_ALIGN_MODE as any) === 'REPLACE' || (env.GRID_ENTRY_ALIGN_MODE as any) === 'AUTO') ? (env.GRID_ENTRY_ALIGN_MODE as any) : 'AUTO';
  235. const entryAlignAddBps = env.GRID_ENTRY_ALIGN_ADD_BPS ? parseInt(env.GRID_ENTRY_ALIGN_ADD_BPS) : 12;
  236. const entryAlignReplaceBps = env.GRID_ENTRY_ALIGN_REPLACE_BPS ? parseInt(env.GRID_ENTRY_ALIGN_REPLACE_BPS) : 30;
  237. const entryAlignSustainTicks = env.GRID_ENTRY_ALIGN_SUSTAIN_TICKS ? parseInt(env.GRID_ENTRY_ALIGN_SUSTAIN_TICKS) : 2;
  238. // 薄盘口优化默认:开启点差感知,限制大点差时的吃单;maker 贴最优
  239. const spreadAware = env.GRID_SPREAD_AWARE ? env.GRID_SPREAD_AWARE === '1' : false;
  240. const takerMaxSpreadBps = env.GRID_TAKER_MAX_SPREAD_BPS ? parseInt(env.GRID_TAKER_MAX_SPREAD_BPS) : 120;
  241. const makerJoinBest = env.GRID_MAKER_JOIN_BEST ? env.GRID_MAKER_JOIN_BEST === '1' : false;
  242. const makerInsideTicks = env.GRID_MAKER_INSIDE_TICKS ? parseInt(env.GRID_MAKER_INSIDE_TICKS) : 0;
  243. const auditEnabled = env.GRID_AUDIT_ENABLED ? env.GRID_AUDIT_ENABLED === '1' : true;
  244. const auditLogFile = env.GRID_AUDIT_LOG_FILE || undefined;
  245. return {
  246. symbol,
  247. leverage,
  248. baseNotionalUsd,
  249. gridStepBps,
  250. gridCount,
  251. tickIntervalMs,
  252. maxOpenPerSide,
  253. tpBps,
  254. slBps,
  255. workingType,
  256. stateFile,
  257. persistIntervalMs,
  258. minNotionalUsd,
  259. forceOpenOnStart,
  260. minOpenIntervalMs,
  261. ordersPerTickPerSide,
  262. aggressive,
  263. parallelPlacement,
  264. maxExposureUsdPerSide,
  265. reduceWhenExposureAboveUsd,
  266. reduceChunkUsd,
  267. minReduceIntervalMs,
  268. useMaxLeverage,
  269. continuousProtect,
  270. protectRefreshMs,
  271. hfMode,
  272. hfHoldMs,
  273. hfMaxConcurrentPerSide,
  274. hfSymmetric,
  275. auditEnabled,
  276. auditLogFile,
  277. makerMode,
  278. makerOffsetBps,
  279. makerTimeoutMs,
  280. rebalanceEnabled,
  281. rebalanceThresholdQty,
  282. rebalanceChunkQty,
  283. rebalanceMinIntervalMs,
  284. deleverageAfter2019,
  285. deleverageChunkQty,
  286. deleverageMinIntervalMs,
  287. deleverageStepsOn2019,
  288. deleverageMultiplier,
  289. deleverageMaxChunkQty,
  290. takerRatio,
  291. takerBurstMs,
  292. takerMaxConcurrent,
  293. costCapBps,
  294. minSpreadBps,
  295. takerCooldownMs
  296. ,maxGrossQtyPerSide
  297. ,deRiskEnabled
  298. ,deRiskAvailRatio
  299. ,deRiskChunkQty
  300. ,deRiskIntervalMs
  301. ,maxNetQty
  302. ,entryAlignEnabled
  303. ,entryAlignDeltaBps
  304. ,entryAlignChunkRatio
  305. ,entryAlignMinIntervalMs
  306. ,entryAlignMode
  307. ,entryAlignAddBps
  308. ,entryAlignReplaceBps
  309. ,entryAlignSustainTicks
  310. ,spreadAware
  311. ,takerMaxSpreadBps
  312. ,makerJoinBest
  313. ,makerInsideTicks
  314. };
  315. }