← Zurück

и снова GetTimeFrameCandles

Что-то не понятное всё-таки с методом GetTimeFrameCandles. Посмотрел все ветки форума на эту тему ответа не нашёл.

  1. Берём пример SampleSMA.
  2. Открываем SMAStrategy.cs и в метод OnRunning, перед строкой base.OnRunning(); дописываем:
var candlesForTest = _candleManager.GetTimeFrameCandles(base.Security, TimeSpan.FromMinutes(5), 14);

Т.е. я пытаюсь получить 14 последних 5-ти минутных свечек.

Так вот, candlesForATR.Count() всегда равна нулю... Что я делаю не так?

Может быть это из-за того что счёт учебный на терминале Quik-Junior?

Версия StockSharp 2.5.1

War dieses Thema hilfreich?

Thema teilen

Kommentare (29)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Mikhail Sukhov
Mikhail Sukhov

romanick: ... Т.е. я пытаюсь получить 14 последних 5-ти минутных свечек.

Так вот, candlesForATR.Count() всегда равна нулю...

_candleManager.RegisterCandles вызывается? Экспорт тиков идет?

romanick
romanick Autor

_candleManager.RegisterCandles вызывается? Повторюсь, это Ваш пример, - SampleSMA. Конечно вызывается в методе Start_Click перед стартом стратегии.

Экспорт тиков идет? Не уверен. При нажатии кнопки "Экспорт DDE" процессор что-то делает примерно секунд 30, но вот этот код в том же Start_Click не выполняется.

// начинаем вычислять скользящие средние
				foreach (var candle in candles)
				{
					_strategy.LongSma.Add(candle);
					_strategy.ShortSma.Add(candle);

					// если все скользящие сформировались, то начинаем их отрисовывать
					if (index >= _strategy.LongSma.Length)
						DrawSmaLines(candle.Time);

					index++;

					_lastCandleTime = candle.Time;
				}

т.е. candles пуст.

Mikhail Sukhov
Mikhail Sukhov

romanick: но вот этот код в том же Start_Click не выполняется.

// начинаем вычислять скользящие средние foreach (var candle in candles) { _strategy.LongSma.Add(candle); _strategy.ShortSma.Add(candle);

				// если все скользящие сформировались, то начинаем их отрисовывать
				if (index >= _strategy.LongSma.Length)
					DrawSmaLines(candle.Time);

				index++;

				_lastCandleTime = candle.Time;
			}
> т.е. candles пуст.

В коде выше написано следующее:

var candles = File.ReadAllLines("LKOH_history.txt").Select(line =>


Значит нет истории. Обновляйте с Финама.
romanick
romanick Autor

Значит нет истории. Обновляйте с Финама. Вот этот момент мне не понятен... Разве история не формируется непосредственно в процессе торговли? И разве при вызове _trader.StartExport() она не загружается в _сandleManager?

Mikhail Sukhov
Mikhail Sukhov

romanick:

Значит нет истории. Обновляйте с Финама. Вот этот момент мне не понятен... Разве история не формируется непосредственно в процессе торговли? И разве при вызове _trader.StartExport() она не загружается в _сandleManager?

Смотря как делать. В примере SampleSMA история берется из текстового файла. Мы сейчас говорим о примере или о вообще?

romanick
romanick Autor

Наверное всё же "вообще". Моя задача - получить 14 последних баров. Разве вызвать StartExport() и зарегистрировать TimeFrame недостаточно? Ещё надо что-то делать?

Mikhail Sukhov
Mikhail Sukhov

romanick: Наверное всё же "вообще". Моя задача - получить 14 последних баров. Разве вызвать StartExport() и зарегистрировать TimeFrame недостаточно? Ещё надо что-то делать?

Если 14 5-минуток то история не нужна. Тогда я не понимаю, зачем Вы привели тот кусок кода, который вам не нужен. Выкиньте его. Я пример скорее всего придется переделать, так как там много мест на историю завязано.

romanick
romanick Autor

Да, с куском кода я действительно попал пальцем в небо. :)

Если 14 5-минуток то история не нужна. А как же всё-таки получить их?

Mikhail Sukhov
Mikhail Sukhov

romanick: Да, с куском кода я действительно попал пальцем в небо. :)

Если 14 5-минуток то история не нужна. А как же всё-таки получить их?

Через _candleManager.GetTimeFrameCandles но только после того, как они построятся. А в реальном приложении нужно использовать _candleManager.NewCandles.

romanick
romanick Autor

Через _candleManager.GetTimeFrameCandles но только после того, как они построятся Хм. Т.е. на момент запуска стратегии (выполнение OnRunning) они просто не успевают строится? А как мне узнать когда они построятся? Событие какое-то есть? Или просто проверять дату последней свечи?

