Сегодня открыл учебный квик в БКС (он там 5.15) чтобы версию S#1.7 попробовать. Приложенный wnd файл не открылся. Пишет ошибку переполнение памяти и квик вылетает. Вобщем вручную настроил. Единственное в таблице стоп-заявки нескольких полей не нашёл (время действия, активна с, активны по и т.д.). Ну да бог с ним. Всё работает нормально Sample, SampleConsole, SampleCandle. В SampleSMA строятся свечки, скользящие средние пересекаются вверх, вниз - а сделки не идут. Может потому что в OnProcess после Gettimeframecandle алгоритм доходит до строк if (candle == null) return true; а дальше не идёт?
Комментарии (21)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
Поставьте бряк и посмотрите что там. Только таймфрейм нужно уменьшить, а то ждать придется.
Так? Так не дает, пишет отсутствует внешний цикл для прерывания или продолжения А ТФ я давно до 1 минуты уменьшил
брейк пойнт - точка останова для отладки. Нажать на левый край окна, будет красная точка
Ну да, так и есть. Код выполняется до строчки return true , а до следующей this.LongSma.Add(candle) уже не доходит.
Нет свечек, искать почему нет. Можно попробовать подождать пару сек, чтобы была хотя бы одна свечка и несколько сделок после нее. Потом ставить бряк, смотреть что поймали, если ничего, то жать Ф5.
Интересно, это у меня одного только такие глюки, а у всех остальных в СМА сделки идут? Поставил Thread.Sleep(2000) перед GetTimeFrameCandle с тем же результатом. Денис, даже твоя экзешка (которая без Визифайр) тотже результат выдаёт.
А сделки экспортируются? QuikTrader.DdeError ничего не пишет плохого?
Да, экспорт идёт. Да иначе бы графики не строились (графики строятся отлично).. У меня один боевой квик 5.14 с S#1.5, второй учебный на другом компе 5.15 c S#1.7. И там и там результат один и тот же что на RIM0, что на LKOH. Таймфрейм 1 мин.
А текущая свечка на графике рисуется (она должна изменятся). Какое по ней время? Текушее?
У Вас время совпадает с биржей? CandleManager.GetTimeFrameCandles до if (candle == null) return true; какую свечку с наибольшей датой возвращает? Какое время в данный момент на машине?
Сейчас пытался воспроизвести ситуацию, запустил квик-джуниор, выбрал лук, приехали 147 тыс сделок и увидел загруз по процу. Сейчас уже 173т. а таск менеджер рисует пики на все ядро при быстром режиме показа. Это еще сделки редкие, не каждую секунду.
Продолжаю копать дальше :)
Да, текущая свечка постоянно меняется - это видно, в соответствии с ценой последних сделок. На бирже, то есть в квике и на графике в S# время 19:50. Местное, то которое на компьютере 22:50. Разница может быть плюс/минус секунд 20 .
Видимо в этом и причина - время не московское. Инициализируйте MarketTimeOffset или подведите время.
Да я уж понял. В документации по 1.7 есть пунктик - биржевое время. Может стоит MarkettimeOffset в текст примеров вставлять скажем с нулем для Москвы, а каждый сам будет необходимый сдвиг подставлять? А в 1.5 я что-то его не нашёл. Вермя на компе не могу подвести, только на учебном квике. На боевом дата в Глобалсервер записывается.
поставил бряк на последней строчке в SMA.cs public void Add(TimeFrameCandle candle) { if (candle == null) throw new ArgumentNullException("candle");
и посмотрел буфер, сравнил this.Value с СМА в квик-джуниор, сходятся. Сделок придется долго ждать, там все растет :) Сейчас я ему мозги выключу, посмотрю чего выкинет. а вот уже приехал еррор :) прикладываю скрин
https://docs.google.com/leaf?id=0Bw2gQDvf41vtN2RkZGZjNzItMjJhMC00Mjc4LWFmMjgtY2VkOWVkYzI3MTJh&sort=name&layout=list&num=50
т.е. симлСМА пытается чего-то делать.
Почему то 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) к локальному ещё три часа добавило. Причём самое интересное, после того совершения сделки время сделки указывает московское.
QuikTrader не имеет возможности получать биржевое время. Поэтому выводит DateTime.Now. Для корректировки я как раз и ввел MarketTimeOffset.
Да, есть такое. Квик гонит данные только в московском времени. Создает проблемы?
То есть, скажем для Новосибирска должно быть, биржевое время ( = московскому = квиковскому) 17:00, локальное 20:00, Markettime (после MarketTimeOffset) 23:00?
Не понял логики. Москва - это +3, Новосиб - это +6. Соответвенно, если Вы в новосибе, нужно делать -3, а не +3. Иначе получится уже Хабаровскй. Делать минус можно так (собственно как плюс, только там знак минус =) ):
trader.MarketTimeOffset = TimeSpan.FromHours(-3);
Я так и делаю в 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 рисуются до последней.
Стакан нужно экспортировать для SampleSMA. Уже найдена эта бага в примере ранее.
Насчет свечек. Странное поведение. Посмотрю.
Спасибо. Добавил экспорт стакана - сделки пошли.