Урок 5. Алготрейдинг и программирование
Atom Ответить
25.05.2013


Видео-урок
Программируем стратегию BollingerBands


[vk]http://vk.com/video_ext.php?oid=-66650972&id=167470173&hash=62ad29fe5712f0aa&hd=3[/vk]

Темы занятия:

  1. Стратегия проверенная на истор. данных

    • Определяем алгоритм торговли
    • Реализация стратегии



Полезные ссылки:
  1. Алгоритм стратегии
  2. Индикатор "Rate Of Change" (ROC) в S# документации, википедия
  3. Индикатор "Экспоненциальная скользящая средняя" в S# документации, википедия


Вложения:
Скачать проекты

Изменения в проектах:

Теги:


Спасибо:




6 Ответов
UsilaDobry

Фотография
Дата: 26.05.2013
Ответить


Доброго дня Иван.
Во всех примерах со стратегиями значения индикатора передаются в стратегию в виде графического значения
Code
var bs = new BollingerStrategy((BollingerBands) _bollingerElem.Indicator, _series)

В таком случае стратегия зависит от графика, например запущу вывод на график 30-минутные свечи, а стратегию запущу на минутных свечах, в этом случае она работать не будет.
Так передать значение индикатора не получается
Code
var bollinger = new BollingerBands{Length = 20, Width = 2};
series.ProcessCandle += candle =>
                            {
                                if (candle.State != CandleStates.Finished)
                                    return;
                                var bollingerValue = bollinger.Process((DecimalIndicatorValue)candle.ClosePrice;
                            };
var bs = new BollingerStrategy(bollingerValue, _series)

Что можно еще придумать?
Спасибо:

IvanB

Фотография
Дата: 27.05.2013
Ответить


UsilaDobry Go to

Доброго дня Иван.
...
Так передать значение индикатора не получается
Code
var bollinger = new BollingerBands{Length = 20, Width = 2};
series.ProcessCandle += candle =>
                            {
                                if (candle.State != CandleStates.Finished)
                                    return;
                                var bollingerValue = bollinger.Process((DecimalIndicatorValue)candle.ClosePrice;
                            };
var bs = new BollingerStrategy(bollingerValue, _series)

Что можно еще придумать?

Здравствуйте.
Единственная ошибка, которую вижу в Вашем коде, это то, что переменные bollinger и bs объявлены как локальные, их нужно объявить на уровне класса, и тогда этот код должен работать.

UsilaDobry Go to

Во всех примерах со стратегиями значения индикатора передаются в стратегию в виде графического значения
Code
var bs = new BollingerStrategy((BollingerBands) _bollingerElem.Indicator, _series)

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

в таком случае надо создавать два экземпляра серии свечей, с разными таймфреймами.
Автор топика
Спасибо: UsilaDobry

UsilaDobry

Фотография
Дата: 28.05.2013
Ответить


IvanB Go to

в таком случае надо создавать два экземпляра серии свечей, с разными таймфреймами.

А так можно сделать для анализа в стратегии свечей разного таймфрейма?
Хорошо создал две серии, передал их в стратегию.

Code

                        var timeFrame1 = TimeSpan.FromMinutes(1);
                        var timeFrame2 = TimeSpan.FromMinutes(30);
                        
                        _candleManager1 = new CandleManager(ConnectionInterface.SafeConnection.Trader);
                        _candleManager2 = new CandleManager(ConnectionInterface.SafeConnection.Trader);
                        
                        var security = ConnectionInterface.SelectedSecurity;

                        var series1 = new CandleSeries(typeof(TimeFrameCandle), security, timeFrame1);
                        var series2 = new CandleSeries(typeof(TimeFrameCandle), security, timeFrame2);
                        
                        _candleManager1.Start(series1);
                        _candleManager2.Start(series2);

                        _breakdownLevelStrategy = new BreakdownLevelStrategy(series1, series2)
                        {
                            Volume = int.Parse(VolumeTextBox3.Text)
                        };

Но в стратегии мы обрабатываем одну серию в реальном времени
Code
 _candleSeries1.ProcessCandle += candle =>
                    {
                       
                       var timeFrame = (TimeSpan) candle.Arg; 
                       var time = timeFrame.GetCandleBounds(Security).Min - timeFrame; 
                       
                        if (candle.OpenTime >= time && candle.State == CandleStates.Finished)
                        {
                            ....какой-то код алгоритма...
                        }
                    };

Или можем подписаться также на обработку свечей второй серии
Code
 _candleSeries2.ProcessCandle += candle =>
                    {
                       
                       var timeFrame = (TimeSpan) candle.Arg; 
                       var time = timeFrame.GetCandleBounds(Security).Min - timeFrame; 
                       
                        if (candle.OpenTime >= time && candle.State == CandleStates.Finished)
                        {
                            ....какой-то код алгоритма...
                        }
                    };

А алгоритмы связать через переменные, объявленные на уровне класса стратегии...???
Спасибо:

IvanB

Фотография
Дата: 29.05.2013
Ответить


UsilaDobry Go to
IvanB Go to

в таком случае надо создавать два экземпляра серии свечей, с разными таймфреймами.

А так можно сделать для анализа в стратегии свечей разного таймфрейма?

Да, можно.
UsilaDobry Go to

Хорошо создал две серии, передал их в стратегию.


Но в стратегии мы обрабатываем одну серию в реальном времени

Или можем подписаться также на обработку свечей второй серии

А алгоритмы связать через переменные, объявленные на уровне класса стратегии...???

Да, так лучше всего, думаю.
Автор топика
Спасибо: UsilaDobry

pft_man

Фотография
Дата: 20.06.2013
Ответить


Добрый день. У меня такой вопрос. Немного изменил эту стратегию, логика работы таже, за исключением того, что расчёты происходят не по событию окончания свечки, а по событию изменения свечки. Как только цена достигает определённого уровня, регистрируется и отправляется ордер. С тестовым квиком всё работает, но с боевым квиком как только исполняется ордер (заключается сделка), сразу всё падает, появляется новое окно No Source Available и появляется вот такая ошибка. Причём ни на какую-то конкретную строку в коде она не указывает. Никак не могу разобраться, с чем это связано?
error.jpg 99 KB (1)
Спасибо:

IvanB

Фотография
Дата: 05.07.2013
Ответить


pft_man Go to
Добрый день. У меня такой вопрос. Немного изменил эту стратегию, логика работы таже, за исключением того, что расчёты происходят не по событию окончания свечки, а по событию изменения свечки. Как только цена достигает определённого уровня, регистрируется и отправляется ордер. С тестовым квиком всё работает, но с боевым квиком как только исполняется ордер (заключается сделка), сразу всё падает, появляется новое окно No Source Available и появляется вот такая ошибка. Причём ни на какую-то конкретную строку в коде она не указывает. Никак не могу разобраться, с чем это связано?


В Вашей стратегии встречается код:
Code

this.AddInfoLog("trailing-stop = {0}, current step = {1}, level = {3}",
                                 trailingStop.ToString(), currentStep.ToString(), level.ToString());

Ошибка, о которой Вы пишите возникает из за того, что не найдено значение {3} для строки форматирования. Т.е. у Вас три аргумента передается:
Code

trailingStop.ToString(), currentStep.ToString(), level.ToString()

а в строке форматирования требуется и четвертый элемент (индекс 3).

Чтобы код работал, нужно исправить строку форматирования (видимо, по ошибке вклинился индекс 3 в место 2), правильно так:
Code

this.AddInfoLog("trailing-stop = {0}, current step = {1}, level = {2}",
                                 trailingStop.ToString(), currentStep.ToString(), level.ToString());


И таких кусков кода у Вас несколько.
Автор топика
Спасибо: pft_man


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy