esper
|
Дата: 14.05.2013
Как воспроизвести?
|
|
|
|
longtrades
|
Дата: 14.05.2013
Пока не знаю из-за чего ошибка :( Может какойто уровень лога повыше поможет разобраться ?
может из-за этой ошибки у меня не отменяються ордера и висят активными в Трейдере ?
но ошибка появляется еще до начала выставления и снятия заявок :(
|
Автор топика
|
|
|
longtrades
|
Дата: 14.05.2013
|
|
|
|
Ошибка появляется сразу после :
_trader.RegisterMarketDepth(Sec);
вот:
2013/05/14 11:19:07.401| |QuikTrader|Экспорт запущен. 2013/05/14 11:19:16.509|Error |QuikTrader|System.InvalidOperationException: Priority queue is empty at Ecng.Collections.PriorityQueue`2.Peek() at Ecng.Collections.PriorityQueue`2.PeekValue() at StockSharp.Algo.Testing.MarketEmulator.#=qs79PTBWoBFuRx8Q2yrv5adgu4HB4C8yklBG_NoWJcqY=.#=q5OvkGwWOHSKoy$qfYt6cNg==() at StockSharp.Algo.Testing.MarketEmulator.Emulate(Message msg) at StockSharp.Algo.Testing.MarketEmulator.UpdateQuotes(MarketDepth marketDepth, MarketDepth delta) at StockSharp.Algo.Testing.RealTimeEmulationTrader`1.#=qzDfzsZDU5Gz7JvAOX_Z4QRgGyGyywkTFxgtASVcbd0M=(IEnumerable`1 #=qut1NpOdjYCX2CJaEhX1aVg==) at Ecng.Common.DelegateHelper.SafeInvoke[T](Action`1 handler, T arg) at Ecng.ComponentModel.EventsContainer`1.Raise(IEnumerable`1 items) 2013/05/14 11:19:16.509|Error |QuikTrader|System.InvalidOperationException: Priority queue is empty at Ecng.Collections.PriorityQueue`2.Peek() at Ecng.Collections.PriorityQueue`2.PeekValue() at StockSharp.Algo.Testing.MarketEmulator.#=qs79PTBWoBFuRx8Q2yrv5adgu4HB4C8yklBG_NoWJcqY=.#=q5OvkGwWOHSKoy$qfYt6cNg==() at StockSharp.Algo.Testing.MarketEmulator.Emulate(Message msg) at StockSharp.Algo.Testing.MarketEmulator.UpdateQuotes(MarketDepth marketDepth, MarketDepth delta) at StockSharp.Algo.Testing.RealTimeEmulationTrader`1.#=qzDfzsZDU5Gz7JvAOX_Z4QRgGyGyywkTFxgtASVcbd0M=(IEnumerable`1 #=qut1NpOdjYCX2CJaEhX1aVg==) at Ecng.Common.DelegateHelper.SafeInvoke[T](Action`1 handler, T arg) at Ecng.ComponentModel.EventsContainer`1.Raise(IEnumerable`1 items) 2013/05/14 11:19:16.509|Error |QuikTrader|System.ArgumentException: Новое событие MarketDepth, T=12:19:16.471Бид 1970 2/Оффер 1990 20(1) имеет дату более раннюю, чем текущее время эмулятора 14.05.2013 12:19:16. Parameter name: message at StockSharp.Algo.Testing.MarketEmulator.#=qzpj$x3Te7dhB7R4FsKcXgw==(Message #=qtJKTkjNOI_BSH$I1woquYw==) at StockSharp.Algo.Testing.MarketEmulator.EnqueueMessage(Message message) at StockSharp.Algo.Testing.MarketEmulator.Emulate(Message msg) at StockSharp.Algo.Testing.MarketEmulator.UpdateQuotes(MarketDepth marketDepth, MarketDepth delta) at StockSharp.Algo.Testing.RealTimeEmulationTrader`1.#=qzDfzsZDU5Gz7JvAOX_Z4QRgGyGyywkTFxgtASVcbd0M=(IEnumerable`1 #=qut1NpOdjYCX2CJaEhX1aVg==) at Ecng.Common.DelegateHelper.SafeInvoke[T](Action`1 handler, T arg) at Ecng.ComponentModel.EventsContainer`1.Raise(IEnumerable`1 items) 2013/05/14 11:19:25.334| |QuikTrader|Экспорт остановлен.
Такие ошибки тоже выскакивают постоянно: : Новое событие MarketDepth, T=12:19:16.471Бид 1970 2/Оффер 1990 20(1) имеет дату более раннюю, чем текущее время эмулятора 14.05.2013 12:19:16.
|
Автор топика
|
|
|
longtrades
|
Дата: 14.05.2013
|
|
|
|
Почему время ємулятора постоянно отстает ? Постоянно такое пишет:
2013/05/14 12:24:07.990|Error |QuikTrader|System.ArgumentException: Новое событие Changed,T=14:24:07.812,47855496/1270 Продажа Цена=8070 Объем=1 Сост=Done Бал=1 имеет дату более раннюю, чем текущее время эмулятора 14.05.2013 13:24:07. Parameter name: message at StockSharp.Algo.Testing.MarketEmulator.#=qzpj$x3Te7dhB7R4FsKcXgw==(Message #=qtJKTkjNOI_BSH$I1woquYw==) at StockSharp.Algo.Testing.MarketEmulator.#=qnWK1AT0RAi$1GUZuQlgTOQihLsAS3JKusmAdSX5HniA=(Message #=q8zwQ2rFCa4DFOfcAfCBgmg==) at StockSharp.Algo.Testing.MarketEmulator.#=qzbQwtxUJhdiGR3wnszAnFrDpBbrnHhHbSyDrN6bGBiM=() at StockSharp.Algo.Testing.MarketEmulator.#=qlA1EdkS6ZZmWy5hZ0x$pEITVZr2jLC7e9PLeF3dVQ88=() at StockSharp.Algo.Testing.MarketEmulator.set_CurrentTime(DateTime value) at StockSharp.Algo.Testing.MarketEmulator.Emulate(Message msg) at StockSharp.Algo.Testing.MarketEmulator.UpdateQuotes(MarketDepth marketDepth, MarketDepth delta) at StockSharp.Algo.Testing.RealTimeEmulationTrader`1.#=qzDfzsZDU5Gz7JvAOX_Z4QRgGyGyywkTFxgtASVcbd0M=(IEnumerable`1 #=qut1NpOdjYCX2CJaEhX1aVg==) at Ecng.Common.DelegateHelper.SafeInvoke[T](Action`1 handler, T arg) at Ecng.ComponentModel.EventsContainer`1.Raise(IEnumerable`1 items)
|
Автор топика
|
|
|
esper
|
Дата: 14.05.2013
|
|
|
|
longtrades
|
Дата: 14.05.2013
|
|
|
|
Вот: Code
try
{
// для теста выбираем бумагу Лукойл
const string secCode = "LKOH";
var quikPath = QuikTerminal.GetDefaultPath();
/*if (quikPath.IsEmpty())
{
Console.WriteLine("Не найден ни один запущенный Quik");
return;
}*/
Console.WriteLine("Запущенный Quik найден по пути " + quikPath);
var account = "59072";
using (var waitHandle = new AutoResetEvent(false))
{
Portfolio _portfolio = null;
ITrader _trader;
QuikTrader trader;
DdeCustomTable _table;
// создаем шлюз к Quik-у
trader = new QuikTrader(quikPath);
using (_trader = new RealTimeEmulationTrader(trader))
{
_trader.LogLevel = LogLevels.Info;
var lm = new LogManager();
lm.Sources.Add(_trader);
lm.Sources.Add(trader);
lm.Listeners.Add(new FileLogListener("log.txt"));
// подписываемся на событие успешного подключения
// все действия необходимо производить только после подключения
_trader.Connected += () =>
{
Console.WriteLine("Подключение было произведено успешно.");
// извещаем об успешном соединени
waitHandle.Set();
};
Console.WriteLine("Производим подключение...");
_trader.Connect();
// дожидаемся события об успешном соединении
waitHandle.WaitOne();
_trader.NewPortfolios += portfolios =>
{
};
// подписываемся на событие появление инструментов
_trader.NewSecurities += securities =>
{
foreach (var sec in securities)
{
trader.RegisterMarketDepth(sec);
}
};
// подписываемся на событие обновления стакана
_trader.MarketDepthsChanged += depths =>
{
};
// запускаем экспорт по DDE
_trader.StartExport();
// дожидаемся появления портфеля и инструмента
waitHandle.WaitOne();
Console.ReadLine();
// останавливаем экспорт по DDE
_trader.StopExport();
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
|
Автор топика
|
|
|
esper
|
Дата: 14.05.2013
Code
_trader.RegisterMarketDepth(sec);
P.s. для исходников есть специальные теги [ code=csharp ][ /code ]
|
|
|
|
longtrades
|
Дата: 14.05.2013
|
|
|
|
Ошибка начинает сыпаться в логи после: Code
ITrader _trader;
QuikTrader trader;
DdeCustomTable _table;
// создаем шлюз к Quik-у
trader = new QuikTrader(quikPath);
using (_trader = new RealTimeEmulationTrader(trader)
почему так делаю , потому что мне нужны дополнительные поля которые я могу прописать только к Квик трейдеру :( , а к мулятору нет Code
trader = new QuikTrader(quik_path);
trader.CancelOrderInstantly = true;
trader.SupportManualOrders = false;
// изменяем метаданные так, чтобы начали обрабатывать дополнительные колонки опционов
var columns = trader.SecuritiesTable.Columns;
columns.Add(DdeSecurityColumns.Strike);
columns.Add(DdeSecurityColumns.ImpliedVolatility);
columns.Add(DdeSecurityColumns.UnderlyingSecurity);
columns.Add(DdeSecurityColumns.TheorPrice);
columns.Add(DdeSecurityColumns.OptionType);
columns.Add(DdeSecurityColumns.ExpiryDate);
columns.Add(DdeSecurityColumns.OpenPositions);
columns.Add(DdeSecurityColumns.MinStepPrice);
// new
var columns1 = trader.DerivativePortfoliosTable.Columns;
columns1.Add(DdeDerivativePortfolioColumns.PlannedPositionsPrice);
columns1.Add(DdeDerivativePortfolioColumns.ACI);
columns1.Add(DdeDerivativePortfolioColumns.MarketCommission);
trader.ReConnectionSettings.Interval = TimeSpan.FromSeconds(10);
_trader = new RealTimeEmulationTrader<QuikTrader>(trader);
|
Автор топика
|
|
|
esper
|
Дата: 14.05.2013
Регистрируйте стаканы в эмуляторе, а на напрямую в квике.
|
|
|
|
longtrades
|
Дата: 14.05.2013
Я так и делал : Code
trader.RegisterMarketDepth(sec); // (QuikTrader )
попробовал Code
_trader.RegisterMarketDepth(sec); // RealTimeEmulationTrader
ничего не изменилось , та же ошибка. Насколько я понял ошибку выдает не RealTimeEmulationTrader , а QuikTrader потому как убираю строку : и в логах уже нет этой ошибки.
|
Автор топика
|
|
|
esper
|
Дата: 14.05.2013
А какую версию используете? У меня код из вашего сообщения никаких ошибок не выдает.
|
|
|
|
longtrades
|
Дата: 14.05.2013
|
Автор топика
|
|
|
longtrades
|
Дата: 14.05.2013
|
|
|
|
Вот еще провел експеремент с _trader.CancelOrder , заявки не снимаються а остаются висеть активными : Код: Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using Ecng.Common;
using StockSharp.Quik;
using StockSharp.BusinessEntities;
using StockSharp.Logging;
using StockSharp.Algo.Testing;
namespace ConsoleApplication1
{
class Program
{
Portfolio _account = new Portfolio();
static void Main(string[] args)
{
try
{
// для теста выбираем бумагу Лукойл
const string secCode = "LKOH";
var quikPath = QuikTerminal.GetDefaultPath();
/*if (quikPath.IsEmpty())
{
Console.WriteLine("Не найден ни один запущенный Quik");
return;
}*/
Console.WriteLine("Запущенный Quik найден по пути " + quikPath);
var account = "59072";
using (var waitHandle = new AutoResetEvent(false))
{
Portfolio _portfolio = new Portfolio();;
//ITrader _trader;
QuikTrader trader;
DdeCustomTable _table;
// создаем шлюз к Quik-у
trader = new QuikTrader(quikPath);
using (var _trader = new RealTimeEmulationTrader(trader))
{
_trader.LogLevel = LogLevels.Info;
var lm = new LogManager();
lm.Sources.Add(_trader);
lm.Sources.Add(trader);
lm.Listeners.Add(new FileLogListener("log.txt"));
// подписываемся на событие успешного подключения
// все действия необходимо производить только после подключения
_trader.Connected += () =>
{
Console.WriteLine("Подключение было произведено успешно.");
// извещаем об успешном соединени
waitHandle.Set();
};
Console.WriteLine("Производим подключение...");
_trader.Connect();
// дожидаемся события об успешном соединении
waitHandle.WaitOne();
_trader.NewPortfolios += portfolios =>
{
};
// подписываемся на событие появление инструментов
_trader.NewSecurities += securities =>
{
foreach (var sec in securities)
{
_trader.RegisterMarketDepth(sec);
}
var Sec = securities.Where(x => x.Code == "RIM3").FirstOrDefault();
for (int i = 0; i < 10; i++)
{
var ord = new Order();
ord.Security = Sec;
ord.Portfolio = _portfolio;
ord.Trader = _trader;
ord.Direction = OrderDirections.Buy;
ord.Price = Sec.LastTrade.Price - 1000;
ord.Volume = 1;
_trader.RegisterOrder(ord);
System.Threading.Thread.Sleep(5 * 1000);
_trader.CancelOrder(ord);
}
System.Threading.Thread.Sleep(10 * 1000);
var b = 0;
};
// подписываемся на событие обновления стакана
_trader.MarketDepthsChanged += depths =>
{
};
// запускаем экспорт по DDE
_trader.StartExport();
// дожидаемся появления портфеля и инструмента
waitHandle.WaitOne();
Console.ReadLine();
// останавливаем экспорт по DDE
_trader.StopExport();
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
}
и Активные ордеда в трейдере : + лог - файл
|
Автор топика
|
|
|
longtrades
|
Дата: 14.05.2013
Включил : Code
_trader.LogLevel = LogLevels.Debug;
trader.LogLevel = LogLevels.Debug;
вот лог. Плюс во время исполнения вsскочило вот такое сообщение:
|
Автор топика
|
|
|
Иван З.
|
Дата: 14.05.2013
Если не секрет,у вас с Москвой во времени сколько разница?
|
|
|
|
esper
|
Дата: 14.05.2013
longtrades  Вот еще провел експеремент с _trader.CancelOrder , заявки не снимаються а остаются висеть активными По заявкам будет фикс.
|
|
|
|
longtrades
|
Дата: 14.05.2013
Иван З.  Если не секрет,у вас с Москвой во времени сколько разница? Разница в -1 час , но я что-то сомневають что проблема в разнице во времени. Хотя время сервера квик -1 час ко времени в таблице всех сделок. я пробовал сделать: Code
LoggingHelper.SyncMarketTime(10000);
LoggingHelper.NowOffset = new TimeSpan(-1, 0, 0);
мои трейды приходят в тоже время что и транслируються все тейды с биржы , но те же ошыбки и далее прут.
|
Автор топика
|
|
|
Иван З.
|
Дата: 14.05.2013
Я к тому, что в логе интересное время Quote:2013/05/14 12:24:07.990|Error |QuikTrader|System.ArgumentException: Новое событие Changed,T=14:24:07.812,47855496/1270 Продажа Цена=8070 Объем=1 Сост=Done Бал=1 имеет дату более раннюю, чем текущее время эмулятора 14.05.2013 13:24:07. А на картинке вроде нормальное время, только миллисекунды отличаются
|
|
|
|
longtrades
|
Дата: 14.05.2013
Ну да тут дело в милисекундах , на час отличается только время записи в лог.
|
Автор топика
|
|
|
longtrades
|
Дата: 14.05.2013
esper  А какую версию используете? У меня код из вашего сообщения никаких ошибок не выдает. А может вы не включили логирование КвикТрейдера ?
|
Автор топика
|
|
|
esper
|
Дата: 14.05.2013
longtrades  А может вы не включили логирование КвикТрейдера ? Код 1 в 1 как в сообщении.
|
|
|
|
longtrades
|
Дата: 14.05.2013
Как такое может быть что один и тотже код по разному работает ? В чем может быть причина у меня ? Где мне копать дальше ?
|
Автор топика
|
|
|
Moadip
|
Дата: 14.05.2013
Quote:почему так делаю , потому что мне нужны дополнительные поля которые я могу прописать только к Квик трейдеру :( , а к мулятору нет Можно так сделать: Code
var trader = new RealTimeEmulationTrader<QuikTrader>(new QuikTrader());
trader.UnderlyingTrader.SecuritiesTable.Columns.Add(DdeSecurityColumns.MinStepPrice);
По ошибке. Попробуйте установить на компе московский часовой пояс + время. Это надо чтобы проверить во времени проблема или нет.
|
|
|
|
longtrades
|
Дата: 14.05.2013
Moadip  По ошибке. Попробуйте установить на компе московский часовой пояс + время. Это надо чтобы проверить во времени проблема или нет.
Установил московский часовой пояс - не помогло все те же ошибки :(
|
Автор топика
|
|
|
longtrades
|
Дата: 14.05.2013
Moadip  Можно так сделать: Code
var trader = new RealTimeEmulationTrader<QuikTrader>(new QuikTrader());
trader.UnderlyingTrader.SecuritiesTable.Columns.Add(DdeSecurityColumns.MinStepPrice);
Переделал так , тоже не помогло :(
|
Автор топика
|
|