ETH期权Wheel_FMZ实盘执行版
Binance ETH Options Wheel Strategy (Cash-Secured Puts + Covered Calls)
Risk warning: This strategy is intended for research and small-scale validation and does not guarantee profits. The Wheel is an option-selling strategy: it usually collects small premiums but can occasionally suffer large losses. After a Put is assigned, the strategy holds ETH and bears further downside like any spot holder, and selling Calls gives up upside above the strike. The strategy has no hard stop-loss and no hedge. Transfers between the spot and options wallets must be done manually. Run it in paper-trading mode first and verify account permissions, fees, contract specifications, and the settlement workflow before enabling live orders.
Strategy Concept
This is a single-underlying option-selling strategy on the FMZ platform. It currently supports Binance ETH options (USDT-settled) together with Binance spot ETH_USDT only.
The strategy treats option selling as underwriting insurance: the seller collects a premium up front and carries the payout obligation until expiry. Implied volatility has tended to exceed subsequently realized volatility over long periods, so sellers can earn a risk premium while also collecting time decay. The Wheel turns this income into a repeatable cycle:
- While holding cash, sell an out-of-the-money Put, which acts as a paid limit order to buy lower;
- If the Put expires out of the money, sell the next one; if it expires in the money, acquire ETH at the strike;
- While holding ETH, sell an out-of-the-money Call struck no lower than the position cost, which acts as a paid limit order to sell higher;
- If the Call expires in the money, sell the ETH and return to cash; otherwise keep selling Calls.
The rules follow the behaviour of the open-source project ThetaGang, but the code is an independent implementation. Binance options are cash-settled: expiry pays only the difference against the settlement price and does not deliver ETH. The strategy therefore performs the "assignment" itself after expiry. It reads the official settlement price, matches the account's exercise record, and then buys or sells the corresponding ETH on the spot market.
text
Read option chain, Greeks, order book, index, and balances
↓
Select by phase (Puts in the cash phase, Calls in the ETH phase)
↓
Delta, tenor, spread, depth, and net-premium filters with dynamic sizing
↓
Persist order intent → IOC sell to open → reconcile against actual fills and positions
↓
Evaluate rolls while holding; read official settlement price at expiry
↓
In the money: buy/sell ETH on spot and switch phase; out of the money: keep phase and sell again
Contract Selection and Entry
The strategy reads the account and market every 60 seconds and manages one option contract at a time. The tenor follows the Option Type parameter:
| Option type | Days to expiry | Roll rule |
|---|---|---|
| Daily | 0.3–1.5 | Hold to expiry, no rolls |
| Weekly | 4–10 | One roll within 1 day of expiry |
| Monthly | 20–40 | Two rolls within 5 days of expiry |
| Quarterly | 45–90 | Two rolls within 15 days of expiry |
A candidate contract must satisfy all of the following:
- It is trading, and its tenor falls within the selected band;
- Absolute Delta is between 0.10 and 0.30, roughly a 10–30% chance of assignment;
- Put strikes are below the index and Call strikes are above the index, and Call strikes are not below the strategy's conservative ETH cost;
- The order book is fresh and the bid-ask spread is within 10% of the mid-price;
- Selling at the best bid, the premium net of fees is at least 0.1% of the strike notional;
- Quantity and price respect the contract's minimum size, step, and price limits.
There is no fixed capital amount. Each round uses the USDT currently available in the options and spot wallets:
text
Put assignment budget = available cash × (1 − 20% reserve) × 50% allocation
Put quantity = budget ÷ [strike × (1 + fee buffer)]
Final quantity = min(cash quantity, margin-allowed quantity, 10% of best-bid depth, contract maximum)
Puts are fully cash-secured with no leverage, so even a deep assignment uses only about 40% of the capital. Call quantity never exceeds the ETH actually bought by the strategy and available in the spot account. Any ETH held before startup is recorded as a baseline and is never used to cover Calls.
All entries are IOC limit sells. The order intent and clientId are persisted before submission. A returned order ID is not treated as a fill. A position is recorded only after the GetOrder filled quantity agrees with the actual GetPosition result.
Holding, Settlement, and Rolling
While holding, the strategy estimates the close-out profit at the best ask. It considers a roll when either the position has captured about 90% of its premium after fees, or expiry is near and the position is still profitable. Rolls follow these rules:
- The new expiry must be later;
- A Put strike may not be raised and a Call strike may not be lowered;
- The estimated net credit of closing the old leg and opening the new one must be positive;
- An in-the-money Put is not rolled at a loss and is left to expire and be assigned;
- The old leg must be fully closed before the new leg is sold with FOK. If the new leg is not completed within 5 minutes, the roll is abandoned.
After expiry, the strategy confirms that the exchange position is gone and reads the official settlement price. For an in-the-money contract, it also requires a matching short exercise record in the account:
- In-the-money Put: a spot-buy task acquires the ETH and the strategy enters the ETH phase;
- In-the-money Call: a spot-sell task sells the ETH and the strategy returns to the cash phase;
- Out-of-the-money expiry: the full premium is kept and the phase is unchanged.
Spot orders pause, and the task is kept, if the spot price deviates more than 2% from the settlement price. If the spot account lacks USDT, the strategy waits and the status panel asks for a manual transfer. It never transfers funds between wallets automatically.
Additional safeguards:
- An ambiguous order response locks further submissions and is never retried automatically; the clientId must be checked manually;
- Persistent mismatches between fills and option positions or spot balances halt the strategy;
- Unmanaged ETH option positions or external ETH balance changes halt the strategy;
- When the ratio of maintenance margin to option equity reaches 50%, the strategy tries to buy back the position and stops opening new ones;
- A failed read is never interpreted as a zero position or zero balance; the committed state is kept until the next attempt;
- Each distinct error is logged once to avoid log flooding.
The status panel shows separate tables for account and state, performance statistics, option position, pending tasks, and recent events, all in Beijing time. Performance statistics include cumulative return, maximum drawdown, premium collected, buyback cost, fees, exercise payouts, expiries by outcome (expired worthless, Put assigned, Call assigned), win rate, and roll count. Annualized return is shown only after seven days of running.
Main Parameters
| Parameter | Default | Description |
|---|---|---|
| PaperTrading | true | Paper trading with live quotes, Greeks, order books, and official settlement prices; fills are recorded in a virtual account. Real orders are sent when disabled |
| Period | Daily | Drop-down: Daily / Weekly / Monthly / Quarterly options |
| Paper capital | 1000 USDT | Built-in constant used only in paper trading |
| reserveFraction | 0.20 | Cash reserve (built-in) |
| putCapitalFraction | 0.50 | Share of post-reserve cash used as the Put assignment budget (built-in) |
| optionMarginFraction | 0.50 | Share of available options-wallet balance used in the margin estimate (built-in) |
| minDelta / targetDelta | 0.10 / 0.30 | Absolute Delta range for candidates (built-in) |
| maxSpread | 0.10 | Maximum bid-ask spread relative to mid-price (built-in) |
| depthParticipation | 0.10 | Maximum share of top-level depth per order (built-in) |
| minNetYield | 0.001 | Minimum net premium relative to strike notional (built-in) |
| rollProfit | 0.90 | Profit threshold for rolling (built-in) |
| pollMs | 60000 | Polling interval in milliseconds (built-in) |
| maxMaintenanceRatio | 0.50 | Maintenance-margin risk threshold (built-in) |
Exchange objects must be added in order: first Binance futures Futures_Binance, then Binance spot Binance with the pair ETH_USDT. Option rules, Greeks, fee rates, and settlement records are read through FMZ native interfaces; spot trading rules are read from the public endpoint. If a required field cannot be obtained, the affected operation pauses instead of using a guessed value.
Paper trading and live trading use separate state keys and do not interfere with each other. Paper trading makes these simplifications: options fill in full at the best bid when the order is placed, the two wallets are merged into one virtual cash balance, and maintenance-margin controls are not applied. Paper results are therefore more optimistic than real execution.
Validation Status
All 51 local offline tests pass. They cover dynamic sizing, state progression from actual fills, the full Put assignment → ETH purchase → covered Call → ETH sale cycle, partial fills, roll ordering, restart recovery, ambiguous orders, insufficient funds, stale market data, tenor presets, the paper account, and performance statistics.
On FMZ, paper trading is running and has completed the first simulated Put sale and reconciliation in the daily-option band. At the time of writing, it has not yet recorded a full expiry settlement or assignment conversion. Live mode has not yet been run through option selling, exercise-record retrieval, and spot conversion on a real account.
In historical checks, a one-month scenario analysis using real traded option prices and a six-month model-based simulation showed the following. During the rally, the Wheel earned less than holding ETH but with a much smaller drawdown. Over six months, simulated drawdowns still reached 18–30%. The six-month option prices were estimated with Black-Scholes from the implied-volatility index, not historical trade prices, and should not be treated as a backtest.
Before live deployment, the recommended validation sequence is:
- Run paper trading through several full expiry cycles and verify settlement, assignment, and spot conversion;
- Compare premium income, assignment frequency, and drawdown across option types;
- With observation or small live capital, verify options- and spot-wallet balances, fee rates, and exercise-record retrieval;
- Verify real IOC/FOK fill rates, partial-fill handling, and restart recovery;
- On a real account, verify the spot purchase after a Put assignment, the spot sale after a Call assignment, and the handling of manual wallet transfers;
- Add protective Put spreads, strike laddering, lower Delta, or stop-loss rules as needed before increasing capital.
// GENERATED by node build.js. FMZ NATIVE WHEEL. Read LIVE.md before enabling orders.
/* ETH Wheel native execution controller.
* Behavioral reference: ThetaGang (DTE/Delta, red Put / green Call, profitable rolls).
* All balances and fills come from the broker. No synthetic fills or fixed cash budget.
*/
var NativeWheel = (function () {
'use strict';
var DAY = 86400000, EPS = 1e-8;
var defaults = {
tradeEnabled: false, stateKey: 'ETH_WHEEL_NATIVE_V1', period: 'CUSTOM',
reserveFraction: 0.20, putCapitalFraction: 0.50, optionMarginFraction: 0.50,
minDTE: 45, maxDTE: 90, targetDelta: 0.30, minDelta: 0.10,- 1