← Назад

Не идут сделки в SampleSMA

Сегодня открыл учебный квик в БКС (он там 5.15) чтобы версию S#1.7 попробовать. Приложенный wnd файл не открылся. Пишет ошибку переполнение памяти и квик вылетает. Вобщем вручную настроил. Единственное в таблице стоп-заявки нескольких полей не нашёл (время действия, активна с, активны по и т.д.). Ну да бог с ним. Всё работает нормально Sample, SampleConsole, SampleCandle. В SampleSMA строятся свечки, скользящие средние пересекаются вверх, вниз - а сделки не идут. Может потому что в OnProcess после Gettimeframecandle алгоритм доходит до строк if (candle == null) return true; а дальше не идёт?

Комментарии (21)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

denis
denis

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

dart
dart Автор
                   if (candle == null)
                            return true;
                   break;

Так? Так не дает, пишет отсутствует внешний цикл для прерывания или продолжения А ТФ я давно до 1 минуты уменьшил

denis
denis

брейк пойнт - точка останова для отладки. Нажать на левый край окна, будет красная точка

dart
dart Автор

Ну да, так и есть. Код выполняется до строчки return true , а до следующей this.LongSma.Add(candle) уже не доходит.

denis
denis

Нет свечек, искать почему нет. Можно попробовать подождать пару сек, чтобы была хотя бы одна свечка и несколько сделок после нее. Потом ставить бряк, смотреть что поймали, если ничего, то жать Ф5.

dart
dart Автор

Интересно, это у меня одного только такие глюки, а у всех остальных в СМА сделки идут? Поставил Thread.Sleep(2000) перед GetTimeFrameCandle с тем же результатом. Денис, даже твоя экзешка (которая без Визифайр) тотже результат выдаёт.

Mikhail Sukhov
Mikhail Sukhov

А сделки экспортируются? QuikTrader.DdeError ничего не пишет плохого?

dart
dart Автор

Да, экспорт идёт. Да иначе бы графики не строились (графики строятся отлично).. У меня один боевой квик 5.14 с S#1.5, второй учебный на другом компе 5.15 c S#1.7. И там и там результат один и тот же что на RIM0, что на LKOH. Таймфрейм 1 мин.

Mikhail Sukhov
Mikhail Sukhov

А текущая свечка на графике рисуется (она должна изменятся). Какое по ней время? Текушее?

У Вас время совпадает с биржей? CandleManager.GetTimeFrameCandles до if (candle == null) return true; какую свечку с наибольшей датой возвращает? Какое время в данный момент на машине?

denis
denis

Сейчас пытался воспроизвести ситуацию, запустил квик-джуниор, выбрал лук, приехали 147 тыс сделок и увидел загруз по процу. Сейчас уже 173т. а таск менеджер рисует пики на все ядро при быстром режиме показа. Это еще сделки редкие, не каждую секунду.

Продолжаю копать дальше :)

dart
dart Автор

Да, текущая свечка постоянно меняется - это видно, в соответствии с ценой последних сделок. На бирже, то есть в квике и на графике в S# время 19:50. Местное, то которое на компьютере 22:50. Разница может быть плюс/минус секунд 20 .

Mikhail Sukhov
Mikhail Sukhov

Видимо в этом и причина - время не московское. Инициализируйте MarketTimeOffset или подведите время.

dart
dart Автор

Да я уж понял. В документации по 1.7 есть пунктик - биржевое время. Может стоит MarkettimeOffset в текст примеров вставлять скажем с нулем для Москвы, а каждый сам будет необходимый сдвиг подставлять? А в 1.5 я что-то его не нашёл. Вермя на компе не могу подвести, только на учебном квике. На боевом дата в Глобалсервер записывается.

denis
denis

поставил бряк на последней строчке в SMA.cs public void Add(TimeFrameCandle candle) { if (candle == null) throw new ArgumentNullException("candle");

                   var value = this.Value;

                   // добавляем новое начало
                    value += candle.ClosePrice / this.Length;
                    _buffer.Add(candle);

и посмотрел буфер, сравнил this.Value с СМА в квик-джуниор, сходятся. Сделок придется долго ждать, там все растет :) Сейчас я ему мозги выключу, посмотрю чего выкинет. а вот уже приехал еррор :) прикладываю скрин

