Блог им. SergeyEgorov |Разрабатываем простейший бэктестер (часть завершающая)

Собираем из нескольких запчастей наш элементарно-концептуальный консольный бэктестер. Наш план вполне удался и у нас появилась возможность тестировать придуманные и реализованные нами обработчики на исторических данных без дополнительных программ и переписывания кода алгоритмов.

Конструктив, как и все что мы разрабатываем, можно развивать и обвешивать опциями ибо архитектурно все у нас как обычно слабосвязано и все зависимости инвертированы. Желающие могут постепенно добавить возможность тестирования на тиках и стаканах, вычисление дродаунов, эквитей и оптимизацию параметров.


Блог им. SergeyEgorov |Программируем простейший бэктестер (часть 4)

Реализацию обработчика, который предназначен для закрытия позиции с фиксацией убытка, начинаем с рефакторинга. Выделяем из обработчика, реализованного в предыдущем видео, код, который можно повторно использовать, в отдельный абстрактный класс и класс нового обработчика наследуем от этого абстрактного, избавляя себя таким образом от необходимости повторно описывать уже имеющееся в проекте поведение.


Блог им. SergeyEgorov |Программируем простейший бэктестер (часть 3)

Целеустремленно и неотвратимо продолжаем кодировать компоненты для простейшего бэктестера. Тема сегодняшнего видео — обработчик, который фиксирует прибыль, генерируя сигнал на закрытие позиции, когда цена достигает границы, определенной нами в настройках. Как мы и договаривались обработчик щелкает каждый раз, когда в контекст торговых данных падает новая свечка (Bar).


Блог им. SergeyEgorov |Программируем простейший бэктестер (часть 2)

Продолжаем двигаться по пути строительства коммунизма простейшего собственного бэктестера.

Поскольку оказалось что инструмент для загрузки свечей (Bar) из текстовых файлов уже существует в проекте ru.sazan.trader, то в этом видео мы смотрим как реализовать пробойный обработчик на открытие позиции, который как мы и договаривались реагирует на добавление новых свечей в контекст торговых данных.


Блог им. SergeyEgorov |Программируем простейший бэктестер (часть 1)

Один из самых частых вопросов, который начинающие программисты-трейдеры задают мне в почту или скайп это — «Как написать бэктестер?». Глобализовать задачу не хочется, дабы она не умерла из-за потери концентрации и мотивированности, поэтому пойдем поступательно, от простейшего, к простому и за несколько итераций реализуем набор алгоритмов, которые позволят тестировать торговые стратегии, базирующиеся на свечках (Bar). Первый бэктестер должен будет уметь исполнять рыночные заявки, по цене закрытия самого последнего бара, присутствующего в контексте торговых данных, для нашего финансового инструмента. Примерный план действий такой:

  1. Реализуем класс, который эмулирует сделки для наших заявок.
  2. Реализуем класс, который последовательно читает свечки из текстового файла и добавляет их в контекст торговых данных.
  3. Реализуем к примеру пробойный обработчик на открытие позиции.
  4. Реализуем обработчик на закрытие позиции.
  5. Реализуем консольное приложение, которому можно будет передавать имя текстового файла с историческими данными и которое будет выполнять бэктест для этих данных.

Видео по первому пункту:


Блог им. SergeyEgorov |Как получить информацию о сделках?

Продолжаем рассматривать контекст торговых данных (ru.sazan.trader.Data.TradingDataContext). В этом видео показано как пользоваться вызовами методов расширения GetTrades для того, чтобы получить коллекцию (IEnumerable<Trade>) сделок для торгуемой стратегии или для конкретной заявки.

Кроме того, в видео показано как пользоваться одним из методов, позволяющих эмулировать комплект, содержащий сигнал (Signal), заявку (Order) и сделку (Trade), которые могут потребоваться в тестовых классах для проверки правильности срабатывания обработчиков на вход и выход.


Блог им. SergeyEgorov |Миграция адаптера ru.sazan.trader.smartcom

Поскольку новые тестовые счета Ай Ти Инвест регистрирует на торговом контуре Matrix, то мы убираем адаптер для SmartCOM 2 на дальнюю полку и начинаем переезд на SmartCOM версии 3. Новое видео показывает что нужно изменить в нашем демонстрационном роботе ru.sazan.scalper, чтобы он начал работать на новом тестовом торговом контуре. Не забудьте предварительно установить себе саму третью версию компонента SmartCOM.


Блог им. SergeyEgorov |Где робот хранит свои данные?

Класс, представляющий основную структуру данных торгующего робота, называется TradingDataContext (контекст торговых данных). Внутри этого контекста содержится вся необходимая для торговли информация, описания и настройки торговых алгоритмов, сигналы, заявки, сделки. Следующее видео представляет собой двадцатиминутную шпаргалку, демонстрирующую способы получения доступа к коллекциям объектов, помещенных в контексте торговых данных, в зависимости от того, какие манипуляции вы собираетесь производить с этими данными.


Контекст торговых данных реализует интерфейс:

public interface DataContext
{
    T Get<T>();
}

Поэтому у вас есть по-меньшей мере три способа обращения к коллекциям и наборам, содержащимся в контексте торговых данных:

/// Получите ссылку на контекст торговых данных
DataContext tradingDataContext = TradingData.Instance;

/// Если вам нужно только читать данные из коллекции, используйте такой вызов
IEnumerable<Tick> ticks = tradingDataContext.Get<IEnumerable<Tick>>();

/// Если вы хотите изменять содержимое коллекции, добавляя или удаляя ее элементы
/// но чтобы при этом не срабатывали алгоритмы, наблюдающие изменение коллекции
/// используйте следующий вызов
ICollection<Bar> bars = tradingDataContext.Get<ICollection<Bar>>();

/// Если вы хотите изменять содержимое коллекции, заставляя при этом срабатывать
/// алгоритмы, наблюдающие за ее содержимым, используйте такой вызов
ObservableCollection<Trade> trades = tradingDataContext.Get<ObservableCollection<Trade>>();


....все тэги
UPDONW
Новый дизайн