Config Reference
This page documents every configuration field. The structure mirrors your JSONC editor in
/dashboard/config.For conceptual explanations of feature behavior, see How GridBT Works and the individual feature pages, such as Rebalancer.
Grid Core Settings
| Field | Default | Description |
|---|---|---|
spacingPct | 0.37 | Percentage gap between grid levels. Higher spacing = fewer orders, more profit per cycle. Example: At $2,000 anchor with 0.37% spacing, level +1 is ~$2,007.40. |
ordersPerSide | 25 | Orders placed on each side of anchor when grid is constructed. More orders = wider coverage but more margin used. |
maxOrdersPerSide | 100 | Soft cap. When orders exceed this on one side, the bot trims the furthest orders. |
maxGridOrdersPerSide | 150 | Hard safety cap. The bot will never place more than this many orders per side. |
orderSizeUsd | 5.5 | USD value per order. Base size before multipliers. See Position Sizing. |
Risk Management
| Field | Default | Description |
|---|---|---|
maxNetExposureUsd | 1000 | Primary cross-mode risk limit. Net exposure is abs(longUsd - shortUsd). At or above this value, new OPEN orders are blocked on the larger side while the smaller side can keep opening to reduce imbalance. |
maxGrossPositionUsd | 2000 | Secondary cross-mode safety limit. Gross exposure is longUsd + shortUsd. At or above this value, new OPEN orders are blocked on both sides to cap total exposure growth. |
warningThresholdPct | 0.8 | Fraction of max at which the bot logs warnings. At 0.8, warnings start at 80% of the limit. |
minPositionQty | -1 | Reserve quantity. Value of -1 means "reserve 1 qtyStep" so position is never fully closed. |
Rebalancer
Controls how the bot corrects position drift. See How the Rebalancer Works for the conceptual explanation.
| Field | Default | Description |
|---|---|---|
enabled | true | Master switch. When disabled, the bot ignores position drift entirely. |
seedMode | false | When true, disables rebalancing entirely. Use this when you want to run the grid without any position drift correction. |
minTriggerRatio | 2.0 | Minimum imbalance (as multiple of orderSizeUsd) before rebalancing activates. |
pivotRatio | 10.0 | Imbalance level at which base correction rate (2.5%) is used. Smaller imbalances get higher rates. |
maxDistributionRate | 20.0 | Maximum correction percentage per fill. |
priceGating | true | When enabled, amplified CLOSE orders are paused until price is at or above the average add price (or has fallen past the buffer). Prevents amplified closes at unfavorable prices. |
priceGatingBufferPct | 10 | Buffer zone below average add price. At 10%, amplified CLOSE orders remain paused while price is within 10% below your average. |
Exo Indicator
Amplifies OPEN orders during extreme market conditions. See How Exo Indicator Works for details on the indicators used.
| Field | Default | Description |
|---|---|---|
enabled | true | Master switch. |
forceActive | false | Bypasses all indicator checks. Warning: Only use for testing. |
multiplier | 1.25 | Order size multiplier when active. At 1.25, OPEN orders are 125% of normal. |
maxDurationCandles | 4 | Max candles active. On 7-minute candles, 4 = ~28 minutes max. |
Trigger Thresholds
All four conditions must pass simultaneously to start accumulation. Fields are nested under
trigger in your config (e.g., trigger.rsiOversoldThreshold):| Field | Long | Short | Description |
|---|---|---|---|
trigger.rsiOversoldThreshold | 28 | N/A | RSI must be below this for longs. |
trigger.rsiOverboughtThreshold | N/A | 73 | RSI must be above this for shorts. |
trigger.wtOversoldThreshold | -53 | N/A | WaveTrend level must be below this for longs. |
trigger.wtOverboughtThreshold | N/A | 53 | WaveTrend level must be above this for shorts. |
trigger.requireWtMomentum | true | true | WaveTrend momentum direction: wt1 > wt2 for longs, wt1 < wt2 for shorts. |
trigger.requirePriceBelowBB | true | true | Price must be beyond the Bollinger Band. |
Continuation Thresholds
Relaxed conditions to maintain accumulation once triggered. Fields are nested under
continuation:| Field | Long | Short | Description |
|---|---|---|---|
continuation.rsiOversoldThreshold | 32 | N/A | More relaxed than trigger (28). |
continuation.rsiOverboughtThreshold | N/A | 66 | More relaxed than trigger (73). |
continuation.wtOversoldThreshold | -43 | N/A | More relaxed than trigger (-53). |
continuation.wtOverboughtThreshold | N/A | 43 | More relaxed than trigger (53). |
continuation.requireWtMomentum | true | true | Momentum direction still required during continuation. |
continuation.requirePriceBelowBB | false | false | BB check not required for continuation. |
Indicator Parameters
| Field | Default | Description |
|---|---|---|
rsiLength | 13 | RSI calculation period (candles). |
bbLength | 100 | Bollinger Bands moving average period. |
bbStdDev | 1.25 | Bollinger Bands standard deviation multiplier. |
wtChannelLen | 9 | WaveTrend channel length (smoothing). |
wtAverageLen | 27 | WaveTrend average length. |
wtSmaLen | 3 | WaveTrend signal line smoothing. |
Opportunity Scanner
Auto-opens a new hedge-mode grid after a qualified long-liquidation cascade. See Opportunity Scanner for the conceptual explanation and tier examples.
| Field | Default | Description |
|---|---|---|
enabled | false | Master switch. When disabled, the scanner does not subscribe or open new scanner positions. |
allowedSymbols | [] | Optional allow list. Empty means all eligible universe symbols are allowed. |
blockedSymbols | [] | Symbols to always exclude. Block list wins over allow list. |
maxConcurrentPositions | 3 | Max number of open scanner positions at the same time. |
seedLongUsd | 500 | USD value for the long seed leg. Must be greater than or equal to seedShortUsd. |
seedShortUsd | 250 | USD value for the short seed leg. Must be positive and less than or equal to seedLongUsd. |
hardStop | { mode: 'percent_net', value: -10 } | Frozen stop-loss threshold stored at entry. Negative value required. |
profitTake | { mode: 'percent_net', value: 10 } | Frozen profit-take threshold stored at entry. Positive value required. |
profitTakeMinAgeHours | 6 | Minimum age before profit-take can close the position. Set 0 to disable the age gate. |
cascadeWindowMs | 600000 | Detection window size in milliseconds. Default is 10 minutes. |
cascadeThresholdUsd | 2000000 | Flat liquidation threshold when no matching tier overrides it. |
cascadeMinZScore | 3 | Flat z-score requirement when no matching tier overrides it. |
cascadeDedupMs | 900000 | Per-symbol retrigger lockout after a detected cascade. Default is 15 minutes. |
cooldownHours | 6 | Per-symbol cooldown after a scanner position closes. |
Opportunity Scanner hardStop and profitTake
| Field | Allowed values | Description |
|---|---|---|
mode | usd or percent_net | usd uses a fixed dollar PnL. percent_net uses a percentage of frozen net exposure. |
value | Signed number | Hard stop must be negative. Profit take must be positive. |
Opportunity Scanner cascadeTiers
Optional per-liquidity overrides for
cascadeThresholdUsd and cascadeMinZScore.| Field | Default | Description |
|---|---|---|
cascadeTiers | [] | Array of turnover-based detection tiers. Empty means every symbol uses the flat top-level threshold and z-score. |
cascadeTiers[].minTurnover24hUsd | none | Minimum 24h turnover for the tier to apply. Highest matching tier wins. |
cascadeTiers[].cascadeThresholdUsd | none | Liquidation threshold for symbols in this tier. |
cascadeTiers[].cascadeMinZScore | none | Z-score threshold for symbols in this tier. |
Opportunity Scanner pumpGuard
Rejects symbols that still look too extended on the 24h view.
| Field | Default | Description |
|---|---|---|
pumpGuard.enabled | true | Master switch for the pump guard. |
pumpGuard.maxPrice24hPct | 10 | Reject if the symbol is still up more than this percentage over 24h. |
pumpGuard.minDrawdownFromHighPct | 25 | Require the current price to be at least this far below the 24h high. |
PnD Protection
Prevents the bot from placing OPEN orders during sharp price moves. See PnD Protection for the full explanation.
| Field | Default | Description |
|---|---|---|
enabled | true | Master switch. |
closeFillsThreshold | 8 | Number of close fills that triggers protection. At 8 fills with 0.37% spacing, catches ~3% moves. |
withinSeconds | 60 | Time window for counting fills. |
cooldownDurationMinutes | 14 | How long the bot pauses after triggering. |
reconstructOnExpire | true | When cooldown ends, rebuild grid from current price. |
Position Balancer
Amplifies CLOSE orders to take profit faster when holding large, profitable positions. See How the Position Balancer Works.
| Field | Default | Description |
|---|---|---|
enabled | true | Master switch. |
minProfitPct | 1.0 | Minimum ROE% required. Price must have moved at least 1% in your favor. |
tiers | See below | Position utilization tiers with multipliers. Higher tiers checked first. |
Default Tiers
| positionPct | multiplier | Meaning |
|---|---|---|
0.90 | 1.75 | At 90%+ of max, CLOSE orders are 175% of normal. |
0.75 | 1.5 | At 75%+ of max, CLOSE orders are 150% of normal. |
0.50 | 1.25 | At 50%+ of max, CLOSE orders are 125% of normal. |
Hedge Guard
Amplifies long OPEN orders when long exposure falls behind short. See How Hedge Guard Works.
| Field | Default | Description |
|---|---|---|
enabled | true | Master switch. Only applies to long mode. |
multiplier | 1.5 | OPEN order multiplier when Hedge Guard is active (150% of normal). |
entryThresholdPct | 0.667 | Activates when longUsd < shortUsd × 0.667 (short is 50%+ larger). |
exitThresholdPct | 0.9 | Deactivates when longUsd > shortUsd × 0.9 (approaching balance). |
cooldownMs | 60000 | 60-second cooldown after deactivation and on startup. |
Short Size Guard
Reduces short base order size when short exposure has overtaken long. See How Short Size Guard Works.
| Field | Default | Description |
|---|---|---|
enabled | false | Master switch. Only applies to short mode. |
entryRatio | 1.0 | Activates when shortUsd / longUsd is at or above this ratio. At 1.0, parity is enough to turn it on. |
exitRatio | 0.95 | Deactivates when shortUsd / longUsd falls below this ratio. Must be lower than entryRatio. |
guardedMultiplier | 0.5 | Short base size multiplier while active. At 0.5, a $10 short base becomes $5 before other short-side sizing rules apply. |
cooldownMs | 60000 | Cooldown after deactivation before the feature can turn on again. |
Short Inventory Refill
Adds matched long and short seed when short inventory is nearly depleted after short CLOSE fills. See Short Inventory Refill.
| Field | Default | Description |
|---|---|---|
enabled | false | Master switch. Only enabled short-mode rows can act on this feature. |
triggerShortPositionUsd | 100 | Activates when the remaining short position is positive and at or below this USD value. |
consecutiveTriggers | 2 | Number of qualifying checks in a row required before refill. At 2, two eligible checks must both stay below threshold. |
seedUsd.long | 250 | USD value to seed on the long side during refill. |
seedUsd.short | 250 | USD value to seed on the short side during refill. |
cooldownMinutes | 15 | Cooldown after a refill attempt starts. Applies per symbol. |
Gross Exposure Flattener
Reduces matched long and short exposure when gross position is high, balanced enough, and profitable. See Gross Exposure Flattener.
| Field | Default | Description |
|---|---|---|
enabled | false | Master switch. Only enabled short-mode rows can trigger it. |
triggerGrossPct | 0.5 | Activates when longUsd + shortUsd reaches this fraction of maxGrossPositionUsd. At 0.5, a $20,000 gross cap triggers checks at $10,000 gross. |
flattenUsdPerSide | 1000 | USD value to reduce from each side. The bot converts this to one base quantity and applies the same quantity to long and short. |
maxNetToGrossPct | 0.25 | Skips when abs(longUsd - shortUsd) / (longUsd + shortUsd) is above this value. |
minCombinedUnrealisedPnlUsd | 25 | Minimum combined unrealised PnL across long and short before flattening can start. |
minEstimatedFlattenPnlUsd | 5 | Minimum estimated PnL for the fixed flatten slice. |
consecutiveTriggers | 2 | Number of qualifying exposure checks in a row required before activation. |
cooldownMinutes | 15 | Cooldown after a flatten attempt starts. Applies per symbol. |
The v1 config intentionally does not include
targetGrossPct. Each attempt uses the configured fixed slice and then restarts from the refreshed position.Profit Lock
Config-managed Profit Locks use
defaults.profitLocks as the global source of truth. Set enabled: true and the settings apply to every enabled symbol in pairs. Those symbols become read-only in the popup."defaults": {
"profitLocks": {
"enabled": true,
"triggerKind": "short_gte_long",
"autoCycle": {
"enabled": true,
"seedLongUsd": 500,
"seedShortUsd": 250,
"maxCycles": 10
}
}
}
For granular control, place a
profitLock override inside the existing pairs entry for the symbol. Profit Lock is symbol-wide, so if both enabled long and short rows define profitLock, the values must match."pairs": {
"HYPEUSDT": [
{
"enabled": true,
"mode": "long",
"profitLock": {
"triggerKind": "short_gte_long",
"autoCycle": {
"seedLongUsd": 700,
"seedShortUsd": 300,
"maxCycles": 25
}
}
},
{ "enabled": true, "mode": "short" }
],
"LINKUSDT": [
{ "enabled": true, "mode": "long", "profitLock": { "enabled": false } },
{ "enabled": true, "mode": "short" }
]
}
| Field | Default | Description |
|---|---|---|
defaults.profitLocks | omitted | Optional defaults-level block. Omitted means config saves leave popup-managed locks untouched. |
defaults.profitLocks.enabled | none | Enables config ownership for every enabled symbol. false leaves popup-managed locks untouched. |
defaults.profitLocks.triggerKind | none | Global usd or short_gte_long trigger. Required when defaults.profitLocks.enabled is true. |
defaults.profitLocks.targetPnlUsd | none | Required for usd. Must be omitted for short_gte_long. |
defaults.profitLocks.autoCycle.enabled | true | Creates or updates Auto-Cycle config for each managed symbol. Long-side EXO must be enabled. |
defaults.profitLocks.autoCycle.seedLongUsd | none | Long seed notional. Must be greater than seedShortUsd. |
defaults.profitLocks.autoCycle.seedShortUsd | none | Short seed notional. |
defaults.profitLocks.autoCycle.targetIncrementUsd | none | Required for usd triggers. Optional and ignored for short_gte_long; the runtime reuses the same trigger kind with no USD target. |
defaults.profitLocks.autoCycle.maxCycles | 10 | Integer from 1 to 9999. |
pairs.<symbol>[].profitLock.enabled | inherited | Set false to clear the active lock and opt the symbol out while global ownership remains enabled. |
pairs.<symbol>[].profitLock.triggerKind | inherited | Optional symbol-wide trigger override. |
pairs.<symbol>[].profitLock.targetPnlUsd | inherited | Optional symbol-wide USD target override. |
pairs.<symbol>[].profitLock.autoCycle | inherited | Optional symbol-wide Auto-Cycle override. |
Config saves do not change a triggered lock's trigger kind or target. Resume or clear the symbol first, then save the new config. For config-managed symbols, clear or resume by setting
pairs.<symbol>[].profitLock.enabled to false and saving Strategy Config.Mode Overrides
The
modes section lets you set different defaults for long vs short:"modes": {
"long": {
"orderSizeUsd": 10 // Larger orders for longs
},
"short": {
"orderSizeUsd": 5.5 // Smaller orders for shorts
}
}
Any field from
defaults can be overridden here. Mode settings override defaults, and pair-specific settings override modes.Note: Exposure limits (
maxNetExposureUsd, maxGrossPositionUsd) are cross-mode and cannot be overridden per mode. They apply to both long and short positions together.Pair Configuration
The
pairs section enables specific symbols:"pairs": {
"HYPEUSDT": [
{ "enabled": true, "mode": "long" },
{ "enabled": true, "mode": "short" }
],
"ETHUSDT": [
{ "enabled": true, "mode": "long" },
{ "enabled": false, "mode": "short" } // Short disabled
]
}
Note: Anchor price is auto-managed. It's set from market price on first run and persisted in the database. You don't need to configure it.