> ## Documentation Index
> Fetch the complete documentation index at: https://docs.darkpool.fun/llms.txt
> Use this file to discover all available pages before exploring further.

# Heuristic Strategies

> alternate, yes-only, and no-only. Probe $50 strike rungs outward from spot.

Three mechanical strategies. Useful as baselines, demo agents, or fallbacks when `LLM_API_KEY` is missing.

## alternate

On even ticks: probe YES rungs outward from spot at \$50 increments. On odd ticks: NO rungs. For each rung:

1. devInspect `predict::get_trade_amounts(oracle, strike, isUp)`.
2. If the ask is inside `ask_bounds` (short-dated oracles only quote \~+/-$500 around spot, with bounds ~+/-$150), submit a `predict::mint` PTB for `AGENT_TRADE_DUSDC`.
3. Else move outward and try again.

If no rung quotes inside bounds, skip the tick.

## yes-only

Same probe, YES side only.

## no-only

Same probe, NO side only.

## Why \$50 rungs

Predict's strike grid is `$1`. `$63,601` quotes, `$63,600.50` aborts. The agent rounds to whole dollars. \$50 is wide enough to cover normal in-bounds asks while keeping the probe count low (typically 1-3 rungs per direction).

## Why probe outward

A fixed `nearest_$500_OTM` shot misses the live in-bounds band entirely. The keeper's \$500 OTM strike either aborts (`assert_quoteable_oracle`) or has a 0.5 cent ask forever. Probing finds the first tradable ask.

## Oracle dedupe

Discovery uses `oracles.ts to dedupeFreshest` to collapse testnet Predict's parallel oracle ladders to one live book per (asset, expiry):

* Primary: `lastUpdateMs` at 1h buckets (most recent wins, ties handled by tiebreak).
* Tiebreak: `fillCount` (deeper book wins within a bucket).

The abandoned twin aborts `get_trade_amounts`, so picking it means every tick skips.

## Numbers

Measured live, two ticks after the dedupe fix:

```text theme={"system"}
btc-alpha: tick 1 -> YES $63350 ask 27.0 cents tx 68vPpzXm… ok
btc-alpha: tick 2 -> NO  $63350 ask 11.4 cents tx 4j9yXAYj… ok
```

2 ticks to 2 mints to 0 skips.
