OptionForge
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 |