Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Знаете ли вы, что в MQL5 появилась обработка событий?
hoz
1936
hoz 2013.03.12 22:11 

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

Ситуация для примера 

 Синяя линия нарисована рукой. Линия у нас является лучом. По лучу тянем ордер, в данном случает селлимит.

 Вопрос такой, как это адекватнее реализовать?

 Я думаю так:

1. Перебираем в цикле объекты, и находим нужный нам.. Тут нужно какое-то имя для идентификации объекта. Но имя должно быть уникальным. Т.к. 2 объекта с одинаковыми линиями нельзя создать в терминале. Получается имя логичнее сделать в виде типа сигнала + некий идентификатор, черпаемый из какого-н. массива, скажем так, логично?

2.  Если нашли объект, то  цену (или другое свойство нужное нам) получаем с помощью функции ObjectGet(). Далее свойство ( в нашем случае цену) нужно сравнивать с текущими значениями соот-но бида или аска, в зависимости от типа сигнала.

  Данную последовательность повторяем на каждом баре. Всё верно, или я что-то упустил? Сложновато как-то воспринимается графика без привычки.

Алексей Тарабанов
7220
Алексей Тарабанов 2013.03.12 22:15  

Можно так, но - можно и иначе: 

// Поиск точки пробоя линии на графике
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;
   }
hoz
1936
hoz 2013.03.13 13:40  

 У Вас же тут просто нахождения координат объекта как я вижу. До последней строчки так точно.

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

 Bar1=LastBar-1;

 Вот с функции switch( Type ) дополучаются некоторые данные, нужные для канкретного объекта, и дальше идёт условие:

 

 if( Bar1<=Bar2
    || Bar1<=LastBar
    || Bar2<LastBar
    || Price1<Zero
    || Price2<Zero )
Что это нам даёт?
Алексей Тарабанов
7220
Алексей Тарабанов 2013.03.13 22:03  
Простите, кто кого ...бет? 
unreal
474
unreal 2013.03.14 02:22  
hoz
1936
hoz 2013.03.14 06:10  
tara:
Простите, кто кого ...бет? 

 Вы не о том думаешь сударь :) Я о другом думал когда писал это строки.  Давайте вернёмся к коду :) А то руки чешутся, да не определился ещё..

 


 Видел я эту тему, но разгребать чужой код сложнее, чем написать свой. Я спрашиваю логику что и как.. А написать уже как-н. постараюсь.

poruchik
907
poruchik 2013.03.14 11:35  

  Cигнализатор,  думаю можно будет переделать

отсюда  http://mtexperts.narod.ru/linewithalerts.html

Файлы:
hoz
1936
hoz 2013.03.14 14:27  
poruchik:

  Cигнализатор,  думаю можно будет переделать

отсюда  http://mtexperts.narod.ru/linewithalerts.html


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

По сути я интересуюсь лишь тем, как правильно получить сигнал от касания ценой линии и всё. В какой момент линия каснётся текущей цены инструмента?

Dima.A
140
Dima.A 2013.03.14 15:08  
hoz:


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

По сути я интересуюсь лишь тем, как правильно получить сигнал от касания ценой линии и всё. В какой момент линия каснётся текущей цены инструмента?

функция ObjectGetValueByShift вам в помощь
double ObjectGetValueByShift( string name, int shift) 
Функция вычисляет и возвращает значение цены для указанного бара (смещение относительно текущего бара). Значение цены вычисляется при помощи линейного уравнения по первой и второй координатам. Применяется для трендовых линий и аналогичных объектов. Для получения информации об ошибке необходимо вызвать функцию GetLastError(). 
См. также ObjectGetShiftByValue(). 
Параметры:
name   -   Имя объекта. 
shift   -   Номер бара. 

Пример:
  double price=ObjectGetValueByShift("MyTrendLine#123", 11);

 
hoz
1936
hoz 2013.03.15 11:36  
 Благодарю. Смотря я на эту функция. Но что-то были свои затупы. Щяс понимаю, что это как-раз таки то, что нужно.
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий