Как реализовать индикатор, который строит горизонтальные линии до момента пересечения с ценой - страница 2

 
Alexey Viktorov:
Это в истории или в текущее время? В истории можно воспользоваться функцией CopyTime а текущее Time[0]
Для каждой линии пересечение будет разным. А текущее время всегда будет ведь на нулевом баре? И линии всегда будут окончиваться на текущем времени? Так что Time [0] не подходит наверное или я не правильно понимаю
 
Dmitry Fedoseev:

Если в общих чертах, создать в индикаторе дополнительный индикаторный буфер, при пересечении присвоить соответствующему элементу этого буфера время, а потом на каждом баре подтягивать его за собой - брат из предыдущего элемента и присваивать текущему. Таким образом на нулевом баре будут время последнего перемещения. 

Есть похуже вариант - при пересечении присвоить время глобальной переменн

Dmitry Fedoseev:

Если в общих чертах, создать в индикаторе дополнительный индикаторный буфер, при пересечении присвоить соответствующему элементу этого буфера время, а потом на каждом баре подтягивать его за собой - брат из предыдущего элемента и присваивать текущему. Таким образом на нулевом баре будут время последнего перемещения. 

Есть похуже вариант - при пересечении присвоить время глобальной переменной, и в ней всегда будет время последнего пересечения. 

А как присвоить это время глобальной переменной, а может и локальной как-то можно?

 
Lovkacher:
Для каждой линии пересечение будет разным. А текущее время всегда будет ведь на нулевом баре? И линии всегда будут окончиваться на текущем времени? Так что Time [0] не подходит наверное или я не правильно понимаю




Верхняя стрелка указывает на первую точку привязки трендовой линии.

Вторая - на вторую.

Значение цены в точке третьей стрелки надо узнать с помощью функции

double price = ObjectGetValueByShift("имя линии", 0);
и дальше

bool  ObjectMove(
   long       chart_id,      // идентификатор графика
   string     object_name,   // имя объекта
   int        point_index,   // номер привязки 2
   datetime   time,          // время Time[0]
   double     price          // цена ObjectGetValueByShift("имя линии", 0)
   );
Если у трендовой отключено свойство "луч", то перед определением цены придётся это свойство включить, определить цену, поменять координаты и потом опять отключить.
Либо воспользоваться математическими знаниями и через тангенс высчитать эту цену не прибегая к функции ObjectGetValueByShift()
 
Документация по MQL5: Глобальные переменные терминала
Документация по MQL5: Глобальные переменные терминала
  • www.mql5.com
Глобальные переменные терминала - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov:




Верхняя стрелка указывает на первую точку привязки трендовой линии.

Вторая - на вторую.

Значение цены в точке третьей стрелки надо узнать с помощью функции

double price = ObjectGetValueByShift("имя линии", 0);
и дальше

bool  ObjectMove(
   long       chart_id,      // идентификатор графика
   string     object_name,   // имя объекта
   int        point_index,   // номер привязки 2
   datetime   time,          // время Time[0]
   double     price          // цена ObjectGetValueByShift("имя линии", 0)
   );
Если у трендовой отключено свойство "луч", то перед определением цены придётся это свойство включить, определить цену, поменять координаты и потом опять отключить.
Либо воспользоваться математическими знаниями и через тангенс в
Alexey Viktorov:




Верхняя стрелка указывает на первую точку привязки трендовой линии.

Вторая - на вторую.

Значение цены в точке третьей стрелки надо узнать с помощью функции

double price = ObjectGetValueByShift("имя линии", 0);
и дальше

bool  ObjectMove(
   long       chart_id,      // идентификатор графика
   string     object_name,   // имя объекта
   int        point_index,   // номер привязки 2
   datetime   time,          // время Time[0]
   double     price          // цена ObjectGetValueByShift("имя линии", 0)
   );
Если у трендовой отключено свойство "луч", то перед определением цены придётся это свойство включить, определить цену, поменять координаты и потом опять отключить.
Либо воспользоваться математическими знаниями и через тангенс высчитать эту цену не прибегая к функции ObjectGetValueByShift()

Друг, спасибо конечно, но это не то, что мне надо. Ещё раз повторюсь! Есть определенная цена и есть время определения этой цены и это соответственно price1 и time1, а price2 будет такой же, как и price1. Горизонтальная линия строится по этим точкам. А вторую координату я выставляю со сдвигом от time1 на какое угодно количество элементов, типа Time[i-1], в этом случае сдвиг идет на одну свечу. То есть получается отрезок длиною от свечи до свечи. А мне нужно другое решение. Вторая координата должна выбираться по факту пересечения цены линии с ценой свечи, которая её пересекает.  Нужно как-то определить факт этого пересечения, как-то определить время этого пересечения и назначить время этого пересечения под вторую координату. Самое сложное для меня это выявить факт пересечения. По каким данным можно это определить.

 

Есть индикатор который строит прямоугольники таким принципом, но он очень сложный для меня, поэтому не могу прочитать код. Если бы кто-нибудь пояснил его по строчкам!!!
Файлы:
9rebs9.mq4  9 kb
 

Maxim Kuznetsov:
если в один момент времени таких линий может быть много (заранее не известно сколько) - то только рисовать граф.объектами и чтобы всё работало правильно, без сбоев учитывая перезагрузки индикатора - кода получится очень много и логика весьма витиевата :-)

а если линий например всего две (4-6, то есть постоянное число) то заводите столько-же буферов и на каждый момент времени записываете в них значения соотв. уровней. Когда цена пробивает уровень #1 (становится например выше), то теперь значенеие #1=#2, #2=#3 а самый дальний расчитывается заново

Maxim Kuznetsov:
если в один момент времени таких линий может быть много (заранее не известно сколько) - то только рисовать граф.объектами и чтобы всё работало правильно, без сбоев учитывая перезагрузки индикатора - кода получится очень много и логика весьма витиевата :-)

а если линий например всего две (4-6, то есть постоянное число) то заводите столько-же буферов и на каждый момент времени записываете в них значения соотв. уровней. Когда цена пробивает уровень #1 (становится например выше), то теперь значенеие #1=#2, #2=#3 а самый дальний расчитывается заново

А сам факт пробития по отношению к уровню как можно определить? 

 
Lovkacher:
факт пробития как0то так примерно:

void OnTick() {
// на каждом тике, и (внимание!) для контроля пробития смотрим High,Low - а не Bid
// потому как тик пробивший уровень может быть и пропущен. Такую-же процедуру по той-же причине проводим и со свеже-закрытым баром, только вместо 0 будет 1
// если в буферах NearestUpper, SecondaryUpper и TernaryUpper лежат значения верхних уровней по порядку (от меньшего к большему)
if (High[0]>NearestUpper[0]) {
  // Хай пробил ближайший уровень сверху
  while(High[0]>NearestUpper[0]) {
      // повторяем потому-что могло быть пробито несколько уровней
      NearestUpper[0]=SecondaryUpper[0];       // ближайшим станет тот который был вторым
      SecondaryUpper[0]=TernaryUpper[0];     // вторым - тот кто был третьим
      TernaryUpper[0]=CalculateWithMyRules(0); // а третий рассчитать полностью (потому-что четвёртого нет)
  }
}

}

 
Maxim Kuznetsov:
факт пробития как0то так примерно:

void OnTick() {
// на каждом тике, и (внимание!) для контроля пробития смотрим High,Low - а не Bid
// потому как тик пробивший уровень может быть и пропущен. Такую-же процедуру по той-же причине проводим и со свеже-закрытым баром, только вместо 0 будет 1
// если в буферах NearestUpper, SecondaryUpper и TernaryUpper лежат значения верхних уровней по порядку (от меньшего к большему)
if (High[0]>NearestUpper[0]) {
  // Хай пробил ближайший уровень сверху
  while(High[0]>NearestUpper[0]) {
      // повторяем потому-что могло быть пробито несколько уровней
      NearestUpper[0]=SecondaryUpper[0];       // ближайшим станет тот который был вторым
      SecondaryUpper[0]=TernaryUpper[0];     // вторым - тот кто был третьим
      TernaryUpper[0]=CalculateWithMyRules(0); // а третий рассчитать полностью (потому-что четвёртого нет)
  }
}

}

OnTick

Событие NewTick генерируется только для экспертов при поступлении нового тика по символу, к графику которого прикреплен эксперт. Функцию OnTick() бесполезно определять в пользовательском индикаторе или скрипте, поскольку событие NewTick для них не генерируется.


 
Lovkacher:

OnTick

Событие NewTick генерируется только для экспертов при поступлении нового тика по символу, к графику которого прикреплен эксперт. Функцию OnTick() бесполезно определять в пользовательском индикаторе или скрипте, поскольку событие NewTick для них не генерируется.


определи сам, не мучайся :-)

фрамент чисто иллюстративный и "написан с руки и по памяти"
 

Для каждой новой линии нужно запоминать текущую цену бид, на момент построения этой линии. 
И потом каждый тик (OnCalculate) сравнивать пробитие цены линии (если бид был внизу, сравниваем пробой бидом вверх, если бид был вверху сравниваем пробой вниз).
Если пробоя нет, удлиняем линию, если пробой есть - останавливаем линию, и больше не сравниваем ее на пробитие.

То есть нужно создать массив структур с описанием линий и пересматривать на каждом тике "живые" линии.

Причина обращения: