TickAtlas
Strategy Development

Backtest Strategies with Real Historical Data

Your strategy is only as good as the data you test it on. We provide real OHLCV candles, pre-calculated indicator values, and raw tick data sourced directly from live broker feeds -- not synthetic or interpolated data.

10

Timeframes

50+

Symbols

42

Pre-Calculated Indicators

Real

Broker-Sourced Data

Data Retention by Timeframe

Higher timeframes retain more history by default

Timeframe Default Retention Approx. Candles Enterprise
M1 24 hours ~1,440 Full retention
M5 48 hours ~576 Full retention
M15 72 hours ~288 Full retention
M30 120 hours ~240 Full retention
H1 360 hours (15 days) ~360 Full retention
H4 720 hours (30 days) ~180 Full retention
D1 1,080 hours (45 days) ~45 Full retention

Enterprise plans retain all historical data indefinitely. Starter and Pro plans follow the retention schedule above.

Everything You Need for Backtesting

Historical OHLCV

Open, High, Low, Close, Volume candles at every timeframe via /v1/ohlc. Request up to 500 bars per call with timestamp filtering.

Historical Indicators

Pre-calculated indicator values synced to each candle via /v1/indicators. No need to calculate RSI, MACD, or Bollinger Bands yourself.

Historical Ticks

Raw bid/ask tick data via /v1/ticks for tick-level backtesting. Available on Starter plan and above.

Fetching Historical Data

REQUEST
GET /v1/ohlc?symbol=EURUSD&timeframe=H1&bars=100&from=2026-03-20T00:00:00Z
200 OK
{
  "success": true,
  "data": {
    "symbol": "EURUSD",
    "timeframe": "H1",
    "bars": [
      {
        "time": "2026-03-20T00:00:00Z",
        "open": 1.0821,
        "high": 1.08245,
        "low": 1.08192,
        "close": 1.08231,
        "volume": 8432
      },
      {
        "time": "2026-03-20T01:00:00Z",
        "open": 1.08231,
        "high": 1.08267,
        "low": 1.08218,
        "close": 1.08254,
        "volume": 6821
      },
      {
        "time": "2026-03-20T02:00:00Z",
        "open": 1.08254,
        "high": 1.08289,
        "low": 1.08241,
        "close": 1.08273,
        "volume": 7156
      }
    ],
    "count": 100,
    "from": "2026-03-20T00:00:00Z",
    "to": "2026-03-24T04:00:00Z"
  }
}

Python Backtesting Example

A simple moving average crossover backtest in 40 lines

python
import requests

API_KEY = "YOUR_API_KEY"
BASE = "https://tickatlas.com"

def get_ohlc(symbol, timeframe, bars=200):
    resp = requests.get(
        f"{BASE}/v1/ohlc",
        headers={"X-API-Key": API_KEY},
        params={"symbol": symbol, "timeframe": timeframe, "bars": bars}
    )
    return resp.json()["data"]["bars"]

def get_indicators(symbol, timeframe, indicator, period):
    resp = requests.get(
        f"{BASE}/v1/indicators",
        headers={"X-API-Key": API_KEY},
        params={"symbol": symbol, "timeframe": timeframe,
                "indicator": indicator, "period": period, "bars": 200}
    )
    return resp.json()["data"]["values"]

# Fetch data
bars = get_ohlc("EURUSD", "H1", 200)
sma_20 = get_indicators("EURUSD", "H1", "sma", 20)
sma_50 = get_indicators("EURUSD", "H1", "sma", 50)

# Simple SMA crossover backtest
trades = []
position = None

for i in range(1, len(sma_20)):
    if sma_20[i] > sma_50[i] and sma_20[i-1] <= sma_50[i-1]:
        # Golden cross - BUY
        if position is None:
            position = {"type": "BUY", "entry": bars[i]["close"],
                        "time": bars[i]["time"]}
    elif sma_20[i] < sma_50[i] and sma_20[i-1] >= sma_50[i-1]:
        # Death cross - SELL / close position
        if position and position["type"] == "BUY":
            pnl = bars[i]["close"] - position["entry"]
            trades.append({**position, "exit": bars[i]["close"],
                          "pnl_pips": pnl * 10000})
            position = None

# Results
total_pnl = sum(t["pnl_pips"] for t in trades)
wins = sum(1 for t in trades if t["pnl_pips"] > 0)
print(f"Trades: {len(trades)} | Wins: {wins} | "
      f"Win Rate: {wins/len(trades)*100:.0f}% | "
      f"Total PnL: {total_pnl:.1f} pips")

Use Cases

  • Strategy Validation

    Test your trading rules against real historical data before risking real money. Does your RSI reversal strategy actually work on XAUUSD H4? The data tells you.

  • Parameter Optimization

    Is RSI 14 better than RSI 21 for your strategy? Run the same backtest with different parameters and compare results. Data-driven optimization, not guesswork.

  • ML Training Data

    Train machine learning models on real OHLCV + indicator features. Our pre-calculated indicators save you from implementing 42 indicator calculations yourself.

  • Walk-Forward Analysis

    Split historical data into in-sample (optimization) and out-of-sample (validation) windows. Use the timestamp filters to fetch precise date ranges.

Data Quality You Can Trust

Real Broker Data

Every candle and tick comes from live broker feeds. This is not synthesized, interpolated, or delayed data. It is what the market actually traded at.

Multi-Broker Verification

Data from multiple brokers is cross-validated. Anomalous spikes and gaps are detected and flagged. Automated backfill fills any gaps within minutes.

Consistent Timestamps

All timestamps are UTC. No timezone confusion. Candle boundaries align precisely to their timeframe (H1 candles start at :00, H4 at 00:00/04:00/08:00/etc.).

Volume Data Included

Tick volume is included with every candle. Essential for volume-weighted strategies, VWAP calculation, and volume profile analysis.

Frequently Asked Questions

How far back does the data go?

Data retention depends on timeframe and plan. D1 data goes back ~45 days on Starter/Pro, H1 goes back ~15 days. Enterprise plans retain all historical data since the platform started collecting.

Can I download bulk data for offline backtesting?

Yes. Use the from and to timestamp parameters along with bars=500 (maximum per call) and paginate through the date range. Many users run a nightly download job.

Are indicator values included with OHLCV data?

OHLCV and indicator values come from separate endpoints (/v1/ohlc and /v1/indicators). They share the same timestamps so you can merge them easily by time.

Is there survivorship bias in the symbol list?

No. We track all 50+ symbols consistently. Forex pairs do not get delisted like stocks, so survivorship bias is not a concern for FX and commodity backtesting.

What about spread data for more realistic backtests?

Use the /v1/spread endpoint to get historical spread statistics. Incorporate average spread by session into your backtest for realistic cost modeling.

Test Your Strategy Before You Trade It

Access real historical market data and pre-calculated indicators for strategy backtesting. Start your free trial today.

14-day free trial / No credit card required / 1,000 requests included / Cancel anytime