События NewCandles и CandlesChanged не происходят.
Atom Ответить
27.07.2011


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


Код
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();
		}
     
	}
}

Теги:


Спасибо:



Скидка 15% на все продукты до 5 апреля (осталось 3 дней).

12 Ответов
Alexander

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


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

paunov

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


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

Alexander

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


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


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

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

paunov

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


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

Запущенный 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 зарегистрирована.

Автор топика
Спасибо:

Alexander

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


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

paunov

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


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

Alexander

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


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



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

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

paunov

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


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

Alexander

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


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


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

paunov

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


Спасибо! Все заработало!
Автор топика
Спасибо:

paunov

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


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

Код

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

                        };


                      
                        _strategy.Start();


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

Alexander

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


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


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

loading
clippy