private void buttonAddSignVolume_Click(object sender, EventArgs e) { Qlog.CatchException(() => { //if (LastSecSignal.IsNull()) return; int timeFrame = 1; if (comboBoxSignTimeFrame.SelectedItem is SelectorTimeFrame) { timeFrame = ((SelectorTimeFrame)comboBoxSignTimeFrame.SelectedItem).TimeFrame; } DateMarket date = new DateMarket(DateTime.Now); var newSign = new SignalMarket() { Type = SignalMarket.TypeSignal.ByVolume, SecClass = LastSecSignal.ToString(), Volume = Convert.ToInt64(numericUpDownSignVolume.Value), TimeFrame = timeFrame, TimeAntiRepeat = date, Comment = textBoxSignComment.Text, Infinity = true }; SignalView.GSMSignaler.AddSignal(newSign); textBoxSignComment.Text = ""; }); }
private void buttonStopOrderBuy_Click(object s, EventArgs e) { if (this.TrElement.Security.LastPrice == 0) return; if (this.TrElement.Security.LastPrice > numericUpDownStopOrderPrice.Value) { var sOrder = new StopOrder() { Sec = this.TrElement.Security, Price = this.numericUpDownStopOrderPrice.Value, Volume = Convert.ToInt32(this.numericUpDownStopOrderVol.Value), Direction = OrderDirection.Buy, Comment = Define.STOP_LIMIT, ConditionPrice = this.numericUpDownStopOrderPrice.Value + this.TrElement.Security.Params.MinPriceStep, Offset = this.TrElement.Security.Params.MinPriceStep, Spread = this.TrElement.Security.Params.MinPriceStep, DateExpiry = DateMarket.ExtractDateTime(dateTimePickerStopOrder.Value) }; this.Trader.CreateStopOrder(sOrder, StopOrderType.TakeProfit); } else { var sOrder = new StopOrder() { Sec = this.TrElement.Security, Price = this.numericUpDownStopOrderPrice.Value, Volume = Convert.ToInt32(this.numericUpDownStopOrderVol.Value), Direction = OrderDirection.Buy, Comment = Define.STOP_LIMIT, ConditionPrice = this.numericUpDownStopOrderPrice.Value - this.TrElement.Security.Params.MinPriceStep, DateExpiry = DateMarket.ExtractDateTime(dateTimePickerStopOrder.Value) }; this.Trader.CreateStopOrder(sOrder, StopOrderType.StopLimit); } }
/// <summary> /// /// </summary> /// <param name="position"></param> /// <param name="Price"></param> /// <returns></returns> private StopOrder GetStopOrderControl(int position, decimal Price) { decimal stepStop = Securities.Params.MinPriceStep * 20; var stopOrder = new StopOrder() { Sec = Securities, Volume = position < 0 ? position * -1 : position, DateExpiry = DateMarket.ExtractDateTime(DateTime.Now.AddDays(1)), ClientCode = ClientCode.Value, Comment = Define.STOP_CONTROL }; if (position > 0) { Price = Price - numericUpDownMCStopTiks.Value * Securities.Params.MinPriceStep; stopOrder.ConditionPrice = Price; stopOrder.Direction = OrderDirection.Sell; stopOrder.Price = Price - stepStop; } else if (position < 0) { Price = Price + numericUpDownMCStopTiks.Value * Securities.Params.MinPriceStep; stopOrder.ConditionPrice = Price; stopOrder.Direction = OrderDirection.Buy; stopOrder.Price = Price + stepStop; } return(stopOrder); }
/// <summary> /// Создание отложенных стоп заявок /// </summary> /// <param name="isBuy"></param> private void SendStopOrder(bool isBuy = true) { if (Securities.LastPrice == 0) { ShowTransReply("Значение последней цены равно 0."); return; } if (isBuy) { var sOrder = new StopOrder() { Sec = Securities, Price = this.numericUpDownStopPrice.Value, Volume = Convert.ToInt32(this.numericUpDownVolume.Value), Direction = OrderDirection.Buy, Comment = Define.STOP_LIMIT, ClientCode = ClientCode.Value, DateExpiry = DateMarket.ExtractDateTime(dateTimePickerStopOrder.Value) }; if (Securities.LastPrice > this.numericUpDownStopPrice.Value) { sOrder.ConditionPrice = this.numericUpDownStopPrice.Value + Securities.Params.MinPriceStep; sOrder.Offset = Securities.Params.MinPriceStep; sOrder.Spread = Securities.Params.MinPriceStep; this.Trader.CreateStopOrder(sOrder, StopOrderType.TakeProfit); } else { sOrder.ConditionPrice = this.numericUpDownStopPrice.Value - Securities.Params.MinPriceStep; this.Trader.CreateStopOrder(sOrder, StopOrderType.StopLimit); } } else { var sOrder = new StopOrder() { Sec = Securities, Price = this.numericUpDownStopPrice.Value, Volume = Convert.ToInt32(this.numericUpDownVolume.Value), Direction = OrderDirection.Sell, Comment = Define.STOP_LIMIT, ClientCode = ClientCode.Value, DateExpiry = DateMarket.ExtractDateTime(dateTimePickerStopOrder.Value) }; if (Securities.LastPrice < numericUpDownStopPrice.Value) { sOrder.ConditionPrice = this.numericUpDownStopPrice.Value - Securities.Params.MinPriceStep; sOrder.Offset = Securities.Params.MinPriceStep; sOrder.Spread = Securities.Params.MinPriceStep; this.Trader.CreateStopOrder(sOrder, StopOrderType.TakeProfit); } else { sOrder.ConditionPrice = this.numericUpDownStopPrice.Value + Securities.Params.MinPriceStep; this.Trader.CreateStopOrder(sOrder, StopOrderType.StopLimit); } } }
private StopOrder GetTakeProfitOrderControl(int position, int percentPosition, decimal Price) { bool isBuy = position < 0 ? true : false; var sOrder = new StopOrder() { Sec = Securities, Volume = percentPosition, Comment = Define.STOP_CONTROL, ClientCode = ClientCode.Value, DateExpiry = DateMarket.ExtractDateTime(DateTime.Now.AddDays(1)) }; if (isBuy) { Price = Price - numericUpDownMCTakeProfitTiks.Value * Securities.Params.MinPriceStep; sOrder.Price = Price; sOrder.Direction = OrderDirection.Buy; if (Securities.LastPrice > Price) { sOrder.ConditionPrice = Price + Securities.Params.MinPriceStep; sOrder.Offset = Securities.Params.MinPriceStep; sOrder.Spread = Securities.Params.MinPriceStep; return(sOrder); } } else { sOrder.Direction = OrderDirection.Sell; Price = Price + numericUpDownMCTakeProfitTiks.Value * Securities.Params.MinPriceStep; sOrder.Price = Price; if (Securities.LastPrice < Price) { sOrder.ConditionPrice = Price - Securities.Params.MinPriceStep; sOrder.Offset = Securities.Params.MinPriceStep; sOrder.Spread = Securities.Params.MinPriceStep; return(sOrder); } } return(null); }
/// <summary> Инициализация панели очистки сделок за определенную дату </summary> private void InitPanelClearCharts() { dateTimePickerClearChartsStart.Value = DateTime.Now; dateTimePickerClearChartsEnd.Value = DateTime.Now; dateTimePickerClearChartsStart.ValueChanged += (s, e) => { if (dateTimePickerClearChartsStart.Value > dateTimePickerClearChartsEnd.Value) { dateTimePickerClearChartsStart.Value = dateTimePickerClearChartsEnd.Value; } }; dateTimePickerClearChartsEnd.ValueChanged += (s, e) => { if (dateTimePickerClearChartsStart.Value > dateTimePickerClearChartsEnd.Value) { dateTimePickerClearChartsEnd.Value = dateTimePickerClearChartsStart.Value; } }; buttonClearCandle.Click += (s, e) => { var dateClearStart = dateTimePickerClearChartsStart.Value; var dateClearEnd = dateTimePickerClearChartsEnd.Value; var result = MessageBox.Show(this, "Удалить сделки за " + dateClearStart.ToLongDateString() + " - " + dateClearEnd.ToLongDateString(), "Удаление котировок?", MessageBoxButtons.OKCancel, MessageBoxIcon.Question); if (result == DialogResult.OK) { var dStart = new DateMarket(dateClearStart); dStart.SetHour(0).SetMinute(0).SetSecond(0); var dEnd = new DateMarket(dateClearEnd); dEnd.SetHour(23).SetMinute(59).SetSecond(59); DeleteCharts(dStart.GetDateTime(), dEnd.GetDateTime()); } }; }
/// <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); } } } } } }); }
protected void SendStopOrder(PanelControl panel, bool autoStop = false, bool showInfo = false) { if (autoStop) { if (panel.LastSendStopOrder > DateTime.Now.AddSeconds(-5)) { //Для избежания многократного выставления return; } } var pos = Parent.Trader.Objects.tPositions.SearchFirst(p => p.Sec == panel.TrElement.Security); decimal stepStop = panel.TrElement.Security.Params.MinPriceStep * 20; int volume = pos.NotIsNull() ? pos.Data.CurrentNet : 0; if (volume < 0) { stepStop = stepStop * -1; volume = volume * -1; } //Просмотр инфо по будущему стопу if (showInfo) { string text = "Инфо создаваемой стоп заявки:\n"; text += "Позиций: " + pos.Data.CurrentNet + "\n\n"; text += "Стоп цена: " + panel.PriceStop.Value + "\n"; text += "Цена исполнения: " + (panel.PriceStop.Value - stepStop) + "\n"; text += "Объем: " + volume + "\n"; text += "Дата завершения: " + DateTime.Now.AddDays(1).ToShortDateString() + "\n"; MessageBox.Show(text); return; } if (panel.PriceStop.Value == 0) { SetMessage("Некорректная цена стоп-ордера!"); return; } if (volume == 0) { SetMessage("Не текущих позиций!"); return; } var stopOrder = new StopOrder() { Sec = panel.TrElement.Security, Price = panel.PriceStop.Value - stepStop, Volume = volume, Direction = volume > 0 ? OrderDirection.Sell : OrderDirection.Buy, ConditionPrice = panel.PriceStop.Value, DateExpiry = DateMarket.ExtractDateTime(DateTime.Now.AddDays(1)), Comment = Define.STOP_LOSS }; var lastPrice = panel.TrElement.Security.LastPrice; if (lastPrice > 0) { if (pos.IsBuy() && panel.PriceStop.Value > 0) { stopOrder.Direction = OrderDirection.Sell; if (panel.PriceStop.Value > lastPrice) { SetMessage("Не корректная цена стоп заявки! Необходимо указать цену ниже текущей."); return; } } if (pos.IsSell() && panel.PriceStop.Value > 0) { stopOrder.Direction = OrderDirection.Buy; if (panel.PriceStop.Value < lastPrice) { SetMessage("Не корректная цена стоп заявки! Необходимо указать цену выше текущей."); return; } } } MThread.InitThread(ThreadPriority.Normal, () => { Qlog.CatchException(() => { Thread.Sleep(1000); var countClosed = CancelAllStopOrders(panel); Thread.Sleep(1000); Parent.Trader.CreateStopOrder(stopOrder, StopOrderType.StopLimit); addSignalByStop(stopOrder); }); }); panel.LastSendStopOrder = DateTime.Now; }
/// <summary> /// Проверка и выставление стоп-ордера /// </summary> /// <param name="Price"></param> /// <param name="volume"></param> public void SetStopOrder(decimal Price, int volume, bool checkSet = true) { if (Price == 0) { ShowTransReply("Некорректная цена стоп-ордера!"); return; } if (volume == 0) { ShowTransReply("Не текущих позиций!"); return; } decimal stepStop = Securities.Params.MinPriceStep * 20; if (volume < 0) { stepStop = stepStop * -1; volume = volume * -1; } var stopOrder = new StopOrder() { Sec = Securities, Price = Price - stepStop, Volume = volume, ConditionPrice = Price, DateExpiry = DateMarket.ExtractDateTime(dateTimePickerStopOrder.Value), ClientCode = ClientCode.Value, Comment = Define.STOP_LOSS }; if (this.Position.IsBuy() && Price > 0) { stopOrder.Direction = OrderDirection.Sell; if (Price > Securities.LastPrice) { ShowTransReply("Не корректная цена стоп заявки! Необходимо указать цену ниже текущей."); return; } } if (this.Position.IsSell() && Price > 0) { stopOrder.Direction = OrderDirection.Buy; if (Price < Securities.LastPrice) { ShowTransReply("Не корректная цена стоп заявки! Необходимо указать цену выше текущей."); return; } } //Устанавливаем в форму значение стоп цены this.GuiAsync(() => { numericUpDownStopPrice.Value = Price; }); MThread.InitThread(() => { var cancelOrders = this.Trader.Objects.tStopOrders.SearchAll(so => so.Sec == Securities && so.IsActive() && so.Comment.Contains(Define.STOP_LOSS)); if (cancelOrders.NotIsNull()) { this.Trader.CancelListStopOrders(cancelOrders); } Thread.Sleep(500); this.Trader.CreateStopOrder(stopOrder, StopOrderType.StopLimit); if (checkSet) { Thread.Sleep(10000); var allStopOrders = this.Trader.Objects.tStopOrders.SearchAll(so => so.Sec == Securities && so.IsActive()); if (allStopOrders.NotIsNull()) { if (allStopOrders.Count() == 0) { this.SetStopOrder(Price, volume, false); } } } }); }