Невозможно обработать начальные значения индикатора
Atom Ответить
18.12.2011


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

Запуск бота происходит в середине торговой сессии, т.е. уже есть какие-то трейды
Последовательность запуска примерно такая
Код

this._trader = new QuikTrader(QuikTerminal.GetDefaultPath());
this._cm = new CandleManager(this._trader);
this._trader.Connect();
this._trader.StartExport();
this.security = this._trader.Securities.FirstOrDefault(s => s.Code == this.SCode);
var candleToken = this._cm.RegisterTimeFrameCandles(security, this._timeFrame);
this.ATRToken = indicatorManager.RegisterIndicator(new AverageTrueRange { Length = 10 }, new CandleTokenIndicatorSource(candleToken, BaseCandleIndicatorSource.ByClose));
var ATR = this.ATRToken.Indicator as AverageTrueRange;
ATR.Changed += (input, res) =>
{
    var candle = this._cm.GetTimeFrameCandle(this.security, this._timeFrame, 1);
    var val = ATR.LastValue.GetValue<decimal>();
    this.GuiAsync(() => this.chartWnd.ATR.Add(new DItem { date = candle.Time, value = val }));
};


Как сделать добавление события Changed до регистрации свечек, я так и не разобрался. Ведь я не могу определить его без токена. А токен можно получить только зарегистрировав свечи

Теги:


Спасибо:




10 Ответов
Alexander

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


Тема к квику, я так понял, не относится.
Переношу в индикаторы.
Спасибо:

pehas

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


Я так понял, красиво эту задачу не решить?
Кто-то вообще занимался отрисовкой индикаторов по прошлым трейдам, если бот запускается внутри дня? Поделитесь опытом

В библиотеке S# есть пример SampleSMA - там рисуются индикаторы за предыдущие периоды, но только с помощью истории загруженной из файла. А по задаче нужно нарисовать используя только свечи CandleManager
Автор топика
Спасибо:

Mikhail Sukhov

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


pehas Перейти
Я так понял, красиво эту задачу не решить?


Я лично не понял ничего из сообщения.
Спасибо:

freelancer

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


Может вам поможет:

я соединяю исторические свечи из квика с текущими, а потом вызываю
Код
foreach (Candle c in _candles)
{
	Индикатор.Process(new StockSharp.Algo.Indicators.CandleIndicatorValue(c));
}
Спасибо: OvcharenkoVI

pehas

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


freelancer Перейти
Может вам поможет:

я соединяю исторические свечи из квика с текущими, а потом вызываю
Код
foreach (Candle c in _candles)
{
	Индикатор.Process(new StockSharp.Algo.Indicators.CandleIndicatorValue(c));
}


Это не совсем то что мне нужно, но благодаря вашему примеру, я решил свою проблему. И как раз думал над тем как засунуть в индикатор свечи импортированные из квика. Так что вы совсем вовремя) Спасибо!
Автор топика
Спасибо:

pehas

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


freelancer Перейти
Может вам поможет:

я соединяю исторические свечи из квика с текущими, а потом вызываю
Код
foreach (Candle c in _candles)
{
	Индикатор.Process(new StockSharp.Algo.Indicators.CandleIndicatorValue(c));
}

мне нужно вызвать Process у индикатора Highest. Указанный выше способ не работает в этом случае.
Выползает ошибка "Объект должен реализовывать интерфейс IConvertible"
Если делать так -
Код

Highest h = new Highest {Length = 20}
foreach (Candle c in _candles)
{
        
	h.Process(new StockSharp.Algo.Indicators.DecimalIndicatorValue(c));
}

то работает, но тогда вылетает с ошибкой такой код
Код

        h.Changed += (input, res) =>
        {
             MessageBox.Show(input.Time.ToString());
        }
}

потому что инпут не свеча.

Как получить input в виде свечи в данном случае?
Автор топика
Спасибо:

pehas

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


Кому интересно, проблема решилась так:
Нашел в исходниках на codeplex закрытый класс CandlePartIndicatorValue и скопировал его реализацию в свой код
Таким образом следующий код заработал без ошибок
Код

Highest h = new Highest {Length = 20}

h.Changed += (input, res) =>
{
    MessageBox.Show(input.Time.ToString());
}

foreach (Candle c in _candles)
{
    h.Process(new StockSharp.Algo.Indicators.CandlePartIndicatorValue (c, c.HighPrice));
}

Автор топика
Спасибо:

OvcharenkoVI

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


Че то ты сам че то натворил и сам че то решил

Если ты работаешь с DecimalIndicatorValue, то и входное значение изначально должно быть типа Decimal.

Чем не устраивает: h.Process(new StockSharp.Algo.Indicators.DecimalIndicatorValue(c.HighPrice));

И все сразу должно было работать
Спасибо:

pehas

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


OvcharenkoVI Перейти
Че то ты сам че то натворил и сам че то решил

Если ты работаешь с DecimalIndicatorValue, то и входное значение изначально должно быть типа Decimal.

Чем не устраивает: h.Process(new StockSharp.Algo.Indicators.DecimalIndicatorValue(c.HighPrice));

И все сразу должно было работать


Тем что мне нужно передать в событие Chanded индикатора свечу а не Decimal для дальнейшей работы. К примеру тебе надо в событии changed отрисовать значение индикатора или получить значение цены открытия входной свечи. С decimal ты ничего не сделаешь
Автор топика
Спасибо:

russ

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


...
Спасибо:


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

loading
clippy