Идея стратегии сетки заключается в следующем: < /p>
[*] selet and lothers. Геометрическое расстояние).
[*] Игнорируйте ближайший уровень к текущей цене.
[*] Заказы на покупку ниже и продавать заказы выше текущей цены.
[*] Когда заказ на продажу выполняется, поместите новый заказ на покупку на один уровень ниже. /> Повторите неопределенный срок. Однако я действительно хочу иметь отдельные состояния для каждого уровня сетки. В частности: < /p>
- Для каждого уровня сетки должно быть состояние (, buy или sell ).
Код: Выделить всё
Inactive
- Если уровень сетки наиболее близок к текущей цене, состояние должно быть неактивным .
- Если уровень сетки ниже текущей цены, государство должно быть в целом. Продать .
[*] Нижний предел: нижняя граница сетки.
Верхний предел: верхняя граница сетки. /> < /ul>
Сетка может быть сгенерирована с помощью арифметического или геометрического расстояния. Ниже приведена версия Python о том, как рассчитываются уровни сетки: < /p>
def get_grids(lower_limit, upper_limit, grid_count, tp="arth"):
if tp == "arth":
grids = np.linspace(lower_limit, upper_limit, grid_count + 1)
elif tp == "geom":
grids = np.geomspace(lower_limit, upper_limit, grid_count + 1)
else:
print("not right range type")
return grids
< /code>
В C#уровни арифметической сетки можно рассчитать следующим образом: < /p>
var step = (upperLimit - lowerLimit) / gridCount;
List gridLevels = new List();
for (var i = 0; i
Что я пробовал (минимальный воспроизводимый пример) < /h2>
var builder = Host.CreateApplicationBuilder(args);
builder.AddEventBus();
var host = builder.Build();
await host.StartAsync();
var bus = host.Services.GetRequiredService();
var stateMachine = new GridStateMachine();
var lowerLimit = 25_000m;
var upperLimit = 35_000m;
var gridCount = 20;
var step = (upperLimit - lowerLimit) / gridCount;
List gridLevels = [];
for (var i = 0; i x.CurrentState);
Event(() => Initialized, e => e.CorrelateById(m => m.Message.CorrelationId));
Event(() => PriceCrossedUp, e => e.CorrelateById(m => m.Message.CorrelationId));
Event(() => PriceCrossedDown, e => e.CorrelateById(m => m.Message.CorrelationId));
Initially(
When(Initialized)
.IfElse(context => IsClosestLevel(context.Message.Price),
then => then.TransitionTo(Inactive),
orElse => orElse.IfElse(context => IsLowerLevel(context.Message.Price),
then => then.TransitionTo(Buy).Then(context => PlaceBuyOrder(context.Message)),
orElse2 => orElse2.TransitionTo(Sell).Then(context => PlaceSellOrder(context.Message))
)
)
);
}
public State Inactive { get; private set; } = null!;
public State Buy { get; private set; } = null!;
public State Sell { get; private set; } = null!;
public Event Initialized { get; private set; } = null!;
public Event PriceCrossedUp { get; private set; } = null!;
public Event PriceCrossedDown { get; private set; } = null!;
private bool IsClosestLevel(decimal price)
{
Console.WriteLine($"Is {price} the closest level?");
return false;
}
private bool IsLowerLevel(decimal price)
{
Console.WriteLine($"Is {price} lower level?");
return false;
}
private bool IsHigherLevel(decimal price)
{
Console.WriteLine($"Is {price} higher level?");
return false;
}
private void PlaceBuyOrder(GridInitialized request)
{
Console.WriteLine("Placing a buy order...");
}
private void PlaceSellOrder(GridInitialized request)
{
Console.WriteLine("Placing a sell order...");
}
}
public class GridInitialized
{
public Guid CorrelationId { get; set; }
public decimal Price { get; set; }
public List GridLevels { get; set; } = [];
}
public class PriceCrossedUp
{
public Guid CorrelationId { get; set; }
}
public class PriceCrossedDown
{
public Guid CorrelationId { get; set; }
}
public static class ServiceCollectionExtensions
{
public static IHostApplicationBuilder AddEventBus(
this IHostApplicationBuilder builder,
Action? massTransitConfiguration = null) =>
AddEventBus(builder, massTransitConfiguration);
public static IHostApplicationBuilder AddEventBus(
this IHostApplicationBuilder builder,
Action? massTransitConfiguration = null)
where TBus : class, IBus
{
ArgumentNullException.ThrowIfNull(builder);
builder.Services.AddMassTransit(x =>
{
x.SetKebabCaseEndpointNameFormatter();
x.SetInMemorySagaRepositoryProvider();
var entryAssembly = Assembly.GetEntryAssembly();
x.AddSagaStateMachines(entryAssembly);
x.AddSagas(entryAssembly);
x.AddActivities(entryAssembly);
massTransitConfiguration?.Invoke(x);
x.UsingRabbitMq((context, cfg) =>
{
cfg.Host("localhost", "/", h =>
{
h.Username("guest");
h.Password("guest");
});
cfg.ConfigureEndpoints(context);
});
});
return builder;
}
}
< /code>
Я изо всех сил пытаюсь выяснить, как управлять отдельными состояниями для каждого уровня сетки в MassTransit. Поскольку стратегия сетки может иметь много уровней, мне нужно иметь разные состояния для каждого уровня сетки вместо одного глобального состояния для всей сетки.
Как я могу это сделать?
Подробнее здесь: https://stackoverflow.com/questions/795 ... a-masstran