Ошибка: котирование порождает несколько выполненных заявок


Ошибка: котирование порождает несколько выполненных заявок
Atom Ответить
10.11.2011


Проблема проявляется даже стандартном примере SampleHistoryTesting. Для обнаружения в OnProcess достаточно добавить
Код
if (Math.Abs(PositionManager.Position) > Volume)
  throw new Exception("Неверное состояние - поза превышает рабочий объем.");

и после получения эксепшена посмотреть Trader.Orders - последние две заявки будут исполненными, а перед ними будет несколько отмененных с примерно тем же временем.

Ошибка плавающая, возникает иногда на первой же заявке, а иногда несколько первых заявок проходят нормально.

Теги:


Спасибо:




52 Ответов
< 1 2 3  >
andy_baka_

Фотография
Курсы
Дата: 16.11.2011
Ответить


Alexander Mukhanchikov Перейти

2) PositionManager.Position может обновиться чуть позднее


Александр, а насколько к PositionManager.Position можно привязываться как к индикатору состояния позиции?
Спасибо:

esper

Фотография
Программист
Дата: 17.11.2011
Ответить


Camill Перейти
Такой вот код не помог, все равно зависает:
Код
_trader.MarketEmulator = new SyncMarketEmulator(_trader);

Сама стратегия у вас из примера, только окно логов добавлено? Если просто взять стандартный пример ошибка повторяется? Можете выложить ваш проект на котором повторяется ошибка? Какая конфигурация компа, т.е. сколько ядер и памяти?
Спасибо:

Camill

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


esper Перейти
Если просто взять стандартный пример ошибка повторяется? Можете выложить ваш проект на котором повторяется ошибка? Какая конфигурация компа, т.е. сколько ядер и памяти?

Пример SampleHistoryTesting, 4 ядра, 16 гигов памяти. На нем проявляются и зависание и дублирование заявок.
Мы уже разбирались вчера вечером с Михаилом Суховым, у него ошибка с зависанием повторилась, так что по этому поводу он теперь больше знает.
Но пока еще не понятно, возможно, дублирование заявок - это другая ошибка, не связанная с зависанием.
Автор топика
Спасибо:

Camill

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


Похоже, ошибка исправлена, но стало работать в несколько раз медленнее, и памяти жрать чуть ли не в два раза больше.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 18.11.2011
Ответить


Camill Перейти
Похоже, ошибка исправлена, но стало работать в несколько раз медленнее, и памяти жрать чуть ли не в два раза больше.


Обычное в сравнительном приложении в русском языке пишут 2 части. Вторую часть пишут через слово "чем". Собственно, чем что?
Спасибо:

Camill

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


Mikhail Sukhov Перейти
Обычное в сравнительном приложении в русском языке пишут 2 части. Вторую часть пишут через слово "чем". Собственно, чем что?

Чем 3.2.11 при прогоне на одинаковой истории с той же стратегией.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 18.11.2011
Ответить


Camill Перейти
Mikhail Sukhov Перейти
Обычное в сравнительном приложении в русском языке пишут 2 части. Вторую часть пишут через слово "чем". Собственно, чем что?

Чем 3.2.11 при прогоне на одинаковой истории с той же стратегией.


Сейчас проверим по памяти и скорости. Могу только зрительно.
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 18.11.2011
Ответить


Может стоит сделать визуально в примере отображение производительности?
Спасибо:

Camill

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


Проверил на SampleHistoryTesting - запускал по два раза. По времени стало 23:17 и 24:19 против 13:17 и 9:33, а вот по памяти разница небольшая - 1,5 против 1,2.
Автор топика
Спасибо:

Camill

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


Но на моем проекте прогоняется истории fRTS с 2009 года, и могут быть нюансы с работой GC.
По факту посчитались только два года, а съедено уже 8 гигов, раньше было 4-5.
Ну и дополнительные тормоза за счет работы свопа появились, видимо.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 18.11.2011
Ответить


Camill Перейти
По факту посчитались только два года, а съедено уже 8 гигов, раньше было 4-5.


Ничего не понимаю. Вы пишите, что было 1.2 стало 1.5 гига. Теперь цифры другие, с 4 до 8. Какие цифры правильные?
Спасибо:

Camill

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


На тестовом примере - 1,5 и 1,2.
На моем - 8 и 4.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 18.11.2011
Ответить


Camill Перейти
На тестовом примере - 1,5 и 1,2.
На моем - 8 и 4.


Тогда нужно смотреть профайлером, что так много кушает у вас. Пример то мало потребляет, а данные все те же генерирует.
Спасибо:

Camill

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


Пример проходит один фьючерс, а я всю серию, с RIH9 по RIZ1.
Скорее всего, где-то утечка памяти.
Профайлером пытаться смотреть, но пока не разобрался, как им пользоваться.

И в любом случае, это не может влиять на скорость тестового примера. 16 гигов оперативки ему более чем достаточно. Так что тормоза надо лечить отдельно.
Автор топика
Спасибо:

Camill

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


Еще один аргумент за утечку - когда я ставил запуск GC в конце каждого дня истории, вылетала ошибка где-то внутри генератора свечей.
Попробую повторить, напишу подробнее.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 18.11.2011
Ответить


Camill Перейти
Так что тормоза надо лечить отдельно.


Параллельным матчингом.
Спасибо:

Camill

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


Mikhail Sukhov Перейти
Параллельным матчингом.

Буду благодарен за пример кода.
Нашел в документации ParallelMarketEmulator, но не нашел, куда его надо вписать.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 18.11.2011
Ответить


Camill Перейти
Mikhail Sukhov Перейти
Параллельным матчингом.

Буду благодарен за пример кода.
Нашел в документации ParallelMarketEmulator, но не нашел, куда его надо вписать.


Вы же мне пример присылали, где синхронный устанавливали.
Спасибо:

Camill

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


И правда.
Но подключение параллельного не помголо - те же 25 минут на тестовый пример.
Подключал так:
Код
_trader.MarketEmulator = new ParallelMarketEmulator(_trader);
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 18.11.2011
Ответить


Camill Перейти
И правда.
Но подключение параллельного не помголо - те же 25 минут на тестовый пример.
Подключал так:
Код
_trader.MarketEmulator = new ParallelMarketEmulator(_trader);


Значит это точно не матчинг заявок увеличил время. Свечки используете?
Спасибо:

Camill

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


Mikhail Sukhov Перейти
Значит это точно не матчинг заявок увеличил время. Свечки используете?

Конечно. Собственно, я к тестовому примеру со скользящими средними его и подключал.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 18.11.2011
Ответить


Camill Перейти
Mikhail Sukhov Перейти
Значит это точно не матчинг заявок увеличил время. Свечки используете?

Конечно. Собственно, я к тестовому примеру со скользящими средними его и подключал.


Наверное, они тормозят. Раньше был один алгоритм компрессии, затем другой (опять же, с фиксами). Ничего не поделать, свечки сейчас (да и раньше тоже) самый тормозящий участок в тестировании. Я уже предлагал в Гидре сделать компрессию для ускорения. Не знаю, работает ли.
Спасибо:

Camill

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


Вроде что-то сделали, но непонятно, как это использовать - ни примера, ни мануала внятного я не видел.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 18.11.2011
Ответить


Camill Перейти
Вроде что-то сделали, но непонятно, как это использовать - ни примера, ни мануала внятного я не видел.


Вот такая помощь. К таким помощникам еще парочка помощников нужна.
Спасибо:

russ

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


По поводу проблемы с неработающим котированием, описанной здесь https://stocksharp.ru/fo...rabotaiet-kotirovaniie/
1. Взял с codeplex версию 4.0.6
2. К стратегии котирования прикрепил лог
Код

var strategy = new MarketQuotingStrategy(order, new Unit(5), new Unit(5));
var log = new FileLogListener("log" + (count++).ToString() + ".txt");
strategy.Log += new Action<LogMessage>(message => log.WriteMessage(message)); 


В итоге все нормально, но появилось очень много сообщение о том, что в стакан пустой:
Код

00:05:00.000 |            | MQS             | Стратегия запущена.
00:05:00.000 | Warning    | MQS             | Стакан пустой.
00:10:00.000 | Warning    | MQS             | Стакан пустой.
00:15:00.000 | Warning    | MQS             | Стакан пустой.
00:20:00.000 | Warning    | MQS             | Стакан пустой.
00:25:00.000 | Warning    | MQS             | Стакан пустой.
00:30:00.000 | Warning    | MQS             | Стакан пустой.
00:35:00.000 | Warning    | MQS             | Стакан пустой.
00:40:00.000 | Warning    | MQS             | Стакан пустой.
00:45:00.000 | Warning    | MQS             | Стакан пустой.

Лог обрезал т.к. очень длинный, т.е. каждые 5 минут выдается сообщение Стакан Пустой.

23:20:00.000 | Warning    | MQS             | Стакан пустой.
23:25:00.000 | Warning    | MQS             | Стакан пустой.
23:30:00.000 | Warning    | MQS             | Стакан пустой.
23:35:00.000 | Warning    | MQS             | Стакан пустой.
23:40:00.000 | Warning    | MQS             | Стакан пустой.
23:45:00.000 | Warning    | MQS             | Стакан пустой.
23:50:00.000 | Warning    | MQS             | Стакан пустой.
23:55:00.000 | Warning    | MQS             | Стакан пустой.
23:59:59.990 |            | MQS             | Регистрация новой заявки на Buy с ценой 155010 и объемом 1.
23:59:59.990 |            | MQS             | Заявка 52981109 на Buy отправлена с ценой 155010 объемом 1.
00:04:59.990 |            | MQS             | Цена текущей 155010 и лучшей 154965.
00:04:59.990 |            | MQS             | Лучший бид 154960 и лучший аск 155005.
00:04:59.990 |            | MQS             | Котирование заявки 52981109 на Buy с ценой 155010 объемом 1.
00:04:59.990 |            | MQS             | Отмена заявки 52981109.
00:04:59.990 |            | MQS             | Новая Buy сделка 1 по цене 155005 на 1 заявки 52981109.
00:04:59.990 |            | MQS             | Позиция изменилась на 1.
00:04:59.990 |            | MQS             | Заканчиваем котирование с неисполненным объемом равный 0.
00:04:59.990 |            | MQS             | Стратегия останавливается.
00:04:59.990 |            | MQS             | Заканчиваем котирование с неисполненным объемом равный 0.
00:04:59.990 |            | MQS             | Заканчиваем котирование с неисполненным объемом равный 0.
00:04:59.990 |            | MQS             | Заканчиваем котирование с неисполненным объемом равный 0.
00:04:59.990 |            | MQS             | Стратегия остановлена.


Непонятно почему стакан пустой, исходные данные формирую как в примере:

Код

var portfolio = new Portfolio { Name = "test account" };
                    var timeFrame = TimeSpan.FromMinutes(5);
                    var security = new Security
                    {
                        Id = "RIU9@RTS",
                        Code = "RIU9",
                        Name = "RTS-9.09",
                        MinStepSize = 5,
                        MinStepPrice = 2,
                        Decimals = 0,
                        Exchange = Exchange.Test,
                    };
                    
                    _trader = new EmulationTrader(
                    new[] { security },
                    new[] { portfolio })
                        {
                            MarketTimeChangedInterval = timeFrame
                        };

                        _trader.TradeGenerators[security] = new RandomWalkTradeGenerator(security, 155000);

                        _trader.DepthGenerators[security] = new TrendMarketDepthGenerator(security);
Спасибо:
< 1 2 3  >

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

loading
clippy