помогите с индикатором, немогу посичтать время для вертикальной линии

 

Нужно чтобы вертикальная линия рисовалась на пересечении горизонтальной и трендовой. Но непонятно как для вертикальной посичтать время, возможно у времени другой формат в отличии от цены.
Смысл индикатора в том что трендовая линия теряет свою силу (игнорируется) после того как цена прошла двойное расстояние тредовой линии. Где вертикальная линия должна указывать время где цена развернется еще не пробив тредовую линию.
Помогите пожалуста, уже все перепробовал что мог.

//+------------------------------------------------------------------+
//|                                              Double Distance.mq4 |
//|                                               Copyright © L-user |
//|                                                       22.04.2010 | 
//|                                                   Описание: link | 
//+------------------------------------------------------------------+
string str="Double Distance.mq4";
#property copyright "L-user"
#property link ""
#property indicator_chart_window

void init()
{

ObjectCreate("Trendline 1", OBJ_TREND, 0, Time[10], High[10], Time[0], High[0]);
ObjectSet("Trendline 1", OBJPROP_COLOR, Red); 
ObjectSet("Trendline 1", OBJPROP_WIDTH, 1);

   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

int start()
{

int i=IndicatorCounted();
i=Bars;
while(i>=0)
{

ObjectDelete("TimeTarget 1");
ObjectDelete("PriceTarget 1");

double time1=ObjectGet("Trendline 1", OBJPROP_TIME1);
double time2=ObjectGet("Trendline 1", OBJPROP_TIME2);
double time3=ObjectGet("Trendline 1", OBJPROP_TIME3);

double price1=ObjectGet("Trendline 1", OBJPROP_PRICE1);
double price2=ObjectGet("Trendline 1", OBJPROP_PRICE2);
double price3=ObjectGet("Trendline 1", OBJPROP_PRICE3);

ObjectSet("Trendline 1", OBJPROP_PRICE3, price2+(price2-price1));
ObjectSet("Trendline 1", OBJPROP_TIME3, time2+(time2-time1));// Как в этом месте посчитать время??? У меня считается неправильно.

ObjectCreate("PriceTarget 1", OBJ_HLINE, 0, i, price3);
ObjectSet("PriceTarget 1", OBJPROP_COLOR, Blue); 
ObjectSet("PriceTarget 1", OBJPROP_BACK, true);
ObjectSet("PriceTarget 1", OBJPROP_WIDTH, 1);
ObjectSet("PriceTarget 1", OBJPROP_STYLE, STYLE_DOT);

ObjectCreate("TimeTarget 1", OBJ_VLINE, 0, time3, price3);
ObjectSet("TimeTarget 1", OBJPROP_COLOR, Blue); 
ObjectSet("TimeTarget 1", OBJPROP_WIDTH, 1);
ObjectSet("TimeTarget 1", OBJPROP_BACK, true);
ObjectSet("TimeTarget 1", OBJPROP_STYLE, STYLE_DOT);

i--;
   }
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {

   return(0);
  }

  
//+------------------------------------------------------------------+
Файлы:
dobdis.mq4  3 kb
 
время у тебя считается не правильно, потому что ты считаешь 3ю координату, а у трендовой линии нету 3ей координаты, их всего 2. Да и вобще непонятно зачем тут цикл
 
алгоритм прост
берутся две цены и два времени трендовой линии из них получаем коэффициент наклона линии = разница ценовых координат трендовой / разница в барах двух временых координат, далее находится отклонение в барах от правой точки трендовой линии до бара, на котором произошло пересечение в некоторой ценой (горизонтальная линия), т.е. из цены правой точки трендовой вычитаем цену горизонтальной линии и эту разность делим на полученный ранее коэффициент, т.о.
получаем количество баров через которое произойдет пересечение,
т.е. время пересечения = Time[бар правой точки трендовой - полученное отклонение] - это при условии разница (бар правой точки трендовой - полученное отклонение) больше либо равна нулю, т.е. точка пересечения на истории, а не в будущем..
если разница (бар правой точки трендовой - полученное отклонение) отрицательная, то время вычисляется как
Time[0] + MathAbs(бар правой точки трендовой - полученное отклонение) * Period() * 60

могут быть неточности в 1 бар, из-за того того что пересечения как правило случаются между барами, ну это ты сам уже скорректируй..
 
keekkenen >>:
алгоритм прост
берутся две цены и два времени трендовой линии из них получаем коэффициент наклона линии = разница ценовых координат трендовой / разница в барах двух временых координат, далее находится отклонение в барах от правой точки трендовой линии до бара, на котором произошло пересечение в некоторой ценой (горизонтальная линия), т.е. из цены правой точки трендовой вычитаем цену горизонтальной линии и эту разность делим на полученный ранее коэффициент, т.о.
получаем количество баров через которое произойдет пересечение,
т.е. время пересечения = Time[бар правой точки трендовой - полученное отклонение] - это при условии разница (бар правой точки трендовой - полученное отклонение) больше либо равна нулю, т.е. точка пересечения на истории, а не в будущем..
если разница (бар правой точки трендовой - полученное отклонение) отрицательная, то время вычисляется как
Time[0] + MathAbs(бар правой точки трендовой - полученное отклонение) * Period() * 60

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

а не проще ли циклом просто узнать бар, на котором цена трендовой линии равна горизонтальному уровню? Потом по бару получается время и ставится вертикальная линия.

 
не вижу смысла делать цикл..
какой смысл вычислять циклом сколько раз тройка без остатка входит в число 29 ? MathFloor(29./3.) и все, какие циклы ?
 
мы не про тройки говорим. С циклами будет точнее в данной ситуации, а по производительности..да тож самое, не существенно
 
L-user >>:

Нужно чтобы вертикальная линия рисовалась на пересечении горизонтальной и трендовой. Но непонятно как для вертикальной посичтать время, возможно у времени другой формат в отличии от цены.
Смысл индикатора в том что трендовая линия теряет свою силу (игнорируется) после того как цена прошла двойное расстояние тредовой линии. Где вертикальная линия должна указывать время где цена развернется еще не пробив тредовую линию.
Помогите пожалуста, уже все перепробовал что мог.

Для постоения вертикальной линии нужна всего одна координата - время.
В данности имееться горизонтальная линия тоже с одной координатой - уровнем, и трендлиния с 4-мя координатами (время1,уровень1,время2,уровень2).
Те задача состоит в том чтоб найти время когда трендлиния будет иметь уровень горизонтальной линии.
Отсюда Коэф.наклона=(уровень2-уровень1)/(время2-время1)
дальше B=(уровень_горизонтальной_линии-уровень1)/Коэф.наклона
где В--> это количество бар от время1 до точки пересечения,
тут важно В что может быть дробное, поэтому если int b=В; если b!=B то результат находитьсямежду b и b+1.
зы можно просто нормализовать B до 0 знака после запятой, те если B будет стремиться к меньшему то останеться целочисленная часть если к большему то к целочисленной добавиться 1. Такой вариат лучше тем что позволяет обойтись без if()
 
Urain >>:
Такой вариат лучше тем что позволяет обойтись без if()

об этом я и писал

 
keekkenen >>:

об этом я и писал

подумаешь if, такой вариант не слишком состоятелен, тк алгоритм часто будет промазывать на бар

 
дело не в if-е, а алгоритме, цикл также будет промазывать, потому что алгоритма не зависит попадет пересечение на баре или нет..
 
keekkenen >>:
дело не в if-е, а алгоритме, цикл также будет промазывать, потому что алгоритма не зависит попадет пересечение на баре или нет..

ну для начала промазывает выше указанный метод из-за работы с дробными числами и итоговый номер бара получается дробный. Цикл же работает с целыми(напрямую с номерами баров), поэтому никаких промазываний не будет, это просто исключено.

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