Урок 3. Все о создании стратегий.
Видео-уроки:Стратегии[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]
Темы занятия:Работа со стратегиями
- Изучение класса Stratеgy
- Использование Strategy Rule( Once,Sync,Exclusive и т.д..)
- Два примера стратегий с использованием практически всех, рассказанных до этого StrategyRule
StrategyRule
- Простые примеры StrategyRule
- Сделки
Логирование
- Как работать с логированием
- Графическое отображение информации
Дочерние стратегии
- Котирование
- Работа с тейк-профитом, стоплоссом и др. защитными стратегиями
- Создание своей собственной стратегии котирования
Запускаем стратегию в S#.Studio (будущее)
Домашнее задание:- Изучить визуальную панель для отображения сатистических параметров 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();
}
}
}