book
Checkout our new book! Hands on AI Trading with Python, QuantConnect, and AWS Learn More arrow

Read Backtest

Charts

Introduction

Read chart from a backtest.

Request

Request body to obtain a chart from a backtest. The /backtests/chart/read API accepts requests in the following format:

ReadBacktestChartRequest Model - Request body to obtain a chart from a backtest.
projectId integer
required
example: 12345678

Project ID of the request.
backtestId string
required
example: 2a748c241eb93b0b57b4747b3dacc80e

Associated Backtest ID for this chart request.
name string
required
example: Strategy Equity

The requested chart name.
count integer
required
example: 100

The number of data points to request.
start integer
required
example: 1717801200

Optional. If provided, the Utc start seconds timestamp of the request.
end integer
required
example: 1743462000

Optional. If provided, the Utc end seconds timestamp of the request.
Example
{
  "projectId": 12345678,
  "backtestId": "2a748c241eb93b0b57b4747b3dacc80e",
  "name": "Strategy Equity",
  "count": 100,
  "start": 1717801200,
  "end": 1743462000
}

Responses

The /backtests/chart/read API provides a response in the following format:

200 Success

LoadingChartResponse Model - Response when the requested chart is being generated.
progress number
Loading percentage of the chart generation process.
status string
example: loading

Status of the chart generation process.
success boolean
Indicate if the API request was successful.
Example
{
  "progress": 0,
  "status": "loading",
  "success": true
}
ReadChartResponse Model - Response with the requested chart from a live algorithm or backtest
chart Chart object
Single Parent Chart Object for Custom Charting.
success boolean
Indicate if the API request was successful.
errors string Array
List of errors with the API call.
Example
{
  "chart": {
    "name": "string",
    "chartType": "Overlay",
    "series": {
      "name": "string",
      "unit": "string",
      "index": 0,
      "values": [
        "object"
      ],
      "seriesType": "Line",
      "color": "string",
      "scatterMarkerSymbol": "none"
    }
  },
  "success": true,
  "errors": [
    "string"
  ]
}
Chart Model - Single Parent Chart Object for Custom Charting.
name string
Name of the Chart.
chartType string Enum
Type of the Chart, Overlayed or Stacked. Options : ['Overlay', 'Stacked']
series Series object
List of Series Objects for this Chart.
Example
{
  "name": "string",
  "chartType": "Overlay",
  "series": {
    "name": "string",
    "unit": "string",
    "index": 0,
    "values": [
      "object"
    ],
    "seriesType": "Line",
    "color": "string",
    "scatterMarkerSymbol": "none"
  }
}
Series Model - Chart Series Object - Series data and properties for a chart.
name string
Name of the series.
unit string
Axis for the chart series.
index integer
Index/position of the series on the chart.
values object Array
Values for the series plot. These values are assumed to be in ascending time order (first points earliest, last points latest).
seriesType string Enum
Chart type for the series. Options : ['Line', 'Scatter', 'Candle', 'Bar', 'Flag', 'StackedArea', 'Pie', 'Treemap']
color string
Color the series.
scatterMarkerSymbol string Enum
Shape or symbol for the marker in a scatter plot. Options : ['none', 'circle', 'square', 'diamond', 'triangle', 'triangle-down']
Example
{
  "name": "string",
  "unit": "string",
  "index": 0,
  "values": [
    "object"
  ],
  "seriesType": "Line",
  "color": "string",
  "scatterMarkerSymbol": "none"
}

401 Authentication Error

UnauthorizedError Model - Unauthorized response from the API. Key is missing, invalid, or timestamp is too old for hash.
www_authenticate string
Header

Examples

The following example demonstates creating, reading, updating, deleting, and listing backtests of a project through the cloud API.

from base64 import b64encode
from hashlib import sha256
from time import time
from requests import get, post
BASE_URL = 'https://www.quantconnect.com/api/v2/'

