Первый проверочный бэктест
Готовый C# проект для первого запуска: полный код, манифест, загрузка истории и проверенный результат без заявок.
Что получится
Это готовый первый проверочный бэктест для человека, который пока не пишет C#. Вы создадите папочную стратегию, вставите полный файл, скомпилируете его и проверите обработку исторических свечей.
Пример считает закрытые бары и пишет журнал. Он не размещает заявки, поэтому ноль сделок — ожидаемый результат. Так удобно проверить установку, данные и запуск до добавления торговых правил.
Полный проект проверен в изолированном EngineHost 1.0.0-preview.1 на macOS: компиляция без ошибок и исторический расчёт Binance/Spot/BTCUSDT за час 2020-01-01. Дополнительные библиотеки, API-ключи биржи и платная модель ИИ в коде не используются.
Эта инструкция относится к формату стратегий Studio. Для другого выпуска, старого Tester или примера из SDK Handbook сначала проверьте версию и доступный API.
Получить готовый проект
палитра команд → «XTester: Новая стратегия…» → «Создать с нуля». Выберите C#, имя First Check и отдельную учебную папку.
Альтернативный путь: скачайте ZIP, распакуйте папку first-check и откройте её через «Открыть сохранённую стратегию» в мастере. В архиве main.cs, манифест, инструкции RU/EN и фактический протокол проверки; истории котировок и установленной программы в нём нет.
- Создать новую стратегию с нуля.
- Открыть уже сохранённую стратегию.
Папочная стратегия состоит из main.cs и xtester.strategy.json. Мастер может добавить служебные поля. Если создаёте её через мастер, сохраните созданную структуру и целиком замените только main.cs кодом ниже.
first-check/
main.cs
xtester.strategy.json
README.ru.md
README.en.md
verification.jsonПолный main.cs
Откройте main.cs, выделите всё содержимое и вставьте этот полный файл. Сохраните его перед компиляцией.
Для папочного шаблона Studio namespace и using здесь не пропущены: компилятор добавляет стандартные импорты SDK. Это проверенный формат файла стратегии, а не отдельный консольный .NET-проект. Точные типы и сигнатуры можно сверить по API установленного движка.
OnInit получает журнал и обнуляет счётчик. OnBar вызывается для закрытых баров. OnFinish выводит число обработанных баров. В коде нет вызовов отправки ордеров.
public class UserStrategy : IStrategy
{
private ILogger _logger = null!;
private int _closedBars;
public void OnInit(StrategyContext context)
{
_logger = context.Logger;
_closedBars = 0;
_logger.Info("Learning example started. No orders will be placed.");
}
public void OnTick(decimal? price = null) { }
public void OnBar(ISymbolKey symbolKey, IKline kline)
{
_closedBars++;
if (_closedBars == 1)
{
_logger.Info("The first closed bar was received.");
}
}
public void OnFinish(StrategyFinishContext context)
{
_logger.Info("Closed bars processed: " + _closedBars);
}
}
Манифест и условия
Манифест указывает язык, точку входа и параметры примера. Сценарий использует C# и main.cs, Binance Spot BTCUSDT, m1 и начальные 1000 USDT.
Ниже приведён полный манифест проверенного ZIP. При создании через мастер задайте те же условия в интерфейсе; вручную добавлять .csproj не требуется. В режиме шага выберите Bar («Бар»). Прогон в инструкции исторический.
{
"strategy": {
"name": "First Check",
"language": "csharp",
"entryPoint": "main.cs"
},
"simulation": {
"exchange": "Binance",
"market": "Spot",
"symbol": "BTCUSDT",
"timeframe": "m1",
"period": {
"from": "2020-01-01T00:00:00Z",
"to": "2020-01-01T01:00:00Z"
},
"depositUsdt": 1000,
"launchMode": "Release"
}
}
Скачать данные и запустить
Откройте «Данные» и загрузите историю Binance / Spot / BTCUSDT, m1, за 2020-01-01. Для часового расчёта нужны свечи с 00:00 до 00:59 UTC. Проверьте фактическое покрытие после загрузки.
- Выберите Binance, Spot, BTCUSDT и m1.
- Задайте начало 2020-01-01 00:00 и конец 2020-01-01 01:00 UTC.
- Проверьте начальные средства 1000 USDT и режим шага Bar.
- Выполните «Скомпилировать стратегию» и проверьте отсутствие ошибок.
- Запустите исторический расчёт выбранной стратегии и дождитесь завершения.
Если история недоступна, сначала устраните причину загрузки. Другой инструмент, другая дата или сгенерированные данные изменяют проверяемый сценарий.
Затем откройте «Симуляция» выбранной стратегии и задайте условия ниже. В проверке был использован режим Bar с обычной моделируемой моделью исполнения; исторические цены не делают исполнение точной реконструкцией биржи.
Проверить результат
В выполненной проверке получены 60 шагов, 59 вызовов по закрытым барам, 0 заявок и 0 сделок. Сообщение Closed bars processed: 59 подтвердило выполнение нашего кода, а не только успешную компиляцию.
- Итоговые показатели прогона.
- Капитал и ориентир для сравнения.
Время строк журнала — время исторического расчёта. Поэтому в этом примере вы увидите дату 2020-01-01, а не сегодняшнюю дату компьютера. Шаг времени и вызов OnBar — разные события; на выбранных границах их числа отличаются.
Проверьте собственные условия и журнал: первые сообщения показывают запуск примера и получение закрытого бара, последняя строка — итог счётчика. При изменении периода, данных или сборки число баров может отличаться.
Нулевая доходность здесь не оценка торговой идеи: код специально ничего не покупает и не продаёт. Для следующего упражнения добавляйте конкретные правила входа/выхода и проверяйте их отдельно.
Learning example started. No orders will be placed.
The first closed bar was received.
Closed bars processed: 59Если результат не получился
Ошибка типов IStrategy или StrategyContext. Проверьте, что выбран C# шаблон Studio, открыт правильный проект и файл заменён целиком. Сверьте версию по «О программе» и доступный API, прежде чем добавлять namespace из другого примера.
Нет свечей или расчёт не стартует. Проверьте биржу, рынок, пару, m1, UTC-период и фактический диапазон загруженной истории. Само наличие названия инструмента в списке не подтверждает данные.
Ноль сделок при наличии сообщений журнала — нормальный результат этого примера. Отсутствие самих сообщений требует проверки выбранной стратегии, сохранения файла, компиляции и запуска.
Для поддержки сохраните версию, условия расчёта, его собственный runId и точное сообщение ошибки. Не используйте идентификатор из чужого проверочного протокола для своего проекта.