Общие вопросы по разработке > Вычисление индикатора от серии - это возможно?

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

Вычисление индикатора от серии - это возможно?

Непрочитанное сообщение BugsDigger » 12 янв 2019, 18:26

Привет всем.

Имею код типа:

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

function Initialize()
{
 IndicatorName = "QQ";
 PriceStudy=false;
 AddInput("Input", Inputs.Candle);
 
 AddSeries("Signal", DrawAs.Custom, Color.Green, AxisType.ZeroBased); // выходная
 AddLevel(0, Color.Black, "Signal");

 AddSeries("cAvg", DrawAs.Line, Color.Black, false);   // для вычислений
}

function Evaluate()
{
  var Inp=MY.CustomCandle(Input, CustomTFsec);
  cAvg[0]=(Inp.GetValue("Open", 0)+Inp.GetValue("High", 0)+Inp.GetValue("Low", 0)+Inp.GetValue("Close", 0))/4.0;

  Signal[0]=666;


До сих пор всё ОК. Если далее включаю любое вычисление еще одного индикатора от серии cAvg:

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

  double dpdt=MY.pDerivativeNS(cAvg, 5).GetValue("pDerivativeNS", 0);
  var Ind=MY.SomeInd(cAvg);
  double didt=MY.pDerivativeNS(Ind, 5).GetValue("pDerivativeNS", 0);


(и одного вызова какаго-нибудь MY.индикатора на самом деле достаточно), то в логе в конце Evaluate выводятся вместо значений cAvg нули (т.е. содержимое серии портится), картинка Signal (основной результат) вообще не отрисовывается (пустое окно графика)...

В док-ции и примерах идет всегда только Ind2(Ind1(Input)), никогда от "внутренних" серий, но ведь компилируется же...

► Показать


И что делать, если нужна такая вот "внутренняя" серия для вычислений, на которую хочу напустить индикатор?..

Аватара пользователя
Indigo-On
Сообщения: 48
Зарегистрирован: 28 ноя 2018, 18:44
Откуда: Russia
Благодарил (а): 18 раз
Поблагодарили: 9 раз

Re: Вычисление индикатора от серии - это возможно?

Непрочитанное сообщение Indigo-On » 12 янв 2019, 20:06

BugsDigger писал(а):(и одного вызова какаго-нибудь MY.индикатора на самом деле достаточно), то в логе в конце Evaluate выводятся вместо значений cAvg нули (т.е. содержимое серии портится), картинка Signal (основной результат) вообще не отрисовывается (пустое окно графика)...

В док-ции и примерах идет всегда только Ind2(Ind1(Input)), никогда от "внутренних" серий, но ведь компилируется же...
.

Раньше, в более ранних версиях AD, когда я пытался использовать подобные конструкции, компилятор ругался, что нельзя использовать серии.
Воды утекло много с тех пор, возможно уже можно. :-)

Может не хватает данных для второго индикатора?
Возможно в первом индикаторе исходные данные за определенный период берете? Тогда во втором точно не хватает исходных данных и ничего не рисуется.
Попробуйте так:

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

double didt;
if (CurrentIndex > Period + 1)
{
   var Ind=MY.SomeInd(cAvg);
   didt=MY.pDerivativeNS(Ind, 5).GetValue("pDerivativeNS", 0);
}
else
   didt=значение при нехватке исходных данных.

,где Period - глубина анализа в барах первого индикатора.

Или даже так, наверняка

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

double didt;
if (CurrentIndex > Period*5 + 1)
{
   var Ind=MY.SomeInd(cAvg);
   didt=MY.pDerivativeNS(Ind, 5).GetValue("pDerivativeNS", 0);
}
else
   didt=значение при нехватке исходных данных.

BugsDigger
Сообщения: 333
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 41 раз

Re: Вычисление индикатора от серии - это возможно?

Непрочитанное сообщение BugsDigger » 12 янв 2019, 20:20

Привет, Indigo-On, спасибо за отклик.

> Может не хватает данных

Перепроверю завтра, но вообще-то я везде слежу за этим строго.

Ну а если действительно не позволяет, то что делать-то? Кроме как волочь весь код из искомого индикатора не вижу решения... Ужоссс...

AP_Bor
Сообщения: 167
Зарегистрирован: 18 дек 2017, 08:18
Благодарил (а): 11 раз
Поблагодарили: 7 раз

Re: Вычисление индикатора от серии - это возможно?

Непрочитанное сообщение AP_Bor » 12 янв 2019, 21:55

Доброго времени суток, BugsDigger
BugsDigger писал(а):Привет всем.

Имею код типа:

function Initialize()
{
IndicatorName = "QQ";
PriceStudy=false;
Код для наглядности лучше оборачивать тегом [code]...[//code] и [spoil]...[//spoil], чтоб не маячил на все окно.

Обычно так принято, да и читается легче, я с трудом дочитал, простите.
С наилучшими пожеланиями

Аватара пользователя
Indigo-On
Сообщения: 48
Зарегистрирован: 28 ноя 2018, 18:44
Откуда: Russia
Благодарил (а): 18 раз
Поблагодарили: 9 раз

Re: Вычисление индикатора от серии - это возможно?

Непрочитанное сообщение Indigo-On » 13 янв 2019, 02:03

BugsDigger писал(а):Привет, Indigo-On, спасибо за отклик.
> Может не хватает данных
Перепроверю завтра, но вообще-то я везде слежу за этим строго.
Ну а если действительно не позволяет, то что делать-то? Кроме как волочь весь код из искомого индикатора не вижу решения... Ужоссс...

Расскажите потом, пожалуйста, получилось или нет.
А так да, приходится "волочь весь код" в таких случаях. Даже стандартные RSI реализовывать собственным кодом с отдельной серией (аж 4 раза, т.е. 4 серии).
Нестандартные решения стараюсь не использовать, т.к. нет уверенности, что это будет работать в новых версиях AD4.
Например, реализовано было несколько индикаторов с использованием недокументированного оператора while. В новых версиях не компилируется и не работает нормально. Пришлось реализовать через for и break.

BugsDigger
Сообщения: 333
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 41 раз

Re: Вычисление индикатора от серии - это возможно?

Непрочитанное сообщение BugsDigger » 13 янв 2019, 06:52

Получилость так: пользовательский индикатор компилируется, но не работает, как я уже описал, а на попытку использовать встроенный компилятор ругается ("Преобразование типа TA.Script.XSeries в TA.Script.IInputSeries невозможно"), как вы описали.

> реализовано было несколько индикаторов с использованием недокументированного оператора while.
> В новых версиях не компилируется и не работает нормально. Пришлось реализовать через for и break.

Странно, у меня "базовые" фичи языка работают, не встречал такого.
Использую while, do-while, foreach, switch, оператор ?:, goto.

AP_Bor
Сообщения: 167
Зарегистрирован: 18 дек 2017, 08:18
Благодарил (а): 11 раз
Поблагодарили: 7 раз

Re: Вычисление индикатора от серии - это возможно?

Непрочитанное сообщение AP_Bor » 13 янв 2019, 09:26

Доброго времени суток, Indigo-On
Indigo-On писал(а):... оператора while. В новых версиях не компилируется ...
Оператор while, "вшит" на уровне компилятора, если разработчики его не "парсерят"(отлавливают) до того, а это не так, должно все работать.
Покажите фрагмент? - посмотрю.
Для справки, оператор while наиболее затратный из циклических операторов, если не получается подобрать или нет встроенного оператора цикла в обрабатываемом объекте, используйте простой for.
► Показать
С наилучшими пожеланиями

BugsDigger
Сообщения: 333
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 41 раз

Re: Вычисление индикатора от серии - это возможно?

Непрочитанное сообщение BugsDigger » 13 янв 2019, 09:46

Привет всем.

> приходится "волочь весь код" в таких случаях
...
> (аж 4 раза, т.е. 4 серии).

По наводке AP_Bor посмотрел насчет делегатов

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

function Evaluate()
{
/*
Func<T,TResult> универсальный делегат
Экземпляр этого делегата можно создать как

 Func<int,bool> myFunc
 
где int — входной параметр, а bool — возвращаемое значение.
Возвращаемое значение всегда указывается в последнем параметре типа.
Func<int, string, bool> определяет делегат с двумя входными параметрами, int и string, и типом возвращаемого значения bool.
*/
 Func<int, string, bool> myFunc = (int x, string s) =>
  {
   s+="qq";
   return x == 5;
  };
 
 bool result = myFunc(4, "qq");
}


Скомпилировалось, уже хорошо, будет работать, надеюсь.
Так что по крайней мере возможно не писать 4 раза, а вызывать локально написанную ф-цию.
Если была бы еще директива #include как в С, вообще было бы возможно делать библиотеки и не плодить копии текстов. Но в C# нет includ-ов...

Аватара пользователя
evge
Администратор
Сообщения: 1641
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 62 раза
Поблагодарили: 294 раза
Контактная информация:

Re: Вычисление индикатора от серии - это возможно?

Непрочитанное сообщение evge » 13 янв 2019, 10:20

Проверил, работает

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

Func<int, int, int> myFunc = (int x, int y) =>
  {
   return x + y;
  };
 
 A = myFunc(1, 2) + myFunc(3, 4) + myFunc(5, 6);


в индикаторе выдало в серию A - 21

добавил в FAQ
никогда такого не было и вот опять

AP_Bor
Сообщения: 167
Зарегистрирован: 18 дек 2017, 08:18
Благодарил (а): 11 раз
Поблагодарили: 7 раз

Re: Вычисление индикатора от серии - это возможно?

Непрочитанное сообщение AP_Bor » 13 янв 2019, 11:07

Доброго времени суток, BugsDigger
BugsDigger писал(а):Если была бы еще директива #include как в С, вообще было бы возможно делать библиотеки и не плодить копии текстов. Но в C# нет includ-ов...
Возможно плохо читали про делегаты, а вот еще один способ работы с указателями.
BugsDigger писал(а):
Re: Вылезти из песочницы
► Показать
С наилучшими пожеланиями


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

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

Сейчас этот форум просматривают: Bing [Bot] и 4 гостя