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