OptionForge

Please enter a valid date (YYYY-MM-DD)
Please enter a valid number ≥ 0
Please enter a valid date (YYYY-MM-DD)
Documentation [View Full Documentation]
--Portfolio
porfolio:new_trade() -- create a new (empty trade)
portfolio.n_open_trades -- number: number of open trades
portfolio:trades() -- table: all trades ([1])
portfolio:history() -- table: PnL history of the portfolio ([1])
portfolio:pnl()/portfolio:dte() -- number
portfolio:value() -- number: portfolio value (pnl + starting cash)
portfolio:delta()/portfolio:theta() -- number
portfolio:last_trade() -- Trade: most recently opened trade
portfolio:trade(id: number) -- Trade: trade by id
-- Trade (note the . vs : syntax)
trade.cash -- number: cash used or made from trade (negative for debit)
trade.delta or trade.theta -- number: delta or theta of the trade
trade.dit -- number: maximum dit of the trade
trade.dte -- number: minimum DTE of the trade
trade.id -- number: id of the trade (unique per run start at 0 and increments)
trade.pnl -- number: PnL of the trade
trade:close(Option[string]) -- close the trade. with an optional string reason that gets counted.
trade:erase() -- erase the trade and any commissions.
trade:add_leg(TradeLeg) -- add a leg to the trade.
trade:has_leg(name: string) -- bool: true if the trade has a leg named name
trade:close_leg(name: string, option[erase]) -- close the leg named name. if erase is true, it's like the leg never existed
trade:count(name: string, inc: number) -- increment the count of the key named name by inc
trade:adjust(selector, name: string) -- bool: adjust leg of a trade
-- e.g. use the leg named LP to adjust so that the full trade delta is -5
trade:adjust(TradeDelta(-5), "LP") 
trade:leg(name: string) -- Leg: leg by name
-- Leg
leg.delta or leg.theta -- number: delta or theta of the leg
leg.dte -- number: DTE of the leg
leg.expiration -- string: expiration of the leg
leg.mid -- number: mid of the leg
leg.name -- string: name of the leg
leg.qty -- number: quantity of the leg
leg.selector -- selector: selector of the leg
leg.side -- string: side of the leg
leg.strike -- number: strike of the leg
-- Selector
Delta(number) -- place leg at this delta (use negative number for puts)
TradeDelta(number) -- get the trade-delta to the given number (accounts for qty etc.)
Strike(number) -- select by strike
Mid(number) -- select by mid
Theta(number) -- select by theta
Vega(number) -- select by vega
Gamma(number) -- select by gamma
-- TradeLeg (Put or Call)
Put(name: string, selector: Selector, dte: number, qty: number) -- create a put leg
Call(name: string, selector: Selector, dte: number, qty: number) -- create a call leg
-- Globals
underlying_price -- number: underlying price of the index/stock/etf
day_of_week -- string: "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"
hour -- number: 0-23 (16 is 4pm EST)
last_trade -- Trade: last trade opened. May be nil if no trades have been opened yet or if most recent trade has been closed.
O -- table: let's user store any data they want in the script that persists between ticks.
O[trade.id] = trade.pnl -- store the pnl of the trade
-- Moving Averages (MA)
MA:EMA(period: number) -- number: EMA of the last period elements up to 200
MA:SMA(period: number) -- number: SMA of the last period elements up to 200
-- Plotting
plots:add(title: string, y: number, plot_type: "histogram"|"scatter"|"bar", opts: table[bins: option[number], color: option[string], symbol: option[string], date: option[string]]) -- plot a value y vs x. plot_type is a PlotType enum.
plots:add("# of trades on", portfolio.n_open_trades, "histogram", {bins = 20})
plots:add("# of trades vs date", portfolio.n_open_trades, "scatter", {date = date})

[1] This is an expensive operation, don't do it each tick

Chart
Performance Metrics
Trade Stats
User Counts
User Plots
JSON Results
Performance Metrics
Year CAGR Max Drawdown Drawdown from Start
No data available

User Counts

Name Count
No data available