Тестирование 4.2.2.16. Вывод свечей на график.
Atom Ответить
10.03.2014


Добрый вечер!
Разъясните, пожалуйста, следующую ситуацию.
Есть HistoryEmulationConnector.
Есть свечи из бд (источник финам).
Допустим такой набор


Свечи формируются следующим образом
Код

var time = DateTime.ParseExact(candle.DatetimeCandle, "dd.MM.yyyy HH:mm:ss", null);
return new TimeFrameCandle()
{
    OpenPrice = candle.Open,
    HighPrice = candle.High,
    LowPrice = candle.Low,
    ClosePrice = candle.Close,
    TimeFrame = timeFrameCandle,
    OpenTime = time,
    CloseTime = time + timeFrameCandle,
    TotalVolume = candle.Volume,
    Security = security,
    State = CandleStates.Finished
};


Если смотреть через дебаггер - то значения соответствуют тем, что выше.
1) Но вот при отрисовке свечей их OPEN и CLOSE значения изменяются. Изменяются они не намного, но все же мне пока не понятно по какому принципу это происходит.
2) И еще - все первые свечи (10:00:00) каждого дня при отрисовке имеют OPEN = HIGH = LOW = CLOSE, что, например, не соответствует данным, указанным выше. (Для первого набора, например, эти значения равны 97,8)

Буду благодарен, если кто-то объяснит почему так происходит.



Спасибо:




13 Ответов
Bond

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


Добрый день!
К сведению, некоторые особенности формирования свечей из тиков:
- Свечи закрываются первой сделкой из следующей свечи. Так может возникнуть запаздывание события закрытия свечи.
- В первой свече может возникнуть неопределенность и, в принципе, по алгоритму может формироваться новая свеча только когда закроется первая. Но это нужно смотреть алгоритм.

Цитата:
Изменяются они не намного
Уточните конкретнее о чем речь.

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

romany4

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


Добрый день.
Цитата:
Уточните конкретнее о чем речь.

Есть уже готовые свечи в бд. Хранятся они в таком виде:

Данные из бд получаю и сохраняю в IEnumerable<Candle> candles
Если смотреть candles через дебаггер - то все нормально - данные те же самые.
Далее я их сохраняю в StorageRegistry, который в свою очередь используется в HistoryEmulationConnector
И вот если через дебаг смотреть уже метод DrawCandle то там будут такие значения


Т.е. получается так. Первая свеча формируется из OPEN. При этом OPEN = HIGH = LOW = CLOSE.
Для остальных свечей HIGH и LOW соответствуют первоначальным значениям (что и в бд). А вот OPEN и CLOSE не намного изменяются, и изменяются они не везде, но в большинстве случаев.
Автор топика
Спасибо:

Bond

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


Приведите полный код преобразований. Здесь явно какая-то ошибка.
Спасибо:

romany4

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


Так получаю свечи
Код

IEnumerable<Candle> candles = instanceCandle.GetHistoryCandle(_security, _fromDate.ToMysqlTimestampFormat(), _toDate.ToMysqlTimestampFormat(), timeFrameCandle);

если смотреть через дебаг - candles содержит тот же набор что и в бд.

теперь сохраняю в StorageRegistry, затем создаю HistoryEmulationConnector, и вывожу свечи

Вот собственно весь код.

И вот еще сам метод DrawCandle
Код
private void DrawCandle(Candle candle)
{
    this.GuiAsync(() => Chart.ProcessCandle((ChartCandleElement)Chart.Areas[0].Elements[0], candle));
}
Автор топика
Спасибо:

Bond

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


Вы берете текстовый файл с данными свечи. Потом его парсите и сохраняете в хранилище. Потом берете из хранилища сохраненные свечи(!). При этом используете генератор стакана! Затем создаете свечи из приходящих сделок (скорее всего случайные из стакана. Здесь появляются отличия.) Laugh
Я даже не знаю как эту схему еще больше можно усложнить)
Берете свечи - используйте свечи. Торгуете тики и стаканы - используйте тики и стаканы.
От себя советую не использовать никакие генераторы - это бред.
Торгуйте свечи или тики. Нужны стаканы - берите ордер лог.
Данные качайте Гидрой и не забиыайте себе голову всякими ненужными преобразованиями.
Спасибо:

romany4

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


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


Цитата:
скорее всего случайные из стакана. Здесь появляются отличия

Почему тогда эта случайность одна и та же? или тут речь о псевдослучайности?

PS Закомментил пока этот код у себя. Но результат тот же.
Автор топика
Спасибо:

romany4

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


Собственно в продолжение темы решил данные выкачать гидрой и проверить.
1) Для сравнения выкачиваем данные с финама вручную (тыц) (Сбербанк, с 01.10.2013 по 01.12.2013, 5мин. свечи) - это будет эталон, на который будем ориентироваться.
2) С помощью гидры также выкачиваем Сбер за аналогичный период. (только пятиминутные свечи, без сделок)
3) Протестируем данные гидры на SampleHistoryTesting (4.2.2.16)
4) Проверим данные, записанные в лог и сравним их с тем, что прислал финам
Вот что я вижу -
финам


лог с SampleHistoryTesting


Наблюдаются те же самые расхождения. Совпадают только HIGH и LOW цены.
Автор топика
Спасибо:

Bond

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


Сбросьте ВСЕ файлы, включая ваш пример и исторические данные в одном архиве на почту bond_algotrade@mail.ru
Найдем, где собака зарыта.
Спасибо:

devruss

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


Bond Перейти
От себя советую не использовать никакие генераторы - это бред.


Не использовать ни при каких обстоятельствах. Я где-то создавал тему, где сравнивал подходы и генератором и без, там вывод был, что с включенным генератором результат получается сильно искаженным

Спасибо:

devruss

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


romany4 Перейти


Наблюдаются те же самые расхождения. Совпадают только HIGH и LOW цены.


У финама дырявые данные. НО бесплатные=))) Доверять можно только данным записанным вживую с рынка, и то, с определенным скептицизмом (latency, рассинхронизация на очень маленьких таймфреймах и т.д.)

Спасибо:

romany4

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


Цитата:
У финама дырявые данные

Тут суть то в том, что через гидру я тоже качаю финамовские данные (источник Финам). И получается, что данные полученные от финама напрямую, отличаются от данных финама, скачанные гидрой. Собственно со всего этого и началось. Я хочу понять почему так происходит.

Цитата:
Сбросьте ВСЕ файлы, включая ваш пример и исторические данные в одном архиве

Сегодня-завтра скину
Автор топика
Спасибо:

Bond

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


Добрый день!
Раньше, к сожалению, не было возможности посмотреть ваши файлы. Поэтому отвечаю только сейчас.
Значит, что я обнаружил.
Ошибку вашу подтверждаю. Свечки строятся не правильно.
В высланном вами примере творится хаос. На мой взгляд все слишком мудрено написано.
Странная схема построения свечек и работа с series. Это все таки тестирование, а не реальная торговля, зачем с этим заморачиваться не понятно.
Предлагаю такую схему работы со свечами:
Код

//Загружаем из хранилища свечи, + добавляем один день(косяк - не выводит последний день)
var candles = storageRegistry.GetCandleStorage(typeof(TimeFrameCandle), security, timeFrame).Load(startTime, stopTime.AddDays(1));

//Перебираем полученные свечи
foreach (var candle in candles)
{
   DrawCandle(candle, ChartCandleElement);
}

//Выводим их на график или обрабатываем как нравится
private void DrawCandle(Candle candle, ChartCandleElement chartCandleElement)
{
   this.GuiAsync(() => _candleWindow.Chart.ProcessCandle(chartCandleElement, candle));
}




Отправил вам на почту рабочий пример работы со свечами.
Спасибо: romany4

romany4

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


Спасибо за помощь)
Цитата:

Ошибку вашу подтверждаю. Свечки строятся не правильно.
...
Это все таки тестирование, а не реальная торговля, зачем с этим заморачиваться не понятно.

Просто если вести статистику - то можно запутаться, получается что на деле значения свечи одни а в эмуляторе уже другие. И тем более при переходе на реальную торговлю это не вызовет неожиданных результатов?
Было бы классно, если ребята из S# прокомметировали эту ситуацию...
Автор топика
Спасибо:


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

loading
clippy