Видео-уроки:
Стратегии
[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();
}
}
}
Comentarios (26)
Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario
Добрый день. В каком-то одном из уроков (к сожалению не помню, в каком) вы говорили о том, что последнюю сделку можно брать из стакана. Можно об этом подробней с парой строков кода? Я правильно понимаю, что если эту сделку брать из стакана, то она быстрее придёт, чем по событию всех сделок, поскольку все сделки отправляются пакетами и соответственно есть задержка на формирование этого пакета?
Добрый день,
на Vimeo отсутствует видео "работа с котировками" https://vimeo.com/channels/mainstocksharp/59397647 Просьба добавить.
Видео добавлено
Так и не увидел, где добавленное видео.
При попытке открыть ссылку ничего не выдает.
Опять убрали???
Подтверждаю, видео появилось. Спасибо!
Добрый день.
Попробовал сделать третий урок первую часть - Стратегия.
После того как все сделал и запустил программу (на фьючерсах SIZ3), программа отказывалась выполнять сделки по купли и продаже.
Я решил скачать оригинал и попробовать запустить его. Оказалось скаченный оригинал отличается от урока (немного правда), но видимо что-то в нем было докручено под фьючерсы.
В результате стратегия стала покупать, однако отказывается выходить из сделки. Операция просто не выполняется:
И позиция с купленным фьючерсом продолжает висеть.
Подскажите пожалуйста:
В чем могут быть проблемы с ```csharp RegisterOrder(this.SellAtMarket());
Дело в том, что методы SellAtMarket и BuyAtMarket для фьючерсов используют цены, из столбцов МасимальнаяЦена и МинимальнаяЦена, для этого мы добавляем код:
И соответственно нужно добавить эти столбцы в Quik, что Вы не сделали, я предполагаю.
Еще есть вариант для получения маркет заявок - использовать расширенные методы SellAtMarketEx и BuyAtMarketEx, реализицию которых можно найти в проекте по пути (tfs): $/StockSharp Lessons/StockSharp.Edu/Additional/Algo/CommonStrategy
Иван,
Действительно замена BuyAtMarket на BuyAtLimit с ценой выставления превышающую BestAsk на несколько пунктов, изменило ситуацию. (аналогично с Sell)
Спасибо.
Возник еще один вопрос.
Правильно ли я понимаю что для фьючерсов не работает ClosePosition (закрытие открытых позиций)?
Есть ли аналог для фьючерсов или надо самому писать ? (Возможно просто перегрузить данный метод?)
Можно перегрузить метод, за основу взять реализацию метода, но переписать на SellAtMarketEx и BuyAtMarketEx.
https://stocksharp.codeplex.com/SourceControl/latest#Sources/Algo/Strategies/StrategyHelper.cs
При выполнении урока в момент вызова candlemanager.Start(candleseries)
ошибка {"Заданный аргумент находится вне диапазона допустимых значений.\r\nИмя параметра: min"} С чем это может быть связано? и что это вообще за параметр min? (в свойствах объектов CandleManager/CandleSeries/Security такой отсутствует)
В общем путем экспериментов установил что для TransaqTrader указанная выше ошибка не возникает, только для AlfaTrader.
Надо стек ошибки посмотреть. В каком-то диапазоне не верно указана левая граница, только это сейчас можно выявить из имеющейся информации.
Вот стек
System.ArgumentOutOfRangeException не обработано HResult=-2146233086 Message=Заданный аргумент находится вне диапазона допустимых значений. Имя параметра: min Source=Ecng.ComponentModel ParamName=min StackTrace: в Ecng.ComponentModel.Range
1.ValidateBounds(T min, T max) в Ecng.ComponentModel.Range1.Init(T min, T max) в Ecng.ComponentModel.Range`1..ctor(T min, T max) в StockSharp.Algo.Candles.CandleHelper.GetCandleBounds(TimeSpan timeFrame, DateTime currentTime, WorkingTime time) в StockSharp.Algo.Candles.CandleHelper.GetCandleBounds(TimeSpan timeFrame, DateTime currentTime, ExchangeBoard board) в StockSharp.Algo.Candles.CandleHelper.GetCandleBounds(TimeSpan timeFrame, Security security) в StockSharp.AlfaDirect.AlfaTrader.SubscribeCandles(CandleSeries series, DateTime from, DateTime to) в StockSharp.Algo.Candles.CandleManager.#=qMItUWtqqyxYV9eWUtO90aDhlD9POR4EPsQbWwGhMYSU=.#=qYfTpvUh_jC5dOKfp3oA$a$Vdsd0SvzCDXNDBrNjhXNm8y0N_S725XkJOiNmGVmlQbqWusBy_YGgt7iMjlsMuohgqhuSSw7olYEW7_ojgPDg=(CandleSeries #=qeXfORGiqD4X1Cbp9Je9U1A==, DateTime #=q1JcQ7uzX3vPwwrOdqkEouA==, DateTime #=qkxh3a7A69CubZ51Z$8WGAg==) в #=qdWC8DOndbS63yr7$WS97GpgXM4jJ2_pcgdHNKeXsN7j8Redf1iAVtJlNjy_cA0rszuybRYnmv1lBG8EMklOzzg==.#=qF_5wYMlMSSFtMdHs0xKGdA==() в StockSharp.Algo.Candles.CandleManager.Start(CandleSeries series, DateTime from, DateTime to) в StockSharp.Algo.Candles.CandleHelper.Start(ICandleManager manager, CandleSeries series) в SimpleStrategy.MainWindow.RunGetCandle(TimeSpan tf) в c:\Users\lsa\Documents\Visual Studio 2012\Projects\S# for traders\Lesson 3\SimpleStrategy\SimpleStrategy\MainWindow.xaml.cs:строка 86 в SimpleStrategy.MainWindow.ButtonBase_OnClick(Object sender, RoutedEventArgs e) в c:\Users\lsa\Documents\Visual Studio 2012\Projects\S# for traders\Lesson 3\SimpleStrategy\SimpleStrategy\MainWindow.xaml.cs:строка 114Версия API 4.2.1.7
Здравствуйте! На Vimeo отсутствует видео "Видео-уроки (экстра): Отслеживание сигналов по котировкам (00:09:50)" т.е. "работа с котировками" https://vimeo.com/channels/mainstocksharp/59397647 Просьба добавить.
Здравствуйте! Не увидел, где можно скачать проекты-коды из уроков.
http://stocksharp.com/forum/3885/TFS--proiekty--chaty--komandnaia-rabota/
С уроком 3 Логгирование есть проблемы:
Все уроки построены на версии S# 4.1.1.19, в то время как текущая ветка S# 4.2.x. В примерах используется StockSharp.TraderConnection.dll и StockSharp.WPFConnectionInterface.dll, которые основаны на ветке 4.1.x (и соответсвенно на BaseTrader вместо Connector). Даже если собрать .TraderConnection.dll и .WPFConnectionInterface.dll по урокам 1 и 2 самому, и заменить References, то возникают проблемы с запуском урока:
<mark>Огромная просьба как можно быстрее пересобрать .TraderConnection.dll и .WPFConnectionInterface.dll для ветки 4.2.x так как на них базируются все уроки, начиная с 3 </mark>
Возможно будут еще ошибки, но пока скомпилировать и запустить проект невозможно из-за текущих проблем. Очень жаль, так как урок классный, хотелось бы поиграть с разными настройками и посмотреть что можно сделать вне рамок данного урока
Также StockSharp.Xaml из ветки 4.2.x не подходит к примерам в уроках, нужно использовать только версию от 4.1.1.x
Мы уже переносим примеры на новую версию библиотеки. Совсем скоро они будут доступны на нашем сервере.
Господа, добрый день!
Из урока про дочерние стратегии пытаюсь просто повторить пример:
Ругается на конструкцию trades => trades.ForEach
Что не так сделано?
Ecng.Collections включен.
Библиотека - 4.2.18
Предлагаю общение в скайп перенести http://stocksharp.com/forum/4390/Tiekhpoddierzhka-v-Skype--Khoroshiie-novosti/ Сейчас только там все общаются. Кстати, вопрос задавали уже несколько раз этот.
Спасибо, Михаил
Подскажите кто-нибудь пытался запускать пример со стратегией stoploss и takeprofit ? Это из урока 3 часть 4 (TestingStrategy).
У меня почему-то эти стратегии не работают. Пишет в логе, что позиция защищена, но не срабатывает вообще ни stoploss ни takeprofit.
Работаю через Quick 7.2.1.5
Есть у кого-то похожие проблемы?