using System;
using System.Diagnostics;
namespace CryptoExchange.Net.SharedApis
{
///
/// Spot order info
///
[DebuggerDisplay("{DebugView,nq}")]
public record SharedSpotOrder : SharedSymbolModel
{
private string DebugView =>
$"[{CreateTime}] {OrderId} {Symbol} - " +
$"{OrderType} {Side} {OrderQuantity}{(OrderPrice != null ? " @ " + OrderPrice : "")}, " +
$"{Status}{(QuantityFilled != null && Status != SharedOrderStatus.Canceled ? $" {QuantityFilled}" : "")}{(AveragePrice != null ? " @ " + AveragePrice : "")}";
///
/// The id of the order
///
public string OrderId { get; set; }
///
/// The type of the order
///
public SharedOrderType OrderType { get; set; }
///
/// The side of the order
///
public SharedOrderSide Side { get; set; }
///
/// Status of the order
///
public SharedOrderStatus Status { get; set; }
///
/// Time in force for the order
///
public SharedTimeInForce? TimeInForce { get; set; }
///
/// Order quantity
///
public SharedOrderQuantity? OrderQuantity { get; set; }
///
/// Filled quantity
///
public SharedOrderQuantity? QuantityFilled { get; set; }
///
/// Order price
///
public decimal? OrderPrice { get; set; }
private decimal? _averagePrice;
///
/// Average fill price
///
public decimal? AveragePrice
{
get => _averagePrice > 0 ? _averagePrice
: (QuantityFilled?.QuantityInBaseAsset > 0 && QuantityFilled?.QuantityInQuoteAsset > 0
? QuantityFilled.QuantityInQuoteAsset / QuantityFilled.QuantityInBaseAsset
: null);
set => _averagePrice = value;
}
///
/// Client order id
///
public string? ClientOrderId { get; set; }
///
/// Asset the fee is in
///
[Obsolete("FeeAsset on order level is deprecated and will be removed in a futures version, use FeeAsset on trade level instead")]
public string? FeeAsset { get; set; }
///
/// Fee paid for the order
///
[Obsolete("Fee on order level is deprecated and will be removed in a futures version, use Fee on trade level instead")]
public decimal? Fee { get; set; }
///
/// Timestamp the order was created
///
public DateTime? CreateTime { get; set; }
///
/// Last update timestamp
///
public DateTime? UpdateTime { get; set; }
///
/// Only available for order updates, contains the info on the executed trade
///
[Obsolete("Use SharedSpotOrderUpdate.LastTrade instead, LastTrade is never filled on non websocket updates")]
public SharedUserTrade? LastTrade { get; set; }
///
/// Trigger price for a trigger order
///
public decimal? TriggerPrice { get; set; }
///
/// Whether or not the is order is a trigger order
///
public bool IsTriggerOrder { get; set; }
///
/// ctor
///
public SharedSpotOrder(
SharedSymbol? sharedSymbol,
string symbol,
string orderId,
SharedOrderType orderType,
SharedOrderSide orderSide,
SharedOrderStatus orderStatus,
DateTime? createTime)
: base(sharedSymbol, symbol)
{
OrderId = orderId;
OrderType = orderType;
Side = orderSide;
Status = orderStatus;
CreateTime = createTime;
}
}
}