← Strategy index

Strategy file: moonPhases_SPOT.js Market: spot

Description

Moon Phases (Spot). Lunar-cycle phase detector. Configurable entry trigger (New Moon / Full Moon / Higher Moon / Lower Moon) drives a grid of limit orders. Multi-level TP, fixed-% SL, BE_GUARD-aware exits. Grid orders auto-expire.

How it works

The lunar-cycle hypothesis in finance was tested by Dichev & Janes (2003) and Yuan, Zheng & Zhu (2006), who reported that equity returns around full moons are statistically lower than around new moons across most developed markets, with effect sizes in the 3–5 % annualised range. Mechanism is debated — proposed candidates include investor sentiment, sleep disruption, and ancestral risk-taking patterns — but the empirical regularity has survived in robustness checks. The strategy uses a precise lunar ephemeris to phase-rotate a grid: it tightens grid spacing and widens DCA aggressiveness near new moon (the historically bullish window) and the reverse near full moon. Effect size is small enough that on crypto it should be considered a tilt, not an edge.

Allocation

How much of THIS pair’s wallet the strategy may use, what it must start with, and the hard config gate. Trading is BLOCKED until Wallet allocation % is set AND Allocation confirmed is ON. Optional grid splits an order into laddered post-only rungs for better fills.

Key Type Default Description
ALLOC_PCT range (range 1..100) 25 Percentage of THIS pair’s wallet balance the strategy may deploy. Effective cap = min(wallet × this %, the absolute Capital allocation). Every order is clamped to it and can never exceed it. REQUIRED — trading is blocked until this is set (>0) and Allocation confirmed is ON.
ALLOC_CONFIRMED boolean False Explicit acknowledgement that the allocation above is correct for this pair. The strategy will NOT place any entry order until this is ON. A clear "ALLOCATION CONFIGURED" line is logged once it is; otherwise an "ALLOCATION NOT CONFIGURED — refusing to trade" line is logged each cycle.
ALLOC_SPLIT_TOL range (range 0..100) 15 How far the starting base/quote split may deviate from what this strategy needs before it refuses to start. Long-only strategies want mostly quote/cash; two-sided market-makers want ~50/50 base/quote; futures want free margin. Mismatch beyond this % blocks trading (unless Enforce start inventory is OFF).
ALLOC_ENFORCE_SPLIT boolean True When ON, the strategy refuses to trade until the starting base/quote split is within tolerance of what it needs (archetype-aware). When OFF, a mismatch is logged as a warning but trading proceeds.
ALLOC_AUTO_REBALANCE boolean True Two-sided market-makers only. ON by default: if the pair starts off the target base/quote split, the strategy places a single bounded market order on start to reach it (e.g. buys ~half the allocation into base for a 50/50 maker), then begins normal trading. Set to OFF to instead stay blocked and log the exact amount to buy/sell manually. Long-only and futures strategies ignore this.
ALLOC_RESERVE_PCT range (range 0..50) 0 A buffer, as % of wallet, kept BELOW the allocation cap and never deployed. Use to leave headroom for fees/slippage. Effective cap = min(wallet × allocation %, absolute cap) − wallet × this %.
MOON_GRID boolean False When ON, an entry order is split into several laddered post-only rungs across a price band instead of one order — often gets better average fills. Cumulative size is still clamped to the allocation. OFF = single order.
MOON_GRID_LEVELS range (range 2..10) 3 Number of laddered rungs to split an entry into when "Split entries into a grid" is ON. More rungs = finer fills but more orders.
MOON_GRID_SPAN_PCT range (range 0.1..5) 0.5 Price band width, as % from the reference price, across which the grid rungs are spread. e.g. 0.5 places rungs from the reference price down to 0.5% below it (for buys).

Lunar Signals

Which lunar phase triggers a buy or sell

Key Type Default Description
MOON_BUY_SIGNAL select Full Moon Lunar phase that triggers buy-side grid
MOON_SELL_SIGNAL select New Moon Lunar phase that triggers sell-side grid

Grid

How buy/sell orders are spread across a price range

