Графическое перекрестие трендовых линий, функция ObjectGetValueByTime что с ней не так? - страница 4

 
Алексей Тарабанов:

Нет, с индикатора данные снимать можно будет только через элеватор. 

Я редко бываю здесь, пока не понимаю что вы имеете в виду. Надеюсь вы не имеете ввиду комбикормовый завод, а говорите о транспортировке данных из индикатора в другие программы...

 

Банальная ошибка в функции, нужно было сделать проверку на скрещение. 

Все работает в мт4,и перекрестие двух прямых найти можно на любом промежутке.

  1 2

 

Функции для поиска перекрестия

//+----------------------------------------------------------------------------+
//| Цена пересечения двух прямых отрезков: автор Martingeil MQL4 2020г. янв.   |
//| x1 = цена  первой линии А, x2 = цена  первой линии Б                       |
//| x3 = цена  второй линии С, x4 = цена  второй линии Д                       |
//| у1 = время первой линии А, у2 = время первой линии Б                       |
//| у3 = время второй линии С, у4 = время второй линии Д                       |
//| функция возвращает цену пересечения, если нет пересечения возвращает ноль  |
//+----------------------------------------------------------------------------+
double PriceX (double x1,double x2,double x3,double x4,double y1,double y2,double y3,double y4) {

   double k1,k2; 
   double X,Y;
   double z1,z2,z3,z4;
     
      // проверим: если линии не пересекаются, то завершим работу
      z1 = ( x4-x3 )*( y1-y3 )-( y4-y3 )*( x1-x3 );
      z2 = ( x4-x3 )*( y2-y3 )-( y4-y3 )*( x2-x3 );
      z3 = ( x2-x1 )*( y3-y1 )-( y2-y1 )*( x3-x1 );
      z4 = ( x2-x1 )*( y4-y1 )-( y2-y1 )*( x4-x1 );
      
      if((z1*z2>0) && (z3*z4>0)) return(0); // если нет пересечения завершаем работу функции
      
    k1=(x2-x1)/(y2-y1); 
    k2=(x4-x3)/(y4-y3);
    
    if(k1 != k2)
      {
      Y = NormalizeDouble((x1 - x3 + k2*y3 - k1*y1)/(k2 - k1),0); // время перекрестия
      X = NormalizeDouble( x1 + k1*(Y - y1),_Digits);             // цена  перекрестия
      }
return(X);
}    
//+----------------------------------------------------------------------------+
//| Время пересечения двух прямых отрезков: автор Martingeil MQL4 2020г. янв.  |
//| x1 = цена  первой линии А, x2 = цена  первой линии Б                       |
//| x3 = цена  второй линии С, x4 = цена  второй линии Д                       |
//| у1 = время первой линии А, у2 = время первой линии Б                       |
//| у3 = время второй линии С, у4 = время второй линии Д                       |
//| функция возвращает время пересечения, если нет пересечения возвращает ноль |
//+----------------------------------------------------------------------------+
double TimeY (double x1,double x2,double x3,double x4,double y1,double y2,double y3,double y4) {

   double k1,k2;  
   double X,Y;
   double z1,z2,z3,z4;
     
      // проверим: если линии не пересекаются, то завершим работу
      z1 = ( x4-x3 )*( y1-y3 )-( y4-y3 )*( x1-x3 );
      z2 = ( x4-x3 )*( y2-y3 )-( y4-y3 )*( x2-x3 );
      z3 = ( x2-x1 )*( y3-y1 )-( y2-y1 )*( x3-x1 );
      z4 = ( x2-x1 )*( y4-y1 )-( y2-y1 )*( x4-x1 );
      
      if((z1*z2>0) && (z3*z4>0)) return(0); // если нет пересечения завершаем работу функции
      
    k1=(x2-x1)/(y2-y1); 
    k2=(x4-x3)/(y4-y3);
    
    if(k1 != k2)
      {
      Y = NormalizeDouble((x1 - x3 + k2*y3 - k1*y1)/(k2 - k1),0); // время перекрестия
      X = NormalizeDouble( x1 + k1*(Y - y1),_Digits);             // цена  перекрестия
      }
return(Y);
}    
//+----------------------------------------------------------------------------+
 

Nikolai Semko:

запустите на разных периодах следующий скрипт:

и получите следующий результат:

void OnStart() {
   datetime time1 = D'2019.04.01 15:37';
   datetime time2 = D'2020.01.11 04:10';
   ObjectCreate(0,"TrendLine01",OBJ_TREND,0,time1,1.20,time2,1.05);
   double pr=ObjectGetValueByTime(0,"TrendLine01",D'2020.01.02 20:02');
   Print (pr);
}

Кстати этому тоже есть решение, с моего города мой земляк еще 2008 году ее решил..

так для себя оставлю ссылку чтобы искать было легче.

https://www.mql5.com/ru/code/8080

Функции ObjectGetValue_ByCurrent .....Delta_ByCurrent .....Delta_ByTimeShift .....Delta_PerBar
Функции ObjectGetValue_ByCurrent .....Delta_ByCurrent .....Delta_ByTimeShift .....Delta_PerBar
  • www.mql5.com
Функция учитывает пропуски баров в выходные дни, и размещение графического объекта правее рынка. Это позволяет оперировать объектами выходящими за позицию нулевого бара. На нулевом баре это будет истинное значение. На любом другом баре это будет значение смещенное на истекшее время формирования нулевого бара. Т.е. при вызове с номером бара...
 
Martingeil:

Вопрос по библиотеке вашей, будет возможность снимать данные с индикатора так же через буфер? 

Никто не мешает данные индикатора записывать в индикаторый буфер без отрисовки (INDICATOR_CALCULATIONS) для дальнейшего использования в iCustom.

Более того, Вы можете записывать любые структуры или массивы структур в индикаторный буфер (через union), а потом считывать (декодировать) эти структуры через iCustom, предоставляя пользователю функцию декодирования структур. Это даст большую гибкость, наглядность и удобство применения пользовательских индикаторов.

 
Nikolai Semko:

Никто не мешает данные индикатора записывать в индикаторый буфер без отрисовки (INDICATOR_CALCULATIONS) для дальнейшего использования в iCustom.

Более того, Вы можете записывать любые структуры или массивы структур в индикаторный буфер (через union), а потом считывать (декодировать) эти структуры через iCustom, предоставляя пользователю функцию декодирования структур. Это даст большую гибкость, наглядность и удобство применения пользовательских индикаторов.

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

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

 
Martingeil:

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

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

Я тоже сижу на четверке, но я в средней школе учил английский язык, а Вы - не очень. 

 
Алексей Тарабанов:

Я тоже сижу на четверке, но я в средней школе учил английский язык, а Вы - не очень. 

При чем здесь язык в наш век технологий, даже здесь на форуме можно перевести пост нажав на кнопку.

Я ответил на его ответ мне в его ветке, Николай сказал что у него есть лучшее решение считывания данных, но он его не даст. 

На торговлю язык как-то влияет? Или это опять из песни элеватора?

 

Ладно, не стану затягивать паузу. 

В Англии неделя начинается в Воскресенье, а заканчивается в Субботу. Weekend, однако. 

Еще, в Англии нет первого этажа, есть Ground Floor. И 13 тоже нет. 

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

 
Алексей Тарабанов:

Ладно, не стану затягивать паузу. 

В Англии неделя начинается в Воскресенье, а заканчивается в Субботу. Weekend, однако. 

Еще, в Англии нет первого этажа, есть Ground Floor. И 13 тоже нет. 

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

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