Аналог ObjectGetValueByTime может кто то реализовывал ? - страница 4

 
Vladimir Pastushak #:

Результат не верный 

Давайте рассмотрим эту конкретную ситуацию. Дайте точные данные проведенной линии:

  1. Два бара времени
  2. Два значения цены
  3. ТФ.
  4. Время открытия бара, для которого производится расчет.
 
Ihor Herasko #:
Нет никаких проблем. Все то же самое. Просто индексы баров отрицательные. Единственное, что меняется, это обязательный перерасчет значения на каждом новом баре.

Вот именно…

следовательно полного соответствия не будет. Это я сам только сейчас понял. Для полного соответствия надо время в будущем обрезать до времени текущего бара. 

 
Alexey Viktorov #:

Вот именно…

На расчет это никак не влияет. 


следовательно полного соответствия не будет. Это я сам только сейчас понял. Для полного соответствия надо время в будущем обрезать до времени текущего бара. 

Так ведь это проблемы ObjectGetValueByTime(), а не расчета. Чем плохо, что та фукнция не может, а наш расчет может?
 
Ihor Herasko #:

На расчет это никак не влияет. 

Так ведь это проблемы ObjectGetValueByTime(), а не расчета. Чем плохо, что та фукнция не может, а наш расчет может?
Ничем не плохо. Но Владимир на протяжении всего обсуждения любой вариант сравнивает с показаниями ObjectGetValueByTime() и никак не может получить нужное значение. По картинкам на предыдущей странице видно, что правая координата трендовой в будущем…
 
Alexey Viktorov #:
Ничем не плохо. Но Владимир на протяжении всего обсуждения любой вариант сравнивает с показаниями ObjectGetValueByTime() и никак не может получить нужное значение. По картинкам на предыдущей странице видно, что правая координата трендовой в будущем…
И тем не менее, расчет от ObjectGetValueByTime(), судя по скрину, правильно показывает цену, которая расположена на трендовой линии. То есть расчет нельзя назвать неправильным. В то же время, собственный расчет почему-то показывает цену, которая не лежит на трендовой линии. Вот это для меня загадка. Возможно, в собственном расчете в качестве правой точки подставлен бар с индексом 0 или положительный вместо отрицательного. Я потому и запросил исходные данные для воспроизведения.
 
Ihor Herasko #:
И тем не менее, расчет от ObjectGetValueByTime(), судя по скрину, правильно показывает цену, которая расположена на трендовой линии. То есть расчет нельзя назвать неправильным. В то же время, собственный расчет почему-то показывает цену, которая не лежит на трендовой линии. Вот это для меня загадка. Возможно, в собственном расчете в качестве правой точки подставлен бар с индексом 0 или положительный вместо отрицательного. Я потому и запросил исходные данные для воспроизведения.

Экспериментирую

// =============================================================================================== //
// =                                                                                             = //
// =============================================================================================== //
double CMyLine :: Price(void) // === Возвращает цену
  {

   if(!w_work)
      return(false);

double rezult_original = ::ObjectGetValueByTime(0, m_line.Name(), ::TimeCurrent(), 0);
double rezult_custom   = PredictPriceFromTwoPoints(m_line.Time(0), m_line.Price(0), m_line.Time(1), m_line.Price(1), TimeCurrent());

::Print("rezult_original "+DoubleToString(rezult_original,_Digits)+" rezult_custom "+DoubleToString(rezult_custom,_Digits));



 return(::ObjectGetValueByTime(0, m_line.Name(), ::TimeCurrent(), 0));

 //  return(PredictPriceFromTwoPoints(m_line.Time(0), m_line.Price(0), m_line.Time(1), m_line.Price(1), TimeCurrent()));
  }
// =============================================================================================== //
// =                                                                                             = //
// =============================================================================================== //
double PredictPriceFromTwoPoints(const datetime time1, const double price1, const datetime time2, const double price2, const datetime targetTime)
  {

   int nLeftBar  = iBarShift(_Symbol, PERIOD_CURRENT, time1, true);
   int nRightBar = iBarShift(_Symbol, PERIOD_CURRENT, time2, true);

   if(nRightBar < 0)
      nRightBar = 0;

   double fKKoef = 0;
   double fBKoef = CalculateBAndKKoefs(nLeftBar, price1, nRightBar, price2, fKKoef);

   int nThirdBar = 1;
   double fPrice3 = fKKoef * nThirdBar + fBKoef;

   ::Print("nLeftBar " + nLeftBar + " nRightBar " + nRightBar + " fBKoef " + fBKoef + " fKKoef " + fKKoef + " fPrice3 " + DoubleToString(fPrice3,_Digits));

   return(fPrice3);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double CalculateBAndKKoefs(const int nX1, const double fY1, const int nX2, const double fY2, double &fKKoef)
  {
   if(nX1 == nX2)
      return DBL_MAX;

   fKKoef = (fY2 - fY1) / (nX2 - nX1);
   return fY1 - fKKoef * nX1;
  }

Результат

2026.04.17 23:37:02.475 Test TP SL (EURUSD,H1)  rezult_original 1.17363 rezult_custom 1.17401
2026.04.17 23:37:02.527 Test TP SL (EURUSD,H1)  nLeftBar 120 nRightBar 0 fBKoef 1.1740605462822458 fKKoef -0.00009997470915528532 fPrice3 1.17396
2026.04.17 23:37:02.527 Test TP SL (EURUSD,H1)  rezult_original 1.17358 rezult_custom 1.17396
2026.04.17 23:37:03.108 Test TP SL (EURUSD,H1)  nLeftBar 120 nRightBar 0 fBKoef 1.1741113808801213 fKKoef -0.0001003983308042485 fPrice3 1.17401
2026.04.17 23:37:03.108 Test TP SL (EURUSD,H1)  rezult_original 1.17363 rezult_custom 1.17401
2026.04.17 23:37:03.169 Test TP SL (EURUSD,H1)  nLeftBar 120 nRightBar 0 fBKoef 1.174263884673748 fKKoef -0.00010166919575113806 fPrice3 1.17416
2026.04.17 23:37:03.169 Test TP SL (EURUSD,H1)  rezult_original 1.17378 rezult_custom 1.17416
2026.04.17 23:37:03.236 Test TP SL (EURUSD,H1)  nLeftBar 120 nRightBar 0 fBKoef 1.1743147192716237 fKKoef -0.00010209281740010123 fPrice3 1.17421
2026.04.17 23:37:03.236 Test TP SL (EURUSD,H1)  rezult_original 1.17387 rezult_custom 1.17421
2026.04.17 23:37:03.256 Test TP SL (EURUSD,H1)  nLeftBar 120 nRightBar 0 fBKoef 1.1743655538694993 fKKoef -0.00010251643904906442 fPrice3 1.17426
2026.04.17 23:37:03.256 Test TP SL (EURUSD,H1)  rezult_original 1.17387 rezult_custom 1.17426
2026.04.17 23:37:03.941 Test TP SL (EURUSD,H1)  nLeftBar 120 nRightBar 0 fBKoef 1.1743655538694993 fKKoef -0.00010251643904906442 fPrice3 1.17426
2026.04.17 23:37:03.941 Test TP SL (EURUSD,H1)  rezult_original 1.17392 rezult_custom 1.17426
2026.04.17 23:37:03.973 Test TP SL (EURUSD,H1)  nLeftBar 120 nRightBar 0 fBKoef 1.1744163884673748 fKKoef -0.0001029400606980276 fPrice3 1.17431
2026.04.17 23:37:03.973 Test TP SL (EURUSD,H1)  rezult_original 1.17392 rezult_custom 1.17431
2026.04.17 23:37:04.756 Test TP SL (EURUSD,H1)  nLeftBar 120 nRightBar 0 fBKoef 1.1744163884673748 fKKoef -0.0001029400606980276 fPrice3 1.17431
2026.04.17 23:37:04.756 Test TP SL (EURUSD,H1)  rezult_original 1.17392 rezult_custom 1.17431

Не сходятся значения.

nThirdBar 

Пробовал ставить 0 то же не сходятся.

   if(nRightBar < 0)
      nRightBar = 0;

Исключил бар за пределами.

 
Может быть, если разработчики читают наши рукоблудия помогут ?
 
Vladimir Pastushak #:

Экспериментирую

Результат

Не сходятся значения.

Пробовал ставить 0 то же не сходятся.

Исключил бар за пределами.

Нужны данные, которые в коде получаются через m_line.Time(0) и т. д. Проверьте их, скорее всего, именно там ошибка.
 
Vladimir Pastushak #:

Экспериментирую

Результат

Не сходятся значения.

Пробовал ставить 0 то же не сходятся.

Исключил бар за пределами.

И почему индекс бара для TimeCurrent() установлен как 1? Он должен быть 0.

Также еще учтите, что если правый бар находится правее текущего бара, то вот здесь:

int nRightBar = iBarShift(_Symbol, PERIOD_CURRENT, time2, true);

будет получено -1 вместо правильного индекса бара.

 

Нашёл причину. Галочка "Точная шкала времени.

Если стоит галка то формула тангенса полностью совпадает с ObjectGetValueByTime(), если галки нет, то чем больше угол трендовой тем больше разница в результатах.

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

Гифка работает только если на неё кликнуть.


ps вот такой вариант округления в пользовательской функции, даёт одинаковый результат с ObjectGetValueByTime(), не зависимо от галки в настройках.

            int persec = PeriodSeconds();
            long t0 = time0 - time0 % persec;
            long t1 = time1 - time1 % persec;
            long t2 = time2 - time2 % persec;
            price2 = price0 + (price1 - price0) * (t2 - t0) / (t1 - t0);


Думаю здесь все понимают, что вот это 

  fKKoef = (fY2 - fY1) / (nX2 - nX1);

  return fY1 - fKKoef * nX1;

и то, что написал я, это одно и то же. Формула тангенса.