Возможно, проблема с SMA. Прошу меня проверить
Atom Ответить
17.10.2011


Начал разбираться с проектом, немного переделываю примеры под свои задачи. Для начала решил разобраться с индикаторами и их отрисовкой и столкнулся с проблемой - короткую SMA взял с периодом 1, на последнем баре ее значение иногда не совпадает с ценой закрытия бара. Подключение - к боевому серверу, данные за день приходят небольшими порциями, бары отрисовываются сразу по их приходу. После прихода нескольких порций данных нажимаю кнопку "Старт", которая в будущем будем запускать стратегию, а пока что просто отрисовывает скользящие средние.

Вот код:

private void btnRunStrategy_Click(object sender, RoutedEventArgs e)
{
// Создаем торговую стратегию, скользящие средние
this.currentStrategy = new SmaStrategy(candleManager, new SimpleMovingAverage(20), new SimpleMovingAverage(1), this.currentTimeFrame, this.candleToken)
{
Volume = 1,
Security = this.SelectedSecurity,
Portfolio = (Portfolio)this.cbPortfolios.SelectedItem,
Trader = this.trader,
};

currentStrategy.Log += OnLog;
currentStrategy.NewOrder += new Action<Order>(currentStrategy_NewOrder);
currentStrategy.PropertyChanged += new PropertyChangedEventHandler(currentStrategy_PropertyChanged);

int index = 0;
IEnumerable<Candle> tmpCandles = candleManager.GetCandles(this.candleToken);

// начинаем вычислять скользящие средние
foreach (Candle candle in tmpCandles)
{
currentStrategy.LongSma.Add(candle.ClosePrice);
currentStrategy.ShortSma.Add(candle.ClosePrice);

// если все скользящие сформировались, то начинаем их отрисовывать
if (index >= currentStrategy.LongSma.Length)
DrawSmaLines(candle.Time);

index++;

if (currentStrategy.ShortSma.Values[currentStrategy.ShortSma.Values.Count - 1] != candle.ClosePrice)
MessageBox.Show(this, "@@@1");

lastCandleTime = candle.Time;
lastCandle = candle;
}

}

На данном этапе все ок, последнее значение ShortSma равно цене закрытия бара. Но на графике потом иногда можно видеть, что последнее значение ShortSma уже не равно цене закрытия соответствующего бара, условие (currentStrategy.ShortSma.Values[currentStrategy.ShortSma.Values.Count - 1] != candle.ClosePrice) начинает выполняться.

Больше нигде в коде данные в ShortSma не добавляются и не изменяются те, что ранее были добавлены.
form1.jpg 151 KB (0)

Теги:


Спасибо:




5 Ответов
Daenur

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


Насчет SMA ошибался, провел тесты - все корректно считает. Проблема оказалась в изменении бара. Т.к. бары приходят порциями, то SMA так же считалась для всех пришедших баров, в т.ч. и для последнего, который я сохранял и с которым потом сравнивал значения. Оказалось, что после прихода новой порции баров последний из предыдущей порции менял свои значения. Почему - пока вопрос.

upd.
Обнаружилось несоответствие между данными КВИКа и барами, формируемыми StockSharp. См. рисунок. К примеру, бар 18.10.2011 в 13.10 на минутном графике RIZ1 не совпадает.
form2.jpg 523 KB (0)
Автор топика
Спасибо:

Mikhail Sukhov

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


Daenur Перейти

Обнаружилось несоответствие между данными КВИКа и барами, формируемыми StockSharp. См. рисунок. К примеру, бар 18.10.2011 в 13.10 на минутном графике RIZ1 не совпадает.


В Квике свечки строятся как? Как в S# или как в Финам?
Спасибо:

Daenur

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


Не понял вопроса.

В КВИКе открываю "график цены и объема" для RIZ1, ставлю интервал минута. Потом запускаю S# и на событии
void candleManager_NewCandles(CandleToken candleToken, IEnumerable<Candle> candles)
смотрю, что пришло в candles (это очередная порция данных при первоначальной подгрузке)

Вижу, что последний бар, пришедший по событию, не совпадает с тем, что в КВИКе. Дожидаюсь следующей порции баров, первый бар идет действительно следующим за последним из прошлой серии (т.е. их время не совпадает - был последний в 11.10, первый в новой порции - в 11.11)
Теперь снова нахожу тот последний неправильный бар в candleManager - теперь он изменился и совпадает с КВИКом.
form3.jpg 279 KB (0)
Автор топика
Спасибо:

Mikhail Sukhov

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


Daenur Перейти
void candleManager_NewCandles(CandleToken candleToken, IEnumerable<Candle> candles)


Событие не то. Это появление новых свечек, возможно еще не сформированных окончательно.
Спасибо: Daenur

Daenur

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


Да, теперь разобрался. Спасибо за помощь!
Автор топика
Спасибо:


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

loading
clippy