Исторические свечки в 4.1
Atom Ответить
06.08.2012


В предыдущей версии библиотеки я использовал для выгрузки свечек из истории метод RegisterHistoryCandles(int count, SmartHistoryDirections.Backward) а теперь не могу разобраться как мне выгрузить скажем 100 последних свечек из истории и склеить их с текущими. В документации ответа не нашёл. Также интересует как обрабатывать свечки по событию которым раньше было CandleFinished.(series.ProcessCandle как я понял работает при каждом изменении цены и т.п. а мне это не нужно)

Теги:


Спасибо:




6 Ответов
Alexander

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


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

Андрей Александрович

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


С выгрузкой истории я разобрался, остается неясным что делать с CandleFinished... неужели в новой версии не предусмотрено ничего проще чем способ описанный в примерах??? (мне не требуется потиковая отрисовка, нужен только _strategy.LongSma.Process((DecimalIndicatorValue)c.ClosePrice);

Код
_candleManager.Processing += (s, candle) =>
						{
							// выводим только те свечки, которые не были отрисованы как исторические
							if (candle.OpenTime > _lastHistoryCandle)
								DrawCandles(new[]{ candle });

							// нас не интересует текущая свечка, так как она еще не сформировалась
							// и из нее нельзя брать цену закрытия

							// вычисляем временные отрезки текущей свечки
							var bounds = _timeFrame.GetCandleBounds(_trader);

							// если появились новые полностью сформированные свечки
							if ((_lastCandleTime + _timeFrame) < bounds.Min)
							{
								// отступ с конца интервала, чтобы не захватить текущую свечку.
								var endOffset = TimeSpan.FromSeconds(1);

								bounds = new Range<DateTime>(_lastCandleTime + _timeFrame, bounds.Min - endOffset);

								// получаем эти свечки
								var candles = _candleManager.Container.GetCandles(s, bounds);

								if (!candles.IsEmpty())
								{
								    foreach (var c in candles)
								    {
								        // добавляем новую свечку
								        _strategy.LongSma.Process((DecimalIndicatorValue)c.ClosePrice);
								        _strategy.ShortSma.Process((DecimalIndicatorValue)c.ClosePrice);
								    }

								    // получаем время самой последней свечки и запоминаем его как новое начало
									_lastCandleTime = candles.Max(c => c.OpenTime);

								    this.GuiSync(() => DrawMaLines(bounds.Min));
								}
							}
						};
Автор топика
Спасибо:

OvcharenkoVI

Фотография
Автор статей
Дата: 07.08.2012
Ответить


_candleManager.Processing += (s, candle) =>
{
if(cande.State == CandleStates.Finished)
{
_strategy.LongSma.Process((DecimalIndicatorValue)c.ClosePrice);
}
};

То есть проверяем, если пришла законченная свечка, то обрабатываем ее
Спасибо: Андрей Александрович

Андрей Александрович

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


OvcharenkoVI Перейти
_candleManager.Processing += (s, candle) =>
{
if(cande.State == CandleStates.Finished)
{
_strategy.LongSma.Process((DecimalIndicatorValue)c.ClosePrice);
}
};

То есть проверяем, если пришла законченная свечка, то обрабатываем ее


Это как раз то что нужно, благодарю за помощь.
Автор топика
Спасибо:

Moadip

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


Можно еще через правила, в 4.1.3 их можно использовать не только в стратегии.
Код

private CandleSeries _series;

...

_series
	.WhenCandlesFinished()
	.Do(() => {...})
	.Apply();
Спасибо: Андрей Александрович

Андрей Александрович

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


Moadip Перейти
Можно еще через правила, в 4.1.3 их можно использовать не только в стратегии.
Код

private CandleSeries _series;

...

_series
	.WhenCandlesFinished()
	.Do(() => {...})
	.Apply();


Вот это наверно самый удобный способ. Пришлось скопировать код и добавить решарпером сборку чтобы у _series появилось это поле. В исходном варианте его нет. Надеюсь тема станет полезной не только мне. Всем ответившим спасибо за поддержку.
Автор топика
Спасибо:


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

loading
clippy