https://docs.google.com/leaf?id=0Bw2gQDvf41vtN2RkZGZjNzItMjJhMC00Mjc4LWFmMjgtY2VkOWVkYzI3MTJh&sort=name&layout=list&num=50

т.е. симлСМА пытается чего-то делать.

dart
dart Автор

Почему то MarketTime выдаёт не биржевое время, а локальное. Вот код: // путь к Квик директории const string quikPath = @"C:\BCS_Work\Учебный QUIK БКС"; using (var waitHandle = new ManualResetEvent(false)) { // создаем соединение с Quik-ом using (var trader = new QuikTrader(quikPath)) { // выводим текущее время биржи Console.WriteLine(trader.MarketTime); // устанавливаем смещение на +3 часа. // Например, если выбрана биржа РТС (Москва) с временной зоной +3, то в итоге получится временная зона +6 (Новосибирск). trader.MarketTimeOffset = TimeSpan.FromHours(3); // выводим текущее время биржи с учетом смещения Console.WriteLine(trader.MarketTime);

Первый раз (до MarketTimeOffset) вывело локальное время (+3 к Москве). Второй раз, (после MarketTimeOffset) к локальному ещё три часа добавило. Причём самое интересное, после того совершения сделки время сделки указывает московское.

Mikhail Sukhov
Mikhail Sukhov

QuikTrader не имеет возможности получать биржевое время. Поэтому выводит DateTime.Now. Для корректировки я как раз и ввел MarketTimeOffset.

Да, есть такое. Квик гонит данные только в московском времени. Создает проблемы?

dart
dart Автор

То есть, скажем для Новосибирска должно быть, биржевое время ( = московскому = квиковскому) 17:00, локальное 20:00, Markettime (после MarketTimeOffset) 23:00?

Mikhail Sukhov
Mikhail Sukhov

Не понял логики. Москва - это +3, Новосиб - это +6. Соответвенно, если Вы в новосибе, нужно делать -3, а не +3. Иначе получится уже Хабаровскй. Делать минус можно так (собственно как плюс, только там знак минус =) ):

trader.MarketTimeOffset = TimeSpan.FromHours(-3);

dart
dart Автор

Я так и делаю в SampleSMA:

private void Connect_Click(object sender, RoutedEventArgs e) { if (this.Path.Text.IsEmpty()) MessageBox.Show(this, "Путь к Quik не выбран"); else if (this.Account.Text.IsEmpty()) MessageBox.Show(this, "Счет не задан"); else { _trader = new QuikTrader(this.Path.Text); _trader.MarketTimeOffset = TimeSpan.FromHours(-3); _candleManager = new CandleManager(_trader); _trader.NewSecurities += securities => this.Sync(() =>

выскакивает ошибка (не сразу, а спустя какое-то время):

System.InvalidOperationException: Последовательность не содержит элементов в System.Linq.Enumerable.First[TSource](IEnumerable ¶ source) в Ecng.Trading.Algo.TraderHelper.GetFilteredQuotes(IEnumerable ¶ quotes, ITrader trader, OrderCurrentOrder) в Ecng.Trading.Algo.TraderHelper.GetFilteredQuotes(Security security, OrderDirections orderDirection, ITrader trader, OrderCurrentOrder) в Ecng.Trading.Algo.QuotingStrategy.get_FilteredQuotes() в Ecng.Trading.Algo.QuotingStrategy.GetBestPrice() в Ecng.Trading.Algo.MarketQuotingStrategy.GetNewPrice() в Ecng.Trading.Algo.QuotingStrategy.IsNeedReRegister() в Ecng.Trading.Algo.QuotingStrategy.OnProcess() в Ecng.Trading.Algo.Strategy.Process()

И в этом случае скользящие рисуются не до последней свечки , а до пред- пред-последней, то есть третьей с конца свечки. Без .MarketTimeOffset рисуются до последней.

Mikhail Sukhov
Mikhail Sukhov

Стакан нужно экспортировать для SampleSMA. Уже найдена эта бага в примере ранее.

Насчет свечек. Странное поведение. Посмотрю.

dart
dart Автор

Спасибо. Добавил экспорт стакана - сделки пошли.