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

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
vdm
Сообщения: 24
Зарегистрирован: 25 ноя 2016, 14:01
Благодарил (а): 10 раз
Поблагодарили: 2 раза

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

Непрочитанное сообщение vdm » 25 ноя 2016, 14:58

IsUp(Series, N=1, D=0) – возвращает истинность утверждения «ряд со смещением D растет N точек подряд»

Для фин. ряда все работает нормально ( IsUp( Input1,5) ) , но не могу понять , как правильно передать в эту функцию производный индикатор от фин ряда. Например , нужно узнать растет ли EMA 5 точек подряд

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

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

Непрочитанное сообщение evge » 26 ноя 2016, 12:44

Приветствую!

Странно конечно, но первый параметр принимает тип String и пишет это явно в ошибках

Получилось вот так

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

/**IsUpDownTest
Developed by evge;**/

function Initialize()
{
   StrategyName = "IsUpDownTest";
   AddParameter("Period", 50, "", 1);
   AddParameter("UpDownCount", 8, "", 1);
   AddInput("Input1", Inputs.Candle, 1, true, "");
   LongLimit = 1;
   ShortLimit = 1;
}

function OnUpdate()
{
   var E = EMA(Input1.Close, Period);

   if ( IsUp(E.ToString(), UpDownCount, 0) )
   {
      EnterLong();
   }

   if ( IsDown(E.ToString(), UpDownCount, 0) )
   {
      EnterShort();
   }
}
никогда такого не было и вот опять

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

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

Непрочитанное сообщение evge » 26 ноя 2016, 21:54

Странности в том что E.ToString() возвращает тип строку
в виде кода вызова индикатора, т.е. "EMA(Input1.Close, Period)",

но если просто передать в IsUp или IsDown в качестве параметра такую строку и не вызывать индикатор до этого, то работать не будет :)
никогда такого не было и вот опять

Maks
Сообщения: 6
Зарегистрирован: 15 июн 2020, 15:29
Благодарил (а): 2 раза
Поблагодарили: 1 раз

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

Непрочитанное сообщение Maks » 30 июл 2020, 14:16

evge писал(а):Странности в том что E.ToString() возвращает тип строку
в виде кода вызова индикатора, т.е. "EMA(Input1.Close, Period)",

но если просто передать в IsUp или IsDown в качестве параметра такую строку и не вызывать индикатор до этого, то работать не будет :)


Возможно что-то поменялось за 5 лет, но сейчас код компилируется и работает:

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

IsUp("EMA(Input1.Close, Period)", UpDownCount, 0);


Конечно EMA(Input1.Close, Period) надо брать в кавычки, тогда получается обычная строка) которую IsUp/Down прекрасно едят)

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

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

Непрочитанное сообщение evge » 30 июл 2020, 15:03

Насчет работает - сомнительно.

Попробовал - не работает.

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

function Initialize()
{
   StrategyName = "IsUpTest";
   AddParameter("Cnt", 5, "", 1);
   AddParameter("Period", 20, "", 1);
   AddInput("Input1", Inputs.Candle, 1, true, "");
   LongLimit = 1;
   ShortLimit = -1;
}

function OnUpdate()
{

if (IsUp("EMA(Input1.Close, Period)", Cnt, Cnt)) EnterLong();

if (IsDown("EMA(Input1.Close, Period)", Cnt, Cnt)) EnterShort();

}


0 сделок за 2000 баров.
никогда такого не было и вот опять

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

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

Непрочитанное сообщение evge » 30 июл 2020, 15:13

Работает только через ToString()

Например так

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

function Initialize()
{
   StrategyName = "IsUpTest";
   AddParameter("Cnt", 3, "", 1);
   AddParameter("Period", 20, "", 1);
   AddInput("Input1", Inputs.Candle, 60, true, "GDU0=ФОРТС");
   LongLimit = 1;
   ShortLimit = -1;
}

function OnUpdate()
{

if (CurrentIndex < Period) return;

var A = EMA(Input1.Close, Period);

if (IsUp(A.ToString(), Cnt, 0)) EnterLong();
if (IsDown(A.ToString(), Cnt, 0)) EnterShort();

}


или вот так

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

function Initialize()
{
   StrategyName = "IsUpTest";
   AddParameter("Cnt", 5, "", 1);
   AddParameter("Period", 20, "", 1);
   AddInput("Input1", Inputs.Candle, 1, true, "");
   LongLimit = 1;
   ShortLimit = -1;
}

function OnUpdate()
{

if (CurrentIndex < Period) return;

if (IsUp(EMA(Input1.Close, Period).ToString(), Cnt, 0)) EnterLong();
if (IsDown(EMA(Input1.Close, Period).ToString(), Cnt, 0)) EnterShort();

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

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

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

Непрочитанное сообщение evge » 30 июл 2020, 15:22

ещё выяснил, что работает вариант предложенный Maks в том только случае, если до этого с такими параметрами вызывался индикатор

вот так не работает

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

function Initialize()
{
   StrategyName = "IsUpTest";
   AddParameter("Cnt", 5, "", 1);
   AddParameter("Period", 20, "", 1);
   AddInput("Input1", Inputs.Candle, 1, true, "");
   LongLimit = 1;
   ShortLimit = -1;
}

function OnUpdate()
{

if (CurrentIndex < Period) return;

if (IsUp("EMA(Input1.Close, Period)", Cnt, 0)) EnterLong();
if (IsDown("EMA(Input1.Close, Period)", Cnt, 0)) EnterShort();

}


А вот так уже работает. Обратите внимание, разница от прошлого исходника только в том, что задана переменная A с вызовом EMA.

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

function Initialize()
{
   StrategyName = "IsUpTest";
   AddParameter("Cnt", 5, "", 1);
   AddParameter("Period", 20, "", 1);
   AddInput("Input1", Inputs.Candle, 1, true, "");
   LongLimit = 1;
   ShortLimit = -1;
}

function OnUpdate()
{

if (CurrentIndex < Period) return;

var A = EMA(Input1.Close, Period);

if (IsUp("EMA(Input1.Close, Period)", Cnt, 0)) EnterLong();
if (IsDown("EMA(Input1.Close, Period)", Cnt, 0)) EnterShort();

}


если в EMA для A будут другие параметры, то код в if перестанет работать. Например заменив на
var A = EMA(Input1.Close, Period + 1);
получаем уже не работающие условия IsUp, IsDown;
никогда такого не было и вот опять

Maks
Сообщения: 6
Зарегистрирован: 15 июн 2020, 15:29
Благодарил (а): 2 раза
Поблагодарили: 1 раз

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

Непрочитанное сообщение Maks » 30 июл 2020, 18:42

evge писал(а):...
А вот так уже работает. ...

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

function OnUpdate()
{

if (CurrentIndex < Period) return;

var A = EMA(Input1.Close, Period);

if (IsUp("EMA(Input1.Close, Period)", Cnt, 0)) EnterLong();
if (IsDown("EMA(Input1.Close, Period)", Cnt, 0)) EnterShort();

}



точно!
редактировал исходный индикатор и конечно же у меня остался этот var A = EMA(...))) и всё работало))
а без него действительно не работает :geek:

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

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

Непрочитанное сообщение BugsDigger » 31 июл 2020, 12:43

Чисто из любопытства.

А в версии, где работает, ежели в текстовом представлении индикатора "EMA(...)" в вызове IsUp вставить/удалить пробелы между некоторыми из символов, то продолжит работать? Или перестанет?

Если порыться в дизассемблере, то поиск индикатора идет - вроде как - по текстовому представлению; полностью всю логику, конечно, извлечь оттуда трудно.

Причину, по которой не работает без явного вычисления индикатора, понять/представить несложно: откуда ж данные брать? Конечно, можно попытаться сделать некоторый интерпретатор, который по текстовой строчке будет формовать вызов нужного индикатора с нужными параметрами (м.б. так и задумывалось), но как-то это выглядит чересчур. А вот после явного вызова индикатор включается в список доступных вычисленных индикаторов, где его и ищут потом при случае по текстовому представлению...

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

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

Непрочитанное сообщение evge » 31 июл 2020, 20:09

по документации они и не должны принимать строки на вход

IsUp(Series, N=1, D=0) – возвращает истинность утверждения «ряд со смещением D растет N точек подряд»
IsDown(Series, N=1, D=0) – возвращает истинность утверждения «ряд со смещением D снижается N точек»

по-моему это ошибка
никогда такого не было и вот опять


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

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

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