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; }
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); }
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); } }
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(); }
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); }
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; } }
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); }
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); }
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; }
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(); }
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; }