Общие вопросы по разработке > Вопрос по индикатору, разработанному Евгением.

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
Аватара пользователя
Tyler_Durden
Сообщения: 68
Зарегистрирован: 01 дек 2017, 20:42
Благодарил (а): 6 раз

Re: Вопрос по индикатору, разработанному Евгением.

Непрочитанное сообщение Tyler_Durden » 21 апр 2020, 18:00

Отмечу, что это уже не первый "простой" (казалось бы) вопрос ТС, который на продолжительное время повисает в воздухе немым укором.
Помню как минимум несколько.

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

Re: Вопрос по индикатору, разработанному Евгением.

Непрочитанное сообщение BugsDigger » 22 апр 2020, 13:25

Укором кому?
Это неофициальный пользовательский форум, здесь никто никому ничего не должен.
Последний раз редактировалось BugsDigger 22 апр 2020, 14:02, всего редактировалось 1 раз.

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

Re: Вопрос по индикатору, разработанному Евгением.

Непрочитанное сообщение BugsDigger » 22 апр 2020, 14:01

Den, проблема, как я и говорил с самого начала, в длине истории, которую дает АД для расчетов индикатора.

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

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 часа опять будет та же байда.

Возможно, если запускать индикатор в начале сессии и не листать график, то данные будут корректные, но кто знает, по какому внутреннему поводу терминал захочет рестартовать счет индикатора...

На минутах такой проблемы, конечно, не будет.

Аватара пользователя
Den
Сообщения: 352
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 14 раз
Поблагодарили: 4 раза

Re: Вопрос по индикатору, разработанному Евгением.

Непрочитанное сообщение Den » 23 апр 2020, 20:05

Там не два часа с копейками выходит, а значительно больше (сейчас 19.54 S30 пока корректно показывает).
Как я и говорил, особенность в том, что весь график должен уложиться в видимую область от начала дня.
Если выходит за пределы начала дня, что происходит обрыв.

Неясно какое условие должно это исправить.

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

Re: Вопрос по индикатору, разработанному Евгением.

Непрочитанное сообщение BugsDigger » 24 апр 2020, 10:35

Возможно, что при перерисовке графика история дается в бОльшем размере, например, как минимум от левой границы графика.
Попробуйте вставить логгирование MaxIndex.

Аватара пользователя
Den
Сообщения: 352
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 14 раз
Поблагодарили: 4 раза

Re: Вопрос по индикатору, разработанному Евгением.

Непрочитанное сообщение Den » 24 апр 2020, 14:27

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
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 361 раз
Контактная информация:

Re: Вопрос по индикатору, разработанному Евгением.

Непрочитанное сообщение evge » 24 апр 2020, 15:27

не знаю положения, у меня нет вашего кода.
никогда такого не было и вот опять

Аватара пользователя
Den
Сообщения: 352
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 14 раз
Поблагодарили: 4 раза

Re: Вопрос по индикатору, разработанному Евгением.

Непрочитанное сообщение Den » 24 апр 2020, 15:59

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

не знаю положения, у меня нет вашего кода.

я же говорю не работает на секундных ТФ на любом индикаторе

например на этом.

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

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;

}






Аватара пользователя
Den
Сообщения: 352
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 14 раз
Поблагодарили: 4 раза

Re: Вопрос по индикатору, разработанному Евгением.

Непрочитанное сообщение Den » 24 апр 2020, 16:01

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
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 361 раз
Контактная информация:

Re: Вопрос по индикатору, разработанному Евгением.

Непрочитанное сообщение evge » 24 апр 2020, 16:11

Всё верно говорили ранее: не хватает длины истории.

999 это поиск последних значений фрактала и этого должно хватить, если нет, то можно увеличить.

А вот отсчет истории от начала дня сбрасывается если текущий бар не равен предыдущему (по дате бара).
Этого не произойдёт на S1, т.к. это грубо 14*60*60 = 50400 баров (14 - для фьючерсов)
столько АД4 не выводит даже в невидимой части графика,
вывод: отсчет индикатора суммы в индикаторе будет не от начала дня!
никогда такого не было и вот опять


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

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

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