private void MakeOrdersForTest()
 {
     ordersForTest = new List <MarketOrder>
     {
         new MarketOrder
         {
             Symbol        = "EURUSD",
             Volume        = 10000,
             Side          = 1,
             PriceEnter    = 1.3290f,
             TimeEnter     = DateTime.Now.AddMinutes(-60 * 24 * 3),
             State         = PositionState.Opened,
             ExpertComment = MarketOrder.MakeSignalComment(serviceId),
             MasterOrder   = 10001
         },
         new MarketOrder
         {
             Symbol        = "EURUSD",
             Volume        = 40000,
             Side          = -1,
             PriceEnter    = 1.3240f,
             TimeEnter     = DateTime.Now.AddMinutes(-60 * 100),
             State         = PositionState.Opened,
             ExpertComment = MarketOrder.MakeSignalComment(serviceId),
             //MasterOrder = 10002
         },
         new MarketOrder
         {
             Symbol        = "USDJPY",
             Volume        = 20000,
             Side          = 1,
             PriceEnter    = 90.67f,
             TimeEnter     = DateTime.Now.AddMinutes(-23 * 100),
             State         = PositionState.Opened,
             ExpertComment = MarketOrder.MakeSignalComment(serviceId),
             MasterOrder   = 10003
         },
         new MarketOrder
         {
             Symbol        = "EURGBP",
             Volume        = 20000,
             Side          = -1,
             PriceEnter    = 1.2000f,
             TimeEnter     = DateTime.Now.AddMinutes(-117 * 100),
             State         = PositionState.Opened,
             ExpertComment = MarketOrder.MakeSignalComment(serviceId),
             MasterOrder   = 10004
         }
     };
     ordersForTest.ForEach(o => o.AccountID = testAccountId);
 }
Beispiel #2
0
        private static void ProcessSignalOpenOrder(TradeSignalActionTrade action)
        {
            try
            {
                var signalRecord = EnqueueProcessedSignalRecord(action);

                using (var ctx = DatabaseContext.Instance.Make())
                {
                    // получить информацию по настройкам торговых сигналов
                    var subscriptions = (from subsSig in ctx.SUBSCRIPTION_SIGNAL
                                         where (subsSig.AutoTrade ?? false) && subsSig.Service == action.ServiceId && subsSig.TargetAccount.HasValue
                                         select subsSig).ToList();

                    foreach (var sub in subscriptions)
                    {
                        var volm = sub.FixedVolume ?? 0;
                        if (volm == 0)
                        {
                            volm = GetNewOrderVolume(action, ctx, sub);
                        }

                        // объем входа недопустимо мал либо ошибка в расчете
                        if (volm == 0)
                        {
                            return;
                        }

                        var order = new MarketOrder
                        {
                            // ReSharper disable PossibleInvalidOperationException
                            AccountID = sub.TargetAccount.Value,
                            // ReSharper restore PossibleInvalidOperationException
                            Volume        = volm,
                            Side          = action.Side,
                            Symbol        = action.Ticker,
                            StopLoss      = (float?)action.StopLoss,
                            TakeProfit    = (float?)action.TakeProfit,
                            Magic         = action.OrderId,
                            ExpertComment =
                                MarketOrder.MakeSignalComment(
                                    action.ServiceId),
                            MasterOrder = action.OrderId
                        };

                        try
                        {
                            var status =
                                ProxyTrade.SendNewOrderRequest(ProtectedOperationContext.MakeServerSideContext(),
                                                               action.OrderId, order, OrderType.Market,
                                                               (decimal)action.Price, 0);

                            if (signalRecord.subscriberAccountProcessingStatus.ContainsKey(order.AccountID))
                            {
                                Logger.ErrorFormat("Сигнал {0} - повторная отправка на счет {1}",
                                                   action, order.AccountID);
                            }
                            else
                            {
                                signalRecord.subscriberAccountProcessingStatus[order.AccountID] = status;
                            }

                            if (status != RequestStatus.OK)
                            {
                                Logger.ErrorFormat("ProcessSignalOpenOrder - ошибка обработки сервером" +
                                                   " запроса SendNewOrderRequest, master order: {0}, account: {1}, {2}",
                                                   action.OrderId, sub.TargetAccount, status);
                            }
                        }
                        catch (Exception ex)
                        {
                            Logger.ErrorFormat(
                                "ProcessSignalOpenOrder - ошибка отправки запроса SendNewOrderRequest, master order: {0}, account: {1}, {2}",
                                action.OrderId, sub.TargetAccount, ex);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.DebugFormat("ProcessSignalOpenOrder(#{0} - {1}) - исключение: {2}",
                                   action.OrderId, action.Ticker, ex);
            }
        }