| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322 |
- import { DualGridConfig } from './gridDualExecutor';
- /**
- * 超详细中文说明(把你当第一次用的朋友来写):
- *
- * 这个文件做的事:
- * - 从环境变量(.env 或启动命令里的 GRID_XXX)读取参数
- * - 设定“保守、安全”的默认值(就算你一个都不配,也能跑)
- * - 把这些参数转换成网格机器人能理解的配置对象
- *
- * 一句话原则:宁可慢,别炸;先活下来,有单边也要能退。
- *
- * 如何使用:
- * - 不懂就什么都不改,直接跑,默认值很保守。
- * - 想改某个参数:在 .env 里加一行,比如:
- * GRID_BASE_NOTIONAL=3
- * 这样就把“每笔名义金额”从默认 2 美元改为 3 美元。
- * - 想恢复默认:把这一行删掉或注释掉即可。
- *
- * 参数大类(直白解释):
- * - 基础参数:交易品种、杠杆、每笔下多少美金、网格步长(间隔)
- * - 节奏控制:多久下一个单、每次下几个、是否激进、是否并发
- * - 成本/点差:点差太小就不做、成本上限(避免越做越亏)
- * - 高频控制:高频模式开不开、每侧最多并发几个、持有多久就平
- * - 做市(限价)参数:优先用限价省手续费,超时就撤掉走市价
- * - 再平衡:两个账户/双向仓位的净敞口太偏时,把它往中间拉
- * - 去杠杆:资金吃紧(可用资金/钱包余额 比例低)就自动减仓
- * - Taker 爆发:在很短时间窗口内快速打几单,但有并发和冷却限制
- * - 保护单:持续维护止盈/止损(可开/可关),避免裸奔
- * - 审计日志:把每次开/平、资金、仓位写日志,方便复盘
- *
- * 提醒:
- * - 你看到的“默认值”都是偏保守,不追求收益最大化,先把风险压住。
- * - 真想冲,就把“每笔名义金额”、“网格步长”、“并发”等逐步往上调,
- * 但务必结合你的资金体量与风险偏好。
- */
- export interface GridEnv {
- GRID_SYMBOL?: string;
- GRID_LEVERAGE?: string;
- GRID_BASE_NOTIONAL?: string;
- GRID_STEP_BPS?: string;
- GRID_COUNT?: string;
- GRID_TICK_MS?: string;
- GRID_MAX_OPEN?: string;
- GRID_TP_BPS?: string;
- GRID_SL_BPS?: string;
- GRID_WORKING_TYPE?: 'MARK_PRICE' | 'CONTRACT_PRICE' | string;
- GRID_STATE_FILE?: string;
- GRID_PERSIST_MS?: string;
- GRID_MIN_NOTIONAL_USD?: string;
- GRID_FORCE_OPEN_ON_START?: string;
- GRID_MIN_OPEN_INTERVAL_MS?: string;
- GRID_ORDERS_PER_TICK_PER_SIDE?: string;
- GRID_AGGRESSIVE?: string;
- GRID_PARALLEL_PLACEMENT?: string;
- GRID_MAX_EXPOSURE_USD?: string;
- GRID_REDUCE_WHEN_EXPOSURE_ABOVE_USD?: string;
- GRID_REDUCE_CHUNK_USD?: string;
- GRID_MIN_REDUCE_INTERVAL_MS?: string;
- GRID_USE_MAX_LEVERAGE?: string;
- GRID_CONTINUOUS_PROTECT?: string;
- GRID_PROTECT_REFRESH_MS?: string;
- GRID_HF_MODE?: string;
- GRID_HF_HOLD_MS?: string;
- GRID_HF_MAX_CONCURRENT_PER_SIDE?: string;
- GRID_AUDIT_ENABLED?: string;
- GRID_AUDIT_LOG_FILE?: string;
- GRID_MAKER_MODE?: string; // 入场使用限价GTX(post-only)
- GRID_MAKER_OFFSET_BPS?: string; // 入场挂价相对中价偏移bps
- GRID_MAKER_TIMEOUT_MS?: string; // 入场挂单超时取消
- GRID_REBALANCE_ENABLED?: string; // 是否启用净敞口再平衡
- GRID_REBALANCE_THRESHOLD_QTY?: string; // 触发再平衡的净持仓阈值(基础币数量)
- GRID_REBALANCE_CHUNK_QTY?: string; // 每次再平衡数量(基础币数量)
- GRID_REBALANCE_MIN_INTERVAL_MS?: string; // 再平衡最小间隔
- GRID_DELEVERAGE_AFTER_2019?: string; // -2019 后是否尝试减仓
- GRID_DELEVERAGE_CHUNK_QTY?: string; // 每次减仓数量(基础币)
- GRID_DELEVERAGE_MIN_INTERVAL_MS?: string;// 减仓最小间隔
- GRID_DELEVERAGE_STEPS_ON_2019?: string; // -2019 时连击步数
- GRID_DELEVERAGE_MULTIPLIER?: string; // 连击步进系数
- GRID_DELEVERAGE_MAX_CHUNK_QTY?: string; // 单次最大减仓数量
- GRID_TAKER_RATIO?: string; // Taker 触发比例(0~1)
- GRID_TAKER_BURST_MS?: string; // Taker 爆发时窗(ms)
- GRID_TAKER_MAX_CONCURRENT?: string; // Taker 每侧最大并发
- GRID_COST_CAP_BPS?: string; // 成本上限(费率+点差+滑点)bps
- GRID_MIN_SPREAD_BPS?: string; // 最小点差 bps
- GRID_TAKER_COOLDOWN_MS?: string; // Taker 连续失败后的冷却(ms)
- GRID_MAX_GROSS_QTY_PER_SIDE?: string; // 每侧最大总持仓数量(基础币),超过则优先减仓
- GRID_DERISK_ENABLED?: string; // 启用利用率去杠杆器
- GRID_DERISK_AVAIL_RATIO?: string; // 可用/钱包 低于该比例时去杠杆(0~1)
- GRID_DERISK_CHUNK_QTY?: string; // 每次去杠杆数量(基础币)
- GRID_DERISK_INTERVAL_MS?: string; // 去杠杆最小间隔
- GRID_MAX_NET_QTY?: string; // 允许的最大净敞口(基础币)
- GRID_ENTRY_ALIGN_ENABLED?: string; // 启用开仓均价动态回归(成对刷新)
- GRID_ENTRY_ALIGN_BPS?: string; // 触发阈值:两侧开仓均价差(bps)
- GRID_ENTRY_ALIGN_CHUNK_RATIO?: string; // 每次回归的成对刷新比例(0~1)
- GRID_ENTRY_ALIGN_MIN_INTERVAL_MS?: string; // 回归的最小间隔
- GRID_ENTRY_ALIGN_MODE?: 'ADD' | 'REPLACE' | 'AUTO' | string; // 回归模式:ADD=同向加仓,REPLACE=先反向平仓再同向重开,AUTO=自适应
- GRID_ENTRY_ALIGN_ADD_BPS?: string; // AUTO模式:ADD触发阈值(bps)
- GRID_ENTRY_ALIGN_REPLACE_BPS?: string; // AUTO模式:REPLACE触发阈值(bps)
- GRID_ENTRY_ALIGN_SUSTAIN_TICKS?: string; // AUTO模式:REPLACE需连续满足阈值的tick数
- // 薄盘口优化
- GRID_SPREAD_AWARE?: string; // 启用点差感知
- GRID_TAKER_MAX_SPREAD_BPS?: string; // 允许吃单的最大点差(bps)
- GRID_MAKER_JOIN_BEST?: string; // maker 价格跟随盘口最优
- GRID_MAKER_INSIDE_TICKS?: string; // maker 相对最优内移的 tick 数
- }
- export function loadGridEnv(env: NodeJS.ProcessEnv = process.env): GridEnv {
- return {
- GRID_SYMBOL: env.GRID_SYMBOL,
- GRID_LEVERAGE: env.GRID_LEVERAGE,
- GRID_BASE_NOTIONAL: env.GRID_BASE_NOTIONAL,
- GRID_STEP_BPS: env.GRID_STEP_BPS,
- GRID_COUNT: env.GRID_COUNT,
- GRID_TICK_MS: env.GRID_TICK_MS,
- GRID_MAX_OPEN: env.GRID_MAX_OPEN,
- GRID_TP_BPS: env.GRID_TP_BPS,
- GRID_SL_BPS: env.GRID_SL_BPS,
- GRID_WORKING_TYPE: env.GRID_WORKING_TYPE as any,
- GRID_STATE_FILE: env.GRID_STATE_FILE,
- GRID_PERSIST_MS: env.GRID_PERSIST_MS,
- GRID_MIN_NOTIONAL_USD: env.GRID_MIN_NOTIONAL_USD,
- GRID_FORCE_OPEN_ON_START: env.GRID_FORCE_OPEN_ON_START,
- GRID_MIN_OPEN_INTERVAL_MS: env.GRID_MIN_OPEN_INTERVAL_MS,
- GRID_ORDERS_PER_TICK_PER_SIDE: env.GRID_ORDERS_PER_TICK_PER_SIDE,
- GRID_AGGRESSIVE: env.GRID_AGGRESSIVE,
- GRID_PARALLEL_PLACEMENT: env.GRID_PARALLEL_PLACEMENT,
- GRID_MAX_EXPOSURE_USD: env.GRID_MAX_EXPOSURE_USD,
- GRID_REDUCE_WHEN_EXPOSURE_ABOVE_USD: env.GRID_REDUCE_WHEN_EXPOSURE_ABOVE_USD,
- GRID_REDUCE_CHUNK_USD: env.GRID_REDUCE_CHUNK_USD,
- GRID_MIN_REDUCE_INTERVAL_MS: env.GRID_MIN_REDUCE_INTERVAL_MS,
- GRID_USE_MAX_LEVERAGE: env.GRID_USE_MAX_LEVERAGE,
- GRID_CONTINUOUS_PROTECT: env.GRID_CONTINUOUS_PROTECT,
- GRID_PROTECT_REFRESH_MS: env.GRID_PROTECT_REFRESH_MS,
- GRID_HF_MODE: env.GRID_HF_MODE,
- GRID_HF_HOLD_MS: env.GRID_HF_HOLD_MS,
- GRID_HF_MAX_CONCURRENT_PER_SIDE: env.GRID_HF_MAX_CONCURRENT_PER_SIDE,
- GRID_AUDIT_ENABLED: env.GRID_AUDIT_ENABLED,
- GRID_AUDIT_LOG_FILE: env.GRID_AUDIT_LOG_FILE,
- GRID_TAKER_RATIO: env.GRID_TAKER_RATIO,
- GRID_TAKER_BURST_MS: env.GRID_TAKER_BURST_MS,
- GRID_TAKER_MAX_CONCURRENT: env.GRID_TAKER_MAX_CONCURRENT,
- GRID_COST_CAP_BPS: env.GRID_COST_CAP_BPS,
- GRID_MIN_SPREAD_BPS: env.GRID_MIN_SPREAD_BPS,
- GRID_TAKER_COOLDOWN_MS: env.GRID_TAKER_COOLDOWN_MS
- ,GRID_MAX_GROSS_QTY_PER_SIDE: env.GRID_MAX_GROSS_QTY_PER_SIDE
- ,GRID_DERISK_ENABLED: env.GRID_DERISK_ENABLED
- ,GRID_DERISK_AVAIL_RATIO: env.GRID_DERISK_AVAIL_RATIO
- ,GRID_DERISK_CHUNK_QTY: env.GRID_DERISK_CHUNK_QTY
- ,GRID_DERISK_INTERVAL_MS: env.GRID_DERISK_INTERVAL_MS
- ,GRID_MAX_NET_QTY: env.GRID_MAX_NET_QTY
- ,GRID_ENTRY_ALIGN_ENABLED: env.GRID_ENTRY_ALIGN_ENABLED
- ,GRID_ENTRY_ALIGN_BPS: env.GRID_ENTRY_ALIGN_BPS
- ,GRID_ENTRY_ALIGN_CHUNK_RATIO: env.GRID_ENTRY_ALIGN_CHUNK_RATIO
- ,GRID_ENTRY_ALIGN_MIN_INTERVAL_MS: env.GRID_ENTRY_ALIGN_MIN_INTERVAL_MS
- ,GRID_ENTRY_ALIGN_MODE: env.GRID_ENTRY_ALIGN_MODE as any
- ,GRID_ENTRY_ALIGN_ADD_BPS: env.GRID_ENTRY_ALIGN_ADD_BPS
- ,GRID_ENTRY_ALIGN_REPLACE_BPS: env.GRID_ENTRY_ALIGN_REPLACE_BPS
- ,GRID_ENTRY_ALIGN_SUSTAIN_TICKS: env.GRID_ENTRY_ALIGN_SUSTAIN_TICKS
- ,GRID_SPREAD_AWARE: env.GRID_SPREAD_AWARE
- ,GRID_TAKER_MAX_SPREAD_BPS: env.GRID_TAKER_MAX_SPREAD_BPS
- ,GRID_MAKER_JOIN_BEST: env.GRID_MAKER_JOIN_BEST
- ,GRID_MAKER_INSIDE_TICKS: env.GRID_MAKER_INSIDE_TICKS
- };
- }
- // 参数默认值(保守):
- // - baseNotionalUsd=2:单笔名义低,减少 -2019
- // - gridStepBps=60:较大步长,覆盖成本/点差
- // - hfMaxConcurrentPerSide=2、ordersPerTickPerSide=1:降低并发
- // - minSpreadBps=25:点差较小时不吃单
- // - takerCooldownMs=10000:-2019 后适度冷却
- // - maxGrossQtyPerSide=0.02、maxNetQty=0.003:限制总仓与净敞口
- // - 去杠杆阈值=25%,步长0.006,间隔6s:保证金吃紧时主动释压
- export function toDualGridConfig(env: GridEnv): DualGridConfig {
- const symbol = (env.GRID_SYMBOL || 'BTCUSDT').toUpperCase();
- const leverage = parseInt(env.GRID_LEVERAGE || '100');
- const baseNotionalUsd = parseFloat(env.GRID_BASE_NOTIONAL || '2');
- const gridStepBps = parseInt(env.GRID_STEP_BPS || '60');
- const gridCount = parseInt(env.GRID_COUNT || '1');
- const tickIntervalMs = parseInt(env.GRID_TICK_MS || '700');
- const maxOpenPerSide = parseInt(env.GRID_MAX_OPEN || '1');
- const tpBps = env.GRID_TP_BPS ? parseInt(env.GRID_TP_BPS) : undefined;
- const slBps = env.GRID_SL_BPS ? parseInt(env.GRID_SL_BPS) : undefined;
- const workingType = env.GRID_WORKING_TYPE as 'MARK_PRICE' | 'CONTRACT_PRICE' | undefined;
- const stateFile = env.GRID_STATE_FILE || undefined;
- const persistIntervalMs = env.GRID_PERSIST_MS ? parseInt(env.GRID_PERSIST_MS) : 8000;
- const minNotionalUsd = env.GRID_MIN_NOTIONAL_USD ? parseFloat(env.GRID_MIN_NOTIONAL_USD) : undefined;
- const forceOpenOnStart = env.GRID_FORCE_OPEN_ON_START ? env.GRID_FORCE_OPEN_ON_START === '1' : true;
- const minOpenIntervalMs = env.GRID_MIN_OPEN_INTERVAL_MS ? parseInt(env.GRID_MIN_OPEN_INTERVAL_MS) : 1000;
- const ordersPerTickPerSide = env.GRID_ORDERS_PER_TICK_PER_SIDE ? parseInt(env.GRID_ORDERS_PER_TICK_PER_SIDE) : 1;
- const aggressive = env.GRID_AGGRESSIVE ? env.GRID_AGGRESSIVE === '1' : true;
- const parallelPlacement = env.GRID_PARALLEL_PLACEMENT ? env.GRID_PARALLEL_PLACEMENT === '1' : true;
- const maxExposureUsdPerSide = env.GRID_MAX_EXPOSURE_USD ? parseFloat(env.GRID_MAX_EXPOSURE_USD) : undefined;
- const reduceWhenExposureAboveUsd = env.GRID_REDUCE_WHEN_EXPOSURE_ABOVE_USD ? parseFloat(env.GRID_REDUCE_WHEN_EXPOSURE_ABOVE_USD) : undefined;
- const reduceChunkUsd = env.GRID_REDUCE_CHUNK_USD ? parseFloat(env.GRID_REDUCE_CHUNK_USD) : undefined;
- const minReduceIntervalMs = env.GRID_MIN_REDUCE_INTERVAL_MS ? parseInt(env.GRID_MIN_REDUCE_INTERVAL_MS) : undefined;
- const useMaxLeverage = env.GRID_USE_MAX_LEVERAGE ? env.GRID_USE_MAX_LEVERAGE === '1' : true;
- const continuousProtect = env.GRID_CONTINUOUS_PROTECT ? env.GRID_CONTINUOUS_PROTECT === '1' : false;
- const protectRefreshMs = env.GRID_PROTECT_REFRESH_MS ? parseInt(env.GRID_PROTECT_REFRESH_MS) : 15000;
- const hfMode = env.GRID_HF_MODE ? env.GRID_HF_MODE === '1' : true;
- const hfHoldMs = env.GRID_HF_HOLD_MS ? parseInt(env.GRID_HF_HOLD_MS) : 800;
- const hfMaxConcurrentPerSide = env.GRID_HF_MAX_CONCURRENT_PER_SIDE ? parseInt(env.GRID_HF_MAX_CONCURRENT_PER_SIDE) : 2;
- const hfSymmetric = true;
- // 为进一步减少进场漂移,默认关闭 makerMode,成对下单强制用市价同步成交
- const makerMode = env.GRID_MAKER_MODE ? env.GRID_MAKER_MODE === '1' : false;
- // 为减少价差与滑点:加大挂单偏移、缩短挂单超时
- const makerOffsetBps = env.GRID_MAKER_OFFSET_BPS ? parseInt(env.GRID_MAKER_OFFSET_BPS) : 8;
- const makerTimeoutMs = env.GRID_MAKER_TIMEOUT_MS ? parseInt(env.GRID_MAKER_TIMEOUT_MS) : 800;
- const rebalanceEnabled = env.GRID_REBALANCE_ENABLED ? env.GRID_REBALANCE_ENABLED === '1' : true;
- const rebalanceThresholdQty = env.GRID_REBALANCE_THRESHOLD_QTY ? parseFloat(env.GRID_REBALANCE_THRESHOLD_QTY) : 0.005; // 0.005 BTC
- const rebalanceChunkQty = env.GRID_REBALANCE_CHUNK_QTY ? parseFloat(env.GRID_REBALANCE_CHUNK_QTY) : 0.005;
- const rebalanceMinIntervalMs = env.GRID_REBALANCE_MIN_INTERVAL_MS ? parseInt(env.GRID_REBALANCE_MIN_INTERVAL_MS) : 3000;
- const deleverageAfter2019 = env.GRID_DELEVERAGE_AFTER_2019 ? env.GRID_DELEVERAGE_AFTER_2019 === '1' : true;
- const deleverageChunkQty = env.GRID_DELEVERAGE_CHUNK_QTY ? parseFloat(env.GRID_DELEVERAGE_CHUNK_QTY) : 0.002;
- const deleverageMinIntervalMs = env.GRID_DELEVERAGE_MIN_INTERVAL_MS ? parseInt(env.GRID_DELEVERAGE_MIN_INTERVAL_MS) : 8000;
- const deleverageStepsOn2019 = env.GRID_DELEVERAGE_STEPS_ON_2019 ? parseInt(env.GRID_DELEVERAGE_STEPS_ON_2019) : 3;
- const deleverageMultiplier = env.GRID_DELEVERAGE_MULTIPLIER ? parseFloat(env.GRID_DELEVERAGE_MULTIPLIER) : 2.0;
- const deleverageMaxChunkQty = env.GRID_DELEVERAGE_MAX_CHUNK_QTY ? parseFloat(env.GRID_DELEVERAGE_MAX_CHUNK_QTY) : 0.02;
- const takerRatio = env.GRID_TAKER_RATIO ? parseFloat(env.GRID_TAKER_RATIO) : 0.6;
- const takerBurstMs = env.GRID_TAKER_BURST_MS ? parseInt(env.GRID_TAKER_BURST_MS) : 1000;
- const takerMaxConcurrent = env.GRID_TAKER_MAX_CONCURRENT ? parseInt(env.GRID_TAKER_MAX_CONCURRENT) : 1;
- const costCapBps = env.GRID_COST_CAP_BPS ? parseInt(env.GRID_COST_CAP_BPS) : 30;
- const minSpreadBps = env.GRID_MIN_SPREAD_BPS ? parseInt(env.GRID_MIN_SPREAD_BPS) : 35;
- const takerCooldownMs = env.GRID_TAKER_COOLDOWN_MS ? parseInt(env.GRID_TAKER_COOLDOWN_MS) : 10000;
- const maxGrossQtyPerSide = env.GRID_MAX_GROSS_QTY_PER_SIDE ? parseFloat(env.GRID_MAX_GROSS_QTY_PER_SIDE) : 0.02; // 0.02 BTC
- const deRiskEnabled = env.GRID_DERISK_ENABLED ? env.GRID_DERISK_ENABLED === '1' : true;
- const deRiskAvailRatio = env.GRID_DERISK_AVAIL_RATIO ? parseFloat(env.GRID_DERISK_AVAIL_RATIO) : 0.30; // 可用/钱包 < 30%
- const deRiskChunkQty = env.GRID_DERISK_CHUNK_QTY ? parseFloat(env.GRID_DERISK_CHUNK_QTY) : 0.008; // 每次去杠杆更多
- const deRiskIntervalMs = env.GRID_DERISK_INTERVAL_MS ? parseInt(env.GRID_DERISK_INTERVAL_MS) : 4000; // 更频繁检查
- const maxNetQty = env.GRID_MAX_NET_QTY ? parseFloat(env.GRID_MAX_NET_QTY) : 0.002; // 更紧净敞口
- const entryAlignEnabled = env.GRID_ENTRY_ALIGN_ENABLED ? env.GRID_ENTRY_ALIGN_ENABLED === '1' : true; // 默认开启
- const entryAlignDeltaBps = env.GRID_ENTRY_ALIGN_BPS ? parseInt(env.GRID_ENTRY_ALIGN_BPS) : 15; // 均价差>15bps回归
- const entryAlignChunkRatio = env.GRID_ENTRY_ALIGN_CHUNK_RATIO ? parseFloat(env.GRID_ENTRY_ALIGN_CHUNK_RATIO) : 0.15; // 每次回滚15%
- const entryAlignMinIntervalMs = env.GRID_ENTRY_ALIGN_MIN_INTERVAL_MS ? parseInt(env.GRID_ENTRY_ALIGN_MIN_INTERVAL_MS) : 8000;
- // 默认 AUTO:小差用 ADD(更少实亏),大差且持续时用 REPLACE(更快回归)
- 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';
- const entryAlignAddBps = env.GRID_ENTRY_ALIGN_ADD_BPS ? parseInt(env.GRID_ENTRY_ALIGN_ADD_BPS) : 12;
- const entryAlignReplaceBps = env.GRID_ENTRY_ALIGN_REPLACE_BPS ? parseInt(env.GRID_ENTRY_ALIGN_REPLACE_BPS) : 30;
- const entryAlignSustainTicks = env.GRID_ENTRY_ALIGN_SUSTAIN_TICKS ? parseInt(env.GRID_ENTRY_ALIGN_SUSTAIN_TICKS) : 2;
- // 薄盘口优化默认:开启点差感知,限制大点差时的吃单;maker 贴最优
- const spreadAware = env.GRID_SPREAD_AWARE ? env.GRID_SPREAD_AWARE === '1' : false;
- const takerMaxSpreadBps = env.GRID_TAKER_MAX_SPREAD_BPS ? parseInt(env.GRID_TAKER_MAX_SPREAD_BPS) : 120;
- const makerJoinBest = env.GRID_MAKER_JOIN_BEST ? env.GRID_MAKER_JOIN_BEST === '1' : false;
- const makerInsideTicks = env.GRID_MAKER_INSIDE_TICKS ? parseInt(env.GRID_MAKER_INSIDE_TICKS) : 0;
- const auditEnabled = env.GRID_AUDIT_ENABLED ? env.GRID_AUDIT_ENABLED === '1' : true;
- const auditLogFile = env.GRID_AUDIT_LOG_FILE || undefined;
- return {
- symbol,
- leverage,
- baseNotionalUsd,
- gridStepBps,
- gridCount,
- tickIntervalMs,
- maxOpenPerSide,
- tpBps,
- slBps,
- workingType,
- stateFile,
- persistIntervalMs,
- minNotionalUsd,
- forceOpenOnStart,
- minOpenIntervalMs,
- ordersPerTickPerSide,
- aggressive,
- parallelPlacement,
- maxExposureUsdPerSide,
- reduceWhenExposureAboveUsd,
- reduceChunkUsd,
- minReduceIntervalMs,
- useMaxLeverage,
- continuousProtect,
- protectRefreshMs,
- hfMode,
- hfHoldMs,
- hfMaxConcurrentPerSide,
- hfSymmetric,
- auditEnabled,
- auditLogFile,
- makerMode,
- makerOffsetBps,
- makerTimeoutMs,
- rebalanceEnabled,
- rebalanceThresholdQty,
- rebalanceChunkQty,
- rebalanceMinIntervalMs,
- deleverageAfter2019,
- deleverageChunkQty,
- deleverageMinIntervalMs,
- deleverageStepsOn2019,
- deleverageMultiplier,
- deleverageMaxChunkQty,
- takerRatio,
- takerBurstMs,
- takerMaxConcurrent,
- costCapBps,
- minSpreadBps,
- takerCooldownMs
- ,maxGrossQtyPerSide
- ,deRiskEnabled
- ,deRiskAvailRatio
- ,deRiskChunkQty
- ,deRiskIntervalMs
- ,maxNetQty
- ,entryAlignEnabled
- ,entryAlignDeltaBps
- ,entryAlignChunkRatio
- ,entryAlignMinIntervalMs
- ,entryAlignMode
- ,entryAlignAddBps
- ,entryAlignReplaceBps
- ,entryAlignSustainTicks
- ,spreadAware
- ,takerMaxSpreadBps
- ,makerJoinBest
- ,makerInsideTicks
- };
- }
|