{"slug":"iron-condor-screener-from-the-free-sql-api","qid":"candidates","label":"candidates","post_title":"iron-condor-screener-from-the-free-sql-api","post_url":"/blog/iron-condor-screener-from-the-free-sql-api#q-candidates","columns":["structure","short_deltas","net_credit","max_loss","credit_pct","expiry","as_of"],"rows":[{"structure":"730/725 put + 795/800 call","short_deltas":"-0.16 / 0.2","net_credit":1.69,"max_loss":3.31,"credit_pct":51.1,"expiry":"Oct 30, 2026","as_of":"Sep 24, 2026"},{"structure":"735/730 put + 795/800 call","short_deltas":"-0.18 / 0.2","net_credit":1.47,"max_loss":3.53,"credit_pct":41.6,"expiry":"Oct 30, 2026","as_of":"Sep 24, 2026"},{"structure":"720/715 put + 795/800 call","short_deltas":"-0.12 / 0.2","net_credit":1.46,"max_loss":3.54,"credit_pct":41.2,"expiry":"Oct 30, 2026","as_of":"Sep 24, 2026"},{"structure":"725/720 put + 795/800 call","short_deltas":"-0.14 / 0.2","net_credit":1.33,"max_loss":3.67,"credit_pct":36.2,"expiry":"Oct 30, 2026","as_of":"Sep 24, 2026"},{"structure":"730/725 put + 800/805 call","short_deltas":"-0.16 / 0.14","net_credit":1.21,"max_loss":3.79,"credit_pct":31.9,"expiry":"Oct 30, 2026","as_of":"Sep 24, 2026"},{"structure":"735/730 put + 800/805 call","short_deltas":"-0.18 / 0.14","net_credit":0.99,"max_loss":4.01,"credit_pct":24.7,"expiry":"Oct 30, 2026","as_of":"Sep 24, 2026"},{"structure":"720/715 put + 800/805 call","short_deltas":"-0.12 / 0.14","net_credit":0.98,"max_loss":4.02,"credit_pct":24.4,"expiry":"Oct 30, 2026","as_of":"Sep 24, 2026"},{"structure":"725/720 put + 800/805 call","short_deltas":"-0.14 / 0.14","net_credit":0.85,"max_loss":4.15,"credit_pct":20.5,"expiry":"Oct 30, 2026","as_of":"Sep 24, 2026"}],"shape":"table","sql":"WITH\n    (\n        SELECT max(date)\n        FROM global_markets.options_greeks\n        WHERE underlying_symbol = 'SPY'\n    ) AS snapshot,\n    (\n        SELECT expiration_date\n        FROM global_markets.options_greeks\n        WHERE underlying_symbol = 'SPY'\n          AND date = snapshot\n          AND iv_converged = 1\n          AND volume > 0\n          AND days_to_expiry BETWEEN 25 AND 45\n        GROUP BY expiration_date\n        ORDER BY sum(volume) DESC\n        LIMIT 1\n    ) AS target_expiry,\n    chain AS\n    (\n        SELECT\n            toFloat64(strike_price)                 AS k,\n            if(toFloat64(delta) < 0, 'put', 'call') AS side,\n            avg(toFloat64(option_close))            AS px,\n            avg(toFloat64(delta))                   AS d\n        FROM global_markets.options_greeks\n        WHERE underlying_symbol = 'SPY'\n          AND date = snapshot\n          AND expiration_date = target_expiry\n          AND iv_converged = 1\n          AND volume > 0\n          AND toFloat64(option_close) > 0\n          AND toUInt32(round(toFloat64(strike_price) * 100)) % 500 = 0\n        GROUP BY k, side\n    ),\n    put_spreads AS\n    (\n        SELECT s.k AS short_k, l.k AS long_k, s.d AS short_delta, s.px - l.px AS credit\n        FROM chain AS s\n        CROSS JOIN chain AS l\n        WHERE s.side = 'put' AND l.side = 'put'\n          AND s.d BETWEEN -0.20 AND -0.12\n          AND abs(l.k - (s.k - 5)) < 0.01\n    ),\n    call_spreads AS\n    (\n        SELECT s.k AS short_k, l.k AS long_k, s.d AS short_delta, s.px - l.px AS credit\n        FROM chain AS s\n        CROSS JOIN chain AS l\n        WHERE s.side = 'call' AND l.side = 'call'\n          AND s.d BETWEEN 0.12 AND 0.20\n          AND abs(l.k - (s.k + 5)) < 0.01\n    )\nSELECT\n    concat(toString(toUInt32(p.short_k)), '/', toString(toUInt32(p.long_k)), ' put + ',\n           toString(toUInt32(c.short_k)), '/', toString(toUInt32(c.long_k)), ' call') AS structure,\n    concat(toString(round(p.short_delta, 2)), ' / ',\n           toString(round(c.short_delta, 2)))                                         AS short_deltas,\n    round(p.credit + c.credit, 2)                                                     AS net_credit,\n    round(5 - (p.credit + c.credit), 2)                                               AS max_loss,\n    round(100 * (p.credit + c.credit) / (5 - (p.credit + c.credit)), 1)               AS credit_pct,\n    formatDateTime(target_expiry, '%b %e, %Y')                                        AS expiry,\n    formatDateTime(snapshot, '%b %e, %Y')                                             AS as_of\nFROM put_spreads AS p\nCROSS JOIN call_spreads AS c\nWHERE p.credit + c.credit BETWEEN 0.05 AND 4.0\n  AND 100 * (p.credit + c.credit) / (5 - (p.credit + c.credit)) >= 20\nORDER BY credit_pct DESC\nLIMIT 12","computed_at":"2026-09-28T15:27:52.324255+00:00","elapsed":0.041574318}