Key Type Default Description
MOON_ENABLE_GRID boolean True TRUE = spread orders across a grid; FALSE = single market/limit order
MOON_GRID_LEVELS range (range 1..20) 5 Number of grid orders to place each side
MOON_GRID_SPREAD_PCT range (range 0.1..10) 2 Total % spread across all grid levels
MOON_ORDER_TYPE select limit Grid always uses limit; this controls non-grid orders
MOON_GRID_EXPIRY_MINUTES range (range 0..1440) 60 Cancel unfilled grid orders after this many minutes. 0 = never expire.

Position Sizing

How much of each balance to deploy across the grid

Key Type Default Description
MOON_BUY_BALANCE_PCT range (range 1..100) 80 % of available base balance to spend on all grid buys
MOON_SELL_BALANCE_PCT range (range 1..100) 80 % of available quote balance to sell on all grid sells

Take Profit

Tiered TP levels above break-even

Key Type Default Description
MOON_ENABLE_TP boolean True
MOON_TP1_PCT range (range 0.1..10) 1 % above break-even for first TP
MOON_TP1_SIZE_PCT range (range 1..100) 33 % of holdings to sell at TP1
MOON_TP2_PCT range (range 0.1..20) 2
MOON_TP2_SIZE_PCT range (range 1..100) 33
MOON_TP3_PCT range (range 0.1..30) 3
MOON_TP3_SIZE_PCT range (range 1..100) 100 Set to 100 to guarantee full close at TP3

Stop Loss & Guards

Stop loss and break-even protection

Key Type Default Description
MOON_ENABLE_SL boolean True
MOON_SL_PCT range (range 0.1..20) 5 % below entry price
MOON_BREAK_EVEN_GUARD boolean True Refuse exits at a net price below break-even
BE_GUARD boolean True Wraps Gunbot sell methods. Blocks sells below data.breakEven while holding a long.

Lunar Reference

Reference timestamp for lunar-phase calculation

Key Type Default Description
MOON_NEW_MOON_REF_DATE string 2021-01-13T05:00:00Z ISO 8601 timestamp of a known new moon — used to compute the lunar cycle

Runtime

Candle period, trading limit, logging

