Код: Выделить всё
public bool IsUp(string stream, double count, double barsBackward = 0.0)
{
IList<double> inputByStream = GetInputByStream(stream);
if (inputByStream != null)
{
return ScriptedCode.IsUpDown(inputByStream as List<double>, (int)count, 1, (int)barsBackward);
}
return false;
}
private IList<double> GetInputByStream(string stream, bool bounded = true)
{
SortedList<long, double> value = GetDoubles(stream);
long startTime = DataPoint.SecondsFromDateTime(base.Times[0]);
long currentTime = DataPoint.SecondsFromDateTime(base.CurrentTime);
if (value != null)
{
if (!bounded)
{
return value.Values;
}
return (from x in value
where x.Key >= startTime && x.Key <= currentTime
select x.Value).ToList();
}
AdsIndicatorDefinition indicator = GetIndicator(stream);
indicator?.CalculatedPoints.TryGetValue(indicator.MainStream, out value);
return value?.Values;
}
protected SortedList<long, double> GetDoubles(string name, string mainStream = null)
{
if (DoublePoints.TryGetValue(name, out SortedList<long, double> value) || DoublePoints.TryGetValue(name + ".Close", out value))
{
return value;
}
AdsIndicatorDefinition adsIndicatorDefinition = Indicators.FirstOrDefault((AdsIndicatorDefinition x) => CheckTwoStrings(x, name));
return adsIndicatorDefinition?.CalculatedPoints[(!string.IsNullOrEmpty(mainStream)) ? mainStream : adsIndicatorDefinition.MainStream];
}
public AdsIndicatorDefinition GetIndicator(string name)
{
AdsIndicatorDefinition result = null;
foreach (AdsIndicatorDefinition indicator in base.Indicators)
{
if (indicator.Alias == name)
{
return indicator;
}
}
return result;
}
Возможно, что при передаче вместо строки серии, происходит автоматическое преобразование типа серии к строке (я не спец в C#, но такое есть в С++, т.е. если объявить пользовательский оператор преобразования типа, например, класса к строке, то в том месте, где требуется строка, а передан экземпляр класса, автоматически будет вызван оператор преобразования, и его результат - строка - будет использоваться в дальнейших вычислениях). Т.о. серия преобразуется в ее название (ну и, возможно, еще какие-то дополнительные символы), а потом это название ищется в списках известных источников данных.
Если передать (правильно сформатированное! если не ошибаюсь, желательно проверить) строку в виде названия индикатора с параметрами, то ищется именно оно ("строковое представление" рассчитанного индикатора вносится в общий список).
В классе TA.Script.AdsIndicatorDefinition полно строковых методов:
Код: Выделить всё
public bool LookForIndicator(List<AdsIndicatorDefinition> indicators)
{
string b = MakeToString(Name, Access2Stream.ToString(), IndicatorParameters);
bool flag = false;
foreach (AdsIndicatorDefinition indicator in indicators)
{
if (MakeToString(indicator.Name, indicator.Access2Stream.ToString(), indicator.IndicatorParameters) == b)
{
Alias = indicator.Alias;
flag = true;
break;
}
}
if (!flag)
{
Alias = indicators.Count.ToString();
indicators.Add(this);
}
return true; // т.е. всегда возвращает true; зачем тогда вообще ф-ция что-то возвращает :-)
}
// Анализатор, правда, говорит, что эта ф-ция нигде не используется, но ход мыслей в целом понятен.
public static string MakeToString(string name, string stream, FuncParametersCollection funcParameters)
{
string text = name + "," + stream;
for (int i = 0; i < funcParameters.Count; i++)
{
text = text + "," + funcParameters[i]._Value;
}
return text;
}
public override string ToString()
{
string text = "\"" + Alias + "\",\"" + Name + "\",\"" + Stream + "\"";
string text2 = "\"";
string text3 = "";
for (int i = 0; i < Indicator.RealParameters.Length; i++)
{
if ((object)IndicatorParameters[i] != null)
{
if (i > 0)
{
text3 = text3 + "," + IndicatorParameters[i].parValue;
text2 = text2 + "|" + IndicatorParameters[i].parValue;
}
else
{
text3 += IndicatorParameters[i].parValue;
text2 += IndicatorParameters[i].parValue;
}
}
else if (i > 0)
{
text3 = text3 + "," + Indicator.RealParameters[i];
text2 = text2 + "," + Indicator.RealParameters[i];
}
else
{
text3 += Indicator.RealParameters[i].ToString();
text2 += Indicator.RealParameters[i].ToString();
}
}
text2 += "\"";
return text + "," + text2 + "," + text3;
}