Общие вопросы по разработке > Вопрос по IsUp(Series, N=1, D=0)

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
BugsDigger
Сообщения: 535
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 92 раза

Re: Вопрос по IsUp(Series, N=1, D=0)

Непрочитанное сообщение BugsDigger » 01 авг 2020, 08:26

Ошибка в документации? Возможно, хотя возможно и другое.

Код: Выделить всё

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


Вернуться в «Общие вопросы по разработке»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 11 гостей