Key Type Default Description
PERIOD select 5
TRADING_LIMIT range (range 10..10000) 100
MOON_VERBOSE_LOG boolean True Detailed console output (lunar phase, grid orders placed, TP/SL events)
VERBOSE_LOGS boolean False When ON, the full Quantroduction × Gunbot dashboard (every config value + state snapshot) re-emits every VERBOSE_INTERVAL_MIN minutes for forensic audit. When OFF (default), the dashboard only fires once per Gunbot restart per pair.
VERBOSE_INTERVAL_MIN range (range 5..240) 30 How often the dashboard re-emits when VERBOSE_LOGS is ON. Lower = more frequent / noisier; higher = quieter. Has no effect when VERBOSE_LOGS is OFF.
BE_GUARD_BLOCK_MARKET_SELLS boolean True Default ON (legacy). Set OFF to enable SOFT BE_GUARD: market sells and closeMarket pass through (treated as urgent / stop-loss). Only limit sells below break-even remain blocked. Prevents BE_GUARD from silently swallowing stop-loss exits.
SCRATCH_LIVENESS_MIN range (range 0..120) 0 When >0: if the pair holds inventory and hasn't filled in N minutes AND the bid is at break-even+1bp, force a market exit to rotate capital. 0 = disabled. Typical: 30.
CONSEC_RESET_CYCLES range (range 60..2880) 480 After this many cycles without any order activity, auto-reset consecutiveLosses to 0. Default 480 cycles ≈ 2h at 15s/cycle. Prevents a 3-loss streak from killing the pair for the entire session.
DRIFT_ATR_FRAC range (range 0..0.5) 0 When >0: scale drift-requote threshold to this fraction of the recent 10-candle high-low range (clamped 2-100 bps). 0 = use fixed *_STALE_DRIFT_BPS. Typical: 0.05 = 5% of recent range. Adapts drift detection to per-pair volatility.
SKEW_QTY_MAX range (range 1..5) 2.5 Maximum ask:bid qty ratio when inventory is heavily skewed. 2.5 means a heavily-bagged pair quotes up to 2.5x ask qty vs bid qty to drain inventory faster. Set 1.0 to disable (symmetric quoting).
SKEW_QTY_TARGET range (range 0.1..0.9) 0.5 Target inventory fraction of pair equity. 0.5 = 50/50 balanced base/quote. Skew kicks in proportionally as actual exposure deviates from target.
PORTFOLIO_INCLUDE boolean True When ON (default), this pair participates in the shared PORTFOLIO_EXP_BUDGET — its exposure counts toward portfolio total and bids pause when budget is exceeded. When OFF, the pair stands alone (use PAIR_EXP_BUDGET for own cap).
PORTFOLIO_EXP_BUDGET range (range 0..1) 0 Cap on total portfolio inventory as fraction of total allocated equity (sum across PORTFOLIO_INCLUDE pairs). 0 = disabled. Typical: 0.6 = 60% inventory cap across the included portfolio. When exceeded, bids pause but exits remain active.
PAIR_EXP_BUDGET range (range 0..1) 0 This pair's own exposure cap as fraction of pair equity (inventory / pair allocated capital). Applies independently of portfolio budget. 0 = disabled. Typical: 0.2 = 20% per-pair cap.
DISABLE_BREAKER_WINDDOWN boolean False When OFF (default), an active breaker (3 consecutive losses or daily loss limit) actively frees capital: cancels open orders and scratch-sells inventory IF profitable (bid >= BE+1bp). When ON, legacy halt-and-hold behaviour.
TRACE_ALL boolean False Master switch for the Quantroduction tracer. When ON, writes detailed per-cycle JSONL to gunbot_logs/quantroduction/ AND emits a verbose console summary. Equivalent to setting every _TRACE to true. Useful for diagnosing silent gates and breakers. Disk overhead ~1MB/day/pair.

Portfolio & Runtime (per-pair overrides)

Per-pair runtime knobs. Override any of these on a single pair without changing the strategy defaults.

Key Type Default Description
NO_CLOSE_MARKET boolean False On exchanges that don't expose closeMarket reliably, set this to true to force the compat wrapper to route every close through sellMarket / buyMarket instead.
NO_POST_ONLY boolean False On exchanges that reject post-only orders (e.g. some DEX flavours), force the compat wrapper to fall back to plain limit orders. Increases taker risk; only enable if your exchange genuinely cannot process post-only.
RESET_BREAKER_ONCE boolean False Set to true once to clear any tripped circuit breaker (consecutive-loss / daily-loss). The strategy auto-clears this flag after the reset fires so you don't have to remove it.
RESET_STATS_ONCE boolean False Set to true once to zero out wins, losses, consecutive losses, peak equity, max drawdown, trade count, and daily-loss lock. Total PnL is preserved. The flag auto-clears after the reset fires.
LOG_LEVEL select NORMAL Controls how verbose the strategy's logs are. QUIET only logs errors and trade events. NORMAL adds breaker / state changes. VERBOSE adds per-cycle gate decisions (useful for tuning).
MIN_ORDER_QUOTE range (range 1..50) 5 Minimum notional that the exchange will accept for an order, in quote currency. Set higher than the exchange's true minimum to leave buffer for slippage on validation.
QUANTRODUCTION_TRACE boolean False Master switch for the diagnostic tracer. When on, every gate decision and breaker event is recorded so you can see exactly why the strategy did or did not act this cycle.
WARMUP_CYCLES range (range 0..50) 5 How many cycles the strategy waits at startup before placing any orders. Lets indicators warm up and the strategy compute a baseline before reacting.
SPREAD_PNL_JUMP_GUARD range (range 0.1..1) 0.5 Realized-PnL deltas larger than this fraction of pair equity are treated as deposits/withdrawals/data-glitches and skipped. Default 0.5 means a single delta over 50% of equity is ignored. Lower for tighter glitch detection on small accounts.

References & further reading

Configuration playbook