示例#1
0
 public MessagingService(IConfiguration configuration)
 {
     if (Server == null)
     {
         try
         {
             short Port = Int16.Parse(configuration["MessagingPort"]);
             if (Port <= 0)
             {
                 Port = 2021;
             }
             if (configuration["WSProtocol"] == "wss")
             {
                 string pass    = configuration["CertificatePassword"];
                 var    context = new SslContext(SslProtocols.Tls12, new X509Certificate2("server.pfx", pass));
                 _serv = new SMessagingServer(context, IPAddress.Any, Port);
             }
             else
             {
                 _serv = new MessagingServer(IPAddress.Any, Port);
             }
         } catch (Exception e)
         {
             log.Info(e.ToString());
         }
     }
 }
示例#2
0
        public void Init()
        {
            if (Server == null)
            {
                try
                {
                    var Port = short.Parse(configuration["MessagingPort"]);
                    if (Port <= 0)
                    {
                        Port = 2021;
                    }
                    if (configuration["WSProtocol"] == "wss")
                    {
                        var pass    = configuration["CertificatePassword"];
                        var context = new SslContext(SslProtocols.Tls12, new X509Certificate2("server.pfx", pass));
                        _serv = new SMessagingServer(context, IPAddress.Any, Port);
                    }
                    else
                    {
                        _serv = new MessagingServer(IPAddress.Any, Port);
                    }
                }
                catch (Exception e)
                {
                    log.Info(e.ToString());
                }
            }

            if (LocalServer == null)
            {
                try
                {
                    var Port = short.Parse(configuration["TcpPort"]);
                    if (Port <= 0)
                    {
                        Port = 2022;
                    }
                    Thread.Sleep(100);
                    _localserv = new TMessagingServer(IPAddress.Any, Port);
                }
                catch (Exception e)
                {
                    log.Info(e.ToString());
                }
            }
        }
示例#3
0
        private static void Configure(string profile)
        {
            // read configuration values
            var builder = new Microsoft.Extensions.Configuration.ConfigurationBuilder()
                          .SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
                          .AddJsonFile("appsettings.json", false)
                          .AddJsonFile($"{profile}.json", false);
            var configurationRoot = builder.Build();

            // configure logging
            _loggerFactory = new LoggerFactory();
            _loggerFactory.AddConsole(configurationRoot.GetSection("Logging"));
            _loggerFactory.AddNLog();

            LogManager.Configuration = new XmlLoggingConfiguration("nlog.config", true);

            _logger = _loggerFactory.CreateLogger("TestServer");

            // configure caching
            var distributedCache = DistributedCacheFactory.Create();

            // set up address registry
            var addressRegistrySettings = new AddressRegistrySettings();

            configurationRoot.GetSection("AddressRegistrySettings").Bind(addressRegistrySettings);
            addressRegistrySettings.WcfConfiguration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            var addressRegistry = new AddressRegistry(addressRegistrySettings, distributedCache);

            // set up collaboration registry
            var collaborationProtocolRegistrySettings = new CollaborationProtocolRegistrySettings();

            configurationRoot.GetSection("CollaborationProtocolRegistrySettings").Bind(collaborationProtocolRegistrySettings);
            collaborationProtocolRegistrySettings.WcfConfiguration =
                ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

            var collaborationProtocolRegistry = new CollaborationProtocolRegistry(collaborationProtocolRegistrySettings, distributedCache, addressRegistry);

            _serverSettings = new ServerSettings();
            configurationRoot.GetSection("ServerSettings").Bind(_serverSettings);

            // set up messaging
            var messagingSettings = new MessagingSettings();

            configurationRoot.GetSection("MessagingSettings").Bind(messagingSettings);

            messagingSettings.ServiceBus.Synchronous.ReplyQueueMapping.Add(Environment.MachineName, "DUMMY"); // we just need a value, it will never be used
            messagingSettings.LogPayload = true;

            _messagingServer = new MessagingServer(messagingSettings, _logger, _loggerFactory, collaborationProtocolRegistry, addressRegistry);

            _messagingServer.RegisterAsynchronousMessageReceivedStartingCallback((m) =>
            {
                MappedDiagnosticsLogicalContext.Set("correlationId", m.MessageId);
            });
            _messagingServer.RegisterAsynchronousMessageReceivedCallback((m) =>
            {
                if (m.Payload.ToString().Contains("ThrowException"))
                {
                    throw new InvalidOperationException();
                }

                var path = Path.Combine(_serverSettings.DestinationDirectory, "Asynchronous");
                if (Directory.Exists(path) == false)
                {
                    Directory.CreateDirectory(path);
                }
                var fileName = Path.Combine(path, m.MessageId + ".xml");
                using (var sw = File.CreateText(fileName))
                {
                    m.Payload.Save(sw);
                }
            });
            _messagingServer.RegisterAsynchronousMessageReceivedCompletedCallback((m) =>
            {
                MappedDiagnosticsLogicalContext.Set("correlationId", m.MessageId);
            });

            _messagingServer.RegisterSynchronousMessageReceivedStartingCallback((m) =>
            {
                MappedDiagnosticsLogicalContext.Set("correlationId", string.Empty);// reset correlation id
            });
            _messagingServer.RegisterSynchronousMessageReceivedCallback((m) =>
            {
                var path = Path.Combine(_serverSettings.DestinationDirectory, "Synchronous");
                if (Directory.Exists(path) == false)
                {
                    Directory.CreateDirectory(path);
                }
                var fileName = Path.Combine(path, m.MessageId + ".xml");
                using (var sw = File.CreateText(fileName))
                {
                    m.Payload.Save(sw);
                }
                return(new XDocument(new XElement("DummyResponse")));
            });
            _messagingServer.RegisterSynchronousMessageReceivedCompletedCallback((m) =>
            {
                MappedDiagnosticsLogicalContext.Set("correlationId", string.Empty); // reset correlation id
            });
        }