Mikhail Sukhov
Mikhail Sukhov

romanick:

Через _candleManager.GetTimeFrameCandles но только после того, как они построятся Хм. Т.е. на момент запуска стратегии (выполнение OnRunning) они просто не успевают строится? А как мне узнать когда они построятся? Событие какое-то есть? Или просто проверять дату последней свечи?

CandleManager.NewCandles

Alexander
Alexander

romanick:

Через _candleManager.GetTimeFrameCandles но только после того, как они построятся Хм. Т.е. на момент запуска стратегии (выполнение OnRunning) они просто не успевают строится? А как мне узнать когда они построятся? Событие какое-то есть? Или просто проверять дату последней свечи?

я вот так делаю в стратегиях:

_candleManager.CandlesFinished += CandleManagerCandlesFinished;
...
        void CandleManagerCandlesFinished(CandleToken arg1, System.Collections.Generic.IEnumerable<Candle> arg2)
        {
            _candlesFinished = true;
        }
...

        protected override bool OnProcess()
        {
            if (!_candlesFinished)
            {
                AddLog(StrategyErrorStates.None, "Свечки ещё не сформированы...", new object());
                return true;
            }
            ...
        }

romanick
romanick Autor

Нет, не то. Попробую сформулировать вопрос по другому.

_candleManager.NewCandles += (token, candles) =>
			{
				if (token == minutesToken)
				{
					RobotLog.Add("NewCandles count="+candles.Count().ToString()+
					             "last="+candles.Last().Time.ToString());
				}
			};
			_candleManager.CandlesFinished += (token, candles) =>
			{
				if (token == minutesToken)
				{
					RobotLog.Add("CandlesFinished count="+candles.Count().ToString()+
					             "last="+candles.Last().Time.ToString());
				}
			};
protected override bool OnProcess(){
...
var candlesForATR = _candleManager.GetTimeFrameCandles(base.Security, TimeSpan.FromMinutes(1), 14);
			RobotLog.Add("all count="+candlesForATR.Count().ToString());
...
}

В первых двух случаях candles.Count() равно 1, что логично. В третьем равно количеству минут прошедших со старта робота. Т.е. изначально свечей нет вообще и появляются они только во время работы робота. Мне же нужно получить 14 свечей которые были ДО старта робота. Нужно это для инициализации индикатора. Как быть?

Alexander
Alexander

romanick: В первых двух случаях candles.Count() равно 1, что логично. В третьем равно количеству минут прошедших со старта робота. Т.е. изначально свечей нет вообще и появляются они только во время работы робота. Мне же нужно получить 14 свечей которые были ДО старта робота. Нужно это для инициализации индикатора. Как быть?

Нельзя получить свечки за другой день напрямую (т.к. они строятся из всех сделок). Чтобы это всё же сделать - пишешь код на qpile, добавляешь в квике таблицу-портфель и уже её экспортируешь.

romanick
romanick Autor

Alexander:

romanick: В первых двух случаях candles.Count() равно 1, что логично. В третьем равно количеству минут прошедших со старта робота. Т.е. изначально свечей нет вообще и появляются они только во время работы робота. Мне же нужно получить 14 свечей которые были ДО старта робота. Нужно это для инициализации индикатора. Как быть?

Нельзя получить свечки за другой день напрямую (т.к. они строятся из всех сделок). Чтобы это всё же сделать - пишешь код на qpile, добавляешь в квике таблицу-портфель и уже её экспортируешь.

🤨 🤨 🤨 🤨 И что нет другого non-hemorrhoids-way?

Mikhail Sukhov
Mikhail Sukhov

romanick: В первых двух случаях candles.Count() равно 1, что логично. В третьем равно количеству минут прошедших со старта робота. Т.е. изначально свечей нет вообще и появляются они только во время работы робота. Мне же нужно получить 14 свечей которые были ДО старта робота. Нужно это для инициализации индикатора. Как быть?

Ключевое выражение - старт робота. Оно неправильное. Робот - это программа. А данные нужны стратегии (программа может иметь от 0 до N стратегий). Поэтому регистрацию свечек нужно запускать после подключения программы к Квику, но до запуска самой стратегии. О стратегиях написано в документации.

Mikhail Sukhov
Mikhail Sukhov

romanick: 🤨 🤨 🤨 🤨 И что нет другого non-hemorrhoids-way?

Запускать робот после 10:30 + 14 * 5. или брать историю откуда то извне (например, как я сделал это в примере).

Alexander
Alexander

Mikhail Sukhov:

romanick: В первых двух случаях candles.Count() равно 1, что логично. В третьем равно количеству минут прошедших со старта робота. Т.е. изначально свечей нет вообще и появляются они только во время работы робота. Мне же нужно получить 14 свечей которые были ДО старта робота. Нужно это для инициализации индикатора. Как быть?

Ключевое выражение - старт робота. Оно неправильное. Робот - это программа. А данные нужны стратегии (программа может иметь от 0 до N стратегий). Поэтому регистрацию свечек нужно запускать после подключения программы к Квику, но до запуска самой стратегии. О стратегиях написано в документации.

А если свечки, к примеру, минутки, не нужны активным стратегиям? У меня, к примеру, есть стратегии на 5-минутках, есть на минутках. Запускаю регистрацию свечек как раз во время старта стратегий сейчас (т.к. в настройках робота могут быть минутные стратегии выключены, зачем тогда их регистрировать?). Или они в любом случае занимают мало ресурсов, поэтому можно спокойно регистрировать всё, что только может потенциально понадобиться?

Mikhail Sukhov
Mikhail Sukhov

Alexander: А если свечки, к примеру, минутки, не нужны активным стратегиям? У меня, к примеру, есть стратегии на 5-минутках, есть на минутках. Запускаю регистрацию свечек как раз во время старта стратегий сейчас (т.к. в настройках робота могут быть минутные стратегии выключены, зачем тогда их регистрировать?). Или они в любом случае занимают мало ресурсов, поэтому можно спокойно регистрировать всё, что только может потенциально понадобиться?

Кушаем много только старт. Потом все работает как обычно. Плюс у свечек свой поток, а у стратегий свои.

sinc
sinc

у меня тоже не получается экспортировать свечки. запускаю пример SampleCandles. Во-первых, не всегда загружется список инструментов, иногда вместо названий инструментов загружаются числа и пустые строки. Во-вторых, событие NewCandles не вызывается. что может быть не так?

вот картиночка http://www.sharemania.ru/0122592

Mikhail Sukhov
Mikhail Sukhov

sinc: у меня тоже не получается экспортировать свечки. запускаю пример SampleCandles. Во-первых, не всегда загружется список инструментов, иногда вместо названий инструментов загружаются числа и пустые строки. Во-вторых, событие NewCandles не вызывается. что может быть не так?

вот картиночка http://www.sharemania.ru/0122592

Экспорт по тикам идет? В таблице Все сделки стоит фильтр для нужного инструмента (по которому свечки строятся)?

Такие картинки заливайте лучше на этот форум.

Названия у инструментов не обновляется (только визуально, в программе все должно нормально быть), потому что это особенность WPF. Надо по другому строить ГУИ интерфейс, но так как для роботов это не критично, я этим пока не занимался.

sinc
sinc

Mikhail Sukhov: Названия у инструментов не обновляется (только визуально, в программе все должно нормально быть) и в названиях инструментов бывают пустые строки. в картинке показано

sinc
sinc

Фильтр стоит по лукойлу и сбербанку. жэкспорт не идет почему-то. событие NewCandles не вызывается

Mikhail Sukhov
Mikhail Sukhov

sinc: Фильтр стоит по лукойлу и сбербанку. жэкспорт не идет почему-то. событие NewCandles не вызывается

Скорее всего, ITrader.NewTrades не идет. Посмотрите, ITrader.ProcessDataError что нибудь выводит?

sinc
sinc

пишет "Данные для таблицы 'инструменты' экспортировались в меньшем формате. Не было найдено значение для колонки 'Точность цены'. Количество колонок равно '15', индекс колонки '17'."

т.е. не все колонки в инструментах стоят? можете пречислить их все. я пользовался файлом конфигурации, вязтый с вашего сайта

Mikhail Sukhov
Mikhail Sukhov

sinc: пишет "Данные для таблицы 'инструменты' экспортировались в меньшем формате. Не было найдено значение для колонки 'Точность цены'. Количество колонок равно '15', индекс колонки '17'."

т.е. не все колонки в инструментах стоят? можете пречислить их все. я пользовался файлом конфигурации, вязтый с вашего сайта

http://stocksharp.com/doc/help/html/5c13da7b-b6e4-4fd4-958a-66c93c58b941.htm

Какой именно файл (их несколько) и какие площадки подключены.

sinc
sinc

Площадка ММВБ. Обновил файл. сейчас правильно стали инструменты подгружаться, а свечки все равно не экспортируются. сообщений об ошибках нет

Mikhail Sukhov
Mikhail Sukhov

sinc: Площадка ММВБ. Обновил файл.

какой именно файл?

sinc
sinc

Спасибо!!!!!!!!! Все заработало!