Страница 1 из 3
Вычисление индикатора от серии - это возможно?
Добавлено: 12 янв 2019, 18:26
BugsDigger
Привет всем.
Имею код типа:
Код: Выделить всё
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)), никогда от "внутренних" серий, но ведь компилируется же...
► Показать
It compiles, deliver!
И что делать, если нужна такая вот "внутренняя" серия для вычислений, на которую хочу напустить индикатор?..
Re: Вычисление индикатора от серии - это возможно?
Добавлено: 12 янв 2019, 20:06
Indigo-On
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=значение при нехватке исходных данных.
Re: Вычисление индикатора от серии - это возможно?
Добавлено: 12 янв 2019, 20:20
BugsDigger
Привет, Indigo-On, спасибо за отклик.
> Может не хватает данных
Перепроверю завтра, но вообще-то я везде слежу за этим строго.
Ну а если действительно не позволяет, то что делать-то? Кроме как волочь весь код из искомого индикатора не вижу решения... Ужоссс...
Re: Вычисление индикатора от серии - это возможно?
Добавлено: 12 янв 2019, 21:55
AP_Bor
Доброго времени суток,
BugsDiggerBugsDigger писал(а):Привет всем.
Имею код типа:
function Initialize()
{
IndicatorName = "QQ";
PriceStudy=false;
Код для наглядности лучше оборачивать тегом [code]...[//code] и [spoil]...[//spoil], чтоб не маячил на все окно.
Обычно так принято, да и читается легче, я с трудом дочитал, простите.
С наилучшими пожеланиями
Re: Вычисление индикатора от серии - это возможно?
Добавлено: 13 янв 2019, 02:03
Indigo-On
BugsDigger писал(а):Привет, Indigo-On, спасибо за отклик.
> Может не хватает данных
Перепроверю завтра, но вообще-то я везде слежу за этим строго.
Ну а если действительно не позволяет, то что делать-то? Кроме как волочь весь код из искомого индикатора не вижу решения... Ужоссс...
Расскажите потом, пожалуйста, получилось или нет.
А так да, приходится "волочь весь код" в таких случаях. Даже стандартные RSI реализовывать собственным кодом с отдельной серией (аж 4 раза, т.е. 4 серии).
Нестандартные решения стараюсь не использовать, т.к. нет уверенности, что это будет работать в новых версиях AD4.
Например, реализовано было несколько индикаторов с использованием недокументированного оператора
while. В новых версиях не компилируется и не работает нормально. Пришлось реализовать через
for и
break.
Re: Вычисление индикатора от серии - это возможно?
Добавлено: 13 янв 2019, 06:52
BugsDigger
Получилость так: пользовательский индикатор компилируется, но не работает, как я уже описал, а на попытку использовать встроенный компилятор ругается ("Преобразование типа TA.Script.XSeries в TA.Script.IInputSeries невозможно"), как вы описали.
> реализовано было несколько индикаторов с использованием недокументированного оператора while.
> В новых версиях не компилируется и не работает нормально. Пришлось реализовать через for и break.
Странно, у меня "базовые" фичи языка работают, не встречал такого.
Использую while, do-while, foreach, switch, оператор ?:, goto.
Re: Вычисление индикатора от серии - это возможно?
Добавлено: 13 янв 2019, 09:26
AP_Bor
Доброго времени суток,
Indigo-OnIndigo-On писал(а):... оператора while. В новых версиях не компилируется ...
Оператор
while, "вшит" на уровне компилятора, если разработчики его не "парсерят"(отлавливают) до того, а это не так, должно все работать.
Покажите фрагмент? - посмотрю.
Для справки, оператор
while наиболее затратный из циклических операторов, если не получается подобрать или нет встроенного оператора цикла в обрабатываемом объекте, используйте простой
for.
► Показать
P.S. Смотрел ваши индикаторы и еще какие то фрагменты кода, очень интересный подход к определению характеристик объектов и выборе правил, не задумывались о карьере программиста.

С наилучшими пожеланиями
Re: Вычисление индикатора от серии - это возможно?
Добавлено: 13 янв 2019, 09:46
BugsDigger
Привет всем.
> приходится "волочь весь код" в таких случаях
...
> (аж 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-ов...
Re: Вычисление индикатора от серии - это возможно?
Добавлено: 13 янв 2019, 10:20
evge
Проверил, работает
Код: Выделить всё
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
Re: Вычисление индикатора от серии - это возможно?
Добавлено: 13 янв 2019, 11:07
AP_Bor
Доброго времени суток, BugsDigger
BugsDigger писал(а):Если была бы еще директива #include как в С, вообще было бы возможно делать библиотеки и не плодить копии текстов. Но в C# нет includ-ов...
Возможно плохо читали про делегаты, а вот еще один способ работы с указателями.
BugsDigger писал(а):
Re: Вылезти из песочницы► Показать
Наполеон Хилл, журналист и писатель писал(а):Что разум человека может постигнуть и во что он может поверить, того он способен достичь
С наилучшими пожеланиями