Общие вопросы по разработке > Вопрос по индикатору, разработанному Евгением.
- Tyler_Durden
- Сообщения: 68
- Зарегистрирован: 01 дек 2017, 20:42
- Благодарил (а): 6 раз
Re: Вопрос по индикатору, разработанному Евгением.
Отмечу, что это уже не первый "простой" (казалось бы) вопрос ТС, который на продолжительное время повисает в воздухе немым укором.
Помню как минимум несколько.
Помню как минимум несколько.
-
- Сообщения: 535
- Зарегистрирован: 11 ноя 2018, 17:11
- Благодарил (а): 21 раз
- Поблагодарили: 92 раза
Re: Вопрос по индикатору, разработанному Евгением.
Укором кому?
Это неофициальный пользовательский форум, здесь никто никому ничего не должен.
Это неофициальный пользовательский форум, здесь никто никому ничего не должен.
Последний раз редактировалось BugsDigger 22 апр 2020, 14:02, всего редактировалось 1 раз.
-
- Сообщения: 535
- Зарегистрирован: 11 ноя 2018, 17:11
- Благодарил (а): 21 раз
- Поблагодарили: 92 раза
Re: Вопрос по индикатору, разработанному Евгением.
Den, проблема, как я и говорил с самого начала, в длине истории, которую дает АД для расчетов индикатора.
Результат:
TF:1 MaxIndex:6584 - это для минут
TF:-1 MaxIndex:6584 - это для секунд (2 часа с копейками)
Видно, что историю нам дают не 3600*25, а гораздо меньше. (Если не просить бОльшую историю, то по умолчанию дается ~3600 баров.)
Т.е. вы не можете на секундах из произвольной точки сосчитать за весь день.
SumUp, SumDown обнуляются в начале счета в неизвестной точке при старте индикатора, вряд ли это начало дня.
Рестарт счета индикатора происходит при листании графика. Если даже вы стартовали с утра правильно, то если через 2 слишним часа после начала сессии листанем график куда-то на предыдущий день, а потом вернемся к текущему моменту (кнопкой перемотки >| ). то индикатор рестартуется, но счет пойдет уже не от начала дня, а максимум от 2 часов назад. Если вы попали в какой-то сессии на перемену даты (не знаю, где это у нас возможно), то суммы тоже обнулятся (в исходнике есть соответствующий код), но через 2 часа опять будет та же байда.
Возможно, если запускать индикатор в начале сессии и не листать график, то данные будут корректные, но кто знает, по какому внутреннему поводу терминал захочет рестартовать счет индикатора...
На минутах такой проблемы, конечно, не будет.
Код: Выделить всё
function Initialize()
{
IndicatorName = "_Dummy";
PriceStudy=false;
AddInput("Input", Inputs.Candle);
AddSeries("_Dummy", DrawAs.Line, Color.Black);
AddParameter("History", 3600, 25); // просим историю длиной 3600*25
}
function Evaluate()
{
if(CurrentIndex<MaxIndex) return;
WriteLine(@"D:\ADdebug\_Dummy.txt", String.Format("TF:{0} MaxIndex:{1}", Input.Timeframe, MaxIndex));
}
Результат:
TF:1 MaxIndex:6584 - это для минут
TF:-1 MaxIndex:6584 - это для секунд (2 часа с копейками)
Видно, что историю нам дают не 3600*25, а гораздо меньше. (Если не просить бОльшую историю, то по умолчанию дается ~3600 баров.)
Т.е. вы не можете на секундах из произвольной точки сосчитать за весь день.
SumUp, SumDown обнуляются в начале счета в неизвестной точке при старте индикатора, вряд ли это начало дня.
Рестарт счета индикатора происходит при листании графика. Если даже вы стартовали с утра правильно, то если через 2 слишним часа после начала сессии листанем график куда-то на предыдущий день, а потом вернемся к текущему моменту (кнопкой перемотки >| ). то индикатор рестартуется, но счет пойдет уже не от начала дня, а максимум от 2 часов назад. Если вы попали в какой-то сессии на перемену даты (не знаю, где это у нас возможно), то суммы тоже обнулятся (в исходнике есть соответствующий код), но через 2 часа опять будет та же байда.
Возможно, если запускать индикатор в начале сессии и не листать график, то данные будут корректные, но кто знает, по какому внутреннему поводу терминал захочет рестартовать счет индикатора...
На минутах такой проблемы, конечно, не будет.
Re: Вопрос по индикатору, разработанному Евгением.
Там не два часа с копейками выходит, а значительно больше (сейчас 19.54 S30 пока корректно показывает).
Как я и говорил, особенность в том, что весь график должен уложиться в видимую область от начала дня.
Если выходит за пределы начала дня, что происходит обрыв.
Неясно какое условие должно это исправить.
Как я и говорил, особенность в том, что весь график должен уложиться в видимую область от начала дня.
Если выходит за пределы начала дня, что происходит обрыв.
Неясно какое условие должно это исправить.
-
- Сообщения: 535
- Зарегистрирован: 11 ноя 2018, 17:11
- Благодарил (а): 21 раз
- Поблагодарили: 92 раза
Re: Вопрос по индикатору, разработанному Евгением.
Возможно, что при перерисовке графика история дается в бОльшем размере, например, как минимум от левой границы графика.
Попробуйте вставить логгирование MaxIndex.
Попробуйте вставить логгирование MaxIndex.
Re: Вопрос по индикатору, разработанному Евгением.
evge писал(а):попробуйте внутри этого цикла поставить проверку на время бара по индексуКод: Выделить всё
for (var x = 0; x < 999; x++)
{
if (I["L"][x] > 0) { Lx = CurrentIndex - x; Ly = I["L"][x]; }
if (I["H"][x] > 0) { Hx = CurrentIndex - x; Hy = I["H"][x]; }
if (Lx != 0 && Hx != 0) break;
}
заменить наКод: Выделить всё
for (var x = 0; x < 999; x++)
{
if (BarDate(0) != BarDate(x)) break; //если это бар другого дня завершаем цикл
if (I["L"][x] > 0) { Lx = CurrentIndex - x; Ly = I["L"][x]; }
if (I["H"][x] > 0) { Hx = CurrentIndex - x; Hy = I["H"][x]; }
if (Lx != 0 && Hx != 0) break;
}
evge , какие варианты выхода из положения еще есть, посмотрите пожалуйста. Предложенный вариант не работает, к сожалению.
- evge
- Администратор
- Сообщения: 1813
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Вопрос по индикатору, разработанному Евгением.
не знаю положения, у меня нет вашего кода.
никогда такого не было и вот опять
Re: Вопрос по индикатору, разработанному Евгением.
Код: Выделить всё
не знаю положения, у меня нет вашего кода.
я же говорю не работает на секундных ТФ на любом индикаторе
например на этом.
Код: Выделить всё
function Initialize()
{
IndicatorName = "Fractal";
AddInput("Input", Inputs.Candle);
AddParameter("Period", 5);
PriceStudy = true;
AddSeries("H", DrawAs.Custom, Color.Magenta);
AddSeries("L", DrawAs.Custom, Color.Lime);
AddGlobalVariable("CurrentPosition", Types.Int, 0);
}
function Evaluate()
{
// Fractal. Period - число точек справа и слева от экстремума, которые ниже (выше) него
if (CurrentIndex > 2 * Period)
{
var xH = 0;
var xL = 0;
var HPoint = Input.High[-Period];
var LPoint = Input.Low[-Period];
for (var i = 0; i < Period; i++ )
{
if ( HPoint >= Input.High[i+1-Period] && HPoint >= Input.High[-i-1-Period] && ( CurrentPosition >= 0))
xH = xH + 1;
if ( LPoint <= Input.Low[i+1-Period] && LPoint <= Input.Low[-i-1-Period] && ( CurrentPosition <= 0))
xL = xL + 1;
}
if ( xH == Period )
{
H[Period] = HPoint;
CurrentPosition = -1;
}
if ( xL == Period )
{
L[Period] = LPoint;
CurrentPosition = 1;
}
H.DrawArrowDown(Color.Magenta, LineStyles.Solid, 5, Color.Magenta,1);
L.DrawArrowUp(Color.LawnGreen, LineStyles.Solid, 5, Color.LawnGreen, 1);
}
}
И будет так
Код: Выделить всё
function Initialize()
{
IndicatorName = "fractal_SUMMA";
AddInput("Input", Inputs.Candle);
AddSeries("D", DrawAs.Custom, Color.Green, false);
AddSeries("U", DrawAs.Custom, Color.Red, false);
AddShadowSeries("Sum", DrawAs.Custom, Color.DarkSlateGray);
AddSeries("SUp", DrawAs.Custom, Color.Lime, false);
AddSeries("SDown", DrawAs.Custom, Color.HotPink, false);
AddGlobalVariable("SumUp", Types.Double, 0);
AddGlobalVariable("SumDown", Types.Double, 0);
AddGlobalVariable("LX", Types.Long, 0);
AddGlobalVariable("HX", Types.Long, 0);
PriceStudy = false;
}
function Evaluate()
{
var I = MY.Fractal(Input,5);
var Lx = 0;
var Hx = 0;
var Ly = 0.0;
var Hy = 0.0;
for (var x = 0; x < 999; x++)
{
if (I["L"][x] > 0) { Lx = CurrentIndex - x; Ly = I["L"][x]; }
if (I["H"][x] > 0) { Hx = CurrentIndex - x; Hy = I["H"][x]; }
if (Lx != 0 && Hx != 0) break;
}
if (Lx == 0 && Hx == 0 ) return;
if (BarDate(0) != BarDate(1))
{
SumUp = 0; SumDown = 0;
}
if ( Lx > Hx )
D[1] = Hy - Ly;
else
U[1] = Hy - Ly;
if (HX != Hx || LX != Lx)
{
HX = Hx;
LX = Lx;
if (Hx > Lx) SumUp += Hy - Ly;
if (Hx < Lx) SumDown += Hy - Ly;
}
SUp[0] = SumUp;
SDown[0] = SumDown;
Sum[0] = (SumDown + SumUp)*100;
}
Re: Вопрос по индикатору, разработанному Евгением.
Den писал(а):Код: Выделить всё
не знаю положения, у меня нет вашего кода.
я же говорю не работает на секундных ТФ на любом индикаторе.
Вернее работает, пока ВЕСЬ график инструмента в пределах видимой области ЗА ДЕНЬ - не важно какое увеличение, на S30 примерно до 22:00 верно показывает, на М1 уже верно за весь день показывает.
например на этом.Код: Выделить всё
function Initialize()
{
IndicatorName = "Fractal";
AddInput("Input", Inputs.Candle);
AddParameter("Period", 5);
PriceStudy = true;
AddSeries("H", DrawAs.Custom, Color.Magenta);
AddSeries("L", DrawAs.Custom, Color.Lime);
AddGlobalVariable("CurrentPosition", Types.Int, 0);
}
function Evaluate()
{
// Fractal. Period - число точек справа и слева от экстремума, которые ниже (выше) него
if (CurrentIndex > 2 * Period)
{
var xH = 0;
var xL = 0;
var HPoint = Input.High[-Period];
var LPoint = Input.Low[-Period];
for (var i = 0; i < Period; i++ )
{
if ( HPoint >= Input.High[i+1-Period] && HPoint >= Input.High[-i-1-Period] && ( CurrentPosition >= 0))
xH = xH + 1;
if ( LPoint <= Input.Low[i+1-Period] && LPoint <= Input.Low[-i-1-Period] && ( CurrentPosition <= 0))
xL = xL + 1;
}
if ( xH == Period )
{
H[Period] = HPoint;
CurrentPosition = -1;
}
if ( xL == Period )
{
L[Period] = LPoint;
CurrentPosition = 1;
}
H.DrawArrowDown(Color.Magenta, LineStyles.Solid, 5, Color.Magenta,1);
L.DrawArrowUp(Color.LawnGreen, LineStyles.Solid, 5, Color.LawnGreen, 1);
}
}
И будет такКод: Выделить всё
function Initialize()
{
IndicatorName = "fractal_SUMMA";
AddInput("Input", Inputs.Candle);
AddSeries("D", DrawAs.Custom, Color.Green, false);
AddSeries("U", DrawAs.Custom, Color.Red, false);
AddShadowSeries("Sum", DrawAs.Custom, Color.DarkSlateGray);
AddSeries("SUp", DrawAs.Custom, Color.Lime, false);
AddSeries("SDown", DrawAs.Custom, Color.HotPink, false);
AddGlobalVariable("SumUp", Types.Double, 0);
AddGlobalVariable("SumDown", Types.Double, 0);
AddGlobalVariable("LX", Types.Long, 0);
AddGlobalVariable("HX", Types.Long, 0);
PriceStudy = false;
}
function Evaluate()
{
var I = MY.Fractal(Input,5);
var Lx = 0;
var Hx = 0;
var Ly = 0.0;
var Hy = 0.0;
for (var x = 0; x < 999; x++)
{
if (I["L"][x] > 0) { Lx = CurrentIndex - x; Ly = I["L"][x]; }
if (I["H"][x] > 0) { Hx = CurrentIndex - x; Hy = I["H"][x]; }
if (Lx != 0 && Hx != 0) break;
}
if (Lx == 0 && Hx == 0 ) return;
if (BarDate(0) != BarDate(1))
{
SumUp = 0; SumDown = 0;
}
if ( Lx > Hx )
D[1] = Hy - Ly;
else
U[1] = Hy - Ly;
if (HX != Hx || LX != Lx)
{
HX = Hx;
LX = Lx;
if (Hx > Lx) SumUp += Hy - Ly;
if (Hx < Lx) SumDown += Hy - Ly;
}
SUp[0] = SumUp;
SDown[0] = SumDown;
Sum[0] = (SumDown + SumUp)*100;
}
- evge
- Администратор
- Сообщения: 1813
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Вопрос по индикатору, разработанному Евгением.
Всё верно говорили ранее: не хватает длины истории.
999 это поиск последних значений фрактала и этого должно хватить, если нет, то можно увеличить.
А вот отсчет истории от начала дня сбрасывается если текущий бар не равен предыдущему (по дате бара).
Этого не произойдёт на S1, т.к. это грубо 14*60*60 = 50400 баров (14 - для фьючерсов)
столько АД4 не выводит даже в невидимой части графика,
вывод: отсчет индикатора суммы в индикаторе будет не от начала дня!
999 это поиск последних значений фрактала и этого должно хватить, если нет, то можно увеличить.
А вот отсчет истории от начала дня сбрасывается если текущий бар не равен предыдущему (по дате бара).
Этого не произойдёт на S1, т.к. это грубо 14*60*60 = 50400 баров (14 - для фьючерсов)
столько АД4 не выводит даже в невидимой части графика,
вывод: отсчет индикатора суммы в индикаторе будет не от начала дня!
никогда такого не было и вот опять
Вернуться в «Общие вопросы по разработке»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей