Страница 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(...))) и всё работало))
а без него действительно не работает

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 точек»
по-моему это ошибка