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

Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Это в истории или в текущее время? В истории можно воспользоваться функцией CopyTime а текущее Time[0]
Если в общих чертах, создать в индикаторе дополнительный индикаторный буфер, при пересечении присвоить соответствующему элементу этого буфера время, а потом на каждом баре подтягивать его за собой - брат из предыдущего элемента и присваивать текущему. Таким образом на нулевом баре будут время последнего перемещения.
Есть похуже вариант - при пересечении присвоить время глобальной переменн
Если в общих чертах, создать в индикаторе дополнительный индикаторный буфер, при пересечении присвоить соответствующему элементу этого буфера время, а потом на каждом баре подтягивать его за собой - брат из предыдущего элемента и присваивать текущему. Таким образом на нулевом баре будут время последнего перемещения.
Есть похуже вариант - при пересечении присвоить время глобальной переменной, и в ней всегда будет время последнего пересечения.
А как присвоить это время глобальной переменной, а может и локальной как-то можно?
Для каждой линии пересечение будет разным. А текущее время всегда будет ведь на нулевом баре? И линии всегда будут окончиваться на текущем времени? Так что Time [0] не подходит наверное или я не правильно понимаю
Верхняя стрелка указывает на первую точку привязки трендовой линии.
Вторая - на вторую.
Значение цены в точке третьей стрелки надо узнать с помощью функции
long chart_id, // идентификатор графика
string object_name, // имя объекта
int point_index, // номер привязки 2
datetime time, // время Time[0]
double price // цена ObjectGetValueByShift("имя линии", 0)
);
Либо воспользоваться математическими знаниями и через тангенс высчитать эту цену не прибегая к функции ObjectGetValueByShift()
Верхняя стрелка указывает на первую точку привязки трендовой линии.
Вторая - на вторую.
Значение цены в точке третьей стрелки надо узнать с помощью функции
long chart_id, // идентификатор графика
string object_name, // имя объекта
int point_index, // номер привязки 2
datetime time, // время Time[0]
double price // цена ObjectGetValueByShift("имя линии", 0)
);
Либо воспользоваться математическими знаниями и через тангенс в
Верхняя стрелка указывает на первую точку привязки трендовой линии.
Вторая - на вторую.
Значение цены в точке третьей стрелки надо узнать с помощью функции
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], в этом случае сдвиг идет на одну свечу. То есть получается отрезок длиною от свечи до свечи. А мне нужно другое решение. Вторая координата должна выбираться по факту пересечения цены линии с ценой свечи, которая её пересекает. Нужно как-то определить факт этого пересечения, как-то определить время этого пересечения и назначить время этого пересечения под вторую координату. Самое сложное для меня это выявить факт пересечения. По каким данным можно это определить.
Maxim Kuznetsov:
если в один момент времени таких линий может быть много (заранее не известно сколько) - то только рисовать граф.объектами и чтобы всё работало правильно, без сбоев учитывая перезагрузки индикатора - кода получится очень много и логика весьма витиевата :-)
а если линий например всего две (4-6, то есть постоянное число) то заводите столько-же буферов и на каждый момент времени записываете в них значения соотв. уровней. Когда цена пробивает уровень #1 (становится например выше), то теперь значенеие #1=#2, #2=#3 а самый дальний расчитывается заново
если в один момент времени таких линий может быть много (заранее не известно сколько) - то только рисовать граф.объектами и чтобы всё работало правильно, без сбоев учитывая перезагрузки индикатора - кода получится очень много и логика весьма витиевата :-)
а если линий например всего две (4-6, то есть постоянное число) то заводите столько-же буферов и на каждый момент времени записываете в них значения соотв. уровней. Когда цена пробивает уровень #1 (становится например выше), то теперь значенеие #1=#2, #2=#3 а самый дальний расчитывается заново
А сам факт пробития по отношению к уровню как можно определить?
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); // а третий рассчитать полностью (потому-что четвёртого нет)
}
}
}
факт пробития как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 для них не генерируется.
OnTick
Событие NewTick генерируется только для экспертов при поступлении нового тика по символу, к графику которого прикреплен эксперт. Функцию OnTick() бесполезно определять в пользовательском индикаторе или скрипте, поскольку событие NewTick для них не генерируется.
фрамент чисто иллюстративный и "написан с руки и по памяти"
Для каждой новой линии нужно запоминать текущую цену бид, на момент построения этой линии.
И потом каждый тик (OnCalculate) сравнивать пробитие цены линии (если бид был внизу, сравниваем пробой бидом вверх, если бид был вверху сравниваем пробой вниз).
Если пробоя нет, удлиняем линию, если пробой есть - останавливаем линию, и больше не сравниваем ее на пробитие.
То есть нужно создать массив структур с описанием линий и пересматривать на каждом тике "живые" линии.