События NewCandles и CandlesChanged не происходят.


События NewCandles и CandlesChanged не происходят.
Atom Reply
7/27/2011


Я добавил в SampleConsole события NewCandles и CandlesChanged. Сделки совершаются, но эти события не вызываются.
Сразу кидаю код.


Code
namespace SampleConsole
{
	using System;
	using System.Linq;
	using System.Threading;

	using Ecng.Common;

	using StockSharp.BusinessEntities;
	using StockSharp.Quik;
	using StockSharp.Algo;
    using StockSharp.Algo.Candles;
    using StockSharp.Algo.Reporting;
    using StockSharp.Algo.Strategies;
	class Program
	{
        private readonly static TimeSpan _timeFrame = TimeSpan.FromMinutes(5);
		private static Security _lkoh;
		private static Portfolio _portfolio;
		private static MarketDepth _depth;
        private static CandleManager _candleManager;
		static void Main()
		{
			try
			{
				// для теста выбираем бумагу Лукойл
				const string secCode = "LKOH";

				var quikPath = QuikTerminal.GetDefaultPath();

				if (quikPath.IsEmpty())
				{
					Console.WriteLine("Не найден ни один запущенный Quik");
					return;
				}

				Console.WriteLine("Запущенный Quik найден по пути " + quikPath);

				Console.Write("Введите номер счета, через который будет выставлена заявка: ");
                var account = "1636";

				using (var waitHandle = new AutoResetEvent(false))
				{
					// создаем шлюз к Quik-у
					using (var trader = new QuikTrader(quikPath))
					{
						// необходимо раскомментировать, если идет работа с РТС Стандарт
						//trader.FormatTransaction += builder => builder.RemoveInstruction(TransactionBuilder.ExecutionCondition);

						// подписываемся на событие успешного подключения
						// все действия необходимо производить только после подключения
						trader.Connected += () =>
						{

                            _candleManager = new CandleManager(trader);
							Console.WriteLine("Подключение было произведено успешно.");

							// извещаем об успешном соединени
							waitHandle.Set();
						};

						Console.WriteLine("Производим подключение...");

						trader.Connect();

						// дожидаемся события об успешном соединении
						waitHandle.WaitOne();

						trader.NewPortfolios += portfolios =>
						{
							if (_portfolio == null)
							{
								// находим Лукойл и присваиваем ее переменной lkoh
								_portfolio = portfolios.FirstOrDefault(p => p.Name == account);

								if (_portfolio != null)
								{
									Console.WriteLine("Портфель {0} появился.", account);

									// если инструмент и стакан уже появились,
									// то извещаем об этом основной поток для выставления заявки
									if (_lkoh != null && _depth != null)
										waitHandle.Set();
								}
							}
						};
                        
                        

						// подписываемся на событие появление инструментов
						trader.NewSecurities += securities =>
						{
							if (_lkoh == null)
							{
								// находим Лукойл и присваиваем ее переменной lkoh
								_lkoh = securities.FirstOrDefault(sec => sec.Code == secCode);

								if (_lkoh != null)
								{
									Console.WriteLine("Инструмент Лукойл появился.");

									// запускаем экспорт стакана
									trader.RegisterQuotes(_lkoh);
                                    _candleManager.RegisterTimeFrameCandles(_lkoh, _timeFrame);
									if (_portfolio != null)
										waitHandle.Set();
								}
							}
						};

						// подписываемся на событие появления моих новых сделок
						trader.NewMyTrades += myTrades =>
						{
							foreach (var myTrade in myTrades)
							{
								var trade = myTrade.Trade;
								Console.WriteLine("Сделка {0} по цене {1} по бумаге {2} по объему {3} в {4}.", trade.Id, trade.Price, trade.Security.Code, trade.Volume, trade.Time);
							}
						};

						// подписываемся на событие обновления стакана
						trader.QuotesChanged += depths =>
						{
							if (_depth == null && _lkoh != null)
							{
								_depth = depths.FirstOrDefault(d => d.Security == _lkoh);

								if (_depth != null)
								{
									Console.WriteLine("Стакан Лукойла появился.");

									// если портфель уже появился, то извещаем об этом основной поток для выставления заявки
									if (_portfolio != null)
										waitHandle.Set();
								}
							}
						};

						Console.WriteLine("Дожидаемся появления в программе инструмента Лукойл и портфеля {0}...".Put(account));

                        
                        _candleManager.NewCandles += (token, candles) =>
                        {
                            Console.WriteLine("Событие NewCandles произошло");
                        };
                        _candleManager.CandlesChanged += (token, candles) => 
                        {
                            Console.WriteLine("Событие CandlesChanged произошло");
                        };
                        
						// запускаем экспорт по DDE
						trader.StartExport(trader.SecuritiesTable, trader.MyTradesTable, trader.EquityPositionsTable);

						// дожидаемся появления портфеля и инструмента
						waitHandle.WaitOne();

						// 0.1% от изменения цены
						const decimal delta = 0.001m;

						// запоминаем первоначальное значение середины спреда
						var firstMid = _lkoh.BestPair.SpreadPrice / 2;
						Console.WriteLine("Первоначальное значение середины спреда {0:0.##}", _lkoh.BestBid.Price + firstMid);

						while (true)
						{
							var mid = _lkoh.BestPair.SpreadPrice / 2;

							// если спред вышел за пределы нашего диапазона
							if	(
									((firstMid + firstMid * delta) <= mid) ||
									((firstMid - firstMid * delta) >= mid) ||(0==0)
								)
							{




								var order = new Order
								{
									Portfolio = _portfolio,
									Price = _lkoh.ShrinkPrice(_lkoh.BestBid.Price + mid),
									Security = _lkoh,
									Volume = 1,
									Direction = OrderDirections.Buy,
								};


								trader.RegisterOrder(order);
								Console.WriteLine("Заявка {0} зарегистрирована.", order.Id);

                                Thread.Sleep(1000);

                                try
                                {
                                    if (!order.IsMatched() && (order.State == OrderStates.Active))
                                        trader.CancelOrder(order);
                                }
                                catch (Exception ex)
                                {
                                    Console.WriteLine("Заявка не может быть снята");
                                }



							}
							else
								Console.WriteLine("Текущее значение середины спреда {0:0.##}", _lkoh.BestBid.Price + mid);

							// ждем 1 секунду
							Thread.Sleep(1000);

						}

						// останавливаем экспорт по DDE
						trader.StopExport(trader.SecuritiesTable, trader.MyTradesTable, trader.EquityPositionsTable);
					}
				}
			}
			catch (Exception ex)
			{
				Console.WriteLine(ex);
			}
            var getch = Console.ReadLine();
		}
     
	}
}

Tags:


Thanks:




12 Answers
Alexander

Avatar
Date: 7/27/2011
Reply


а что выводится в консоль?
Thanks:

paunov

Avatar
Date: 7/27/2011
Reply


Сначала то, что все инструменты и портфель появились, а потом идут Заявки подряд(с интервалом в пару секунд). "Заявка {0} зарегистрирована". И иногда "Заявка не может быть снята". (Если сделка уже свершилась, а я попытался снять). И в случае если сделка свершилась в консоль выводится "Сделка {0} по цене {1} по бумаге {2} по объему {3} в {4}.".
Topic starter
Thanks:

Alexander

Avatar
Date: 7/27/2011
Reply


paunov Go to
Сначала то, что все инструменты и портфель появились, а потом идут Заявки подряд(с интервалом в пару секунд). "Заявка {0} зарегистрирована". И иногда "Заявка не может быть снята". (Если сделка уже свершилась, а я попытался снять). И в случае если сделка свершилась в консоль выводится "Сделка {0} по цене {1} по бумаге {2} по объему {3} в {4}.".


Лучше из консоли скопировать, чтоб точно было.

Что выводит ProcessDataError?
Что возвращает RegisterTimeFrameCandles?
Версия S#?
Thanks:

paunov

Avatar
Date: 7/27/2011
Reply


Добавил распечатку RegisterTimeFrameCandles
Версия C# 3.2.5
Ошибок вроде никаких.
вот консоль
Quote:

Запущенный Quik найден по пути C:\Program Files\Quik-Zerich\info.exe
Введите номер счета, через который будет выставлена заявка: Производим подключе
ие...
Подключение было произведено успешно.
Дожидаемся появления в программе инструмента Лукойл и портфеля 1636...
Инструмент Лукойл появился.
Стакан Лукойла появился.
TimeFrameCandle LKOH@EQBR 00:05:00
Портфель 1636 появился.
Первоначальное значение середины спреда 1862,25
Заявка 442774 зарегистрирована.
Заявка 442810 зарегистрирована.
Заявка 442838 зарегистрирована.
Заявка 442895 зарегистрирована.
Заявка 442948 зарегистрирована.
Заявка 442991 зарегистрирована.
Заявка 443021 зарегистрирована.
Заявка 443048 зарегистрирована.
Заявка 443096 зарегистрирована.
Заявка 443121 зарегистрирована.
Заявка 443141 зарегистрирована.
Заявка 443162 зарегистрирована.
Заявка 443209 зарегистрирована.
Заявка 443227 зарегистрирована.
Заявка 443244 зарегистрирована.
Заявка 443277 зарегистрирована.
Заявка 443300 зарегистрирована.
Заявка 443353 зарегистрирована.
Заявка 443368 зарегистрирована.
Заявка 443451 зарегистрирована.
Заявка 443474 зарегистрирована.
Заявка 443538 зарегистрирована.
Заявка 443744 зарегистрирована.
Заявка 444355 зарегистрирована.
Заявка 444578 зарегистрирована.
Сделка 217243 по цене 1861 по бумаге LKOH по объему 1 в 27.07.2011 18:00:08.
Заявка 444660 зарегистрирована.
Заявка 444909 зарегистрирована.
Заявка 445119 зарегистрирована.
Заявка 445210 зарегистрирована.
Заявка 445411 зарегистрирована.
Заявка 445476 зарегистрирована.
Заявка 445569 зарегистрирована.
Заявка 445679 зарегистрирована.
Заявка 445713 зарегистрирована.
Заявка 445762 зарегистрирована.

Topic starter
Thanks:

Alexander

Avatar
Date: 7/27/2011
Reply


Свечки строятся по потоку всех сделок инструмента
Thanks:

paunov

Avatar
Date: 7/27/2011
Reply


Мне нужно получать информацию о свечках.
В коде (141-150 строчки) еcть свечные события.
Я планирую получать значения свечек через них.
Но как видно из распечатки консоли они не происходят.
Как преодолеть эту проблему?
Спасибо!
Topic starter
Thanks:

Alexander

Avatar
Date: 7/27/2011
Reply


paunov Go to
Мне нужно получать информацию о свечках.
В коде (141-150 строчки) еcть свечные события.
Я планирую получать значения свечек через них.
Но как видно из распечатки консоли они не происходят.
Как преодолеть эту проблему?
Спасибо!



Я ведь ответил:
Свечки строятся по потоку всех сделок инструмента

У вас экспорт таблицы всех сделок не стартует => откуда изволите получать информацию для построения свечек? :)
Thanks: paunov

paunov

Avatar
Date: 7/27/2011
Reply


Прошу прощения, с первого раза не понял)
а как называется таблица всех сделок?
я так понял, что просто должен ее в "trader.StartExport(trader.SecuritiesTable, trader.MyTradesTable, trader.EquityPositionsTable);" вставить)
Спасибо огромное!
Topic starter
Thanks:

Alexander

Avatar
Date: 7/27/2011
Reply


paunov Go to
Прошу прощения, с первого раза не понял)
а как называется таблица всех сделок?
я так понял, что просто должен ее в "trader.StartExport(trader.SecuritiesTable, trader.MyTradesTable, trader.EquityPositionsTable);" вставить)
Спасибо огромное!


TradesTable
или просто trader.StartExport(); - все таблицы стартуют
Thanks:

paunov

Avatar
Date: 7/27/2011
Reply


Спасибо! Все заработало!
Topic starter
Thanks:

paunov

Avatar
Date: 7/30/2011
Reply


Возник еще один вопрос. Как в данный код внедрить стратегию SmaStrategy?
Я перед циклом вставляю следующее

Code

  _strategy = new SmaStrategy(_candleManager, new Sma(80), new Sma(10), _timeFrame)
                        {
                            Volume = 1,
                            Portfolio = _portfolio,
                            Security = _lkoh,
                            Trader = trader,

                        };


                      
                        _strategy.Start();


но стратегия не работает.
Спасибо! Прошу прощения за много глупых вопросов.
Topic starter
Thanks:

Alexander

Avatar
Date: 7/30/2011
Reply


посмотрите SampleSma - как раз пример запуска стратегии
Thanks:


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

loading
clippy