← 戻る

Как добится корректного отображения Strategy.Position?

Не совсем понимаю как дождаться корректного отображения Strategy.Position, простая проверка не работает, иногда проскакивают лишние ордера.

 private void ProccesDepth(bool isDirectionBuy)
        {
            lock (_sync)
            {
                var order = new Order
                                {
                                    Direction = isDirectionBuy ? OrderDirections.Buy : OrderDirections.Sell,
                                    Price = isDirectionBuy ? _depth.BestBid.Price : _depth.BestAsk.Price,
                                    Type = OrderTypes.Limit,
                                    Volume = VolumeValue,
                                    Comment = "Entry",
                                };

                order
                    .WhenActivated()
                    .Do(() =>
                            {
                                if(!checkCondition)
                                {
                                    CancelOrder(order);
                                }
                            })
                    .Once()
                    .Apply(this);
                

                order
                    .WhenNewTrades()
                    .Do(SetProtectedOrders)
                    .Apply(this);

                // Узкое место
                if (checkCondition && Position == 0)
                    RegisterOrder(order);
            }
        }

このトピックは参考になりましたか?

トピックを共有

コメント (3)

ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください

yammm
yammm 著者
 // Узкое место
                if (checkCondition && !_inPosition)
                {
                    RegisterOrder(order);
                    _inPosition = true;
                }

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

Sergey Masyura
Sergey Masyura

yammm: Не совсем понимаю как дождаться корректного отображения Strategy.Position, простая проверка не работает, иногда проскакивают лишние ордера.

private void ProccesDepth(bool isDirectionBuy) { lock (_sync) { var order = new Order { Direction = isDirectionBuy ? OrderDirections.Buy : OrderDirections.Sell, Price = isDirectionBuy ? _depth.BestBid.Price : _depth.BestAsk.Price, Type = OrderTypes.Limit, Volume = VolumeValue, Comment = "Entry", };

            order
                .WhenActivated()
                .Do(() =>
                        {
                            if(!checkCondition)
                            {
                                CancelOrder(order);
                            }
                        })
                .Once()
                .Apply(this);
            

            order
                .WhenNewTrades()
                .Do(SetProtectedOrders)
                .Apply(this);

            // Узкое место
            if (checkCondition && Position == 0)
                RegisterOrder(order);
        }
    }

Если ордер зарегистрирован, но еще не исолнился - очевидно позиция ноль. Соответсвенно, если зайти в этот метод с выставленным, но еще не исполненным ордером - выставится второй.

Если входите одним ордером, сделайте его членом класса _order. При входе в метод можно проверять его на null и остаток и только после этого перетирать.
yammm
Mikhail Sukhov
Mikhail Sukhov

Sergey Masyura: Если входите одним ордером, сделайте его членом класса _order. При входе в метод можно проверять его на null и остаток и только после этого перетирать.

Лучше вообще состояния не использовать. Или минимизировать эти места. Event based подход предполагает state less.