← Voltar

Как правильно получить среднюю цену открытия позиции?

Есть такая функция MyTrades.GetAveragePrice(), которая выдает среднюю цену исполнения по всем сделкам, но если позиция была открыта, потом закрыта, потом снова открыта, потом частично закрыта, то простое перемножение цен на объемы не будет иметь никакого смысла. Как же узнать среднюю цену, по которой удерживается позиция?

В старых исходниках нашел вот такое:


public static decimal GetAveragePrice(this IEnumerable<Trade> trades)
{
	if (trades == null)
		throw new ArgumentNullException("trades");

	var nominator = 0m;
	var denominator = 0m;

	foreach (var trade in trades)
	{
		nominator += trade.Price * trade.Volume;
		denominator += trade.Volume;
	}

	if (denominator == 0)
		return 0;

	return nominator / denominator;
}

то есть простое перемножение. А есть ли функция, которая учитывает направление сделок?

Este tópico foi útil?

Compartilhar tópico

Comentários (3)

Entrar ou Criar conta, Faça login ou cadastre-se para deixar um comentário

poison
poison Autor

Что нибудь вроде этого:


public static decimal GetAveragePriceEx(this IEnumerable<MyTrade> myTrades)
{
	if (myTrades == null)
		throw new ArgumentNullException("myTrades");

	var nominator = 0m;
	var denominator = 0m;

	foreach (var myTrade in myTrades)
	{
		var order = myTrade.Order;
		var trade = myTrade.Trade;
		if (order.Direction == StockSharp.Messages.Sides.Buy)
		{
			nominator += trade.Price * trade.Volume;
			denominator += trade.Volume;
		}
		else
		{
			nominator -= trade.Price * trade.Volume;
			denominator -= trade.Volume;
		}
	}

	if (denominator == 0)
		return 0;

	return nominator / denominator;
}

Mikhail Sukhov
Mikhail Sukhov
Mikhail Sukhov

Надо будет посмотреть. На в скидку - код является рудиментом. Возможно, его нужно вообще удалить, а не модернизировать.

Mikhail Sukhov
Mikhail Sukhov

Посмотрел ваш код. Он неправильный. В вашем сценарии, когда позу открывали, закрывали, снова открывали в конечном итоге получится направленная позиция со средней ценой открытия. А как вы написали, будет средняя цена открытия-закрытия-открытия.