# You need to replace these with your actual credentials.
# You can request your credentials at https://www.quantconnect.com/settings/
# You can find our organization ID at https://www.quantconnect.com/organization/ 
USER_ID = 0
API_TOKEN = '____'
ORGANIZATION_ID = '____'

def get_headers():
    # Get timestamp
    timestamp = f'{int(time())}'
    time_stamped_token = f'{API_TOKEN}:{timestamp}'.encode('utf-8')

    # Get hased API token
    hashed_token = sha256(time_stamped_token).hexdigest()
    authentication = f'{USER_ID}:{hashed_token}'.encode('utf-8')
    authentication = b64encode(authentication).decode('ascii')

    # Create headers dictionary.
    return {
        'Authorization': f'Basic {authentication}',
        'Timestamp': timestamp
    }

# Authenticate to verify credentials
response = post(f'{BASE_URL}/authenticate', headers = get_headers())
print(response.json())

# --------------------


### Create Backtest
# Define placeholder compilation ID (replace with actual value)
compile_id = "compile_id..."
# Send a POST request to the /backtests/create endpoint to create a backtest
response = post(f'{BASE_URL}/backtests/create', headers=get_headers(), json={
    "projectId": project_id,  # ID of the project to backtest
    "compileId": compile_id,  # Compilation ID for the backtest
    "backtestName": f"Backtest {int(time())}"  # Unique name for the backtest using current timestamp
})
# Parse the JSON response into python managable dict
result = response.json()
# Extract the backtest ID from the response
backtest_id = result['backtest']['backtestId']
# Check if the request was successful and print the result
if result['success']:
    print("Backtest Created Successfully:")
    print(result)

### Read Backtest Statistics
# Prepare data payload to read backtest statistics
payload = {
    "projectId": project_id,  # ID of the project
    "backtestId": backtest_id  # ID of the backtest to read
}
# Send a POST request to the /backtests/read endpoint to get statistics
response = post(f'{BASE_URL}/backtests/read', headers=get_headers(), json=payload)
# Parse the JSON response into python managable dict
result = response.json()
# Check if the request was successful and print the statistics
if result['success']:
    print("Backtest Statistics:")
    print(result)

### Update Backtest
# Send a POST request to the /backtests/update endpoint to update backtest details
response = post(f'{BASE_URL}/backtests/update', headers=get_headers(), json={
    "projectId": project_id,  # ID of the project
    "backtestId": backtest_id,  # ID of the backtest to update
    "name": f"Backtest_{backtest_id}",  # New name for the backtest
    "note": "The new backtest name is awesome!"  # Additional note
})
# Parse the JSON response into python managable dict
result = response.json()
# Check if the request was successful and print the result
if result['success']:
    print("Backtest Updated Successfully:")
    print(result)

### Delete Backtest
# Prepare data payload to delete the backtest
payload = {
    "projectId": project_id,  # ID of the project
    "backtestId": backtest_id  # ID of the backtest to delete
}
# Send a POST request to the /backtests/delete endpoint to delete the backtest
response = post(f'{BASE_URL}/backtests/delete', headers=get_headers(), json=payload)
# Parse the JSON response into python managable dict
result = response.json()
# Check if the request was successful and print the result
if result['success']:
    print("Backtest Deleted Successfully:")
    print(result)

### List Backtests
# Prepare data payload to list backtests with statistics
payload = {
    "projectId": project_id,  # ID of the project
    "includeStatistics": True  # Include statistics in the response
}
# Send a POST request to the /backtests/list endpoint to list backtests
response = post(f'{BASE_URL}/backtests/list', headers=get_headers(), json=payload)
# Parse the JSON response into python managable dict
result = response.json()
# Check if the request was successful and print the list
if result['success']:
    print("List of Backtests:")
    print(result)

You can also see our Videos. You can also get in touch with us via Discord.

Did you find this page helpful?

Contribute to the documentation: