Можно так, но - можно и иначе:
// Поиск точки пробоя линии на графике void fLineBreak(string Name // Имя линии ,int& Bar1,double& Price1 // Точка начала ,int& Bar2,double& Price2 // Точка касания ,int& Bar3,double& Price3 // Точка пробоя ,double& Speed){ // Наклон линии datetime Time1, Time2; int Type; Bar1=LastBar-1; Bar2=LastBar-1; Bar3=LastBar-1; Price1=0; Price2=0; Price3=0; Speed=0; if( ObjectFind(Name)!=0 ){ if( РежимОтладки ) Print("*** "+Name+" не найден"); return; } Time1=ObjectGet(Name,OBJPROP_TIME1); Bar1=iBarShift(NULL,0,Time1); Price1=ObjectGet(Name,OBJPROP_PRICE1); Type=ObjectType(Name); switch( Type ){ case OBJ_TREND : // Наклонная линия(основной тип) Time2=ObjectGet(Name,OBJPROP_TIME2); Bar2=iBarShift(NULL,0,Time2); Price2=ObjectGet(Name,OBJPROP_PRICE2); break; case OBJ_HLINE : // Горизонтальная линия Bar2=LastBar; Time2=Time[Bar2]; Price2=Price1; break; default : // Необрабатываемый объект Print("*** "+Name+" недопустимый тип: "+Type); return; } if( Bar1<=Bar2 || Bar1<=LastBar || Bar2<LastBar || Price1<Zero || Price2<Zero ){ if( РежимОтладки ) Print("*** "+Name+" не обработан, параметры: " +DoubleToStr(Price1,Digits)+" ("+Bar1+"/"+TimeToStr(Time1)+")..." +DoubleToStr(Price2,Digits)+" ("+Bar2+"/"+TimeToStr(Time2)+")"); return; }
У Вас же тут просто нахождения координат объекта как я вижу. До последней строчки так точно.
Что у Вас означает переменная LastBar? Если линия проведена рукой, тогда зачем ей присваивать время, так? (для первой точки):
Bar1=LastBar-1;
Вот с функции switch( Type ) дополучаются некоторые данные, нужные для канкретного объекта, и дальше идёт условие:
if( Bar1<=Bar2
|| Bar1<=LastBar
|| Bar2<LastBar
|| Price1<Zero
|| Price2<Zero )
Что это нам даёт?
Простите, кто кого ...бет?
Вы не о том думаешь сударь :) Я о другом думал когда писал это строки. Давайте вернёмся к коду :) А то руки чешутся, да не определился ещё..
Видел я эту тему, но разгребать чужой код сложнее, чем написать свой. Я спрашиваю логику что и как.. А написать уже как-н. постараюсь.
Это же не исходник. Если вскрывать, можно долго мудохаться что б понять это код.
По сути я интересуюсь лишь тем, как правильно получить сигнал от касания ценой линии и всё. В какой момент линия каснётся текущей цены инструмента?
double ObjectGetValueByShift( string name, int shift) Функция вычисляет и возвращает значение цены для указанного бара (смещение относительно текущего бара). Значение цены вычисляется при помощи линейного уравнения по первой и второй координатам. Применяется для трендовых линий и аналогичных объектов. Для получения информации об ошибке необходимо вызвать функцию GetLastError(). См. также ObjectGetShiftByValue(). Параметры: name - Имя объекта. shift - Номер бара. Пример: double price=ObjectGetValueByShift("MyTrendLine#123", 11);
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Нужно сделать так, чтоб по нарисованной рукой линии тянулся ордер какого-н. типа. Есть, например, вот такая ситуация:
Синяя линия нарисована рукой. Линия у нас является лучом. По лучу тянем ордер, в данном случает селлимит.
Вопрос такой, как это адекватнее реализовать?
Я думаю так:
1. Перебираем в цикле объекты, и находим нужный нам.. Тут нужно какое-то имя для идентификации объекта. Но имя должно быть уникальным. Т.к. 2 объекта с одинаковыми линиями нельзя создать в терминале. Получается имя логичнее сделать в виде типа сигнала + некий идентификатор, черпаемый из какого-н. массива, скажем так, логично?
2. Если нашли объект, то цену (или другое свойство нужное нам) получаем с помощью функции ObjectGet(). Далее свойство ( в нашем случае цену) нужно сравнивать с текущими значениями соот-но бида или аска, в зависимости от типа сигнала.
Данную последовательность повторяем на каждом баре. Всё верно, или я что-то упустил? Сложновато как-то воспринимается графика без привычки.