Постов с тегом "C#": 140

C#


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

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


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

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

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


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

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

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

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


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

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

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


Миграция адаптера ru.sazan.trader.smartcom

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


Где робот хранит свои данные?

Класс, представляющий основную структуру данных торгующего робота, называется 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>>();


Как собрать историю стакана?

Тема нового видео предложена трейдерами, изучающими возможности библиотеки. В общем фильма отвечает на вопрос «Как за десять минут написать сборщика статистики очереди заявок (стакана) для финансового инструмента?».

Если вам для решения вашей проблемы не требуются исторические данные о сделках и заявках за несколько прошедших лет, а достаточно статистики за неделю, или две, то вы легко можете собрать на основе нашего скальпирующего робота инструмент, который будет «слушать» очереди заявок и записывать их результаты в текстовые файлы с разделителями. А уже эти текстовые файлы вы легко сможете распотрошить с помощью популярных средств работы с табличными данными, такими как Microsoft Excel или OpenOffice Calc или LibreOffice Calc.

Однако, не забывайте пожалуйста что нет смысла записывать данные с тестового контура Ай Ти Инвест. Там данные идут с задержкой и в них вносятся какие-то искажения.


Исходный код скальпера все там же, в открытом репозитории битбакет.

Развиваем навык программирования обработчиков

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

Алгоритм нового обработчика в двух словах: Берем набор тиков за последние N секунд. Если разница между максимальной и минимальной ценой в наборе тиков меньше значения M, то не торгуем, считая что тренда нет. Если цена самого старого тика в наборе, меньше цены самого свежего тика в наборе, открываем позицию в лонг. Если цена самого старого тика в наборе, больше цены самого свежего тика в наборе, открываем позицию в шорт.

Видео в этот раз на 40 минут, потому что пишем код, и потому что пишем тест, до того, как пишем код.


Что произойдет с роботом, в случае сбоя SmartCOM-а?

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

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

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


Доступ из робота к обработчикам событий SmartCom

В собранной нами конструкции робота отсутствуют ссылки на класс StServerClass и интерфейс StServer. Как быть, если необходимо получить прямой доступ к обработчикам событий SmartCom? Ну например моей торговой стратегии для корректной работы необходимы некие исторические данные и я хочу сразу после установления соединения запросить у брокера некий набор баров.

В традиционно коротком видео (15 минут)


показан один из способов обращения к родным событиям SmartCom, который позволяет обеспечивать корректную работу и восстановление робота даже в случае удара пресловутого исключения System.Runtime.InteropServices.COMException (0x800706BA), за счет динамического связывания и пересвязывания всех обработчиков.

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