Урок 3. Все о создании стратегий.

Урок 3. Все о создании стратегий.
Atom
5/1/2013
IvanB


Видео-уроки:

Стратегии

[vk]http://vk.com/video_ext.php?oid=-66650972&id=167470523&hash=4b8b00e53a5b7a38&hd=3[/vk]

StrategyRule

[vk]http://vk.com/video_ext.php?oid=-66650972&id=167470520&hash=5a7de43868bcb7bc&hd=3[/vk]

Логирование

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

Дочерние стратегии

[vk]http://vk.com/video_ext.php?oid=-66650972&id=167470334&hash=8beb60d403b41756&hd=3[/vk]

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

Работа со стратегиями

  1. Изучение класса Stratеgy
  2. Использование Strategy Rule( Once,Sync,Exclusive и т.д..)
  3. Два примера стратегий с использованием практически всех, рассказанных до этого StrategyRule StrategyRule
  4. Простые примеры StrategyRule
  5. Сделки Логирование
  6. Как работать с логированием
  7. Графическое отображение информации Дочерние стратегии
  8. Котирование
  9. Работа с тейк-профитом, стоплоссом и др. защитными стратегиями
  10. Создание своей собственной стратегии котирования Запускаем стратегию в S#.Studio (будущее)

Домашнее задание:

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

Полезные ссылки: Класс Strategy Дочерние стратегии Логирование

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

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

Проект StrategyRules Файл Signal.cs

В начало метода ProcessQuotes следует добавить проверку:


            if (NeededVolume <= 0)
                return;

это связано с тем, что метод: marketDepth.GetTheoreticalTrades(OrderDirections.Sell, NeededVolume) требует не нуливого объема, а в нашем случае получается следующее, мы создаем объект класса Signal, и в конструкторе подписываемся на получение новых котировок, и только потом указываем значение свойства NeededVolume, и до того как мы указали значение в NeededVolume может прийти котировка и метод: marketDepth.GetTheoreticalTrades(OrderDirections.Sell, NeededVolume) сгенерирует ошибку, т.к. значение свойства NeededVolume будет равно нулю.

Было:


        private void ProcessQuotes(IEnumerable<MarketDepth> marketDepths)
        {
            lock (_locker)
            {
                foreach (var marketDepth in marketDepths.Where(m => m.Security == Security))
                {
                    if (!marketDepth.Bids.Any() || !marketDepth.Asks.Any()) return;
                    //Суммарный объем
                    _bid.SumVolumes = marketDepth.TotalBidsVolume;
                    _ask.SumVolumes = marketDepth.TotalAsksVolume;
                    //сам сигнал
                    if (_bid.SumVolumes > _ask.SumVolumes)
                    {
                        _bid.Name = "Buy";
                        _ask.Name = "";
                    }
                    else
                    {
                        _bid.Name = "";
                        _ask.Name = "Sell";
                    }
                    //находим среднюю цену исполнения стакана
                    _bid.AverageMarketPrice = marketDepth.GetTheoreticalTrades(OrderDirections.Sell, NeededVolume).Average(t => t.Trade.Price);//.GetAveragePrice(OrderDirections.Sell, NeededVolume);
                    _ask.AverageMarketPrice = marketDepth.GetTheoreticalTrades(OrderDirections.Buy, NeededVolume).Average(t => t.Trade.Price);
                    //присваиваем лучшую цену
                    _bid.BestPrice = marketDepth.BestBid.Price;
                    _ask.BestPrice = marketDepth.BestAsk.Price;
                    //находим максимальный объем и цену у него 
                    var maxbidvolume = marketDepth.Bids.Max(s => s.Volume);
                    _bid.MaxVolume = maxbidvolume;
                    _bid.Price = marketDepth.Bids.FirstOrDefault(b => b.Volume == maxbidvolume).Price;

                    var maxaskvolume = marketDepth.Asks.Max(s => s.Volume);
                    _ask.MaxVolume = maxaskvolume;
                    _ask.Price = marketDepth.Asks.FirstOrDefault(b => b.Volume == maxaskvolume).Price;
                    //зажигаем событие
                    OnQuotesChanged();
                }
            }
        }

