TL;DR
Your dot can monitor a separate AMD paper portfolio after the rules and running portfolio identity are verified. The example proposes a 20% entry above AMD's 50 day average and a full exit at or below it. October 10, 2026 validation started no paper run. Review simulated orders manually, record the actual evaluation schedule and deployed history, and stop the observation schedule separately from the portfolio.
Create and monitor a separate paper deployment
Preview the candidate
NexusTrade toolbuild_portfolio
Identity boundaryReview the canonical configuration and fix validation issues before saving
Author the candidate
NexusTrade toolcreate_portfolio
Identity boundaryA newly authored chat portfolio, not an existing live account
Inspect the target
NexusTrade toolget_portfolio
Identity boundaryRead the exact returned ID and strategies before activation
Deploy the chat book
NexusTrade toolupdate_portfolio
Identity boundaryoperations: [{type: "deploy", portfolioId: returnedChatId}] creates paper
Find the running book
NexusTrade toolfetch_portfolios
Identity boundaryKeep the resulting deployment ID separately from the original chat/draft ID
Read actual paper history
NexusTrade toolquery_portfolio_history
Identity boundaryThe deployed portfolio curve; never substitute a backtest curve
Show the table · 6 rows, 3 columns
Scroll sideways to compare all columns. Select a heading to sort.
| Preview the candidate | build_portfolio | Review the canonical configuration and fix validation issues before saving |
| Author the candidate | create_portfolio | A newly authored chat portfolio, not an existing live account |
| Inspect the target | get_portfolio | Read the exact returned ID and strategies before activation |
| Deploy the chat book | update_portfolio | operations: [{type: "deploy", portfolioId: returnedChatId}] creates paper |
| Find the running book | fetch_portfolios | Keep the resulting deployment ID separately from the original chat/draft ID |
| Read actual paper history | query_portfolio_history | The deployed portfolio curve; never substitute a backtest curve |
No matching rows. Clear the filter to see all records.
Deploying an existing live portfolio ID can reactivate real brokerage trading. For this workflow use the newly authored chat candidate and verify the returned deployment is paper. The SDK also separates saved draft IDs from deployment.portfolioId.
Validated example: AMD entry and exit
- Starting capital
- $10,000
NexusTrade validation recorded October 10, 2026 returned valid:true with no issues. This preview saved nothing and has no forward Paper history.
Entry
Buy 20% of the portfolio in AMD whenever AMD's price is above its 50-day average price and the portfolio holds no AMD.
Exit
Sell 100% of the current AMD position whenever AMD's price is at or below its 50-day average price and the portfolio holds AMD.
Rule decision example
Hypothetical: AMD at $110, its 50-day average at $100, no AMD held, and a $10,000 portfolio. The entry proposes $2,000 of AMD before whole-share rounding and execution costs.
Exit and equality
At price equal to the average, entry is false; with a holding, the exit passes because its comparison includes equality.
Try this example in Dots
Inspect the request
Connect Dots, then copy the request below. Review the returned result before continuing.
Connect the NexusTrade app your dot will use
Open Plugins in ChatGPT, inspect the NexusTrade plugin if it is listed, and connect its included app through NexusTrade OAuth. On mobile, your dot's profile → Customize → Plugins opens shared settings. Your dot uses the connected account's enabled plugins and allowed actions.
For a private remote MCP connection, eligible ChatGPT web accounts use Settings → Apps → Advanced Settings → developer mode, then Settings → Apps → Create (or an administrator's Workspace settings → Apps → Create). Name it NexusTrade, choose OAuth, enter the URL below, select Scan Tools, finish sign-in and select Create. Full action access depends on the plan, workspace role and administrator settings; read/fetch access alone cannot submit a backtest or deploy a paper book.
Install Plugin Creator, mention @plugin-creator in a chat and ask it to include the connected NexusTrade app in a private research plugin. Review the app and instructions, finish creation and install it. In your dot, select that plugin for this task and perform the read check below. A plugin containing only instructions has no account tools.
NexusTrade MCP URL: https://nexustrade.io/api/mcp
Authentication: OAuth
Include the connected NexusTrade app, then verify owned portfolio reads before enabling actions.Check the account with an owned portfolio read
Ask the agent to call fetch_portfolios with the arguments below. Compare the returned portfolio names, IDs and types with your NexusTrade account. fetch_portfolios returns portfolioId; pass that exact value as portfolio_id to get_portfolio. Inspect the structured portfolio.portfolioId, portfolio.type, portfolio.isActive, portfolio.strategies, portfolio.initialValue and portfolio.deployment. For a new account, an authenticated empty list is a valid result.
This request excludes live books and positions, includes chat drafts and inactive paper books, and returns up to 50 records per page. Follow subsequent pages before concluding a named book is absent. If OAuth expired, reconnect and repeat this read. For a missing tool, inspect the included app, environment and action permissions. An account mismatch must be fixed before a write.
{
"include_live": false,
"include_paper": true,
"include_chat_portfolios": true,
"include_inactive": true,
"include_positions": false,
"limit": 50,
"page": 1
}Freeze AMD memo follow-up
Proposed mechanics example: one long-only AMD stock strategy pair, $10,000 starting simulated capital and a 50-trading-day simple moving average. The historical example uses interval Day. Enter only while flat when price is above that average; buy 20% of portfolio value. Exit the entire AMD holding when price is at or below the same average. Keep the remainder in cash; use no leverage, options or parameter search.
Have the agent show the complete condition and action objects, then call build_portfolio with that full JSON to validate and canonicalize without saving. Review valid, issues and the returned portfolio. Correct each reported issue before approving create_portfolio with the same accepted JSON. The flat-position guard prevents another purchase on every evaluation while the condition stays true. Record how the configuration handles missing prices, warmup and evaluation timing. These are proposed inputs, not a recommended allocation or a tested trading edge.
Draft exactly one new chat portfolio named "OpenAI Dots AMD SMA50 review" with initialValue 10000. Use daily AMD prices and a SimpleMovingAverage window of 50 Day bars. Entry: price > SMA50 AND held PositionValue = 0; buy 20% of portfolio value. Exit: price <= SMA50 AND held PositionValue > 0; sell 100% of that holding. No options, leverage or repeated purchases while held. Show the full condition/action configuration and the dividend policy. Call build_portfolio with the full JSON; inspect valid, issues and the canonicalized portfolio without saving. After I approve saving, call create_portfolio with the same accepted JSON, preserve portfolios[0].portfolioId and read that exact ID with get_portfolio. Do not backtest or deploy yet.Approve one paper-copy operation
Read the newly created chat portfolio again and confirm its type, $10,000 simulated capital and complete strategy pair. Keep the saved draft ID and any historical backtest ID in separate fields. After you approve activation, call update_portfolio with only the chat ID below. Deploying that chat candidate creates a paper book; targeting an existing live portfolio can reactivate real brokerage trading.
Record the returned deployment result, then use fetch_portfolios with include_paper=true, include_live=false and include_chat_portfolios=false to find the deployed book. Read its exact ID with get_portfolio and verify paper type, copied strategies and state. Keep the running paper ID separately from the original chat ID. Inspect its evaluation state after the copy, even if the approval succeeded.
{
"operations": [
{
"type": "deploy",
"portfolioId": "<RETURNED_CHAT_PORTFOLIO_ID>"
}
]
}Confirm evaluation and the first paper record
Open /portfolio/<RETURNED_PAPER_PORTFOLIO_ID> in NexusTrade. Review the Deployment Center on that paper book. Its Automated Trading switch controls strategy evaluation. If it is off and you choose to begin evaluation, enable it for this verified paper target and select Save Changes. Read back the same portfolio and its active state before reporting it running. This is separate from the live-only Autonomous Trading approval policy; paper orders remain on manual review. When a simulated order is pending approval, open Order Management, select Paper, inspect the portfolio, symbol, side and size, then choose Confirm only after review. Read its order state and paper history before claiming a fill.
Keep AMD, the 50-day rule, 20% entry allocation and $10,000 initial value fixed during observation. Read the actual deployment frequency: the Day historical interval and a Day indicator window do not set paper cadence. Constant and OpenClose are different evaluation schedules; OpenClose evaluates at both open and close. Record that frequency, when evaluation began and what data was available. Paper behavior is simulated forward execution. A historical curve remains a separate artifact.
Monitor the deployed curve, not a replay
Use query_portfolio_history with the exact paper ID below and actual observation dates when applying filters. The expected result identifies the deployed portfolio and paper kind and returns {time, value} points. Follow pagination; an empty first result can mean no history yet. Check evaluation state, market timing and the same ID before diagnosing failure.
Keep a journal of signal, simulated order, holding, cash and history timestamps from the available portfolio and event tools. If the rule does not trade, report that observation. Do not invent a fill or launch a backtest to make the paper curve appear.
{
"portfolio_id": "<RETURNED_PAPER_PORTFOLIO_ID>",
"page": 1,
"page_size": 500
}Give the dot a bounded AMD observation task
After the paper ID is verified, ask your dot for a read-only check each weekday at 4:30 p.m. America/New_York for 20 market sessions, with an end date you confirm when starting. It should query that paper ID, compare the last timestamp and update the observation memo. No new strategy, paid research, backtest or repeated activation belongs in this task.
Ask the dot to confirm the saved schedule, paper ID and end date. Inspect the first check in Activity and the recurring task under Scheduled. Notify for a failed read, stopped book, changed rule or new simulated fill; otherwise keep the memo current without repeated messages. Keep writes behind Ask before taking action in Custom rules. Cancel the schedule when the observation ends; profile → ••• → Pause alone is not a verified portfolio stop.
Monitor only my verified AMD paper portfolio <RETURNED_PAPER_PORTFOLIO_ID>. Each weekday at 4:30 p.m. America/New_York for 20 market sessions, read get_portfolio and query_portfolio_history. Record last history time, value, cash, holding and any reported simulated fill; label missing fields unresolved. Compare with the previous observation. Stop and notify on account mismatch or live type. Never deploy again, edit rules or start compute. Confirm the schedule and actual end date before saving it.Recover or stop without a duplicate activation
If the deploy response is missing, read the original draft, list paper books including inactive ones and compare the copied strategy set and creation record. Reuse the existing paper ID when found. An ambiguous timeout is not permission to issue another deploy operation; reconcile the task and account first.
To stop strategy evaluation, turn Automated Trading off in that paper book’s Deployment Center and select Save Changes. Read the same ID and policy to verify the stop. update_portfolio also exposes undeploy for the verified deployed ID when you explicitly choose to stop that deployment. Review existing simulated orders and holdings separately; stopping evaluation does not mean liquidation.
Stopping the external agent or canceling its observation schedule is separate from stopping the NexusTrade book. Save the final paper ID and its observed state before ending the assignment.
Stop this paper deployment and verify its state
After approving a stop, send this update_portfolio request only for the verified running paper ID. Read get_portfolio again and check portfolio.type is paper and portfolio.isActive is false. Retain the ID and history; undeploy is different from delete. Confirm the trading policy separately if you changed Automated Trading in the UI.
{
"operations": [
{
"type": "undeploy",
"portfolioId": "<RETURNED_PAPER_PORTFOLIO_ID>"
}
]
}Exact validation request and provenance
Inspect the complete paper-candidate JSON and validation provenance
On October 10, 2026, we constructed this complete AMD configuration with the NexusTrade Python SDK and sent it to the product's build_portfolio tool. It returned valid: true and an empty issues list. The returned rules are summarized below; generated identifiers and editor metadata are omitted.
The preview saved nothing. Inspect these accepted rule definitions before creating your own paper draft. Copy the complete request below into build_portfolio to inspect the same candidate before saving it.
The entry sizes from total portfolio value, rather than remaining cash. Its zero-position guard prevents repeated purchases while held. The exit closes the current holding, rather than selling a percentage of total account value. The request specifies its dividend policy; the preview's compact result does not repeat every portfolio setting, so confirm those settings after saving.
| Product response | Observed value |
|---|---|
| Validation | valid: true; issues: [] |
| Capital | initialValue: 10000 |
| Entry | Buy 20% of the portfolio in AMD whenever AMD's price is above its 50-day average price and the portfolio holds no AMD. |
| Exit | Sell 100% of the current AMD position whenever AMD's price is at or below its 50-day average price and the portfolio holds AMD. |
| Order approval | automaticOrderApproval: false on both returned rules |
| Persistence | Nothing was saved |
No matching rows. Clear the filter to see all records.
{
"name": "Public SEO example - dots AMD SMA50",
"initialValue": 10000,
"cash": 10000,
"buyingPower": 10000,
"strategies": [
{
"name": "Enter while flat",
"condition": {
"type": "And",
"conditions": [
{
"type": "Base",
"lhs": {
"type": "Price",
"targetAsset": {
"type": "Stock",
"symbol": "AMD",
"name": "AMD"
}
},
"comparison": "greaterThan",
"rhs": {
"type": "SimpleMovingAverage",
"targetAsset": {
"type": "Stock",
"symbol": "AMD",
"name": "AMD"
},
"window": {
"length": 50,
"interval": "Day"
}
}
},
{
"type": "Base",
"lhs": {
"type": "PositionValue",
"targetAssets": [
{
"type": "Stock",
"symbol": "AMD",
"name": "AMD"
}
]
},
"comparison": "equal",
"rhs": {
"type": "Value",
"value": 0
}
}
]
},
"action": {
"type": "Buy",
"targetAsset": {
"type": "Stock",
"symbol": "AMD",
"name": "AMD"
},
"amount": {
"type": "percent of portfolio",
"amount": 20
}
},
"orderExecution": {
"type": "Market"
}
},
{
"name": "Exit held position",
"condition": {
"type": "And",
"conditions": [
{
"type": "Base",
"lhs": {
"type": "Price",
"targetAsset": {
"type": "Stock",
"symbol": "AMD",
"name": "AMD"
}
},
"comparison": "lessThanOrEqual",
"rhs": {
"type": "SimpleMovingAverage",
"targetAsset": {
"type": "Stock",
"symbol": "AMD",
"name": "AMD"
},
"window": {
"length": 50,
"interval": "Day"
}
}
},
{
"type": "Base",
"lhs": {
"type": "PositionValue",
"targetAssets": [
{
"type": "Stock",
"symbol": "AMD",
"name": "AMD"
}
]
},
"comparison": "greaterThan",
"rhs": {
"type": "Value",
"value": 0
}
}
]
},
"action": {
"type": "Sell",
"targetAsset": {
"type": "Stock",
"symbol": "AMD",
"name": "AMD"
},
"amount": {
"type": "percent of current positions",
"amount": 100
}
},
"orderExecution": {
"type": "Market"
}
}
],
"supportsFractionalShares": false,
"supportsCrypto": false,
"alertsEnabled": false,
"dividendPolicy": "cash"
}
No comments yet.