private void ConnectorOnScriptingUnloaded(object sender, EventArgs <string, ScriptingType> e)
        {
            bool updated = false;

            if (e.Value2 == ScriptingType.Indicator)
            {
                lock (Indicators)
                {
                    if (Indicators.ContainsKey(e.Value1))
                    {
                        Indicators.Remove(e.Value1);
                        updated = true;
                    }
                }
            }
            else if (e.Value2 == ScriptingType.Signal)
            {
                lock (Signals)
                {
                    var signal = Signals.FirstOrDefault(i => i.FullName == e.Value1);
                    if (signal != null)
                    {
                        signal.State = State.Stopped;
                        Signals.Remove(signal);
                        updated = true;
                    }
                }
            }

            if (updated && ScriptingListUpdated != null)
            {
                ScriptingListUpdated();
            }
        }
        public string SendIndicatorToServer(string solutionPath)
        {
            var indicatorName = Path.GetFileNameWithoutExtension(solutionPath);
            var DLLs          = GetCompressedScriptingDlls(Path.GetDirectoryName(solutionPath));

            if (!DLLs.ContainsKey(indicatorName + ".dll"))
            {
                return($"Failed to locate or compress {indicatorName} libraries");
            }

            if (Indicators.ContainsKey(indicatorName))
            {
                Indicators.Remove(indicatorName);
                ScriptingListUpdated?.Invoke();
                IndicatorInstanceRemoved?.Invoke(this, new EventArgs <string>(indicatorName));
            }

            _connector.Send(new SaveScriptingDataRequest
            {
                Files         = DLLs,
                Path          = indicatorName,
                RequestID     = Guid.NewGuid().ToString(),
                ScriptingType = ScriptingType.Indicator
            });

            return(String.Empty);
        }
        private void ConnectorOnScriptingSaved(object sender, EventArgs <ScriptingSavedEventArgs> eventArgs)
        {
            if (eventArgs.Value.ScriptingType == Data.Contracts.ScriptingType.Indicator)
            {
                lock (Indicators)
                {
                    if (Indicators.ContainsKey(eventArgs.Value.Name))
                    {
                        Indicators.Remove(eventArgs.Value.Name);
                    }

                    Indicators.Add(eventArgs.Value.Name, eventArgs.Value.Parameters);
                }
            }
            else if (eventArgs.Value.ScriptingType == Data.Contracts.ScriptingType.Signal)
            {
                lock (Signals)
                {
                    var signal = Signals.FirstOrDefault(i => i.FullName == eventArgs.Value.Name);
                    if (signal != null)
                    {
                        signal.Parameters = new List <ScriptingParameterBase>(eventArgs.Value.Parameters);
                    }
                    else
                    {
                        signal = new Signal
                        {
                            FullName   = eventArgs.Value.Name,
                            Parameters = new List <ScriptingParameterBase>(eventArgs.Value.Parameters)
                        };
                    }

                    if (signal.State == State.New)
                    {
                        signal.State = State.Stopped;
                        signal.SetDefaultParamSpace();
                    }

                    if (Signals.All(i => i.FullName != signal.FullName))
                    {
                        Signals.Add(signal);
                    }
                }
            }

            ScriptingListUpdated?.Invoke();
        }