Стало:


        private void ProcessQuotes(IEnumerable<MarketDepth> marketDepths)
        {
            if (NeededVolume <= 0)
                return;

            lock (_locker)
            {
                foreach (var marketDepth in marketDepths.Where(m => m.Security == Security))
                {
                    if (!marketDepth.Bids.Any() || !marketDepth.Asks.Any()) return;
                    //Суммарный объем
                    _bid.SumVolumes = marketDepth.TotalBidsVolume;
                    _ask.SumVolumes = marketDepth.TotalAsksVolume;
                    //сам сигнал
                    if (_bid.SumVolumes > _ask.SumVolumes)
                    {
                        _bid.Name = "Buy";
                        _ask.Name = "";
                    }
                    else
                    {
                        _bid.Name = "";
                        _ask.Name = "Sell";
                    }
                    //находим среднюю цену исполнения стакана
                    _bid.AverageMarketPrice = marketDepth.GetTheoreticalTrades(OrderDirections.Sell, NeededVolume).Average(t => t.Trade.Price);//.GetAveragePrice(OrderDirections.Sell, NeededVolume);
                    _ask.AverageMarketPrice = marketDepth.GetTheoreticalTrades(OrderDirections.Buy, NeededVolume).Average(t => t.Trade.Price);
                    //присваиваем лучшую цену
                    _bid.BestPrice = marketDepth.BestBid.Price;
                    _ask.BestPrice = marketDepth.BestAsk.Price;
                    //находим максимальный объем и цену у него 
                    var maxbidvolume = marketDepth.Bids.Max(s => s.Volume);
                    _bid.MaxVolume = maxbidvolume;
                    _bid.Price = marketDepth.Bids.FirstOrDefault(b => b.Volume == maxbidvolume).Price;

                    var maxaskvolume = marketDepth.Asks.Max(s => s.Volume);
                    _ask.MaxVolume = maxaskvolume;
                    _ask.Price = marketDepth.Asks.FirstOrDefault(b => b.Volume == maxaskvolume).Price;
                    //зажигаем событие
                    OnQuotesChanged();
                }
            }
        }




Thanks:


< 1 2 3 
devruss

Avatar
Date: 2/9/2014
Reply


Также StockSharp.Xaml из ветки 4.2.x не подходит к примерам в уроках, нужно использовать только версию от 4.1.1.x

Thanks:

Валентин Мирошниченко

Avatar
Date: 2/9/2014
Reply


Мы уже переносим примеры на новую версию библиотеки. Совсем скоро они будут доступны на нашем сервере.

Thanks:

andy_baka

Avatar
Date: 9/3/2014
Reply


Господа, добрый день!

Из урока про дочерние стратегии пытаюсь просто повторить пример:

        _order.WhenNewTrades().Do(trades => trades.ForEach(t =>
            {
                var stoploss = new StopLossStrategy(t, 5);
                ChildStrategies.Add(stoploss);

            })).Apply(this);

Ругается на конструкцию trades => trades.ForEach

Что не так сделано?

Ecng.Collections включен.

Библиотека - 4.2.18

Thanks:

Mikhail Sukhov

Avatar
Date: 9/3/2014
Reply


Предлагаю общение в скайп перенести http://stocksharp.com/forum/4390/Tiekhpoddierzhka-v-Skype--Khoroshiie-novosti/ Сейчас только там все общаются. Кстати, вопрос задавали уже несколько раз этот.

Thanks:

andy_baka

Avatar
Date: 9/3/2014
Reply


Спасибо, Михаил

Thanks:

Николай

Avatar
Date: 7/15/2016
Reply


Подскажите кто-нибудь пытался запускать пример со стратегией stoploss и takeprofit ? Это из урока 3 часть 4 (TestingStrategy).

У меня почему-то эти стратегии не работают. Пишет в логе, что позиция защищена, но не срабатывает вообще ни stoploss ни takeprofit.

Работаю через Quick 7.2.1.5

Есть у кого-то похожие проблемы?

Thanks:
< 1 2 3 

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy