Appearance
Order Functions API Reference
Learn how to place buy and sell orders in your trading strategies.
Order Format
All orders are returned as dictionaries with the following structure:
python
{
"symbol": "AAPL", # Required: Stock symbol
"action": "buy", # Required: "buy" or "sell"
"quantity": 100, # Required: Number of shares or "all"
"order_type": "market" # Optional: Defaults to "market"
}
Basic Orders
Market Buy Order
python
def strategy(data_contexts, portfolio, state):
return {
"symbol": "AAPL",
"action": "buy",
"quantity": 100
}
Market Sell Order
python
def strategy(data_contexts, portfolio, state):
return {
"symbol": "AAPL",
"action": "sell",
"quantity": 50 # Sell 50 shares
}
Sell All Shares
python
def strategy(data_contexts, portfolio, state):
return {
"symbol": "AAPL",
"action": "sell",
"quantity": "all" # Sell entire position
}
Multiple Orders
Return a list to place multiple orders in the same bar:
python
def strategy(data_contexts, portfolio, state):
orders = []
# Buy AAPL
orders.append({
"symbol": "AAPL",
"action": "buy",
"quantity": 100
})
# Sell GOOGL
orders.append({
"symbol": "GOOGL",
"action": "sell",
"quantity": "all"
})
return orders
Order Execution
Timing
- Orders execute at the next bar's open price
- This prevents look-ahead bias (realistic trading simulation)
- Current bar data → make decision → execute next bar
Example Timeline
python
# Minute 10:30 AM - Strategy sees:
# - AAPL current price: $150.00
# - RSI: 25 (oversold)
# - Decision: BUY 100 shares
# Minute 10:31 AM - Order executes:
# - AAPL opens at: $150.25
# - Buy 100 shares @ $150.25
# - Total cost: $15,025
Position Sizing Examples
Fixed Dollar Amount
python
def strategy(data_contexts, portfolio, state):
data = data_contexts['AAPL']
if buy_signal:
# Buy $10,000 worth
target_value = 10000
shares = int(target_value / data.close)
return {'symbol': 'AAPL', 'action': 'buy', 'quantity': shares}
Percentage of Portfolio
python
def strategy(data_contexts, portfolio, state):
if buy_signal:
# Risk 20% of portfolio
risk_amount = portfolio.equity * 0.20
shares = int(risk_amount / data.close)
return {'symbol': 'AAPL', 'action': 'buy', 'quantity': shares}
Risk-Based Sizing
python
def strategy(data_contexts, portfolio, state):
data = data_contexts['AAPL']
if buy_signal:
# Risk 2% of portfolio per trade
account_risk = portfolio.equity * 0.02
# Stop loss at 5% below entry
entry_price = data.close
stop_price = entry_price * 0.95
risk_per_share = entry_price - stop_price
# Calculate position size
shares = int(account_risk / risk_per_share)
return {'symbol': 'AAPL', 'action': 'buy', 'quantity': shares}
Order Validation
The system validates orders before execution:
Valid Orders ✅
- Symbol exists in available data
- Sufficient cash for buy orders
- Sufficient shares for sell orders
- Positive quantity values
Invalid Orders ❌
- Unknown symbols → Ignored
- Insufficient funds → Partial fill or skip
- Negative quantities → Ignored
- Invalid actions → Ignored
Best Practices
1. Check Available Cash
python
if portfolio.cash >= (shares * price * 1.01): # 1% buffer
return buy_order
2. Validate Positions
python
current_pos = portfolio.position('AAPL')
if current_pos >= shares_to_sell:
return sell_order
3. Use Position Sizing
python
# Don't risk more than you can afford
max_position_value = portfolio.equity * 0.25
shares = min(desired_shares, int(max_position_value / price))
4. Handle Edge Cases
python
def strategy(data_contexts, portfolio, state):
# Always return None, single order dict, or list of orders
if no_signals:
return None # No action
elif single_order:
return order_dict
else:
return [order1, order2] # Multiple orders
See also: DataContext API | Portfolio API | Strategy Examples