← Zurück

Сработавшая стоп заявка не изменяет, Position стратегии.

StockSharp_4.2.3.7_Sources

  1. Создаю Ордер и подписываюсь на его событие WhenNewTrades

  var order = this.BuyAtLimit(pLevel + this.Security.PriceStep); //открываем лонг
                    order
                        .WhenNewTrades()
                        .Do(ProcessOrder)
                        .Apply(this);

                    this.RegisterOrder(order);


далее создаю связанную стоп заявку,


private void ProcessOrder(IEnumerable<MyTrade> trades)
        {
          
            var t = trades.FirstOrDefault();
            var BuyDir = t.Order.Direction == Sides.Buy;
                var orStopOrder = new Order
                {
                    Type = OrderTypes.Conditional,
                    Volume = t.Trade.Volume,
                    Price = BuyDir ? (t.Order.Price - 350) : (t.Order.Price + 350),  //цена исполнения стопа
                    Portfolio = Portfolio,
                    Security = Security,
                    Direction = BuyDir ? Sides.Sell : Sides.Buy,
                    Comment = "Placed by TradingTrainer",
                    ExpiryDate = DateTime.MaxValue,
                    Condition = new QuikOrderCondition()
                    {
                        Type = QuikOrderConditionTypes.LinkedOrder,
                        LinkedOrderPrice = BuyDir ? (t.Order.Price + 300) : (t.Order.Price - 300), //лимит
                        LinkedOrderCancel = false,
                        StopPrice = BuyDir ? (t.Order.Price - 150) : (t.Order.Price + 150),      //стоп цена
                        ActiveTime = null,
                    },
                };
            
                this.RegisterOrder(orStopOrder);

        }

Значит, стопы ставятся прекрасно, но при срабатывании стопа Position стратегии не изменяется. Получается что фактически позиции нет, а Position == осталось тем же.

War dieses Thema hilfreich?

Thema teilen

Kommentare (7)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

devruss
devruss

Position обновляется очень медленно в некоторых случаях, там есть глюк с ощутимой задержкой после срабатывания ордера. Мне с этим было лень разбираться, так как намного проще и надежнее реализовать подсчет позиции внутри стратегии самому.

chulman
chulman
chulman Autor

devruss: Position обновляется очень медленно в некоторых случаях, там есть глюк с ощутимой задержкой после срабатывания ордера. Мне с этим было лень разбираться, так как намного проще и надежнее реализовать подсчет позиции внутри стратегии самому.

Я думаю проблема в другом, на финише свечи я пишу значение Position в текстовый файл и смотрю его, типа отладка такая, таймфрейм не меньше минуты, да даже 10 минут я пробовал, все равно по срабатыванию стопа Position не меняется. Т.е через 10 минут после активации стопа все так же остается.

Я в стоп заявку даже такое пытался вкорячить.

orStopOrder .WhenNewTrades() .Do(ProcessPosition) .Apply(this);

и потом ручками отнять

private void ProcessPosition(IEnumerable<MyTrade> trades) { var t = trades.FirstOrDefault(); Position = Position - t.Trade.Volume; }

но отладчик не заходит в ProcessPosition

только что пробовал так,

orStopOrder .WhenMatched() .Do(() => { Position = Position - orStopOrder.Volume; }) .Apply(this);

Position зараза не меняется.

Mikhail Sukhov
Mikhail Sukhov

Было недавно про стоп заявки и был фикс. Смотрите в релиз нотес.

chulman
chulman Autor

Михаил Сухов: Было недавно про стоп заявки и был фикс. Смотрите в релиз нотес.

Скачал новую сборку поменял все dll в references которые начинаются с StockSharp и Ecng, сделал ребилд проекта , все осталось по прежнему ((

Ребят помогите пож-та, я уже все попробовал, не получается никак. Хоть куда нибудь ткните, чтоб я пошел читать или смотреть.

chulman
chulman Autor

Сделал так, решил считать вручную позицию, подписался на событие новый трейдов.


 protected override void OnStarted()
        {

            _series = this.GetCandleManager().GetSeries<CandleFoot>(this.Security, 10);
            _series
                .WhenCandlesFinished()
                .Do(ProcessCandle)
                .Apply(this);

            this.WhenNewMyTrades()
                .Do(ProcessPosition)
                .Apply(this);
         
            Pos = 0;
            base.OnStarted();
        }


 private void ProcessPosition(IEnumerable<MyTrade> trades)
        {
            
            var t = trades.FirstOrDefault();
            var buyDir = t.Order.Direction == Sides.Buy;
            if (buyDir)
            {
                Pos = Pos + t.Trade.Volume;
            }
            else
            {
                Pos = Pos - t.Trade.Volume;
            }
            string text = "";
            text = text + "позиция " + Pos.ToString();
            System.IO.File.WriteAllText(@"f:\footText.txt", text);
        }

итог следующий , WhenNewMyTrades не вызывается при срабатывании стоп заявки, файл не переписывается. Даже если тут есть логические ошибки, в файл должно что то записаться, но время файла остается временем основного ордера, при котором выставляется стоп заявка.

Валентин Лебедев

Попробуй что-нибудь из этого:

  1. Order.WhenActivated - правило на событие активации стоп-заявки.
  2. Использовать StopLossStrategy.
  3. Организовать стоп-лосс собственноручно с помощью Security.WhenNewTrades и маркет ордеров.
chulman
chulman
chulman Autor

viosee: Попробуй что-нибудь из этого:

  1. Order.WhenActivated - правило на событие активации стоп-заявки.
  2. Использовать StopLossStrategy.
  3. Организовать стоп-лосс собственноручно с помощью Security.WhenNewTrades и маркет ордеров.

спасибо, тоже подумал о этом.