Получение стакана Фортс.
Atom
10.02.2012
wkj


Продолжаю ковырять SampleConsole, и столкнулся я вот с этим "Если код и класс инструмента содержат символ @, то рекомендуется поменять разделитель на другой символ через свойство SecurityIdGenerator..::..Delimiter у BaseTrader..::..SecurityIdGenerator. " , а как сие применить примера нема.В общем нужно получить стакан srh2@rts в sampleconsole.Может кто кусок кода кинет по теме?

Теги:


Спасибо:


< 1 2 3 
Moadip

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


Поставьте демо квик(закажите доступ на сайте квик). Сначала будет только ММВБ. Потом дня через два подключат фортс.
Проверьте как работает оригинальный пример SampleConsole, чтобы исключить ошибки на начальном этапе.
Спасибо:

Mikhail Sukhov

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


Moadip
Поставьте демо квик(закажите доступ на сайте квик). Сначала будет только ММВБ. Потом дня через два подключат фортс.
Проверьте как работает оригинальный пример SampleConsole, чтобы исключить ошибки на начальном этапе.


Тестировать нагляднее лучше на Sample. Но понять его сложнее.
Спасибо:

wkj

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


Сейчас попробовал после загрузки консоли до "Портфель ХХХ получен"(здесь у меня всё и встаёт)вывеси стакан вручную и получил "Не удалось установить DDЕ соединение с сервером 'wrapper'.Либо не запущен 'стакан', либо в него не загружен лист 'SRH2@RTS'. Таблица 'SRH2@RTS'". Неужели все это действительно работает [cursing] ?
Verifier говорит ок. Ну и код еще раз на всякий.
Код

namespace SampleConsole
{
	using System;
	using System.Linq;
	using System.Threading;
	using Ecng.Common;
        using StockSharp.BusinessEntities;
	using StockSharp.Quik;
	using StockSharp.Algo;

	class Program
	{
		private static Security _SRH2;
		private static Portfolio _portfolio;
		private static MarketDepth _depth;
        static void Main()
		{
			try
			{
				// для теста выбираем бумагу SRH2
				const string secCode = "SRH2";

				var quikPath = QuikTerminal.GetDefaultPath();

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

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

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

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

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

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

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

						trader.Connect();

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

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

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

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

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

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

									// запускаем экспорт стакана
                                    trader.RegisterQuotes(_SRH2);

									if (_portfolio != null && _depth != 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 && _SRH2 != null)
							{
                                _depth = depths.FirstOrDefault(d => d.Security == _SRH2);

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

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

						Console.WriteLine("Дожидаемся появления в программе инструмента SRH2 и портфеля {0}...".Put(account));
                       // запускаем экспорт по DDE
					//trader.StartExport();     
                    trader.StartExport(trader.SecuritiesTable, trader.MyTradesTable, trader.EquityPositionsTable,
           trader.EquityPortfoliosTable, trader.OrdersTable, trader.DerivativePositionsTable, trader.DerivativePortfoliosTable);

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

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

						// запоминаем первоначальное значение середины спреда
                        var firstMid = _SRH2.BestPair.SpreadPrice / 2;
                        if (_SRH2.BestBid == null)
							throw new Exception("Нет лучшего бида для котировки.");

                        Console.WriteLine("Первоначальное значение середины спреда {0:0.##}", _SRH2.BestBid.Price + firstMid);

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

							// если спред вышел за пределы нашего диапазона
							if	(
									((firstMid + firstMid * delta) <= mid) ||
									((firstMid - firstMid * delta) >= mid)
								)
							{
								var order = new Order
								{
									Portfolio = _portfolio,
                                    Price = _SRH2.ShrinkPrice(_SRH2.BestBid.Price + mid),
                                    Security = _SRH2,
									Volume = 1,
									Direction = OrderDirections.Buy,
								};
								trader.RegisterOrder(order);
								Console.WriteLine("Заявка {0} зарегистрирована.", order.Id);
								break;
							}
							else
                                Console.WriteLine("Текущее значение середины спреда {0:0.##}", _SRH2.BestBid.Price + mid);

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

						// останавливаем экспорт по DDE
                   // trader.StopExport();
                
                        trader.StopExport(trader.SecuritiesTable, trader.MyTradesTable, trader.EquityPositionsTable,
              trader.EquityPortfoliosTable, trader.OrdersTable, trader.DerivativePositionsTable, trader.DerivativePortfoliosTable);
                    
                
                      }
                    
                      
				}
			}
			catch (Exception ex)
			{
				Console.WriteLine(ex);
			}
		}
	}
}
Спасибо:

wkj

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


Докладываю на случай появления розовых с моего юзерпика. В квик был подгружен приложенный к библиотеке ванд и на этом настройку я посчитал законченной(прочитав это Данный файл уже содержит настройки программы Quik, и не требуется самостоятельная настройка таблиц ) не добавив свой любимый сбер в таблицу инструменты. Теперь все работает и даже удалось рубль заработать[biggrin]. В документацию стоит добавить что самостоятельно придется добавить торгуемые инструменты.
Спасибо:

Algonavt

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


Добрый день!

Пробую получать данные по инструменту как "RIM2" - ничего. Если имя инструмента задать как "RTS-6.12", все работает.

Для инструментов ММВБ такой проблемы нет - поиск по LKOH, SBER, SBERP и другим результат дает исправно (экспорт по DDE запускается, стакан появляется).

Как побороть?
Спасибо:

Zyanov

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


Algonavt
Добрый день!
Если имя инструмента задать как "RTS-6.12", все работает.
Как побороть?

У некоторых брокеров инструменты фортс имеют такие названия, если все работает может оставить так?
Спасибо:

Кот Матроскин

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


Zyanov
Algonavt
Добрый день!
Если имя инструмента задать как "RTS-6.12", все работает.
Как побороть?

У некоторых брокеров инструменты фортс имеют такие названия, если все работает может оставить так?

Странно, должно быть RIM2
Спасибо:
< 1 2 3 

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

loading
clippy