Пример #1
0
        /// <summary>
        /// Стоп-заявка
        /// </summary>
        /// <param name="ticker">тикер</param>
        /// <param name="bs">Покупка или продажа</param>
        /// <param name="st">Тип стоп-заявки - стоп-лосс или тейк-профит</param>
        /// <param name="alertPrice">цена срабатываная</param>
        /// <param name="lots">кол-во лотов</param>
        /// <param name="endTime">дата окончания</param>
        /// <param name="account">торговый счет</param>
        /// <returns>OrderNo</returns>
        public long AddStopOrder(string ticker, BuySell bs, StopOrderType st, decimal alertPrice, int lots, DateTime endTime, string account)
        {
            SfxOrder order = new SfxOrder();

            order.SlotID     = 0;
            order.OrderMode  = "S";                                      // стоп-заявка
            order.BuySell    = bs == BuySell.Buy ? "B" : "S";            // покупка или продажа
            order.MktLimit   = "M";                                      // рыночная
            order.SplitFlag  = "S";                                      // по разным ценам
            order.ImmCancel  = " ";                                      // поставить в очередь
            order.Account    = account;                                  // счет (из таблицы TRDACC)
            order.SecBoard   = _secBoard;                                // режим торгов
            order.SecCode    = ticker;                                   // инструмент
            order.Quantity   = lots;                                     // кол-во лотов
            order.StopType   = st == StopOrderType.StopLoss ? "L" : "P"; // тип stoploss или takeprofit
            order.AlertPrice = Convert.ToDouble(alertPrice);             // цена
            order.EndTime    = endTime;
            order.BrokerRef  = _slot.BrokerRef;

            long orderNo; string resMsg;
            int  res = order.Add(out orderNo, out resMsg);

            _logger.AddInfo("AlorTradeWrapper", "AddStopOrder res=" + res.ToString() + " resMsg='" + resMsg + "' orderNo=" + orderNo.ToString() + " bs="
                            + bs.ToString() + " st=" + st.ToString() + " ticker=" + ticker + " lots=" + lots.ToString() + " price=" + alertPrice.ToString());

            return(res != (int)SFE.SFE_OK ? 0 : orderNo);
        }
Пример #2
0
 private StopOrderKind ConvertStopOrderType(StopOrderType stopOrderType)
 {
     switch (stopOrderType)
     {
         case StopOrderType.StopLimit:
             return StopOrderKind.SIMPLE_STOP_ORDER;
         case StopOrderType.TakeProfit:
             return StopOrderKind.TAKE_PROFIT_STOP_ORDER;
         default:
             throw new Exception("Not implemented stop order type: " + stopOrderType);
     }
 }
Пример #3
0
        private StopOrderKind ConvertStopOrderType(StopOrderType stopOrderType)
        {
            switch (stopOrderType)
            {
            case StopOrderType.StopLimit:
                return(StopOrderKind.SIMPLE_STOP_ORDER);

            case StopOrderType.TakeProfit:
                return(StopOrderKind.TAKE_PROFIT_STOP_ORDER);

            default:
                throw new Exception("Not implemented stop order type: " + stopOrderType);
            }
        }
Пример #4
0
        /// <summary>
        /// Создать новый стоп-ордер.
        /// При срабатывании будет создана заявка.
        /// </summary>
        /// <param name="insID">Фин. инструмент</param>
        /// <param name="bs">Покупка или продажа</param>
        /// <param name="sot">Тип стоп-ордера</param>
        /// <param name="endTime">Время окончания стоп-ордера (при достижении стоп-ордер снимается)</param>
        /// <param name="alertPrice">Сигнальная цена</param>
        /// <param name="price">Цена в заявке при срабатывании стоп-ордера (Null - рыночная цена)</param>
        /// <param name="lotCount">Кол-во лотов в заявке</param>
        /// <returns></returns>
        public StopOrder AddStopOrder(int insID, BuySell bs, StopOrderType sot,
                                      DateTime?endTime, decimal alertPrice, decimal?price, int lotCount)
        {
            DateTime?time = _timeProvider.CurrentTime;

            if (time == null)
            {
                return(null);
            }

            StopOrder so = _data.AddStopOrder(time.Value, insID, bs, sot, endTime, alertPrice, price,
                                              lotCount, StopOrderStatus.Active);

            RaiseOnStopOrderChangeEvent(so);
            _isChangeData = true;
            SaveChangedData();

            return(so);
        }
Пример #5
0
        /// <summary>
        /// Создать новый стоп-ордер
        /// </summary>
        /// <param name="time">Дата и время создания</param>
        /// <param name="insID">Фин инструмент</param>
        /// <param name="bs">Покупка или продажа</param>
        /// <param name="soType">Тип стоп-ордера</param>
        /// <param name="endTime">Время окончания (null-действует бесконечно)</param>
        /// <param name="alertPrice">Цена срабатывания стопа</param>
        /// <param name="price">Цена заявки, которая будет создана при срабатывании стопа (null-заявка по рыночной цене)</param>
        /// <param name="lotCount">Кол-во лотов</param>
        /// <param name="status">Статус нового стоп-ордера</param>
        /// <returns>Новый стоп-ордер</returns>
        public StopOrder AddStopOrder(DateTime time, int insID, BuySell bs, StopOrderType soType, DateTime?endTime,
                                      decimal alertPrice, decimal?price, int lotCount, StopOrderStatus status)
        {
            StopOrder so = new StopOrder();

            so.StopOrderID  = GetNewID <StopOrder>(_stopOrders, r => r.StopOrderID);
            so.Time         = time;
            so.InsID        = insID;
            so.BuySell      = bs;
            so.StopType     = soType;
            so.EndTime      = endTime;
            so.AlertPrice   = alertPrice;
            so.Price        = price;
            so.LotCount     = lotCount;
            so.Status       = status;
            so.AccountID    = _account.AccountID;
            so.CompleteTime = null;

            _stopOrders.Add(so);

            return(so);
        }
Пример #6
0
        public StopOrder AddStopOrder(int accountID, int insID, BuySell bs, StopOrderType st, decimal price, int lots)
        {
            StopOrder so = new StopOrder()
            {
                StopOrderID  = _stopOrders.Count + 1,
                AccountID    = accountID,
                InsID        = insID,
                BuySell      = bs,
                StopType     = st,
                Time         = DateTime.Now,
                CompleteTime = null,
                EndTime      = null,
                Price        = price,
                AlertPrice   = price,
                LotCount     = lots,
                StopOrderNo  = 1000 * (_stopOrders.Count + 1),
                Status       = StopOrderStatus.Active
            };

            _stopOrders.Add(so);

            return(so);
        }
Пример #7
0
        /// <summary>
        /// Создает стоп-заявку.
        /// </summary>
        /// <param name="createOrder"></param>
        /// <returns></returns>
        public int CreateStopOrder(StopOrder createOrder, StopOrderType type)
        {
            if (createOrder.Sec.Empty())
            {
                return(-1);
            }
            if (createOrder.Price <= 0)
            {
                return(-2);
            }
            if (createOrder.Volume <= 0)
            {
                return(-3);
            }
            Common.Ext.NewThread(() =>
            {
                Qlog.CatchException(() =>
                {
                    Account acc = this.ConTerminal.Accounts.FirstOrDefault(a => a.AccClasses.FirstOrDefault(c => c.Code == createOrder.Sec.Class.Code) != null);
                    if (acc.Empty())
                    {
                        return;
                    }
                    Random rnd        = new Random();
                    string TypeSOrder = "";
                    string[] DopParam = { "TRANS_ID", rnd.Next(1, 1000000).ToString() };

                    string condition = ((int)ConditionStopOrder.MoreOrEqual).ToString();

                    switch (type)
                    {
                    case StopOrderType.StopLimit:
                        TypeSOrder = "SIMPLE_STOP_ORDER";
                        if (createOrder.Direction == OrderDirection.Buy)
                        {
                            condition = ((int)ConditionStopOrder.MoreOrEqual).ToString();
                        }
                        else
                        {
                            condition = ((int)ConditionStopOrder.LessOrEqual).ToString();
                        }
                        var dateExpiry = createOrder.DateExpiry.ToString_YYYYMMDD();
                        DopParam       = DopParam.Concat(new string[] {
                            "CONDITION", condition,
                            "EXPIRY_DATE", (dateExpiry.Empty() ? "TODAY" : dateExpiry),
                            "STOPPRICE", Math.Round(createOrder.ConditionPrice, (int)createOrder.Sec.Scale).ToString(),
                        }).ToArray();
                        break;

                    case StopOrderType.LinkOrder:
                        TypeSOrder = "WITH_LINKED_LIMIT_ORDER";
                        if (createOrder.Direction == OrderDirection.Buy)
                        {
                            condition = ((int)ConditionStopOrder.MoreOrEqual).ToString();
                        }
                        else
                        {
                            condition = ((int)ConditionStopOrder.LessOrEqual).ToString();
                        }
                        DopParam = DopParam.Concat(new string[] {
                            "CONDITION", condition,
                            "EXPIRY_DATE", "TODAY",
                            "STOPPRICE", Math.Round(createOrder.ConditionPrice, (int)createOrder.Sec.Scale).ToString(),
                            "LINKED_ORDER_PRICE", Math.Round(createOrder.LinkOrderPrice, (int)createOrder.Sec.Scale).ToString(),
                            "KILL_IF_LINKED_ORDER_PARTLY_FILLED", "NO"
                        }).ToArray();

                        break;

                    case StopOrderType.TakeProfit:
                        TypeSOrder = "TAKE_PROFIT_STOP_ORDER";
                        if (createOrder.Direction == OrderDirection.Buy)
                        {
                            condition = ((int)ConditionStopOrder.LessOrEqual).ToString();
                        }
                        else
                        {
                            condition = ((int)ConditionStopOrder.MoreOrEqual).ToString();
                        }
                        DopParam = DopParam.Concat(new string[] {
                            "CONDITION", condition,
                            "EXPIRY_DATE", "TODAY",
                            "OFFSET", Math.Round(createOrder.Offset, (int)createOrder.Sec.Scale).ToString(),
                            "OFFSET_UNITS", "PRICE_UNITS",
                            "SPREAD", Math.Round(createOrder.Spread, (int)createOrder.Sec.Scale).ToString(),
                            "SPREAD_UNITS", "PRICE_UNITS",
                            "STOPPRICE", Math.Round(createOrder.ConditionPrice, (int)createOrder.Sec.Scale).ToString(),
                        }).ToArray();
                        break;

                    case StopOrderType.TakeProfitStopLimit:
                        TypeSOrder = "TAKE_PROFIT_AND_STOP_LIMIT_ORDER";
                        DopParam   = DopParam.Concat(new string[] {
                            "OFFSET", Math.Round(createOrder.Offset, (int)createOrder.Sec.Scale).ToString(),
                            "OFFSET_UNITS", "PRICE_UNITS",
                            "SPREAD", Math.Round(createOrder.Spread, (int)createOrder.Sec.Scale).ToString(),
                            "SPREAD_UNITS", "PRICE_UNITS",
                            "STOPPRICE", Math.Round(createOrder.ConditionPrice, (int)createOrder.Sec.Scale).ToString(),
                            "STOPPRICE2", Math.Round(createOrder.ConditionPrice2, (int)createOrder.Sec.Scale).ToString(),
                            "IS_ACTIVE_IN_TIME", "NO"
                        }).ToArray();
                        break;
                    }
                    ;
                    string[] Params =
                    {
                        "ACTION",          "NEW_STOP_ORDER",
                        "CLASSCODE",       createOrder.Sec.Class.Code,
                        "SECCODE",         createOrder.Sec.Code,
                        "OPERATION",       createOrder.Direction == OrderDirection.Buy ? "B" : "S",
                        "TYPE",            "L",
                        "PRICE",           Math.Round(createOrder.Price,                           (int)createOrder.Sec.Scale).ToString(),
                        "QUANTITY",        createOrder.Volume.ToString(),
                        "ACCOUNT",         acc.AccID,
                        "STOP_ORDER_KIND", TypeSOrder,
                    };
                    Params = Params.Concat(DopParam).ToArray();
                    this.SendTransaction(Params);
                });
            });
            return(0);
        }
Пример #8
0
        /// <summary>
        /// Create stop-order
        /// </summary>
        /// <param name="accountID">Account id</param>
        /// <param name="time">Date and time</param>
        /// <param name="insID">Instrum id</param>
        /// <param name="bs">Buy or sell</param>
        /// <param name="st">StopLoss or TakeProfit</param>
        /// <param name="endTime">End time or null</param>
        /// <param name="alertPrice">Alert price</param>
        /// <param name="price">Order price or null</param>
        /// <param name="lotCount">Lots count</param>
        /// <param name="status">Stop order status</param>
        /// <param name="completeTime">Complete date and time</param>
        /// <param name="stopOrderNo">Global stop-order number</param>
        /// <returns>New stop-order</returns>
        public StopOrder CreateStopOrder(int accountID, DateTime time, int insID, BuySell bs, StopOrderType st, DateTime?endTime, decimal alertPrice, decimal?price, int lotCount,
                                         StopOrderStatus status, DateTime?completeTime, long stopOrderNo)
        {
            StopOrder stopOrder = new StopOrder()
            {
                AccountID    = accountID,
                Time         = time,
                InsID        = insID,
                BuySell      = bs,
                StopType     = st,
                EndTime      = endTime,
                AlertPrice   = alertPrice,
                Price        = price,
                LotCount     = lotCount,
                Status       = status,
                CompleteTime = completeTime,
                StopOrderNo  = stopOrderNo
            };

            using (var db = new DaContext(_options))
            {
                db.StopOrder.Add(stopOrder);
                db.SaveChanges();
            }

            return(stopOrder);
        }
Пример #9
0
        public StopOrder CreateStopOrder(int accountID, DateTime time, int insID, BuySell bs, StopOrderType st, DateTime?endTime, decimal alertPrice, decimal?price, int lotCount,
                                         StopOrderStatus status, DateTime?completeTime, long stopOrderNo)
        {
            StopOrder so = new StopOrder()
            {
                StopOrderID  = _nextStopOrderID++,
                AccountID    = accountID,
                Time         = time,
                InsID        = insID,
                BuySell      = bs,
                StopType     = st,
                EndTime      = endTime,
                AlertPrice   = alertPrice,
                Price        = price,
                LotCount     = lotCount,
                Status       = status,
                CompleteTime = completeTime,
                StopOrderNo  = stopOrderNo
            };

            _id_stopOrders.Add(so.StopOrderID, so);

            return(so);
        }