示例#4
0
 public PositionsTester()
 {
     server     = Program.Container.Resolve <IMessagingServer>();
     _positions = GeneratePositions();
     _timer     = new Timer(UpdatePosition, null, _updateInterval, _updateInterval);
 }
        public void PostSignal(SignalInfo signal, IMessagingServer server)
        {
            if ((SignalFlags)signal.Flags == SignalFlags.Cluster)
            {
                xtrade.PostSignalTo(signal);
                return;
            }

            switch ((EnumSignals)signal.Id)
            {
            case EnumSignals.SIGNAL_POST_LOG:
            {
                if (string.IsNullOrEmpty(signal.Data))
                {
                    break;
                }
                MainService.thisGlobal.DoLog(signal);
            }
            break;

            case EnumSignals.SIGNAL_CHECK_HEALTH:
                if (Utils.IsDebug())
                {
                    log.Info("CheckHealth: " + signal.Flags);
                }
                break;

            case EnumSignals.SIGNAL_DEALS_HISTORY:
            {
                List <DealInfo> deals = Utils.ExtractList <DealInfo>(signal.Data);
                xtrade.SaveDeals(deals);
            }
            break;

            case EnumSignals.SIGNAL_CHECK_BALANCE:
            {
                if (signal.Data == null)
                {
                    break;
                }
                var jList = Utils.ExtractList <BalanceInfo>(signal.Data);
                if (Utils.HasAny(jList))
                {
                    BalanceInfo info = jList.FirstOrDefault();
                    xtrade.UpdateBalance((int)info.Account, info.Balance, info.Equity);
                }
            } break;

            case EnumSignals.SIGNAL_UPDATE_RATES:
            {
                try
                {
                    var jRates = Utils.ExtractList <RatesInfo>(signal.Data);
                    if (Utils.HasAny(jRates))
                    {
                        var usdbynrateTask = GetBYNRates();
                        var usdbynrate     = usdbynrateTask.Result;
                        if (usdbynrate > 0)
                        {
                            var rate = new RatesInfo();
                            rate.Ask    = usdbynrate;
                            rate.Bid    = usdbynrate;
                            rate.Symbol = "USDBYN";
                            jRates.Add(rate);
                        }
                    }

                    xtrade.UpdateRates(jRates);
                }
                catch (Exception e)
                {
                    log.Info(string.Format($"GetBYNUSDRates Error: {0}", e));
                }
            }
            break;

            case EnumSignals.SIGNAL_ACTIVE_ORDERS:
            {
                List <PositionInfo> positions = Utils.ExtractList <PositionInfo>(signal.Data);
                var terminals = MainService.thisGlobal.Container.Resolve <ITerminalEvents>();
                terminals.UpdatePositions(signal.ObjectId, signal.Value, positions);
            } break;

            case EnumSignals.SIGNAL_ADD_ORDERS:
            {
                List <PositionInfo> orders = Utils.ExtractList <PositionInfo>(signal.Data);
                if (Utils.HasAny(orders))
                {
                    var terminals = MainService.thisGlobal.Container.Resolve <ITerminalEvents>();
                    terminals.AddOrders(signal.ObjectId, signal.Value, orders);
                }
            } break;

            case EnumSignals.SIGNAL_DELETE_ORDERS:
            {
                List <PositionInfo> orders = Utils.ExtractList <PositionInfo>(signal.Data);
                if (Utils.HasAny(orders))
                {
                    var terminals = MainService.thisGlobal.Container.Resolve <ITerminalEvents>();
                    terminals.DeleteOrders(signal.ObjectId, signal.Value, orders);
                }
            } break;

            case EnumSignals.SIGNAL_UPDATE_ORDERS:
            {
                List <PositionInfo> orders = Utils.ExtractList <PositionInfo>(signal.Data);
                if (Utils.HasAny(orders))
                {
                    var terminals = MainService.thisGlobal.Container.Resolve <ITerminalEvents>();
                    terminals.UpdateOrders(signal.ObjectId, signal.Value, orders);
                }
            } break;

            case EnumSignals.SIGNAL_WARN_NEWS:
                break;

            case EnumSignals.SIGNAL_DEINIT_EXPERT:
            {
                var expert = JsonConvert.DeserializeObject <ExpertInfo>(signal.Data);
                xtrade.DeInitExpert(expert);
            } break;

            case EnumSignals.SIGNAL_DEINIT_TERMINAL:
            {
                var expert = JsonConvert.DeserializeObject <ExpertInfo>(signal.Data);
                xtrade.DeInitTerminal(expert);
            }
            break;

            case EnumSignals.SIGNAL_LEVELS4SYMBOL:
            {
                var symbol       = signal.Sym;
                var levelsString = xtrade.Levels4Symbol(symbol);
                var result       = xtrade.CreateSignal(SignalFlags.Expert, signal.ObjectId, (EnumSignals)signal.Id,
                                                       signal.ChartId);
                result.Sym = symbol;
                result.SetData(levelsString);
                var send = JsonConvert.SerializeObject(result);
                if (server != null)
                {
                    server.MulticastText(send);
                }
            }
            break;

            case EnumSignals.SIGNAL_SAVELEVELS4SYMBOL:
            {
                var levels = signal.Data;
                xtrade.SaveLevels4Symbol(signal.Sym, levels);
                log.Info($"Levels Saved For Symbol {signal.Sym}: {levels}");
            }
            break;

            default:
                if (server != null)
                {
                    var result = xtrade.SendSignal(signal);
                    if (result != null)
                    {
                        var send = JsonConvert.SerializeObject(result);
                        server.MulticastText(send);
                    }
                }

                break;
            }
        }
        public void ProcessMessage(WsMessage wsMessage, IMessagingServer server)
        {
            switch (wsMessage.Type)
            {
            case WsMessageType.GetAllText:
            {
                wsMessage.Message = log.GetAllText();
                wsMessage.Type    = WsMessageType.GetAllText;
                var send = JsonConvert.SerializeObject(wsMessage);
                server.MulticastText(send);
            }
            break;

            case WsMessageType.ClearLog:
            {
                log.ClearLog();
            }
            break;

            case WsMessageType.WriteLog:
            {
                log.Info(wsMessage.Message);
            }
            break;

            case WsMessageType.GetAllPositions:
            {
                var message = new WsMessage();
                message.From = wsMessage.From;
                message.Type = WsMessageType.GetAllPositions;
                var terminals = MainService.thisGlobal.Container.Resolve <ITerminalEvents>();
                message.Message = JsonConvert.SerializeObject(terminals.GetAllPositions());
                var send = JsonConvert.SerializeObject(message);
                server.MulticastText(send);
            }
            break;

            case WsMessageType.GetAllPerformance:
            {
                var message = new WsMessage();
                message.From    = wsMessage.From;
                message.Type    = WsMessageType.GetAllPerformance;
                message.Message = "[]";
                var ds    = MainService.thisGlobal.Container.Resolve <DataService>();
                var month = int.Parse(wsMessage.Message);
                ds.StartPerf(month);
                var send = JsonConvert.SerializeObject(message);
                server.MulticastText(send);
            }
            break;

            case WsMessageType.GetAllCapital:
            {
                var message = new WsMessage();
                message.From    = wsMessage.From;
                message.Type    = WsMessageType.GetAllCapital;
                message.Message = "[]";
                var result       = JsonConvert.DeserializeObject <Dictionary <string, string> >(wsMessage.Message);
                var wallet       = int.Parse(result["WalletId"]);
                var dateTimeFrom = DateTime.Parse(result["from"]);
                var dateTimeTo   = DateTime.Parse(result["to"]);
                xtrade.GetWalletBalanceRangeAsync(wallet, dateTimeFrom, dateTimeTo);
                var send = JsonConvert.SerializeObject(message);
                server.MulticastText(send);
            }
            break;

            case WsMessageType.UpdatePosition:
            {
                var result = JsonConvert.DeserializeObject <PositionInfo>(wsMessage.Message);
                if (result != null)
                {
                    var terminals = MainService.thisGlobal.Container.Resolve <ITerminalEvents>();
                    terminals.UpdatePositionFromClient(result);
                }
            }
            break;

            case WsMessageType.GetLevels:
            {
                wsMessage.From    = "Server";
                wsMessage.Message = xtrade.Levels4Symbol(wsMessage.Message);
                wsMessage.Type    = WsMessageType.GetLevels;
                var send = JsonConvert.SerializeObject(wsMessage);
                server.MulticastText(send);
            }
            break;


            default:
            {
                log.Info("Undefined Message");
                // Multicast message to all connected sessions
                // ((WsServer)Server).MulticastText(message);
            }
            break;
            }
        }
示例#7
0
 public SMessageSession(WssServer server, ILog l, ISignalHandler signalHandler) : base(server)
 {
     log     = l;
     handler = signalHandler;
     mServer = (IMessagingServer)server;
 }
        public void PostSignal(SignalInfo signal, IMessagingServer server)
        {
            if ((SignalFlags)signal.Flags == SignalFlags.Cluster)
            {
                xtrade.PostSignalTo(signal);
                return;
            }

            switch ((EnumSignals)signal.Id)
            {
            case EnumSignals.SIGNAL_POST_LOG:
            {
                if (signal.Data == null)
                {
                    break;
                }
                MainService.thisGlobal.DoLog(signal);
            }
            break;

            case EnumSignals.SIGNAL_CHECK_HEALTH:
                if (xtrade.IsDebug())
                {
                    log.Info("CheckHealth: " + signal.Flags);
                }
                break;

            case EnumSignals.SIGNAL_DEALS_HISTORY:
            {
                List <DealInfo> deals = null;
                if (signal.Data != null)
                {
                    deals = JsonConvert.DeserializeObject <List <DealInfo> >(signal.Data.ToString());
                }
                else
                {
                    deals = new List <DealInfo>();
                }
                xtrade.SaveDeals(deals);
            }
            break;

            case EnumSignals.SIGNAL_CHECK_BALANCE:
            {
                if (signal.Data == null)
                {
                    break;
                }
                JArray jarray = (JArray)signal.Data;
                if (jarray == null || jarray.Count == 0)
                {
                    break;
                }
                decimal balance = jarray.First.Value <decimal?>("Balance") ?? 0;
                decimal equity  = jarray.First.Value <decimal?>("Equity") ?? 0;
                int     Account = jarray.First.Value <int?>("Account") ?? 0;
                xtrade.UpdateBalance(Account, balance, equity);
            }
            break;

            case EnumSignals.SIGNAL_UPDATE_RATES:
            {
                try
                {
                    List <RatesInfo> rates = null;
                    if (signal.Data != null)
                    {
                        rates = JsonConvert.DeserializeObject <List <RatesInfo> >(signal.Data.ToString());
                    }
                    if (rates != null)
                    {
                        var    usdbynrateTask = GetBYNRates();
                        double usdbynrate     = usdbynrateTask.Result;
                        if (usdbynrate > 0)
                        {
                            RatesInfo rate = new RatesInfo();
                            rate.Ask    = usdbynrate;
                            rate.Bid    = usdbynrate;
                            rate.Symbol = "USDBYN";
                            rates.Add(rate);
                        }
                    }
                    xtrade.UpdateRates(rates);
                }
                catch (Exception e)
                {
                    log.Info(String.Format($"GetBYNUSDRates Error: {0}", e.ToString()));
                }
            }
            break;

            case EnumSignals.SIGNAL_ACTIVE_ORDERS:
            {
                List <PositionInfo> positions = null;
                if (signal.Data != null)
                {
                    positions = JsonConvert.DeserializeObject <List <PositionInfo> >(signal.Data.ToString());
                }
                else
                {
                    positions = new List <PositionInfo>();
                }
                var terminals = MainService.thisGlobal.Container.Resolve <ITerminalEvents>();
                terminals.UpdatePositions(signal.ObjectId, signal.Value, positions);
            }
            break;

            /*
             * case EnumSignals.SIGNAL_UPDATE_SLTP:
             * {
             *  List<PositionInfo> positions = null;
             *  if (signal.Data != null)
             *      positions = JsonConvert.DeserializeObject<List<PositionInfo>>(signal.Data.ToString());
             *  else
             *      positions = new List<PositionInfo>();
             *  terminals.UpdateSLTP(signal.ObjectId, signal.Value, positions);
             * }
             * break;
             */
            case EnumSignals.SIGNAL_WARN_NEWS:
                break;

            case EnumSignals.SIGNAL_DEINIT_EXPERT:
            {
                ExpertInfo expert = JsonConvert.DeserializeObject <ExpertInfo>(signal.Data.ToString());
                xtrade.DeInitExpert(expert);
            }
            break;

            case EnumSignals.SIGNAL_DEINIT_TERMINAL:
            {
                ExpertInfo expert = JsonConvert.DeserializeObject <ExpertInfo>(signal.Data.ToString());
                xtrade.DeInitTerminal(expert);
            }
            break;

            case EnumSignals.SIGNAL_LEVELS4SYMBOL:
            {
                string symbol       = signal.Sym;
                string levelsString = xtrade.Levels4Symbol(symbol);
                var    result       = xtrade.CreateSignal(SignalFlags.Expert, signal.ObjectId, (EnumSignals)signal.Id, signal.ChartId);
                result.Sym  = symbol;
                result.Data = levelsString;
                var send = JsonConvert.SerializeObject(result);
                if (server != null)
                {
                    server.MulticastText(send);
                }
            }
            break;

            default:
                if (server != null)
                {
                    var result = xtrade.SendSignal(signal);
                    if (result != null)
                    {
                        var send = JsonConvert.SerializeObject(result);
                        server.MulticastText(send);
                    }
                }
                break;
            }
        }