本文整理汇总了C#中StockSharp.Messages.ExecutionMessage.Clone方法的典型用法代码示例。如果您正苦于以下问题:C# ExecutionMessage.Clone方法的具体用法?C# ExecutionMessage.Clone怎么用?C# ExecutionMessage.Clone使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类StockSharp.Messages.ExecutionMessage
的用法示例。
在下文中一共展示了ExecutionMessage.Clone方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: OnProcess
/// <summary>
/// Обработать сообщение.
/// </summary>
/// <param name="message">Сообщение.</param>
/// <returns>Результат обработки. Если будет возрвщено <see langword="null"/>,
/// то генератору пока недостаточно данных для генерации нового сообщения.</returns>
protected override Message OnProcess(Message message)
{
DateTimeOffset time;
switch (message.Type)
{
case MessageTypes.Level1Change:
{
var l1Msg = (Level1ChangeMessage)message;
var value = l1Msg.Changes.TryGetValue(Level1Fields.LastTradePrice);
if (value != null)
_lastOrderPrice = (decimal)value;
TradeGenerator.Process(message);
time = l1Msg.ServerTime;
break;
}
case MessageTypes.Execution:
{
var execMsg = (ExecutionMessage)message;
switch (execMsg.ExecutionType)
{
case ExecutionTypes.Tick:
_lastOrderPrice = execMsg.GetTradePrice();
break;
default:
return null;
}
time = execMsg.ServerTime;
break;
}
case MessageTypes.Time:
{
var timeMsg = (TimeMessage)message;
time = timeMsg.ServerTime;
break;
}
default:
return null;
}
if (!IsTimeToGenerate(time))
return null;
// TODO более реалистичную генерацию, так как сейчас объемы, цены и сделки c потолка
var action = RandomGen.GetInt(0, 5);
var isNew = action < 3 || _activeOrders.IsEmpty();
ExecutionMessage item;
if (isNew)
{
var priceStep = SecurityDefinition.PriceStep ?? 0.01m;
_lastOrderPrice += RandomGen.GetInt(-MaxPriceStepCount, MaxPriceStepCount) * priceStep;
if (_lastOrderPrice <= 0)
_lastOrderPrice = priceStep;
item = new ExecutionMessage
{
OrderId = IdGenerator.GetNextId(),
SecurityId = SecurityId,
ServerTime = time,
OrderState = OrderStates.Active,
Volume = Volumes.Next(),
Side = RandomGen.GetEnum<Sides>(),
Price = _lastOrderPrice,
ExecutionType = ExecutionTypes.OrderLog,
};
_activeOrders.Enqueue((ExecutionMessage)item.Clone());
}
else
{
var activeOrder = _activeOrders.Peek();
item = (ExecutionMessage)activeOrder.Clone();
item.ServerTime = time;
var isMatched = action == 5;
//.........这里部分代码省略.........
示例2: Update
//.........这里部分代码省略.........
if (item.IsSystem == false || item.TradePrice != null || item.Price == 0 /* нулевая цена может появится при поставке опционов */)
return changed;
if (item.IsOrderLogRegistered())
{
changed = TryApplyTrades(null);
if (
(item.Side == Sides.Buy && (_depth.Asks.IsEmpty() || item.Price < _depth.Asks.First().Price)) ||
(item.Side == Sides.Sell && (_depth.Bids.IsEmpty() || item.Price > _depth.Bids.First().Price))
)
{
if (item.TimeInForce == TimeInForce.PutInQueue)
{
var quotes = (item.Side == Sides.Buy ? _bids : _asks);
var quote = quotes.TryGetValue(item.Price);
if (quote == null)
{
quote = new QuoteChange
{
Side = item.Side,
Price = item.Price,
Volume = volume,
};
quotes.Add(item.Price, quote);
if (item.Side == Sides.Buy)
_depth.Bids = GetArray(quotes);
else
_depth.Asks = GetArray(quotes);
}
else
quote.Volume += volume;
changed = true;
}
}
else
{
_matchingOrder = (ExecutionMessage)item.Clone();
// mika
// из-за того, что могут быть кросс-сделки, матчинг только по заявкам невозможен
// (сначала идет регистрация вглубь стакана, затем отмена по причине кросс-сделки)
// http://forum.rts.ru/viewtopic.asp?t=24197
//
}
}
else if (item.IsOrderLogCanceled())
{
var isSame = _matchingOrder != null && _matchingOrder.OrderId == item.OrderId;
changed = TryApplyTrades(item);
if (!isSame && item.TimeInForce == TimeInForce.PutInQueue)
{
// http://forum.rts.ru/viewtopic.asp?t=24197
if (item.GetOrderLogCancelReason() != OrderLogCancelReasons.CrossTrade)
{
var quotes = (item.Side == Sides.Buy ? _bids : _asks);
var quote = quotes.TryGetValue(item.Price);
if (quote != null)
{
quote.Volume -= volume;
if (quote.Volume <= 0)
{
quotes.Remove(item.Price);
if (item.Side == Sides.Buy)
_depth.Bids = GetArray(quotes);
else
_depth.Asks = GetArray(quotes);
}
}
}
changed = true;
}
}
else
{
throw new ArgumentException(LocalizedStrings.Str943Params.Put(item), "item");
// для одной сделки соответствуют две строчки в ОЛ
//_trades[item.Trade.Id] = item;
}
}
finally
{
if (changed)
_depth.ServerTime = item.ServerTime;
}
return changed;
}