private string Formula_EMA(SchemaInstrument formula, LocalFormula localFormula, List <int> selectedIndex, List <RecordInstrument> values) { var retval = string.Empty; var closing = GetDouble(selectedIndex.Count - 1, localFormula, selectedIndex, values); var previous = GetValueInstrument(selectedIndex.Count - 2, selectedIndex, values); var previousEma = Double.Parse(previous.Values[localFormula.Items[0].FieldName]); if (previousEma == 0) { var sum = 0d; for (var i = 1; i < selectedIndex.Count; i++) { sum += GetDouble(i, localFormula, selectedIndex, values); } var avg = (sum / (selectedIndex.Count - 1)); retval = (avg == 0 ? null : avg.ToString()); } else { var multiplier = (2d / (selectedIndex.Count + 1)); var ema = closing * multiplier + previousEma * (1 - multiplier); retval = (ema == 0 ? null : ema.ToString()); } return(retval); }
private double GetInt(int index, LocalFormula localFormula, List <int> selectedIndex, List <RecordInstrument> values) { var value = GetValueInstrument(index, selectedIndex, values); var item = localFormula.Items[index]; return(Int32.Parse(value.Values[item.FieldName])); }
private string GetString(int index, LocalFormula localFormula, List <int> selectedIndex, List <RecordInstrument> values) { var value = GetValueInstrument(index, selectedIndex, values); var item = localFormula.Items[index]; return(value.Values[item.FieldName]); }
//private int GetRange(RecordInstrument target, List<RecordInstrument> values, enmUnit unit, int position, int max) //{ // var retval = -1; // if (unit == enmUnit.seconds) // { // var fromMilliseconds = DateTimeOffset.Now.ToUnixTimeMilliseconds() - (Math.Abs(position) * 1000); // var toMilliseconds = DateTimeOffset.Now.ToUnixTimeMilliseconds() - (Math.Abs(position) * 1000); // retval = values.FindLastIndex(x => x.Time < fromMilliseconds); // } // else if (unit == enmUnit.ticks) // { // retval = (values.Count - max + position - 1); // } // return retval; //} private List <int> GetSelected(List <RecordInstrument> values, LocalFormula localFormula) { var retval = new List <int>(); if (localFormula.Type == enmType.formula && values.Count >= localFormula.Range && values.Count > 0 && localFormula.Items.Count > 0) { var targetPosition = (values.Count - localFormula.Max + localFormula.Items[0].Position - 1); retval.Add(targetPosition); for (var i = 1; i < localFormula.Items.Count; i++) { var row = localFormula.Items[i]; //if (localFormula.Unit == enmUnit.ticks) retval.Add(values.Count - localFormula.Max + row.Position - 1); //else if (localFormula.ValueType == enmValueType.single || localFormula.ValueType == enmValueType.scale) //{ // var milliseconds = DateTimeOffset.Now.ToUnixTimeMilliseconds() - (Math.Abs(row.Position) * 1000); // retval.Add(values.FindLastIndex(x => x.Time < milliseconds)); //} //else if (localFormula.ValueType == enmValueType.range) //{ // var fromMilliseconds = DateTimeOffset.Now.ToUnixTimeMilliseconds() - (Math.Abs(row.Position) * 1000); // var toMilliseconds = DateTimeOffset.Now.ToUnixTimeMilliseconds() - (Math.Abs(localFormula.Items[i + 1].Position) * 1000); // foreach (var valueInstrument in values.FindAll(x => x.Time <= fromMilliseconds && x.Time >= toMilliseconds)) { // retval.Add(values.IndexOf(valueInstrument)); // } // break; //} } } else if (localFormula.Type == enmType.capture) { retval.Add(values.Count - 1); } return(retval); }
private bool CheckValid(List <RecordInstrument> values, List <int> selectedIndex, LocalFormula localFormula) { var retval = true; for (var i = 0; i < selectedIndex.Count; i++) { if (string.IsNullOrEmpty(values[selectedIndex[i]].Values[localFormula.Items[i].FieldName]) && localFormula.Items[i].FieldName != localFormula.Key) { retval = false; break; } } return(retval); }
private LocalFormula GetUnit(SchemaInstrument formula) { var retval = new LocalFormula(); if (CachedFormula.ContainsKey(formula.CacheKey)) { retval = CachedFormula[formula.CacheKey]; } else { retval.Key = formula.Key; retval.Items = new List <LocalFormula.ItemInfo>(); retval.Value = formula.Value; retval.Unit = formula.Unit; retval.Type = formula.Type; retval.DataType = formula.DataType; int min = int.MaxValue; int max = int.MinValue; if (formula.Transform != null) { var transforms = formula.Transform.Split(';'); for (var i = 0; i < transforms.Length; i++) { retval.Transform = new Dictionary <string, List <string> >(); var items = transforms[i].Split(','); var args = new string[items.Length - 1]; Array.Copy(items, 1, args, 0, args.Length); retval.Transform.Add(items[0], args.ToList <string>()); } } var fields = retval.Value.Split(';'); if (formula.Type == enmType.formula) { for (var i = 0; i < fields.Length; i++) { var item = fields[i].Split(','); if (item.Length == 2) { var fieldName = item[0]; var selectedRows = item[1]; retval.ValueType = (selectedRows.Contains('>') ? enmValueType.range : (selectedRows.Contains('~') ? enmValueType.scale : enmValueType.single)); if (retval.ValueType == enmValueType.single) { var y = int.Parse(selectedRows); min = Math.Min(min, y); max = Math.Max(max, y); retval.Items.Add(new LocalFormula.ItemInfo(fieldName, y)); } else if (retval.ValueType == enmValueType.range) // && retval.Unit == enmUnit.ticks) { var range = selectedRows.Split(">"); var a = int.Parse(range[0]); var b = int.Parse(range[1]); if (a > b) { (a, b) = (b, a); } for (var x = a; x <= b; x++) { min = Math.Min(min, x); max = Math.Max(max, x); retval.Items.Add(new LocalFormula.ItemInfo(fieldName, x)); } } //else if (retval.ValueType == enmValueType.range && retval.Unit == enmUnit.seconds) //{ // var range = selectedRows.Split(">"); // var a = int.Parse(range[0]); // var b = int.Parse(range[1]); // retval.Items.Add(new LocalFormula.ItemInfo(fieldName, a)); // retval.Items.Add(new LocalFormula.ItemInfo(fieldName, b)); //} else { var range = selectedRows.Split("~"); foreach (var x in range) { var y = int.Parse(x); min = Math.Min(min, y); max = Math.Max(max, y); retval.Items.Add(new LocalFormula.ItemInfo(fieldName, y)); } } } else { throw new Exception("Formula item in value element must have <field>,<position> combination"); } } retval.Range = max - min + 1; retval.Min = min; retval.Max = max; } CachedFormula.Add(formula.CacheKey, retval); } return(retval); }