public override string ActivateScript(CandleChartControl chart, PointD worldCoords)
        {
            var dlg = new OpenFileDialog
            {
                Filter = "*.csv|*.csv|*.*|*.*",
                FilterIndex = 0,
                DefaultExt = "csv",
                Title = "Открыть файл сделок"
            };
            if (dlg.ShowDialog() != DialogResult.OK) return "";

            // прочитать ордера
            var allOrders = ReadOrdersFromCsv(dlg.FileName);
            var chartOrders = allOrders.Where(o => o.Symbol.Contains(chart.Symbol)).ToList();
            if (chartOrders.Count == 0)
            {
                var msg = string.Format("{0} ордеров прочитано, ни один не относится к графику {1}",
                    allOrders.Count, chart.Symbol);
                return msg;
            }

            if (allOrders.Count > 1000)
            {
                //var msg = string.Format("Прочитано {0} ордеров. Отобразить ордера на выбранном временном отрезке?",
                //    chartOrders.Count);
                var ordersDlg = new Mt4ImportDlg(chartOrders);
                if (ordersDlg.ShowDialog() == DialogResult.OK)
                    chartOrders = ordersDlg.selectedOrders;
            }

            ShowOrders(chartOrders, chart);
            return string.Empty;
        }
 public NewTextSignalForm(CandleChartControl sender, List<PaidService> signals)
     : this()
 {
     chart = sender;
     this.signals = signals;
     InitInterface();
 }
        public SaveChartTemplate(CandleChartControl chart)
        {
            InitializeComponent();

            Localizer.LocalizeControl(this);
            this.chart = chart;
        }
        public override string ActivateScript(CandleChartControl chart, PointD worldCoords)
        {
            if (!AccountStatus.Instance.isAuthorized)
            {
                MessageBox.Show("Не авторизован");
                return "Не авторизован";
            }

            var accountId = AccountStatus.Instance.accountID;
            var numStepsMax = (VolumeMax - VolumeMin) / VolumeStep;
            var rand = new Random();
            var sb = new StringBuilder();

            // закрытые сделки
            var closedOrders = MakeClosedOrders(chart, accountId, rand, numStepsMax);

            // SQL по закрытым сделкам
            MakeClosedOrdersSQL(closedOrders, accountId, sb);

            // найти все отметки на графике
            // и по ним сбацать "сделки"
            var positions = MakeMarketOrders(chart, accountId, rand, numStepsMax);

            // слепить SQL по открытым позам
            MakeMarketOrdersSQL(positions, accountId, sb);

            if (sb.Length > 0)
                Clipboard.SetText(sb.ToString());
            return (positions.Count + closedOrders.Count) + " сделок скопировано в буфер обмена";
        }
        public override string ActivateScript(CandleChartControl chart, PointD worldCoords)
        {
            this.chart = chart;
            scriptActivatedCoords = worldCoords;

            // найти робота / роботов на данный тикер / ТФ
            var robots = MainForm.Instance.RobotFarm.GetRobotCopies();
            robots = robots.Where(r => r.Graphics.Any(g => g.a == chart.chart.Symbol && g.b == chart.chart.Timeframe))
                      .ToList();
            if (robots.Count == 0) return "Нет роботов для " + chart.Symbol + ":" + chart.Timeframe;
            selectedBot = robots[0];
            // если роботов несколько - предложить пользователю выбрать интересующего
            if (robots.Count > 1)
            {
                object selectedRobot;
                string inputText;

                if (!Dialogs.ShowComboDialog("Укажите робота",
                                                             robots.Cast<object>().ToList(), out selectedRobot,
                                                             out inputText))
                    return "робот не выбран из списка";
                selectedBot = (BaseRobot) selectedRobot;
            }

            ShowRobotDataOnChart();

            return "";
        }
        public ApplyChartTemplate(CandleChartControl candleChartControl)
        {
            InitializeComponent();

            Localizer.LocalizeControl(this);
            candleChart = candleChartControl;
            symbol = candleChartControl.Symbol;
            LoadTemplateNames();
        }
 private void AddScriptsToChart(CandleChartControl chart)
 {
     var allScripts = ScriptManager.Instance.GetScripts();
     var chartScripts = allScripts.Where(s => s.ScriptTarget == TerminalScript.TerminalScriptTarget.График ||
                                              s.ScriptTarget == TerminalScript.TerminalScriptTarget.Тикер);
     var menuTitles = chartScripts.Select(s => s.Title).ToList();
     var menuTags = chartScripts.Cast<object>().ToList();
     chart.SetupScriptMenu(menuTitles, menuTags);
 }
        public PriceProbForm(CandleChartControl chart, PointD worldCoords)
            : this()
        {
            this.chart = chart;
            tbPrice.Text = worldCoords.Y.ToStringUniform(5);

            var candles = chart.chart.StockSeries.Data.Candles;
            if (candles.Count == 0) return;
            dtEnd.Value = candles[candles.Count - 1].timeClose;
        }
 public override string ActivateScript(CandleChartControl chart, PointD worldCoords)
 {
     this.chart = chart;
     var dlg = new CaymanDivergenceSetupDlg();
     if (dlg.ShowDialog() == DialogResult.Cancel) return "";
     skippedCandles = dlg.SkipCandles;
     checkedPrices = dlg.CheckedPrices;
     removeOldSigns = dlg.RemoveOldSigns;
     return BuildSeries();
 }
 private void ChartScriptMenuItemActivated(CandleChartControl sender, 
     PointD worldCoords, object script)
 {
     var scriptTyped = (TerminalScript) script;
     if (scriptTyped.ScriptTarget == TerminalScript.TerminalScriptTarget.График)
     {
         var rstString = scriptTyped.ActivateScript(sender, worldCoords);
         if (!string.IsNullOrEmpty(rstString))
             AddMessageToStatusPanelSafe(DateTime.Now, "Скрипт [" + scriptTyped.ScriptName + "]: " + rstString);
         return;
     }
     var rst = scriptTyped.ActivateScript(sender.Symbol);
     if (!string.IsNullOrEmpty(rst))
         AddMessageToStatusPanelSafe(DateTime.Now, "Скрипт [" + scriptTyped.ScriptName + "]: " + rst);
 }
        public void AreSettingsUpdated()
        {
            var timeLastSaved = UserSettings.Instance.lastTimeModified.GetLastHitIfHitted() ?? DateTime.Now.AddDays(-1);
            var areUpdated = SettingsAutosaver.AreSettingsUpdated(timeLastSaved);
            Assert.IsFalse(areUpdated, "AreSettingsUpdated - обновления еще не было");

            UserSettings.Instance.WindowSize = new Size(10, 10);
            areUpdated = SettingsAutosaver.AreSettingsUpdated(timeLastSaved);
            Assert.IsTrue(areUpdated, "AreSettingsUpdated - обновление таки имело место");
            timeLastSaved = UserSettings.Instance.lastTimeModified.GetLastHit();

            var chart = new CandleChartControl();
            chart.ActivateIndiAddEvent(new FiboForkIndicator());
            areUpdated = SettingsAutosaver.AreSettingsUpdated(timeLastSaved);
            Assert.IsTrue(areUpdated, "AreSettingsUpdated - обновление имело место - были обновлены индюки");
        }
        public override string ActivateScript(CandleChartControl chart, PointD worldCoords)
        {
            var comment = chart.seriesComment.data.FirstOrDefault(c => c.Name == CommentSpecName);
            // удалить существующий
            if (comment != null)
            {
                chart.seriesComment.data.Remove(comment);
                chart.RedrawChartSafe();
                return string.Empty;
            }

            // добавить новый
            MarketOrder sumPos;
            string scriptText;
            GetCommentText(chart, out scriptText, out sumPos);
            if (sumPos == null) return string.Empty;

            var colorFill = sumPos.ResultDepo > 0
                                ? Color.LightGreen : sumPos.ResultDepo < 0 ? Color.LightCoral : Color.Gray;

            var colorText = chart.chart.BackColor.GetBrightness() < 0.4f ? Color.White : Color.Black;
            comment = new ChartComment
                {
                    FillTransparency = 80,
                    ColorFill = colorFill,
                    HideArrow = true,
                    ArrowAngle = 90,
                    ArrowLength = 1,
                    PivotIndex = worldCoords.X,
                    PivotPrice = worldCoords.Y,
                    Owner = chart.seriesComment,
                    Name = CommentSpecName,
                    Text = scriptText,
                    ColorText = colorText,
                    Color = colorText
                };
            chart.seriesComment.data.Add(comment);
            chart.RedrawChartSafe();
            return string.Empty;
        }
        public override string ActivateScript(CandleChartControl chart, PointD worldCoords)
        {
            var robots = MainForm.Instance.RobotFarm.GetRobotsAsIs().ToList();
            var commentText = GetCommentForChart(chart.Symbol, chart.Timeframe, robots);
            if (string.IsNullOrEmpty(commentText)) return "Нет роботов для " + chart.Symbol + " " +
                BarSettingsStorage.Instance.GetBarSettingsFriendlyName(chart.Timeframe);

            // разместить комментарий на графике в указанной точке, удалить такой же, если был добавлен
            var comment = chart.seriesComment.data.FirstOrDefault(c => c.Name == CommentSpecName);
            if (comment != null)
            {
                chart.seriesComment.data.Remove(comment);
                chart.RedrawChartSafe();
                return string.Empty;
            }

            var colorFill = Color.LightGreen;
            var colorText = chart.chart.BackColor.GetBrightness() < 0.4f ? Color.White : Color.Black;

            comment = new ChartComment
            {
                FillTransparency = 80,
                ColorFill = colorFill,
                HideArrow = true,
                ArrowAngle = 90,
                ArrowLength = 1,
                PivotIndex = worldCoords.X,
                PivotPrice = worldCoords.Y,
                Owner = chart.seriesComment,
                Name = CommentSpecName,
                Text = commentText,
                ColorText = colorText,
                Color = colorText
            };
            chart.seriesComment.data.Add(comment);
            chart.RedrawChartSafe();
            return string.Empty;
        }
        public override string ActivateScript(CandleChartControl chart, PointD worldCoords)
        {
            if (MainForm.Instance.RobotFarm.State != RobotFarm.RobotFarmState.Stopped)
            {
                const string msg = "Роботы должны быть не активны на момент настройки";
                MessageBox.Show(msg);
                return msg;
            }

            // отыскать киборга
            var robots = MainForm.Instance.RobotFarm.GetRobotCopies();
            if (robots == null || robots.Count == 0) robots = RobotFarm.LoadRobots();
            if (robots == null) robots = new List<BaseRobot>();

            var fiboLevelRobots = robots.Where(r => r is StopRobot).Cast<StopRobot>();
            var targetRobots =
                fiboLevelRobots.Where(r => r.Graphics.Any(g => g.a == chart.Symbol &&
                    g.b.Equals(chart.Timeframe))).ToList();
            if (targetRobots.Count == 0)
            {
                var msg = string.Format("Роботов для {0} {1} не найдено", chart.Symbol,
                                        BarSettingsStorage.Instance.GetBarSettingsFriendlyName(chart.Timeframe));
                MessageBox.Show(msg);
                return msg;
            }

            // вызвать диалог
            var dlg = new SetupStopRobotDlg(targetRobots, worldCoords.Y);
            if (dlg.ShowDialog() == DialogResult.Cancel) return "";

            dlg.SelectedRobot.StopLevel = dlg.SelectedPrice;
            dlg.SelectedRobot.Side = dlg.SelectedSide;

            // обновить настройки роботов
            MainForm.Instance.RobotFarm.SetRobotSettings(robots);
            RobotFarm.SaveRobots(robots);
            return "Настройка робота CS произведена";
        }
        private List<MarketOrder> MakeMarketOrders(CandleChartControl chart, int accountId, Random rand, int numStepsMax)
        {
            var positions = new List<MarketOrder>();

            foreach (var mark in chart.seriesAsteriks.data)
            {
                var side = mark.Shape == AsteriskTooltip.ShapeType.СтрелкаВниз
                               ? -1
                               : mark.Shape == AsteriskTooltip.ShapeType.СтрелкаВверх ? 1 : 0;
                if (side == 0) continue;
                var pos = new MarketOrder
                              {
                                  AccountID = accountId,
                                  Side = side,
                                  TimeEnter = mark.DateStart.Value,
                                  State = PositionState.Opened,
                                  PriceEnter = mark.Price,
                                  Symbol = chart.Symbol,
                                  Volume = VolumeMin
                              };
                // посчитать объем
                if (numStepsMax > 0)
                    pos.Volume += rand.Next(numStepsMax + 1)*VolumeStep;
                positions.Add(pos);
            }
            return positions;
        }
        private List<MarketOrder> MakeClosedOrders(CandleChartControl chart, int accountId, Random rand, int numStepsMax)
        {
            var positions = new List<MarketOrder>();

            foreach (var mark in chart.seriesMarker.data)
            {
                var side = (int)mark.Side;
                if (mark.exitPair == null) continue;

                var pos = new MarketOrder
                {
                    AccountID = accountId,
                    Side = side,
                    TimeEnter = mark.DateStart.Value,
                    State = PositionState.Closed,
                    ExitReason = PositionExitReason.Closed,
                    PriceEnter = (float)mark.Price,
                    Symbol = chart.Symbol,
                    Volume = VolumeMin
                };

                // посчитать объем
                if (numStepsMax > 0)
                    pos.Volume += rand.Next(numStepsMax + 1) * VolumeStep;

                // найти отметку выхода
                var exitMarkId = mark.exitPair.Value;
                var exitMarker = chart.seriesMarker.data.First(m => m.id == exitMarkId);

                pos.PriceExit = (float) exitMarker.Price - DalSpot.Instance.GetDefaultSpread(pos.Symbol) * pos.Side;
                pos.TimeExit = exitMarker.DateStart.Value;

                // посчитать результат в пунктах, валюте депозита и тд.
                var profitCounter = pos.Side * (pos.PriceExit.Value - pos.PriceEnter) * pos.Volume;
                var profitDepo = profitCounter;
                if (pos.Symbol.StartsWith("USD")) profitDepo = profitCounter / pos.PriceExit.Value;
                var profitPoints = DalSpot.Instance.GetPointsValue(pos.Symbol, pos.Side*(pos.PriceExit.Value - pos.PriceEnter));

                pos.ResultDepo = profitDepo;
                pos.ResultPoints = profitPoints;
                pos.ResultDepo = profitDepo;
                pos.ResultBase = profitCounter;

                positions.Add(pos);
            }
            return positions;
        }
 public override string ActivateScript(CandleChartControl chart, PointD worldCoords)
 {
     var dlg = new CalculatorForm(chart, worldCoords);
     dlg.ShowDialog();
     return string.Empty;
 }
Exemple #18
0
 public override string ActivateScript(CandleChartControl chart, PointD worldCoords)
 {
     throw new Exception("Неверный тип вызова скрипта " + ScriptName);
 }
        private static void GetCommentText(CandleChartControl chart, out string scriptText, out MarketOrder sumPos)
        {
            scriptText = string.Empty;
            sumPos = null;

            var marketOrders = MarketOrdersStorage.Instance.MarketOrders;
            if (marketOrders == null || marketOrders.Count == 0) return;
            var orders = MarketOrdersStorage.Instance.MarketOrders.Where(o => o.Symbol == chart.Symbol).ToList();

            var quote = QuoteStorage.Instance.ReceiveValue(chart.Symbol);
            var lastPrice = chart.chart.StockSeries.DataCount == 0
                                ? (float?) null
                                : chart.chart.StockSeries.Data[chart.chart.StockSeries.DataCount - 1].close;
            sumPos = DalSpot.Instance.CalculateSummaryOrder(orders, quote, lastPrice);
            if (sumPos == null) return;
            var accountData = AccountStatus.Instance.AccountData;
            var depoCurx = accountData == null ? "" : accountData.Currency;
            var equity = accountData == null ? 0 : accountData.Equity;

            // суммарная позиция
            scriptText = "[b]" + MakeCommentByPosition(sumPos, depoCurx, equity);
            // если есть и покупки, и продажи - суммировать по ним
            if (orders.Any(o => o.Side > 0) && orders.Any(o => o.Side < 0))
            {
                var sumBuy = DalSpot.Instance.CalculateSummaryOrder(orders.Where(o => o.Side > 0).ToList(), quote, lastPrice);
                var sumSell = DalSpot.Instance.CalculateSummaryOrder(orders.Where(o => o.Side < 0).ToList(), quote, lastPrice);
                scriptText = scriptText + Environment.NewLine + Environment.NewLine + "[Green]" +
                             MakeCommentByPosition(sumBuy, depoCurx, equity);
                scriptText = scriptText + Environment.NewLine + Environment.NewLine + "[#ff0000]" +
                             MakeCommentByPosition(sumSell, depoCurx, equity);
            }
        }
Exemple #20
0
        void IndicatorEdited(object sender, CandleChartControl.IndiEventArgs ie)
        {
            // проверяем надо ли название панели поменять если изменили название индикатора
            var oldName = (string) sender;
            // имя индикатора не поменялось, проверяем надо ли удалять панель или добавить
            if (oldName != ie.indi.UniqueName)
            {
                foreach (TabPage page in panesTabCtrl.TabPages)
                {
                    if (page.Text != oldName) continue;
                    page.Text = ie.indi.UniqueName;
                    page.Tag = ie.indi;
                    break;
                }
            }

            // проверяем надо ли вкладку изменить
            if (!ie.indi.CreateOwnPanel && ie.indi.ownPane != null)
            {
                // возможно надо табу удалить, проверяем есть ли вообще она
                foreach (TabPage page in panesTabCtrl.TabPages)
                {
                    if (page.Text != ie.indi.UniqueName) continue;
                    panesTabCtrl.TabPages.Remove(page);
                    ie.indi.IsPanelVisible = false;
                    return;
                }
            }

            // проверяем случай когда включили свою панель на индикаторе
            if (ie.indi.CreateOwnPanel && ie.indi.ownPane != null)
            {
                // проверяем может такая таба уже открыта
                foreach (TabPage page in panesTabCtrl.TabPages)
                {
                    if (page.Text != ie.indi.UniqueName) continue;
                    // нашли табу - ничего не делаем
                    page.Tag = ie.indi;
                    return;
                }
                // табы нет, создаем ее
                chart.chart.Panes.Add(ie.indi.ownPane, ie.indi.ownPane.PercentHeight);
                var tp = new TabPage { Parent = panesTabCtrl, Text = ie.indi.UniqueName, Tag = ie.indi };
                tp.Show();
                panesTabCtrl.SelectedTab = tp;
                ie.indi.IsPanelVisible = true;
                foreach (var series in ie.indi.SeriesResult)
                {
                    if(!ie.indi.ownPane.Series.ContainsSeries(series))
                        ie.indi.ownPane.Series.Add(series);
                }
            }
        }
Exemple #21
0
        private void ChartScaleChanged(DateTime start, DateTime end, CandleChartControl chart)
        {
            if (!UserSettings.Instance.SynchGraphics) return;
            // синхронно поменять границы другим чартам
            foreach (var child in MdiChildren)
            {
                if (child is ChartForm == false) continue;
                var childChart = ((ChartForm) child).chart;
                if (((ChartForm)child).bookmarkId != ((ChartForm)chart.Parent).bookmarkId) continue;

                if (childChart == chart ||
                    (childChart.Symbol != chart.Symbol &&
                        UserSettings.Instance.SynchGraphicsAnyPair == false)) continue;
                childChart.SetScale(start, end);
            }
        }
Exemple #22
0
 private void ChartCrossChanged(DateTime? time, double? price, CandleChartControl sender)
 {
     foreach (var child in MdiChildren)
     {
         if (child is ChartForm == false) continue;
         var chartForm = (ChartForm) child;
         var childChart = chartForm.chart;
         // не перерисовывать крестик для исходного чарта
         if (childChart == sender) continue;
         // пропустить чарты с другой вкладки, а также свернутые чарты
         if (chartForm.bookmarkId != ((ChartForm)sender.Parent).bookmarkId) continue;
         // обновить перекрестие
         childChart.OnCursorCrossChanged(time, price);
     }
 }
Exemple #23
0
 /// <summary>
 /// переключить кнопку инструмента
 /// </summary>        
 private void OnChartToolChanged(CandleChartControl.ChartTool newTool)
 {
     // назначить инструмент графикам
     foreach (var child in Charts)
     {
         child.chart.ActiveChartTool = newTool;
         child.chart.seriesEditParameters = new List<SeriesEditParameter>();
     }
     // ищем все кнопки/п.меню с указанным инструментом и выделяем их
     // (надееемся, что сюда не попадут кнопки/п.меню,
     // которым соответствуют одинаковые инструменты, но с разными настройками)
     foreach (Control btn in panelChartTools.Controls)
     {
         if (btn.Tag == null)
             continue;
         var chartButton = btn.Tag as ChartToolButtonSettings;
         if (chartButton == null)
             continue;
         var checkBox = btn as CheckBox;
         if (checkBox == null)
             continue;
         checkBox.Checked = newTool == chartButton.Tool;
     }
     foreach (var menu in buttonMenus)
     {
         foreach (var item in menu.Items)
         {
             var menuButton = item as ToolStripButton;
             if (menuButton == null)
                 continue;
             if (menuButton.Tag == null)
                 continue;
             var chartMenuButton = menuButton.Tag as ChartToolButtonSettings;
             if (chartMenuButton == null)
                 continue;
             menuButton.Checked = newTool == chartMenuButton.Tool;
         }
     }
 }
 public override string ActivateScript(CandleChartControl chart, PointD worldCoords)
 {
     throw new NotImplementedException();
 }
        public override string ActivateScript(CandleChartControl chart, PointD worldCoords)
        {
            new PriceDistributionForm(chart.Symbol).ShowDialog();

            var candles = chart.chart.StockSeries.Data.Candles;
            if (candles == null || candles.Count == 0) return "нет котировок";

            var ticker = chart.Symbol;
            var midOC =
                DalSpot.Instance.GetPointsValue(ticker, candles.Average(c => Math.Abs(c.close - c.open)));
            var midHL =
                DalSpot.Instance.GetPointsValue(ticker, candles.Average(c => c.high - c.low));
            var low = candles.Min(c => c.low);
            var high = candles.Max(c => c.high);
            var digits = DalSpot.Instance.GetPrecision(chart.Symbol);

            MessageBox.Show(string.Format("{0} свеч, диапазон: {1}-{2}{3}" +
                                          "сред. OC: {4:f1} пп, сред. HL: {5:f1} пп",
                                          candles.Count, low.ToStringUniform(digits), high.ToStringUniform(digits),
                                          Environment.NewLine,
                                          midOC, midHL));

            if (!PromptExportCandles || candles.Count == 0) return "исполнен";

            // экспортировать свечи
            DialogResult rst;
            var countStr = Dialogs.ShowInputDialog("Экспорт свечей", "Макс кол-во", true, "200", out rst);
            if (rst != DialogResult.OK) return "исполнен";

            // таки экспортировать
            var count = countStr.ToIntSafe() ?? 100;
            var start = candles.Count - count;
            if (start < 0) start = 0;
            var sb = new StringBuilder();
            sb.AppendLine("index\ttime op\ttime cl\to\th\tl\tc\t");

            for (var i = start; i < candles.Count; i++)
            {
                var c = candles[i];
                sb.AppendLine(string.Format("{0}\t{1:dd/MM/yyy HH:mm:ss}\t{2:dd/MM/yyy HH:mm:ss}\t{3}\t{4}\t{5}\t{6}",
                    i, c.timeOpen, c.timeClose,
                    c.open.ToStringUniformPriceFormat(true),
                    c.high.ToStringUniformPriceFormat(true),
                    c.low.ToStringUniformPriceFormat(true),
                    c.close.ToStringUniformPriceFormat(true)));
            }

            var dlg = new SaveFileDialog
            {
                Title = "Сохранить свечи",
                DefaultExt = "xls",
                Filter = "XLS (*.xls)|*.xls|CSV (*.csv)|*.csv|Text (*.txt)|txt|Все файлы|*.*",
                FilterIndex = 0,
                FileName = string.Format("свечи_{0}_{1}.xls",
                    chart.Symbol, BarSettingsStorage.Instance.GetBarSettingsFriendlyName(chart.Timeframe))
            };
            if (dlg.ShowDialog() != DialogResult.OK) return "исполнен";

            using (var sw = new StreamWriter(dlg.FileName, false, Encoding.ASCII))
            {
                sw.Write(sb.ToString());
            }

            return "исполнен";
        }
