Общие вопросы по разработке > Как в индикаторе узнать текущую цену

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
Аватара пользователя
evge
Администратор
Сообщения: 1534
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 59 раз
Поблагодарили: 263 раза
Контактная информация:

Re: Как в индикаторе узнать текущую цену

Непрочитанное сообщение evge » 03 мар 2017, 11:59

Владимир писал(а):Как обойти ограничения.


Возможно, в вашем индикаторе можно сместить точку входа на 1 бар назад, изменив код, т.к. получается у Вас текущий бар влияния не оказывает никакого?!
никогда такого не было и вот опять

Владимир
Сообщения: 81
Зарегистрирован: 14 ноя 2016, 02:17
Благодарил (а): 3 раза
Поблагодарили: 2 раза

Re: Как в индикаторе узнать текущую цену

Непрочитанное сообщение Владимир » 03 мар 2017, 12:17

Если словами то последний бар определяет точку разворота.То есть свеча перекрывает диапазон свечи предвидящего диапазона свечи в обратном направлении (для лонга: свечи идут в низ "черные", ждём образования свечи бычей "белой" которая по размерам больше "черной" закрытие выше). если отменить это условие можно просто удалять индикатор (отсутствие условия стратегии).
В коде это выглядит

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

  for (var x= Scan-1; x>0; x--)
   {
 ///// При нормальных свечах
     if (Input.Open[x]<Input.Close[x]) // Проверяем закрытие свечи лонг шорт
        {// Лонг
          if (High<Input.Close[x])
          {   // Считаем, что произошло обновление High. Поэтому переписываея значения хая и лоу
          IzNapr=1;   //лонг
          High=Input.High[x];
          Low=Input.Low[x];
         Xx=x;      // Сохраняем значение для построения канала
          HighX=High;   // Сохраняем значение хая в памяти
          XHighN=x;      // Сохраняем значение в памяти
          }
      }
      else
          {// Шорт
           if (Low>Input.Close[x])
            { // Считаем, что произошло обновление low. Поэтому переписываея значения хая и лоу
             IzNapr=2;  //шорт
             High=Input.High[x];
             Low=Input.Low[x];
           Xx=x;      // Сохраняем значение для построения канала
             LowX=Low;   // Сохраняем значение лоу в памяти
             XLowN=x;   // Сохраняем значение в памяти
            }
           }
 ///// При формировании свечей с гепами
     if (Input.Open[x]>Input.Close[x]) //Проверяем закрытие свечи лонг шорт
        {// Лонг
          if (High<Input.Open[x])
          {   // Считаем, что произошло обновление High. Поэтому переписываея значения хая и лоу
          IzNapr=1;   //лонг
          High=Input.High[x];
          Low=Input.Low[x];
           Xx=x;      //Сохраняем значение для построения канала
          HighX=High;   //Сохраняем значение хая в памяти
          XHighN=x;      //Сохраняем значение в памяти
          }
      }
      else
          {// Шорт
           if (Low>Input.Open[x])
            { // Считаем, что произошло обновление low. Поэтому переписываея значения хая и лоу
             IzNapr=2;  //шорт
             High=Input.High[x];
             Low=Input.Low[x];
             Xx=x;      //Сохраняем значение для построения канала
              LowX=Low;   //Сохраняем значение лоу в памяти
              XLowN=x;   //Сохраняем значение в памяти
              }
           }

    // Заполняем буфер хаёв
            if (IzNapr==NaprHelp && IzNapr==2)    // Смена направления с лонга в шорт
            {
              for (var ch=ExstremaNumber-1; ch>0; ch--)
              {
               Buf_High[ch]=Buf_High[ch-1];
               Buf_time_High[ch]=Buf_time_High[ch-1];
               }
              Buf_High[0]=HighX;
              Buf_time_High[0]=XHighN;
              NaprHelp=1;
             }
   // Заполняем буфер лоёв
            if (IzNapr==NaprHelp && IzNapr==1)    // Смена направления с шорта в лонг
            {
              for (var Lo=ExstremaNumber-1; Lo>0; Lo--) 
              {
               Buf_Low[Lo]=Buf_Low[Lo-1];
                Buf_time_Low[Lo]=Buf_time_Low[Lo-1];
               }
              Buf_Low[0]=LowX;
              Buf_time_Low[0]=XLowN;
              NaprHelp=2;
             }
// Строим канал внешней свечи, для выделения внутренних свечей
  ChLow[Xx]= Low;
  ChLow[0]= Low;
  ChHigh[Xx]= High;
  ChHigh[0]= High;
ChLow.DrawChannel(ChHigh);
////////
   } // Закрытие цикла for


Можно только простые стратегии писать конструкторе, а хотелось бы перейти на новый уровень писать более сложные коды. А также применять несколько таймфреймов по одному инструменту, допустим 5М и 1Д.

Владимир
Сообщения: 81
Зарегистрирован: 14 ноя 2016, 02:17
Благодарил (а): 3 раза
Поблагодарили: 2 раза

Re: Как в индикаторе узнать текущую цену

Непрочитанное сообщение Владимир » 05 мар 2017, 23:39

Сообщение Владимир » Сегодня, 21:12
Добрый день!

В индикаторе свечка последняя при изменении вызывает Evaluate() индикатора и за 1 свечку сигнал Ваш может 10 раз появится и 10 раз исчезнуть.

Евгений я долго думал над вашей фразой и не могу понять как может произойти за одну свечку, изменение сигнала в индикаторе:
1. В индикаторах можно использовать только дискретные значения, то есть значения только сформированных свечей (открытие, закрытия, хай и лоу бара) ;
2. Получение текущей цены и лучшей цены из стакана невозможно напрямую в индикаторе!
3. Передача значений текущей цены и лучшей цены из стакана из робота в индикатор просто невозможна функция OnUpdate() это сделать не даст.
Из выше перечисленного получить изменение сигнала с индикатора просто технически невозможно!!!

Поэтому хотелось бы получить примеры для анализа, может нам чего то недоговаривают и данные модно получать как и открывать позицию в любой момент и не ждать начала открытия нового бара тем самым повысить эффективность торговли?

Аватара пользователя
evge
Администратор
Сообщения: 1534
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 59 раз
Поблагодарили: 263 раза
Контактная информация:

Re: Как в индикаторе узнать текущую цену

Непрочитанное сообщение evge » 06 мар 2017, 08:52

Владимир писал(а): В индикаторе свечка последняя при изменении вызывает Evaluate() индикатора и за 1 свечку сигнал Ваш может 10 раз появится и 10 раз исчезнуть.


Владимир писал(а):Евгений я долго думал над вашей фразой и не могу понять как может произойти за одну свечку, изменение сигнала в индикаторе:


Легко, если на последнем баре цена изменяется и вызывается Evaluate() и сигнал вы рисуете учитывая значения этого последнего бара, то получить появление и исчезновение сигнала на этом баре можно неоднократно, в процессе его отрисовки.

Владимир писал(а):1. В индикаторах можно использовать только дискретные значения, то есть значения только сформированных свечей (открытие, закрытия, хай и лоу бара) ;


Evaluate() для последней свечи в индикаторах вызывается неоднократно, происходит это при изменении цены. Можете проверить.

Владимир писал(а):2. Получение текущей цены и лучшей цены из стакана невозможно напрямую в индикаторе!


Возможно, т.к. в индикаторах не применял и не понимаю для чего можно их там применить, наверное оно и не работает. В стратегиях точно работают.
Смотрим в документ "Терминал 4.0. Скрипты пользовательских индикаторов и стратегий.doc":
Функции работы с ценой
GetAsk() – функция возвращает лучший аск в очереди заявок.
GetBid() – функция возвращает лучший бид в очереди заявок.
GetLast() – функция возвращает цену последней сделки на момент вызова.
GetPriceStep() – функция возвращает шаг цены по инструменту, используемому в стратегии .

Владимир писал(а):3. Передача значений текущей цены и лучшей цены из стакана из робота в индикатор просто невозможна функция OnUpdate() это сделать не даст.


Ну почему же, вызывайте если так необходимо нужный индикатор и передавайте в качестве параметров нужные вам цены из стакана: GetLast(), GetBid(), GetAsk().

Владимир писал(а):Из выше перечисленного получить изменение сигнала с индикатора просто технически невозможно!!!

Поэтому хотелось бы получить примеры для анализа, может нам чего то недоговаривают и данные модно получать как и открывать позицию в любой момент и не ждать начала открытия нового бара тем самым повысить эффективность торговли?


ну я вижу вариант:
Работать на меньшем ТФ для входа внутри бара вышестоящего, т.е. проводить анализ по данным вышестоящего ТФ. Но пока в АД4 нет возможности получать другие ТФ даже одного инструмента, не говоря уже о получении серий других инструментов (аналогично в других ТФ или в том же ТФ). Поэтому работать в нижестоящем ТФ, проводя анализ вышестоящего, будет потруднее реализовать. Примеры индикаторов на форуме есть, когда мы можем получать данные индикаторов вышестоящего ТФ на нижестоящем.
никогда такого не было и вот опять

Владимир
Сообщения: 81
Зарегистрирован: 14 ноя 2016, 02:17
Благодарил (а): 3 раза
Поблагодарили: 2 раза

Re: Как в индикаторе узнать текущую цену

Непрочитанное сообщение Владимир » 06 мар 2017, 10:16

Добрый день!
Evaluate() для последней свечи в индикаторах вызывается неоднократно, происходит это при изменении цены. Можете проверить.

этот вопрос обсуждать бессмысленно я приводил лог, там явно этот момент виден
привожу ещё раз:
2017.02.24 16:30:30.844 NaprTrenda - 1PowerTrenda - 70,5426356589195// StopExst - 2094,8
2017.02.24 16:30:30.991 -1- high[0] 2096,7 > high[1] 2095,5// low[0] 2094,8> low[1] 2090,25
2017.02.24 16:30:30.991 NaprTrenda - 1PowerTrenda - 70,5426356589195// StopExst - 2094,8
2017.02.24 16:30:31.357 -1- high[0] 2096,7 > high[1] 2095,5// low[0] 2094,8> low[1] 2090,25
2017.02.24 16:30:31.616 -1- high[0] 2096,7 > high[1] 2095,5// low[0] 2094,8> low[1] 2090,25
2017.02.24 16:30:43.282 -1- high[0] 2096,7 > high[1] 2095,5// low[0] 2094,8> low[1] 2090,25
2017.02.24 16:30:45.457 -1- high[0] 2096,7 > high[1] 2095,5// low[0] 2094,8> low[1] 2090,25
2017.02.24 16:30:48.427 -1- high[0] 2096,7 > high[1] 2095,5// low[0] 2094,8> low[1] 2090,25
2017.02.24 16:30:51.904 -1- high[0] 2096,7 > high[1] 2095,5// low[0] 2094,8> low[1] 2090,25


А вот передача данный текущей цены из роботы в индикатор возможна только один раз в используемом таймфрейме (если 5 минутка то только один раз в 5 минут и т.п.), благодаря function OnUpdate().

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

//это в роботах многие используют, но всё равно спасибо за напоминание данных методов
EnterLongLimit(GetBid()+ 5* GetPriceStep());
EnterShortLimit(GetAsk()+ 5* GetPriceStep());

Владимир писал(а):
1. В индикаторах можно использовать только дискретные значения, то есть значения только сформированных свечей (открытие, закрытия, хай и лоу бара) ;
evge
Evaluate() для последней свечи в индикаторах вызывается неоднократно, происходит это при изменении цены. Можете проверить.

функций обработки текущих данных нет в индикаторе только сформированных свечей (открытие, закрытия, хай и лоу бара), если вы их приведете то спорить не буду.
Текущая цена может ускорить обработку кода (уменьшить время вычисления индикатора при нарушении формации), но наверное это не только сейчас но и потом будет неактуально по причине нежелания это реализовать или технической невозможности.

Аватара пользователя
evge
Администратор
Сообщения: 1534
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 59 раз
Поблагодарили: 263 раза
Контактная информация:

Re: Как в индикаторе узнать текущую цену

Непрочитанное сообщение evge » 06 мар 2017, 10:43

