ArjunVachhani / order-matcher

simple, fast and feature rich order matching engine supports limit, market, stop-loss, iceberg, IOC, FOK, GTD orders
MIT License
137 stars 70 forks source link

Using floating point in order #27

Closed omidmoradzadeh closed 3 years ago

omidmoradzadeh commented 3 years ago

Hi How can floating-point be used in the amount of assets for buying and selling? For example :

{ "Price": 2005, "OpenQuantity":1.50 }

ArjunVachhani commented 3 years ago

Price and Quantity type support implicit conversion from decimal datatype. you could use m to treat number as decimal.

Order order = new Order { Price : 2005.25m };

or

decimal price = 2005.25m;
Order order = new Order { Price : price };

Prefer using int/long/decimal/price/quantity datatype to represent financial amount instead of float or double.

For Serialization/Deserialization You may need to write custom serialization/deserialization for Price, Quantity and OrderId data type. See below example code for JsonConverter of System.Text.Json

public class PriceJsonConverter : JsonConverter<Price>
{
    public override Price Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var price = reader.GetDecimal();
        return new Price(price);
    }

    public override void Write(Utf8JsonWriter writer, Price objectToWrite, JsonSerializerOptions options)
    {
        decimal price = objectToWrite;
        JsonSerializer.Serialize(writer, price, typeof(decimal), options);
    }
}

public class QuantityJsonConverter : JsonConverter<Quantity>
{
    public override Quantity Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var quantity = reader.GetDecimal();
        return new Quantity(quantity);
    }

    public override void Write(Utf8JsonWriter writer, Quantity objectToWrite, JsonSerializerOptions options)
    {
        decimal quantity = objectToWrite;
        JsonSerializer.Serialize(writer, quantity, typeof(decimal), options);
    }
}

public class OrderIdJsonConverter : JsonConverter<OrderId>
{
    public override OrderId Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var orderId = reader.GetInt32();
        return new OrderId(orderId);
    }

    public override void Write(Utf8JsonWriter writer, OrderId objectToWrite, JsonSerializerOptions options)
    {
        int orderId = objectToWrite;
        JsonSerializer.Serialize(writer, orderId, typeof(int), options);
    }
}

Usage of above defined JsonConverter

var order = new Order { OrderId = 12, Price = 100.0001m, OpenQuantity = 20.00002m };
var jsonSerilizerOption = new JsonSerializerOptions { Converters = { new OrderIdJsonConverter(), new PriceJsonConverter(), new QuantityJsonConverter() } };
var jsonString = JsonSerializer.Serialize(order, jsonSerilizerOption);
var deserializedObject = JsonSerializer.Deserialize<Order>(jsonString, jsonSerilizerOption);