Exemple #1
0
 public void LoopControl(bool ReCalculate = false)
 {
     if (checkBoxMCActivate.Checked)
     {
         var pos = GetPositionForControl();
         if (pos.NotIsNull() && pos.CurrentVolume > 0)
         {
             var sOrders = GetStopOrdersForControl();
             if (ReCalculate || !CheckStopOrdersForControls(sOrders))
             {
                 foreach (var sOrd in sOrders)
                 {
                     Trader.CancelStopOrder(sOrd);
                 }
                 return;
             }
             if (sOrders.NotIsNull() && sOrders.Count() == 0) ///*&& (!CheckStopOrdersForControls(sOrders)*/)
             {
                 //Защита от большого числа заявок
                 if (sOrders.Count() > 2)
                 {
                     ShowTransReply("Контроль риска. Стоп-заявки не снимаются.");
                     return;
                 }
                 var     lastMyTrade = GetLastMyTradeForControl(pos.Data.CurrentNet);
                 decimal Price       = 0;
                 if (lastMyTrade.NotIsNull())
                 {
                     //Если выбран, то берем цену из поля цены
                     if (checkBoxMCSetPrice.Checked)
                     {
                         Price = numericUpDownMCPriceLastTrade.Value;
                     }
                     else
                     {
                         Price = numericUpDownMCPriceLastTrade.Value = lastMyTrade.Trade.Price;
                     }
                 }
                 else
                 {
                     ShowTransReply("Контроль риска. Не удалось получить последнюю сделку.");
                     return;
                 }
                 if (Price > 0 && numericUpDownMCStopTiks.Value > 0 && numericUpDownMCTakeProfitTiks.Value > 0)
                 {
                     var newStopOrder  = GetStopOrderControl(pos.Data.CurrentNet, Price);
                     var takePos       = getCurrectPosByPercent(pos);
                     var newTakeProfit = GetTakeProfitOrderControl(pos.Data.CurrentNet, takePos, Price);
                     if (newStopOrder.NotIsNull() && checkBoxMCStopLoss.Checked)
                     {
                         Trader.CreateStopOrder(newStopOrder, StopOrderType.StopLimit);
                     }
                     if (newTakeProfit.NotIsNull() && checkBoxMCTakeProfit.Checked)
                     {
                         Trader.CreateStopOrder(newTakeProfit, StopOrderType.TakeProfit);
                     }
                 }
                 else
                 {
                     ShowTransReply("Контроль риска. Одно из значений равно 0.");
                     return;
                 }
             }
         }
         else
         {
             var sOrders = GetStopOrdersForControl();
             foreach (var sOrd in sOrders)
             {
                 Trader.CancelStopOrder(sOrd);
                 Trader.CancelAllOrder(Securities);
                 Trader.CancelAllStopOrder(Securities);
             }
             //Снимаем флаг фиксации цены, чтобы при последующих ордерах не выставлялось не корректно.
             checkBoxMCSetPrice.Checked = false;
         }
     }
 }
 /// <summary>
 ///
 /// </summary>
 public void AutoSLLoopControl()
 {
     if (TimeControl.AddSeconds(PERIOD_CONTROL_SEC) > DateTime.Now)
     {
         return;
     }
     TimeControl = DateTime.Now;
     MThread.InitThread(() =>
     {
         foreach (var objControl in ASLObject.ToArray)
         {
             var sec = GetSecCodeAndClass(objControl.SecAndCode);
             if (sec.NotIsNull())
             {
                 var pos = Trader.Objects.tPositions.SearchFirst(p => p.Sec == sec);
                 if (pos.NotIsNull())
                 {
                     var stopLoss = Trader.Objects.tStopOrders.SearchAll(o => o.Sec == sec &&
                                                                         o.IsActive() && o.Comment.Contains(Define.STOP_LOSS)
                                                                         );
                     var volume = pos.CurrentVolume;
                     //Проверяем, не появились ли лишние стоп ордера
                     if (stopLoss.Count() > 1)
                     {
                         Trader.CancelAllStopOrder(sec);
                         continue;
                     }
                     //Проверяем не изменилась ли позиция
                     else if (stopLoss.Count() == 1)
                     {
                         var activeStop = stopLoss.ElementAt(0);
                         //Снимаем стоп если разные обьемы
                         if (activeStop.Volume != volume)
                         {
                             Trader.CancelAllStopOrder(sec);
                             continue;
                         }
                         //Снимаем стоп если он в другую сторону
                         if (activeStop.IsBuy() && pos.IsBuy())
                         {
                             Trader.CancelAllStopOrder(sec);
                             continue;
                         }
                     }
                     else if (stopLoss.Count() == 0 && pos.CurrentVolume > 0)
                     {
                         var allTrades = Trader.Objects.tMyTrades.SearchAll(t => t.Trade.Sec == sec)
                                         .OrderByDescending(o => o.Trade.Number);
                         if (allTrades.NotIsNull())
                         {
                             decimal Price = 0;
                             if (allTrades.Count() > 0)
                             {
                                 var lastTrade = allTrades.FirstOrDefault(o => o.Trade.Direction == pos.CurrentDirection);
                                 if (lastTrade.NotIsNull())
                                 {
                                     Price = lastTrade.Trade.Price;
                                 }
                             }
                             if (Price == 0)
                             {
                                 Price = sec.LastPrice;
                             }
                             var tiks      = objControl.Tiks;
                             var stopOrder = new StopOrder()
                             {
                                 Sec        = sec,
                                 Price      = Price,
                                 ClientCode = objControl.Comment,
                                 Comment    = Define.STOP_LOSS,
                                 Volume     = volume,
                                 DateExpiry = DateMarket.ExtractDateTime(DateTime.Now.AddDays(10))
                             };
                             if (pos.IsBuy())
                             {
                                 stopOrder.Direction      = OrderDirection.Sell;
                                 stopOrder.ConditionPrice = Price - sec.MinPriceStep * tiks;
                                 stopOrder.Price          = stopOrder.ConditionPrice - sec.MinPriceStep * 10;
                             }
                             else if (pos.IsSell())
                             {
                                 stopOrder.Direction      = OrderDirection.Buy;
                                 stopOrder.ConditionPrice = Price + sec.MinPriceStep * tiks;
                                 stopOrder.Price          = stopOrder.ConditionPrice + sec.MinPriceStep * 10;
                             }
                             Trader.CreateStopOrder(stopOrder, StopOrderType.StopLimit);
                             AutoSLLog("Create order: " + sec.ToString() + " " +
                                       (stopOrder.IsBuy() ? "B" : "S") +
                                       " " + stopOrder.ConditionPrice);
                         }
                     }
                 }
             }
         }
     });
 }