и снова GetTimeFrameCandles
Atom Ответить
08.11.2010


Что-то не понятное всё-таки с методом 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

Теги:


Спасибо:




29 Ответов
1 2  >
Mikhail Sukhov

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


romanick

Код
var candlesForTest = _candleManager.GetTimeFrameCandles(base.Security, TimeSpan.FromMinutes(5), 14);

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

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


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

romanick

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


>>_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

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


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

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


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

Mikhail Sukhov

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


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


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

romanick

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


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

Mikhail Sukhov

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


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


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

romanick

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


Да, с куском кода я действительно попал пальцем в небо. :)
>>Если 14 5-минуток то история не нужна.
А как же всё-таки получить их?
Автор топика
Спасибо:

Mikhail Sukhov

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


romanick
Да, с куском кода я действительно попал пальцем в небо. :)
>>Если 14 5-минуток то история не нужна.
А как же всё-таки получить их?


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

romanick

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


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

Mikhail Sukhov

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


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


CandleManager.NewCandles
Спасибо:

Alexander

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


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

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


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

Код
_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

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


romanick

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


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

romanick

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


Alexander
romanick

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


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


Confused Confused Confused Confused
И что нет другого non-hemorrhoids-way?
Автор топика
Спасибо:

Mikhail Sukhov

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


romanick

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


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

Mikhail Sukhov

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


romanick


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


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

Alexander

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


Mikhail Sukhov
romanick

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


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



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

Mikhail Sukhov

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


Alexander

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


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

sinc

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


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

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

Mikhail Sukhov

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


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

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


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

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

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

sinc

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


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

sinc

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


Mikhail Sukhov

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

и в названиях инструментов бывают пустые строки. в картинке показано
Спасибо:

Mikhail Sukhov

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


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


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

sinc

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


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

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

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

loading
clippy