GetTimeFrameCandles, дубляж свечей.
Atom Ответить
06.05.2011


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

GetTimeFrameCandles, и та, что на Count, и та что на Range<DateTime> выдаёт двойные свечи.
Пробежавшись по форуму увидел такую же тему, вопрос так и остался нерешенным.

Date Time Low-Open-Close-High#Volume
06.05.2011 10:00:00 9505-9536-9594-9606#16110
06.05.2011 10:00:00 9505-9536-9594-9606#16110
06.05.2011 10:15:00 9594-9594-9604-9656#9529
06.05.2011 10:15:00 9594-9594-9604-9656#9529


И так далее, в 11:00 выдаёт тоже две свечи, но отличающиеся ценой закрытия и объёмом.

После 12:00:00 всё нормально.

Пока писал эту тему, снова запустил прогу, чтобы скопировать лог и МАГИЧЕСКИМ образом дубляж исчез. Больше всего как раз таки пугает вот такое вот непостоянство результата... на кону ведь всё таки деньги настоящие :)

Очень прошу Вас, Михаил!
Пожалуйста, посмотрите внимательно ещё раз на реализацию метода (extension) GetTimeFrameCandles, и попробуйте выяснить почему в одном списке со свечами встречаются такие непостоянные повторения...

В свою очередь уверяю, что это не мой косяк, ставил стопы сразу после вызова функции. Могу конечно скинуть код, если не верится... Мне сейчас самому не верится, потому что баг исчез, но он был, при этом я ничего не менял.

Надеюсь на взаимопонимание... очень хочется... чтобы всё работало... стабильно...

Теги:


Спасибо:




11 Ответов
Ilya Gruntal

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


Возможно такое непостоянство из-за Quik версии 5.18.0.386?
Но тогда мне в двадцать раз обиднее Crying
Автор топика
Спасибо:

Garic

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


Экспортировал RangeCandles по RI из Гидры - наблюдал аналогичную фишку.
Первые несколько свечек дублировались.
Спасибо:

Mikhail Sukhov

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


Пример SampleCandles запускали? Рисует корректно, без дубляжей?

Подумалось, в примере дубли не увидеть. Можете минимальный код выложить для воспроизведения?
Спасибо:

Mikhail Sukhov

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


Garic Перейти
Экспортировал RangeCandles по RI из Гидры - наблюдал аналогичную фишку.
Первые несколько свечек дублировались.


Какие даты + минимальный код для воспроизведения.

В магические ошибки я не верю. Больше верю, что неправильно используется модель CandleManager. Иногда не сразу понятно, чем скажем CandlesChanged отличается от NewCandles. Поэтому и происходят "мифические" дубляжи.
Спасибо:

Garic

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


Мой случай воспроизводится стабильно.

Скачал Гидрой с РТС данные по RIM1
Строю свечи на 01.03.2011

Если строить на дату где много сделок (например 21.03) - такой фишки не наблюдается - видимо как-то с этим связано.

Свечи:

Код

class RangeDelayCandleFactory : RangeCandleFactory
{
public override bool IsCandleFinished(CandleToken<RangeCandle, Unit> token, RangeCandle currentCandle, Trade trade)
{
return base.IsCandleFinished(token, currentCandle, trade) &&
(currentCandle.Time.Date != trade.Time.Date || currentCandle.Time.Hour != trade.Time.Hour ||
currentCandle.Time.Minute != trade.Time.Minute || currentCandle.Time.Second != trade.Time.Second);
}
}


Сам код:
Код

if (this.Security != null && this.From.DateTime != null && this.To.DateTime != null)
            {
// тестовый портфель
var portfolio = new Portfolio { Name = "test account" };

// инициализируем настройки (инструмент в истории обновляется раз в секунду)
var trader = new HistoryEmulationTrader(
new Dictionary<Security, TimeSpan> { { Security, TimeSpan.FromSeconds(1) } },
new[] { portfolio },
Storage);

// запускаем экспорт, чтобы инициализировать переданными инструментами и портфелями
// необходимоые свойства HistoryEmulationTrader
trader.StartExport();

var timeFrame = TimeSpan.FromMinutes(5);

var candleManager = new CandleManager(new SyncTraderCandleSource(trader));
int priceRangeInt = int.Parse(this.PriceRange.Text);
if (priceRangeInt == 0)
{
priceRangeInt = 100;
this.PriceRange.Text = "100";
}
var priceRange = new Unit(priceRangeInt);


RangeDelayCandleFactory candleFactory = new RangeDelayCandleFactory();
candleManager.UnRegisterCandleFactory<RangeCandle>();
candleManager.RegisterCandleFactory(candleFactory);
candleManager.RegisterCandles<RangeCandle, Unit>(Security, priceRange);

// создаем тестовый менеджер стратегий на заданный период
// в реальности период может быть другим, и это зависит от объема данных,
// хранящихся по пути this.HistoryPath
EmulationStrategyManager _manager;
_manager = new EmulationStrategyManager(trader, this.FromDate, this.ToDate.Date.AddDays(1)) { TimeStep = timeFrame };

_manager.StateChanged += () => this.GuiSync(() =>
             {
if (_manager.State != StrategyManagerStates.Runned)
{
this.FindedTrades.ItemsSource = candleManager.GetRangeCandles(Security, priceRange, new Range<DateTime>(this.FromDate, this.ToDate.Date.AddDays(1)));
this.ExportBtn.IsEnabled = true;
this.TestingProcess.Value = this.TestingProcess.Maximum;
}
                });

// и подписываемся на событие окончания итерации, чтобы обновить ProgressBar
_manager.IterationFinished += () =>
{
// в целях оптимизации обновляем ProgressBar только при каждой 100 итерации
if ((_manager.PassedIterationCount % 100) == 0)
this.GuiAsync(() => this.TestingProcess.Value = _manager.PassedIterationCount);
};

// устанавливаем в визуальный элемент ProgressBar максимальное количество итераций
this.TestingProcess.Maximum = _manager.TotalIterationCount;
            
_manager.Start();
            }
Спасибо:

Mikhail Sukhov

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


Garic Перейти
Скачал Гидрой с РТС данные по RIM1
Строю свечи на 01.03.2011


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

Ilya Gruntal

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




Вот картинка того, что получается.
Код в студию:
Код

_Trader.Connected += () =>
{
this.strategyManager = new RealTimeStrategyManager(_Trader);
this.candleManager = new CandleHistoryManager(_Trader);
Log("Подключились.");
};

_Trader.NewSecurities += (Securities) =>
{
if (SBER == null)
{
SBER = Securities.First(Sec => Sec.Code == "SRM1");
if (SBER != null)
{
Log("Инструмент Сбербанка получен.");
_Trader.RegisterQuotes(SBER);
candleManager.RegisterTimeFrameCandles(SBER, FifteenMinsTimeFrame);
}
}
};

public void Test()
{
var Candles = candleManager.GetTimeFrameCandlesHistory(SBER, FifteenMinsTimeFrame, 100);

foreach (var Candle in Candles)
{
Log(Candle.Time + ": " + Candle.LowPrice.ToString() + " - " +
Candle.OpenPrice.ToString() + "-" + Candle.ClosePrice.ToString() +
" - " + Candle.HighPrice.ToString() + "#" +Candle.TotalVolume.ToString());
}
}


Из CandleHistoryManager:
Код


public IEnumerable<TimeFrameCandle> GetTimeFrameCandlesHistory(Security security, TimeSpan timeframe, int candleCount)
{
var candleList = this.GetTimeFrameCandles(security, timeframe, candleCount).ToList<TimeFrameCandle>();
return candleList;
}



CandleHistoryManager - класс, унаследованный от CandleManager для экспорта Qpile таблицы, однако всё закомментированно, вплоть до Кастом таблиц. Да и если я просто CandleManager использовать буду - тоже самое будет...

SampleCandles сейчас попробую.
Автор топика
Спасибо:

Garic

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


Я их просто на экран вывожу в лист
this.FindedTrades.ItemsSource = candleManager.GetRangeCandles

Среди первых 5-10 свечей есть несколько с одинаковым временем и ценами
Иногда, реже, попадаются с одинаковым временем и отличающейся одной ценой - как будто туда ещё один тик попал.
Спасибо:

Ilya Gruntal

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


SampleCandles работает нормально... заставляет задуматься. Unsure
Блин переписывать чтоль всё... Cursing

Однако в SampleCandles GetTimeFrameCandles не используется, только события...
Это не совсем удобно, когда нужно работать с историей, но если другого варианта нет, то...

Последнее слово за Вами, Михаил!

P.S. Заменил унаследованный класс на стандартный CandlesManager - глюк по прежнему присутствует.
Автор топика
Спасибо:

Ilya Gruntal

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




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

P.S. В таблице всех сделок в течении этой минуты ничего необычного не нашёл.
Автор топика
Спасибо:

Mikhail Sukhov

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


Ilya Gruntal Перейти
Последнее слово за Вами, Михаил!


Нашел. Выложу на этих выхах.
Спасибо: Ilya Gruntal


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

loading
clippy