evge писал(а):функций обработки текущих данных нет в индикаторе только сформированных свечей (открытие, закрытия, хай и лоу бара), если вы их приведете то спорить не буду.


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

function Initialize()
{
IndicatorName = "CloseLevel";
PriceStudy = true;
AddSeries("Price", DrawAs.Custom, Color.Red);
AddInput("Input", Inputs.Price);
AddLevel(0, Color.Red, "Price");
}

function Evaluate()
{
Levels[0].Level = Input.Close[0];
}


рисуем уровень на графике по последней цене, который меняется при изменении последнего бара.
никогда такого не было и вот опять

Владимир
Сообщения: 81
Зарегистрирован: 14 ноя 2016, 02:17
Благодарил (а): 3 раза
Поблагодарили: 2 раза

Re: Как в индикаторе узнать текущую цену

Непрочитанное сообщение Владимир » 06 мар 2017, 10:56

IndicatorName = "CloseLevel"; да вот это железное доказательство.
Только можно было 25 фев 2017 такой довод привести, я это и хотел согластно теме понять!
А то Input.Close[0] должно вроде по по названию давать цену закрытия свечи. А на самом деле ещё и текущую цену даёт!
Спасибо теперь буду знать!
Последний раз редактировалось Владимир 06 мар 2017, 11:06, всего редактировалось 1 раз.

Аватара пользователя
evge
Администратор
Сообщения: 1534
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 59 раз
Поблагодарили: 263 раза
Контактная информация:

Re: Как в индикаторе узнать текущую цену

Непрочитанное сообщение evge » 06 мар 2017, 11:00

Input.Close[0]
Input.High[0]
Input.Low[0]
Input.Volume[0]
Input.VolumeBid[0]
Input.VolumeAsk[0]
Input.OpenInterest[0] (во фьючерсах)

всё это может поменяться на активном, последнем, баре

не может только Input.Open[0] :)


В коде выше, значение просто перерисовывается.
[0] для всех точек истории которые индикатор обходит - это текущий бар. Дойдя до последней точки на графике, индикатор просто перерисует последнее значение уровня равным Input.Close[0];

Можно поставить условие

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

if (CurrentIndex == MaxIndex) Levels[0].Level = Input.Close[0];


тогда будет рисовать только для последнего бара графика (видимой части графика)
никогда такого не было и вот опять

Владимир
Сообщения: 81
Зарегистрирован: 14 ноя 2016, 02:17
Благодарил (а): 3 раза
Поблагодарили: 2 раза

Re: Как в индикаторе узнать текущую цену

Непрочитанное сообщение Владимир » 06 мар 2017, 22:03

Евгений вы не думали об изменении концепции в роботах
1 Переименование функции ]Input.Close[0] в функцию живого бара (по её работе так она и работает сейчас)
2 Если изменить работу функций
evge писал(а):Input.Close[0]
Input.High[0]
Input.Low[0]

согласно их названий (то есть значение цен будет определяться их ценами закрытия, хая и лоу), они будут трактоваться однозначно.
3 Данные изменения позволит в роботе открывать позицию однозначно и правильно, в любое время по сигналу индикаторов (не придётся открывать позицию по функцие OnUpdate(), с ожиданием закрытия таймфрейма на новой свече ).
4 Если удастся отказаться от применения функции OnUpdate(), тогда станет возможным применение нескольких таймфреймов в одном роботе.
Это не вопрос, а просто мысли в слух!

PIed_Plper
Сообщения: 9
Зарегистрирован: 09 янв 2019, 10:33
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Re: Как в индикаторе узнать текущую цену

Непрочитанное сообщение PIed_Plper » 09 янв 2019, 11:38

evge писал(а):Ну почему же, вызывайте если так необходимо нужный индикатор и передавайте в качестве параметров нужные вам цены из стакана: GetLast(), GetBid(), GetAsk().

Добрый день, evge
Подскажите, пожалуйста, как эту информацию (лучший бид и аск) можно вывести визуально на графике? В индикаторах действительно, к сожалению, не доступны эти функции, только в стратегии.
Хотя бы уровнями по последнему бару, хоть как-нибудь отобразить с каким угодно запаздыванием.


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

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

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