private void CheckFormulaParams()
        {
            formulaParams = resolver.GetVariableNames();
            var errorPtrs = new List <string>();
            var tickers   = DalSpot.Instance.GetTickerNames();

            foreach (var ptr in formulaParams)
            {
                if (ExpressionResolverLiveParams.CheckParamName(ptr))
                {
                    continue;
                }
                if (tickers.Any(t => t.Equals(ptr, StringComparison.OrdinalIgnoreCase)))
                {
                    continue;
                }
                errorPtrs.Add(ptr);
            }

            if (errorPtrs.Count == 0)
            {
                return;
            }
            FormulaError  = "Некорректные параметры: " + string.Join(", ", errorPtrs);
            formulaParams = null;
            resolver      = null;
        }
예제 #2
0
        public static ExpressionResolver CheckFunction(string formula, out string error)
        {
            error = string.Empty;

            ExpressionResolver resolver;

            try
            {
                resolver = new ExpressionResolver(formula);
            }
            catch (Exception ex)
            {
                error = Resource.ErrorMessageInFunction + " '" + formula + "': " + ex.Message;
                return(null);
            }

            var resolverVars = resolver.GetVariableNames();

            if (resolverVars.Any(v => !formulaProperties.ContainsKey(v)))
            {
                error = Resource.ErrorMessageUnknownVariables + ": " +
                        string.Join(", ", resolverVars.Where(v => !formulaProperties.ContainsKey(v)));
                return(null);
            }

            return(resolver);
        }
예제 #3
0
        public static double Calculate(ExpressionResolver resolver, PerformerStat stat)
        {
            var ptrVal = new Dictionary <string, double>();

            try
            {
                foreach (var varName in resolver.GetVariableNames())
                {
                    var    val  = PerformerCriteriaFunctionCollection.Instance.propertyByVariable[varName].GetValue(stat, null);
                    double dVal = val is float
                                  ?(float)val
                                  : val is double
                                  ?(double)val
                                  : val is int?(int)val : val is decimal ? (float)(decimal)val : 0;
                    ptrVal.Add(varName, dVal);
                }
                double rst;
                resolver.Calculate(ptrVal, out rst);
                return(rst);
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка в Calculate(" + stat.Account + ")", ex);
                return(0);
            }
        }
예제 #4
0
        private void BtnCheckExistingClick(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(tbTickerFormula.Text)) return;
            // проверить наличие нужных тикеров в файловой БД
            // разобрать формулу
            ExpressionResolver resv;
            try
            {
                resv = new ExpressionResolver(tbTickerFormula.Text);
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка разбора выражения", ex);
                MessageBox.Show(string.Format("Ошибка разбора выражения ({0})", ex.Message));
                return;
            }

            var names = resv.GetVariableNames();
            // проверить доступность - каждое имя должно быть тикером
            var allNames = DalSpot.Instance.GetCurrencyNames();
            var errorsStr = new StringBuilder();
            foreach (var name in names)
            {
                var tickerName = name;
                if (!allNames.Any(n => n.Equals(tickerName, StringComparison.OrdinalIgnoreCase)))
                    errorsStr.AppendLine(string.Format("Тикер \"{0}\" не найден", name));
            }
            if (errorsStr.Length > 0)
            {
                MessageBox.Show(errorsStr.ToString());
                return;
            }

            // наличие истории по тикерам
            tbExistingTickers.Text = string.Empty;
            var sbExist = new StringBuilder();
            foreach (var name in names)
            {
                var tickerName = name;
                var fileInfo = quoteFiles.FirstOrDefault(f => f.TickerName.Equals(tickerName,
                    StringComparison.OrdinalIgnoreCase));
                DateTime? start = null, end = null;
                if (fileInfo != null)
                {
                    start = fileInfo.StartDate;
                    end = fileInfo.EndDate;
                }
                var isInsufficient = !start.HasValue
                                         ? true
                                         : start.Value > dpStart.Value;
                if (!isInsufficient)
                    isInsufficient = (dpEnd.Value - end.Value).TotalMinutes > 30;
                sbExist.AppendLine(string.Format("{0}{1} - {2} - {3}",
                                                 isInsufficient ? "[!]" : "", name,
                                                 start.HasValue ? start.Value.ToString("dd.MM.yyyy") : "...",
                                                 end.HasValue ? end.Value.ToString("dd.MM.yyyy HH:mm") : "..."));
            }
            tbExistingTickers.Text = sbExist.ToString();
        }
예제 #5
0
        private bool CheckFormula()
        {
            Formula = formulaComboBox.Text;
            try
            {
                var resolver = new ExpressionResolver(Formula.ToLower());
                //string absentVars = ""
                string excessVars = "";
                var    vars       = resolver.GetVariableNames();
                var    neededArgs = NewsRobot.formulaArguments.Select(argAndComm => argAndComm.Key.ToLower());

                /*foreach (var argument in neededArgs)
                 *  if (!vars.Contains(argument))
                 *  {
                 *      if (!string.IsNullOrEmpty(absentVars))
                 *          absentVars += ", ";
                 *      absentVars += argument;
                 *  }*/
                foreach (var argument in vars)
                {
                    if (!neededArgs.Contains(argument))
                    {
                        if (!string.IsNullOrEmpty(excessVars))
                        {
                            excessVars += ", ";
                        }
                        excessVars += argument;
                    }
                }
                if (/*!string.IsNullOrEmpty(absentVars) || */ !string.IsNullOrEmpty(excessVars))
                {
                    MessageBox.Show(this,

                                    /*(!string.IsNullOrEmpty(absentVars)
                                     *   ? "В формуле отсутствуют необходимые параметры: " + absentVars + "\n"
                                     *   : "") +*/
                                    (!string.IsNullOrEmpty(excessVars)
                                         ? "В формуле присутствуют лишние параметры: " + excessVars
                                         : ""), "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return(false);
                }
            }
            catch (Exception)
            {
                MessageBox.Show(this, "Синтаксическая ошибка в формуле", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return(false);
            }
            return(true);
        }
예제 #6
0
        public IndexCalculator(string indexFormula)
        {
            try
            {
                resolver = new ExpressionResolver(indexFormula);
            }
            catch (Exception ex)
            {
                Logger.ErrorFormat("Ошибка парсинга формулы \"{0}\" в IndexCalculator: {1}",
                                   indexFormula, ex);
                resolver = null;
                return;
            }

            formulaVariableNames = resolver.GetVariableNames();
        }
        public override void Initialize(BacktestServerProxy.RobotContext grobotContext)
        {
            base.Initialize(grobotContext);
            // проверка настроек графиков
            if (Graphics.Count == 0)
            {
                Logger.DebugFormat("OscillatorBasedRobot: настройки графиков не заданы");
                return;
            }
            if (Graphics.Count > 1)
            {
                Logger.DebugFormat("OscillatorBasedRobot: настройки графиков должны описывать один тикер / один ТФ");
                return;
            }
            ticker = Graphics[0].a;

            try
            {
                formulaResolver      = new ExpressionResolver(indexFormula);
                formulaVariableNames = formulaResolver.GetVariableNames();
                lastBids             = new Dictionary <string, float>();
                lastIndicies         = new RestrictedQueue <float>(CandlesInIndexHistory);
                candles      = new RestrictedQueue <CandleData>(CandlesInIndexHistory);
                packer       = new CandlePacker(Graphics[0].b);
                indexPeaks   = new List <Cortege3 <float, int, float> >();
                tickerNames  = DalSpot.Instance.GetTickerNames();
                randomGener  = new Random(DateTime.Now.Millisecond);
                lastBidLists = new Dictionary <string, RestrictedQueue <float> >();
                // по каждой валютной паре найти макс. количество отсчетов (из формулы индекса)
                InitLastBidLists();
            }
            catch (Exception ex)
            {
                Logger.ErrorFormat("OscillatorBasedRobot: ошибка парсинга выражения \"{0}\": {1}",
                                   indexFormula, ex);
                formulaResolver = null;
            }
        }
예제 #8
0
        private void FunctionCheckFormLoad(object sender, EventArgs e)
        {
            SetupGrid();

            var ptrs = new List <ExpressionParameter>();

            // ReSharper disable LoopCanBeConvertedToQuery
            foreach (var var in resolver.GetVariableNames())
            // ReSharper restore LoopCanBeConvertedToQuery
            {
                var varName = var;
                var field   = PerformerStatField.fields.FirstOrDefault(f =>
                                                                       !string.IsNullOrEmpty(f.ExpressionParamName) && f.ExpressionParamName.Equals(
                                                                           varName, StringComparison.OrdinalIgnoreCase));
                var fieldTitle = field == null ? "" : field.ExpressionParamTitle;
                var ptr        = new ExpressionParameter
                {
                    Name        = var,
                    Description = fieldTitle
                };
                ptrs.Add(ptr);
            }
            grid.DataBind(ptrs);
        }
예제 #9
0
        public static string GetFormulaHighlightedHtml(string formula)
        {
            const string header =
                "<html>\n<head>\n" +
                "<meta charset=\"utf-8\" />\n" +
                "<style type=\"text/css\">\n" +
                "    div.code { font-family: 'Courier New'; } \n" +
                " </style>\n" +
                "</head>\n" +
                "<body>\n" +
                "  <div class=\"code\">\n";

            const string footer = "  </div>\n</body>\n</html>";

            if (string.IsNullOrEmpty(formula))
            {
                return(header + footer);
            }

            // для каждой переменной формулы создать гиперссылку вида
            // <a href="javascript:void(0);" title="Доход
//Суммарная доходность по счету, %">P</a>+1)*2.5)
            // именно так!

            var resolver = new ExpressionResolver(formula);
            var varNames = resolver.GetVariableNames().OrderByDescending(v => v.Length).ToList();
            var tokens   = new List <ExpressionToken>();

            foreach (var varName in varNames)
            {
                var pos = -1;
                while (true)
                {
                    pos = formula.IndexOf(varName, pos + 1, StringComparison.InvariantCultureIgnoreCase);
                    if (pos < 0)
                    {
                        break;
                    }

                    if (tokens.Any(t => t.pos <= pos && (t.pos + t.len) >= pos))
                    {
                        continue;
                    }

                    tokens.Add(new ExpressionToken
                    {
                        pos         = pos,
                        name        = varName,
                        len         = varName.Length,
                        replacement = MakeExpressionParameterHyperlink(varName).Replace("<", "#-").Replace(">", "#+")
                    });
                }
            }

            foreach (var token in tokens)
            {
                var tokenPos = token.pos;
                var deltaLen = token.replacement.Length - token.len;
                formula = formula.Substring(0, token.pos) + token.replacement + formula.Substring(token.pos + token.len);
                foreach (var t in tokens.Where(x => x.pos > tokenPos))
                {
                    t.pos += deltaLen;
                }
            }

            formula = formula.Replace("#-", "<").Replace("#+", ">");
            return(formula);
        }
예제 #10
0
        private void BtnMakeIndexClick(object sender, EventArgs e)
        {
            ExpressionResolver resv;
            try
            {
                resv = new ExpressionResolver(tbTickerFormula.Text);
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка разбора выражения", ex);
                MessageBox.Show(string.Format("Ошибка разбора выражения ({0})", ex.Message));
                return;
            }

            if (saveFileDialog.ShowDialog() != DialogResult.OK) return;
            var fileName = saveFileDialog.FileName;

            var names = resv.GetVariableNames();
            var curs = new BacktestTickerCursor();
            try
            {
                curs.SetupCursor(quoteFolder, names, dpStart.Value);
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка установки курсора", ex);
                return;
            }

            StreamWriter sw;
            try
            {
                sw = new StreamWriter(fileName);
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка открытия файла на запись", ex);
                curs.Close();
                MessageBox.Show("Ошибка открытия файла на запись");
                return;
            }
            var saver = new QuoteSaver(tbTicker.Text);

            try
            {
                while (true)
                {
                    // посчитать индекс
                    var quotes = curs.GetCurrentQuotes();
                    if (quotes.Count == 0) continue;
                    var date = quotes.Max(q => q.b.time);

                    var quoteDic = quotes.ToDictionary(q => q.a, q => (double)q.b.bid);
                    double result;
                    resv.Calculate(quoteDic, out result);

                    // занести индекс в файл
                    saver.SaveQuote(sw, (float)result, (float)result, date);

                    if (!curs.MoveNext()) break;
                }
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка формирования индекса", ex);
            }
            finally
            {
                curs.Close();
                sw.Close();
            }

            MessageBox.Show("Формирование индекса завершено");
            openFileDialog.FileName = saveFileDialog.FileName;
        }
예제 #11
0
        private void BtnCheckExistingClick(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(tbTickerFormula.Text))
            {
                return;
            }
            // проверить наличие нужных тикеров в файловой БД
            // разобрать формулу
            ExpressionResolver resv;

            try
            {
                resv = new ExpressionResolver(tbTickerFormula.Text);
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка разбора выражения", ex);
                MessageBox.Show(string.Format("Ошибка разбора выражения ({0})", ex.Message));
                return;
            }

            var names = resv.GetVariableNames();
            // проверить доступность - каждое имя должно быть тикером
            var allNames  = DalSpot.Instance.GetTickerNames();
            var errorsStr = new StringBuilder();

            foreach (var name in names)
            {
                var tickerName = name;
                if (!allNames.Any(n => n.Equals(tickerName, StringComparison.OrdinalIgnoreCase)))
                {
                    errorsStr.AppendLine(string.Format("Тикер \"{0}\" не найден", name));
                }
            }
            if (errorsStr.Length > 0)
            {
                MessageBox.Show(errorsStr.ToString());
                return;
            }

            // наличие истории по тикерам
            tbExistingTickers.Text = string.Empty;
            var sbExist = new StringBuilder();

            foreach (var name in names)
            {
                var tickerName = name;
                var fileInfo   = quoteFiles.FirstOrDefault(f => f.TickerName.Equals(tickerName,
                                                                                    StringComparison.OrdinalIgnoreCase));
                DateTime?start = null, end = null;
                if (fileInfo != null)
                {
                    start = fileInfo.StartDate;
                    end   = fileInfo.EndDate;
                }
                var isInsufficient = !start.HasValue
                                         ? true
                                         : start.Value > dpStart.Value;
                if (!isInsufficient)
                {
                    isInsufficient = (dpEnd.Value - end.Value).TotalMinutes > 30;
                }
                sbExist.AppendLine(string.Format("{0}{1} - {2} - {3}",
                                                 isInsufficient ? "[!]" : "", name,
                                                 start.HasValue ? start.Value.ToString("dd.MM.yyyy") : "...",
                                                 end.HasValue ? end.Value.ToString("dd.MM.yyyy HH:mm") : "..."));
            }
            tbExistingTickers.Text = sbExist.ToString();
        }
예제 #12
0
        private void BtnMakeIndexClick(object sender, EventArgs e)
        {
            ExpressionResolver resv;

            try
            {
                resv = new ExpressionResolver(tbTickerFormula.Text);
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка разбора выражения", ex);
                MessageBox.Show(string.Format("Ошибка разбора выражения ({0})", ex.Message));
                return;
            }

            if (saveFileDialog.ShowDialog() != DialogResult.OK)
            {
                return;
            }
            var fileName = saveFileDialog.FileName;

            var names = resv.GetVariableNames();
            var curs  = new BacktestTickerCursor();

            try
            {
                curs.SetupCursor(quoteFolder, names, dpStart.Value);
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка установки курсора", ex);
                return;
            }

            StreamWriter sw;

            try
            {
                sw = new StreamWriter(fileName);
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка открытия файла на запись", ex);
                curs.Close();
                MessageBox.Show("Ошибка открытия файла на запись");
                return;
            }
            var saver = new QuoteSaver(tbTicker.Text);

            try
            {
                while (true)
                {
                    // посчитать индекс
                    var quotes = curs.GetCurrentQuotes();
                    if (quotes.Count == 0)
                    {
                        continue;
                    }
                    var date = quotes.Max(q => q.b.time);

                    var    quoteDic = quotes.ToDictionary(q => q.a, q => (double)q.b.bid);
                    double result;
                    resv.Calculate(quoteDic, out result);

                    // занести индекс в файл
                    saver.SaveQuote(sw, (float)result, (float)result, date);

                    if (!curs.MoveNext())
                    {
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка формирования индекса", ex);
            }
            finally
            {
                curs.Close();
                sw.Close();
            }

            MessageBox.Show("Формирование индекса завершено");
            openFileDialog.FileName = saveFileDialog.FileName;
        }