private void buttonCancelStopOrders_Click(object sender, EventArgs e) { if (this.TrElement.Security != null) { Trader.CancelAllStopOrder(this.TrElement.Security); } }
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); } } } } } }); }