Как посчитать касательную к кривой?

 

Нет ли готовой функции или примера на тему расчёта значения (цены) касательной к некоторой кривой по известной исходной точке (цена/бар)? Т.е. есть исходная цена dPriceFrom, её бар iBarFrom, массив цен кривой adLine[] и бар, для которого надо рассчитать значение касательной iBarTo. У меня пока получается вычислять только луч через экстремум кривой, но это не всегда касательная :(

 

Файлы:
chord.jpg  123 kb
 
f2011:

Нет ли готовой функции или примера на тему расчёта значения (цены) касательной к некоторой кривой по известной исходной точке (цена/бар)? Т.е. есть исходная цена dPriceFrom, её бар iBarFrom, массив цен кривой adLine[] и бар, для которого надо рассчитать значение касательной iBarTo. У меня пока получается вычислять только луч через экстремум кривой, но это не всегда касательная :(

 

Всё дело в том, что любая кривая индикатора на графике - это ломанная, так что мы имеем зачастую просто угол с вершиной в точке касания. И стало быть в чистом виде касательной построить не получится! Если только не произвести какую-нибудь криволинейную интерполяцию в точке касания. Проще постоить ось симметрии угла из трех, рядом стоящих точек кривой и потом провести перпендикуляр к этой оси симметрии через точку касания. Формализация этого дела не так чтобы и шибко сложная!
 

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


 
совсем без перебора вряд ли получится.
 

Получилось так

double GetTangentLevel(int iBarTo, int iBarFrom, double dPriceFrom, double& adLine[], bool bTopSide=true) {
  int iLineBar = iBarFrom + 1;
  double
    dAngle = dPriceFrom - adLine[iLineBar],
    dTmpAngle
  ;

  if(bTopSide)
    while(iLineBar < iBarTo) {
      iLineBar++;
      dTmpAngle = (dPriceFrom - adLine[iLineBar]) / (iLineBar - iBarFrom);
      if(dTmpAngle < dAngle) dAngle = dTmpAngle;
    }
  else
    while(iLineBar < iBarTo) {
      iLineBar++;
      dTmpAngle = (dPriceFrom - adLine[iLineBar]) / (iLineBar - iBarFrom);
      if(dTmpAngle > dAngle) dAngle = dTmpAngle;
    }

  return (dPriceFrom - dAngle * (iBarTo - iBarFrom));
}

Должно существовать что-то более оптимальное..

 
GT788:
совсем без перебора вряд ли получится.

Ну как сказать. Если есть математическое уравнение кривой и координата одной точки для касательной, то общее уравнение всех касательных построить можно. А из этого уравнения определить, существует ли хотя бы одна касательная, удовлетворяющая требуемым условиям. Задачка математически вполне решаемая, но весь вопрос, а кто её и за какой интерес будет решать?

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

 
Кривая задана массивом точек - увы мне, про формулу форекса ничё не слышал и хрен жеж кто поделитсо.. А без уравнения, пожалуй действительно, только перебор поможет. Остаётся вопрос о наиболее оптимальном алгоритме
 
f2011:
Кривая задана массивом точек - увы мне, про формулу форекса ничё не слышал и хрен жеж кто поделитсо.. А без уравнения, пожалуй действительно, только перебор поможет. Остаётся вопрос о наиболее оптимальном алгоритме
Формализация в программном коде итерационного процесса, сходящегося к найденной в итоге касательной - это уже достаточно трудоёмкая задачка совсем не одного часа работы с кучей уточнений, едва ли кто её запросто так возьмётся делать!
 
GODZILLA:
Формализация в программном коде итерационного процесса, сходящегося к найденной в итоге касательной - это уже достаточно трудоёмкая задачка совсем не одного часа работы с кучей уточнений, едва ли кто её запросто так возьмётся делать!

За 500 р. на телефон, сделаю за час.  Сам алгоритм 15-20 мин. Ну и на вылизывание (искоренение ошибок) запас нужно оставить.. :)

Бесплатно напрягаться неохота - работы сейчас многовато.

 

Нужно аппроксимировать по 3-5 или 7 точкам с помощью сплайна. А для сплайна вычислить производную не составляет труда.
 
Rosh:

Проще считать "производную" усредненно. Но это не проблема на самом деле.

Проблема раз это то, что кривая не выпуклая, т.е. в любом случае проверять пересечение каждой касательной с кривой.

Проблема два -- множество вариантов касательных на выходе и выбор из них оптимально нужной\требуемой. Это посложнее.

Причина обращения: