Общие вопросы по разработке > Вопрос по IsUp(Series, N=1, D=0)
Вопрос по IsUp(Series, N=1, D=0)
IsUp(Series, N=1, D=0) – возвращает истинность утверждения «ряд со смещением D растет N точек подряд»
Для фин. ряда все работает нормально ( IsUp( Input1,5) ) , но не могу понять , как правильно передать в эту функцию производный индикатор от фин ряда. Например , нужно узнать растет ли EMA 5 точек подряд
Для фин. ряда все работает нормально ( IsUp( Input1,5) ) , но не могу понять , как правильно передать в эту функцию производный индикатор от фин ряда. Например , нужно узнать растет ли EMA 5 точек подряд
- evge
- Администратор
- Сообщения: 1811
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 366 раз
- Контактная информация:
Re: Вопрос по IsUp(Series, N=1, D=0)
Приветствую!
Странно конечно, но первый параметр принимает тип String и пишет это явно в ошибках
Получилось вот так
Странно конечно, но первый параметр принимает тип 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
- Администратор
- Сообщения: 1811
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 366 раз
- Контактная информация:
Re: Вопрос по IsUp(Series, N=1, D=0)
Странности в том что E.ToString() возвращает тип строку
в виде кода вызова индикатора, т.е. "EMA(Input1.Close, Period)",
но если просто передать в IsUp или IsDown в качестве параметра такую строку и не вызывать индикатор до этого, то работать не будет
в виде кода вызова индикатора, т.е. "EMA(Input1.Close, Period)",
но если просто передать в IsUp или IsDown в качестве параметра такую строку и не вызывать индикатор до этого, то работать не будет
никогда такого не было и вот опять
Re: Вопрос по IsUp(Series, N=1, D=0)
evge писал(а):Странности в том что E.ToString() возвращает тип строку
в виде кода вызова индикатора, т.е. "EMA(Input1.Close, Period)",
но если просто передать в IsUp или IsDown в качестве параметра такую строку и не вызывать индикатор до этого, то работать не будет
Возможно что-то поменялось за 5 лет, но сейчас код компилируется и работает:
Код: Выделить всё
IsUp("EMA(Input1.Close, Period)", UpDownCount, 0);
Конечно EMA(Input1.Close, Period) надо брать в кавычки, тогда получается обычная строка) которую IsUp/Down прекрасно едят)
- evge
- Администратор
- Сообщения: 1811
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 366 раз
- Контактная информация:
Re: Вопрос по IsUp(Series, N=1, D=0)
Насчет работает - сомнительно.
Попробовал - не работает.
0 сделок за 2000 баров.
Попробовал - не работает.
Код: Выделить всё
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
- Администратор
- Сообщения: 1811
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 366 раз
- Контактная информация:
Re: Вопрос по IsUp(Series, N=1, D=0)
Работает только через 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
- Администратор
- Сообщения: 1811
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 366 раз
- Контактная информация:
Re: Вопрос по IsUp(Series, N=1, D=0)
ещё выяснил, что работает вариант предложенный Maks в том только случае, если до этого с такими параметрами вызывался индикатор
вот так не работает
А вот так уже работает. Обратите внимание, разница от прошлого исходника только в том, что задана переменная A с вызовом EMA.
если в EMA для A будут другие параметры, то код в if перестанет работать. Например заменив на
var A = EMA(Input1.Close, Period + 1);
получаем уже не работающие условия IsUp, IsDown;
вот так не работает
Код: Выделить всё
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)
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(...))) и всё работало))
а без него действительно не работает
-
- Сообщения: 535
- Зарегистрирован: 11 ноя 2018, 17:11
- Благодарил (а): 21 раз
- Поблагодарили: 92 раза
Re: Вопрос по IsUp(Series, N=1, D=0)
Чисто из любопытства.
А в версии, где работает, ежели в текстовом представлении индикатора "EMA(...)" в вызове IsUp вставить/удалить пробелы между некоторыми из символов, то продолжит работать? Или перестанет?
Если порыться в дизассемблере, то поиск индикатора идет - вроде как - по текстовому представлению; полностью всю логику, конечно, извлечь оттуда трудно.
Причину, по которой не работает без явного вычисления индикатора, понять/представить несложно: откуда ж данные брать? Конечно, можно попытаться сделать некоторый интерпретатор, который по текстовой строчке будет формовать вызов нужного индикатора с нужными параметрами (м.б. так и задумывалось), но как-то это выглядит чересчур. А вот после явного вызова индикатор включается в список доступных вычисленных индикаторов, где его и ищут потом при случае по текстовому представлению...
А в версии, где работает, ежели в текстовом представлении индикатора "EMA(...)" в вызове IsUp вставить/удалить пробелы между некоторыми из символов, то продолжит работать? Или перестанет?
Если порыться в дизассемблере, то поиск индикатора идет - вроде как - по текстовому представлению; полностью всю логику, конечно, извлечь оттуда трудно.
Причину, по которой не работает без явного вычисления индикатора, понять/представить несложно: откуда ж данные брать? Конечно, можно попытаться сделать некоторый интерпретатор, который по текстовой строчке будет формовать вызов нужного индикатора с нужными параметрами (м.б. так и задумывалось), но как-то это выглядит чересчур. А вот после явного вызова индикатор включается в список доступных вычисленных индикаторов, где его и ищут потом при случае по текстовому представлению...
- evge
- Администратор
- Сообщения: 1811
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 366 раз
- Контактная информация:
Re: Вопрос по IsUp(Series, N=1, D=0)
по документации они и не должны принимать строки на вход
IsUp(Series, N=1, D=0) – возвращает истинность утверждения «ряд со смещением D растет N точек подряд»
IsDown(Series, N=1, D=0) – возвращает истинность утверждения «ряд со смещением D снижается N точек»
по-моему это ошибка
IsUp(Series, N=1, D=0) – возвращает истинность утверждения «ряд со смещением D растет N точек подряд»
IsDown(Series, N=1, D=0) – возвращает истинность утверждения «ряд со смещением D снижается N точек»
по-моему это ошибка
никогда такого не было и вот опять
Вернуться в «Общие вопросы по разработке»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 10 гостей