Страница 1 из 2

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

Добавлено: 25 ноя 2016, 14:58
vdm
IsUp(Series, N=1, D=0) – возвращает истинность утверждения «ряд со смещением D растет N точек подряд»

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

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

Добавлено: 26 ноя 2016, 12:44
evge
Приветствую!

Странно конечно, но первый параметр принимает тип 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();
   }
}

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

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

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

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

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

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


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

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

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


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

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

Добавлено: 30 июл 2020, 15:03
evge
Насчет работает - сомнительно.

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

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

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 баров.

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

Добавлено: 30 июл 2020, 15:13
evge
Работает только через 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();

}

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

Добавлено: 30 июл 2020, 15:22
evge
ещё выяснил, что работает вариант предложенный 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;

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

Добавлено: 30 июл 2020, 18:42
Maks
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:

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

Добавлено: 31 июл 2020, 12:43
BugsDigger
Чисто из любопытства.

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

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

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

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

Добавлено: 31 июл 2020, 20:09
evge
по документации они и не должны принимать строки на вход

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

по-моему это ошибка