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; }
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); } }
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); } } }
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); } }
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); } }
/// <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 "исполнен"; }
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; }
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; }