Mikhail Sukhov
|
Date: 8/4/2010
- Да, одинаковые данные отбрасываются. Если это разные Квики, то это
будут все сделки и инструменты (если конечно у Вас не шарица еще что-
то). Хотя и сделки могут быть уникальными, если каждый Квик торгует
только свой диапазон инструментов.
- А кто съедает? Робот или Квики? Роботов несколько или же он только
один? Распределение 50-60 по прогам можете привести?
|
|
|
|
Thanks:
|
|
|
|
|
|
Alexander
|
Date: 8/5/2010
Съедает сам робот. Он запущен только 1, просто там идёт работа со
многими квиками.
Что это за распределение и как его сделать? :)
Ещё я заметил следующее при работе с несколькими квиками - возьмём, к
примеру, таблицу Всех сделок. Она передаётся насколько я понимаю из
какого-то одного квика (к примеру, который был первым добавлен в
AggregatedTrades), из остальных игнорируется. Как только теряется
связь с сервером у первого квика (остальные при этом работают) -
таблица всех сделок перестаёт экспортироваться (хотя могла бы из
других квиков) - получается нельзя таким образом подстраховаться...
|
|
|
|
Thanks:
|
|
|
|
|
|
Mikhail Sukhov
|
Date: 8/5/2010
Можно через Process Explorer. Он покажет, какие потоки тормозят. А
потокам можно понять, что в них делается. Все S# потоки именованы.
Робота, если Вы этого не делали, не именованы.
Насчет прекращения экспорта. Схема не такая. Роботу льется все. А он
уже смотрит на уникальность. Так что, если какой-то из Квиков лили
дубли и он упал, то на экспорт это не должно отразиться. Тут случаем
ReConnectionManager не вступает в работу? Вот он может все остальные
Квики перезапускать.
|
|
|
|
Thanks:
|
|
|
|
|
|
Alexander
|
Date: 8/5/2010
|
|
|
|
|
ðÏËÁÚÁÌ, ÔÏÒÍÏÚÉÔ LogHelp, ×ÏÔ StackTrace:
ntkrnlpa.exe!NtBuildNumber+0xe
ntkrnlpa.exe!RtlUpcaseUnicodeString+0xa2
ntkrnlpa.exe!ZwYieldExecution+0x4f3
ntkrnlpa.exe!MmIsDriverVerifying+0xbb2
hal.dll+0x2ef2
clr.dll+0x1a5e
clr.dll!CoUninitializeEE+0x378e
clr.dll!CoUninitializeEE+0x7663
clr.dll!LogHelp_TerminateOnAssert+0x6a1fd
clr.dll!LogHelp_TerminateOnAssert+0x3c642
clr.dll!LogHelp_TerminateOnAssert+0x3c560
clr.dll!LogHelp_TerminateOnAssert+0x3c6de
clr.dll!LogHelp_TerminateOnAssert+0x40b22
clr.dll!LogHelp_TerminateOnAssert+0x3aab2
mscorlib.ni.dll+0x2aae5b
mscorlib.ni.dll+0x237ff4
mscorlib.ni.dll+0x237f34
mscorlib.ni.dll+0x2aade8
clr.dll+0x21db
clr.dll!CoUninitializeEE+0x6862
clr.dll!CoUninitializeEE+0x6a04
clr.dll!CoUninitializeEE+0x6a39
clr.dll!GetPrivateContextsPerfCounters+0x8a13
clr.dll!LogHelp_TerminateOnAssert+0x591ad
clr.dll!LogHelp_TerminateOnAssert+0x5922f
clr.dll!LogHelp_TerminateOnAssert+0x592ea
clr.dll!LogHelp_TerminateOnAssert+0x59381
clr.dll!GetPrivateContextsPerfCounters+0x88e6
clr.dll!GetPrivateContextsPerfCounters+0x87e1
clr.dll!LogHelp_TerminateOnAssert+0x58fb0
KERNEL32.dll!GetModuleFileNameA+0x1ba
ReConnectionManager, ËÏÎÅÞÎÏ, ×ÓÔÕÐÁÅÔ × ÒÁÂÏÔÕ ÅÓÌÉ ÏÄÉÎ ÉÚ Ë×ÉËÏ×
ÕÐÁÌ, Á ÄÒÕÇÏÊ - ÎÅÔ. ô.Å., ×ÉÄÉÍÏ, ÓÔÏÉÔ ReconnectionManager
ÎÁÚÎÁÞÁÔØ ÏÔÄÅÌØÎÏ ÄÌÑ Ë×ÉËÏ×, Á ÎÅ ÄÌÑ ×ÓÅÇÏ MultiTrader?
|
|
|
|
Thanks:
|
|
|
|
|
|
Alexander
|
Date: 8/5/2010
Отключил логгирование для стратегий (убрал обработчик OnLog и не
добавляю StrategyLogger) - теперь робот ест от 0 до 50% процессора.
50% - крайне редко, всплески. в основном висит на 0%. т.е. разница
колоссальная.
|
|
|
|
Thanks:
|
|
|
|
|
|
Mikhail Sukhov
|
Date: 8/6/2010
Хм, или логов много или дисковая операция тяжелая. Есть вероятность
что StrategyLogger глючит, он там так мало кода. Фактически, вот он
весь (что используется при активизации события):
_writer = new StreamWriter(logDirectory.IsEmpty() ? this.FileName :
Path.Combine(logDirectory, fileName)) ;
private void StrategyLog(Strategy strategy, StrategyErrorStates state,
string message)
{
WriteMessage(strategy + " " + message);
///
/// Записать специальное сообщение, которое относится ко всем
статегиям .
///
/// Сообщение.
public void WriteMessage(string message)
{
if (message.IsEmpty())
throw new ArgumentNullException("message");
Debug.WriteLine(message);
_writer.WriteLine("{0} {1}", DateTime.Now.TimeOfDay, message);
|
|
|
|
Thanks:
|
|
|
|
|
|
Иванов Андрей
|
Date: 8/7/2010
|
|
|
|
|
Про тяжёлую дисковую операцию не понял =) Дисковые операции едят время
(iowait), а не CPU.
Про много лог-записей в точку -- операция конкатенации самая дорогая
по CPU в .NET (из тех, что не ожидаешь).
Единственный способ борьбы это писать сразу в файл. Если убрать
конкатенацию в _writer.WriteLine(..), производительность логирования
вырастет в полтора раза =)
То есть, оформить запись в виде трёх вызовов -- время, разделитель,
сообщение.
Захотите проверить мою теорию, включите логирование, а все строки с
конкатенацией замените на строки-константы примерно той же длины.
Ещё эффективнее по CPU будет, если событие лога генерировать не со
строкой конкатенации стратегии и сообщения, а объектом с двумя полями
или вызовом метода с двумя параметрами.
Единственный вариант привязать к CPU запись на диск это отключить DMA
для ATA-дисков. Я никогда не сталкивался с необходимостью такое
делать, но можно попровать начать с этого -- проверять надо в дисковом
контроллере, на всех системах названия свои. Раньше было переключение
между режимами (PIO/*DMA), в семёрке чекбокс выключения DMA.
|
|
|
|
Thanks:
|
|
|
|
|
|
Alexander
|
Date: 8/8/2010
логов много - каждая запущенная стратегия каждую секунду что-то да
пишет. про тяжёлую дисковую операцию я тоже не понял =)
Хотелось бы ещё закрыть вопрос с прекращением экспорта - я так понимаю
в случае с MultiTrader необходимо ReconnetionManager создавать для
каждого из добавленных AggregatedTraders? В этом случае экспорт не
прекратится если отвалится лишь один из квиков
|
|
|
|
Thanks:
|
|
|
|
|
|
Иванов Андрей
|
Date: 8/10/2010
У меня на процессоре Q6600 конкатенация съедала одно ядро примерно за
100 тысяч записей в секунду.
Если у вас 100 стратегий с тайм-фреймом секунда, современный процессор
не заметит этого -- тайм-фрейм должен быть 10 миллисекунд. У вас либо
очень много стратегий (100 тысяч), либо они не все работают с тайм-
фреймом, либо предположение о конкатенации неверно.
Посчитайте, сколько у вас записей в лог за секунду делается. Вместо
записи в лог инкрементируйте счётчик через
Interlocked.Increment(ref _logCounter);
и пишите это значение куда-нибудь раз в секунду примерно вот так:
int count = Interlocked.Exchange(ref _logCounter, 0);
Console.WriteLine("Log rps: {0}", count);
_logCounter -- глобальная переменная. Стратегии вроде сами по себе
ничего не пишут в лог, поэтому вы можете получить точное значение.
|
|
|
|
Thanks:
|
|
|
|
|
|
Mikhail Sukhov
|
Date: 8/11/2010
private class MyStrategy : Strategy
{
public void DoLog(string message)
{
base.AddLog(StrategyErrorStates.None, message);
}
protected override bool OnProcess()
{
return false;
}
var str = new MyStrategy();
var logger = new StrategyLogger("1.txt");
logger.Strategies.Add(str);
const int count = 100000;
var t1 = Watch.Do(() =>
{
for (var i = 0; i < count; i++)
{
str.DoLog("111");
}
logger.Strategies.Remove(str);
var writer = new StreamWriter("2.txt") ;
str.Log += (s, e, m) =>
{
writer.Write(DateTime.Now.TimeOfDay);
writer.Write(" ");
writer.Write(s);
writer.Write(" ");
writer.WriteLine(m);
var t2 = Watch.Do(() =>
{
for (var i = 0; i < count; i++)
{
str.DoLog("111");
}
ňĹÚŐĚŘÔÁÔ ÎÁ ÍĎĹÍ ÍÁŰÉÎËĹ. t1 - 55 ÓĹËŐÎÄ. t2 - 1 ÓĹËŐÎÄÁ. îÉŢĹÇĎ
ÓĹÂĹ! áÎÄŇĹĘ, ÖÄŐ ËĎÍÍĹÎÔÁŇÉĘ. đĎÔĎÍŐ ËÁË Ń ÄĎ ÓÉČ ĐĎŇ ÓŢÉÔÁĚ, ŢÔĎ
ĎĐĹŇÁĂÉŃ ÚÁĐÉÓÉ × ĆÁĘĚ ÍÎĎÇĎ ÄĎŇĎÖĹ ËÁËĎĘ-ÔĎ ËĎÎËÁÔĹÎÁĂÉÉ ÓÔŇĎË.
|
|
|
|
Thanks:
|
|
|
|
|