← 返回

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

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

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

本主题对您有帮助吗?

分享主题

评论 (5)

登录创建账户, 登录或注册以发表评论

Daenur
Daenur 作者

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

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

Mikhail Sukhov
Mikhail Sukhov

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

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

Daenur
Daenur 作者

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

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

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

Mikhail Sukhov
Mikhail Sukhov

Daenur: void candleManager_NewCandles(CandleToken candleToken, IEnumerable candles)

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

Daenur
Daenur 作者

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