Exemple #26
0
 private void IndicatorAdded(object sender, CandleChartControl.IndiEventArgs ie)
 {
     if (ie.indi.CreateOwnPanel == false || ie.indi.ownPane == null) return;
     // надо вкладку создать
     var tp = new TabPage { Parent = panesTabCtrl, Text = ie.indi.UniqueName, Tag = ie.indi };
     tp.Show();
     panesTabCtrl.SelectedTab = tp;
 }
Exemple #27
0
        void IndicatorDeleted(object sender, CandleChartControl.IndiEventArgs ie)
        {
            // надо вкладку удалить
            if (ie.indi.ownPane == null) return;

            foreach (TabPage page in panesTabCtrl.TabPages)
            {
                if (page.Text != ie.indi.UniqueName) continue;
                panesTabCtrl.TabPages.Remove(page);
                ie.indi.IsPanelVisible = false;
                break;
            }
        }
 public abstract string ActivateScript(CandleChartControl chart, PointD worldCoords);
 public override string ActivateScript(CandleChartControl chart, PointD worldCoords)
 {
     return ActivateScript(chart.Symbol);
 }
 public override string ActivateScript(CandleChartControl chart, PointD worldCoords)
 {
     new PriceProbForm(chart, worldCoords).ShowDialog();
     return string.Empty;
 }