GetTimeFrameCandles, дубляж свечей.

GetTimeFrameCandles, дубляж свечей.
Atom
5/6/2011
Ilya Gruntal


Как узнал о 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, и попробуйте выяснить почему в одном списке со свечами встречаются такие непостоянные повторения...

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

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

Tags:


Thanks:


1 2  >
Ilya Gruntal

Avatar
Date: 5/6/2011
Reply


Возможно такое непостоянство из-за Quik версии 5.18.0.386?
Но тогда мне в двадцать раз обиднее [crying]
Thanks:

Garic

Avatar
Date: 5/6/2011
Reply


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

Mikhail Sukhov

Avatar
Date: 5/6/2011
Reply


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

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

Mikhail Sukhov

Avatar
Date: 5/6/2011
Reply


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


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

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

Garic

Avatar
Date: 5/6/2011
Reply


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

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

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

Свечи:

Code

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);
}
}


Сам код:
Code

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();
            }
Thanks:

Mikhail Sukhov

Avatar
Date: 5/6/2011
Reply


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


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

Ilya Gruntal

Avatar
Date: 5/6/2011
Reply




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

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


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 сейчас попробую.
Thanks:

Garic

Avatar
Date: 5/6/2011
Reply


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

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

Ilya Gruntal

Avatar
Date: 5/6/2011
Reply


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

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

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

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

Ilya Gruntal

Avatar
Date: 5/6/2011
Reply




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

P.S. В таблице всех сделок в течении этой минуты ничего необычного не нашёл.
Thanks:
1 2  >

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy