Calcule a distância entre duas linhas paralelas incluindo ! - página 7

 
Олег avtomat:

da maneira que você quiser.

Como você pode ver, não há nada de complicado nisso. Basta pensar um pouco sobre isso.

Com uma resposta tão detalhada, acho que a TC será capaz de escrever o código sozinha.

Muitas pessoas aqui já esqueceram os problemas escolares porque não conseguiam entender seu significado na escola.

 

A saída é:

 // ЗАДАЕМ ДВЕ ТОЧКИ ПРИВЯЗКИ ДЛЯ ГЛАВНОЙ ЛИНИИ: ТОЧКА1(ВРЕМЯ,ЦЕНА) и ТОЧКА2(ВРЕМЯ,ЦЕНА)
   // ЭТА ЛИНИИ ГЛАВНАЯ
   datetime Line1_Врем0=Time[0], Line1_Врем1=Time[10];
   double Line1_Цена0=High[10], Line1_Цена1=Low[10];

   ObjectCreate("Line1",OBJ_TRENDBYANGLE,0,Line1_Врем0,Line1_Цена0,Line1_Врем1,Line1_Цена1);
   ObjectSetInteger(0,"Line1",OBJPROP_STYLE,STYLE_SOLID);
   ObjectSetInteger(0,"Line1",OBJPROP_COLOR,Red);
   ObjectSetInteger(0,"Line1",OBJPROP_WIDTH,2);

   // СТРОИМ ПАРАЛЛЕЛЬНУЮ ЛИНИЮ ТОЛЬКО ПО ОДНОЙ ТОЧКЕ-ПРИВЯЗКЕ
   ObjectCreate("Line2",OBJ_TRENDBYANGLE,0,Time[15],Low[15],0,0);
   ObjectSetInteger(0,"Line2",OBJPROP_STYLE,STYLE_SOLID);
   ObjectSetInteger(0,"Line2",OBJPROP_COLOR,Lime);
   ObjectSetInteger(0,"Line2",OBJPROP_WIDTH,2);

  // ПРИСВАИВАЕМ ЛИНИИ Line2 ТАКОЙ ЖЕ САМЫЙ УГОЛ КАК В ЛИНИИ Line1 ЧТО БЫ ЛИНИИ БЫЛИ ПАРАЛЛЕЛЬНЫЕ 
   ObjectSetDouble(0,"Line2",OBJPROP_ANGLE,ObjectGetDouble(0,"Line1",OBJPROP_ANGLE)); 

   // РИСУЕМ ПЕРПЕНДИКУЛЯРНУЮ ЛИНИЮ К Line1 и Line2
   ObjectCreate("Value",OBJ_TRENDBYANGLE,0,Time[0],Low[15],0,0);
   ObjectSetInteger(0,"Value",OBJPROP_RAY,false);
   ObjectSetInteger(0,"Value",OBJPROP_COLOR,Gold);
   ObjectSetInteger(0,"Value",OBJPROP_WIDTH,3);
   ObjectSetDouble(0,"Value",OBJPROP_ANGLE,90+ObjectGetDouble(0,"Line1",OBJPROP_ANGLE));

   // ЗАДАЧА: ПОЛУЧИТЬ РАЗМЕР ЖЕЛТОЙ ЛИНИИ МЕЖДУ Line1 и Line2. ОПТИМАЛЬНЫМ И УНИВЕРСАЛЬНЫМ ПАРАМЕТРОМ РАЗМЕРА НАВЕРНОЕ БУДУТ - ПИКСЕЛИ.

A seguir, através de ObjectGetValueByShift("Line1",a+++) e ObjectGetValueByShift("Value",a+++) e ObjectGetValueByShift("Line2",a+++) buscam a interseção

Estou lendo bem?
 
Олег avtomat:

A fim de resolver o problema, você precisa:

1. desenhar uma perpendicular às linhas paralelas dadas

2. Determinar os pontos de interseção da perpendicular com as linhas dadas

3. calcular a distância entre os pontos de interseção


Claramente em fotos:

(diferentes linhas e distâncias entre elas)



.............................................................................


.............................................................................


.............................................................................


.............................................................................


Não convincente.

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

Não convincente.

Abra seus livros didáticos e fique convencido

 
A teoria parece ser clara e não parece haver nada de complicado, mas... A única coisa é como fazer isso na prática e como funcionará...
 
Itum:

Sim

Infelizmente eu não sou matemático (
Que tal pesquisar no Google?


ângulo azul = 90 - ângulo da linha

converter ângulo em radianos

cathetus vermelho oposto = hipotenusa verde * seno (ângulo azul)

Já encontramos a hipotenusa neste fio, cruzando verticalmente ambas as linhas

Se o ângulo da linha for 90 ou 0, então considere a distância de forma diferente, ou seja, cruzando linhas paralelas horizontal ou verticalmente.

 
Renat Akhtyamov:
Que tal pesquisar no Google?


ângulo azul = 90 - ângulo da linha

Converter ângulo em radianos

cathetus vermelho oposto = hipotenusa verde * seno (ângulo azul)

Já encontramos a hipotenusa neste fio, cruzando verticalmente ambas as linhas

Se o ângulo da linha for 90 ou 0, então conte a distância de outra forma, ou seja, cruzando linhas paralelas horizontal ou verticalmente.

Hmmm...

Por alguma razão, não funciona

   datetime t1 = (datetime)ObjectGetInteger(0, "Line1", OBJPROP_TIME, 0);
   datetime t2 = (datetime)ObjectGetInteger(0, "Line2", OBJPROP_TIME, 0);
   double p1 = 0;
   double p2 = 0;
   
   if(t1 > t2)
   {
      p1 = ObjectGetValueByTime(0, "Line1", t2);
      p2 = ObjectGetDouble(0, "Line2", OBJPROP_PRICE, 0);
   }
   if(t1 < t2)
   {
      p1 = ObjectGetDouble(0, "Line1", OBJPROP_PRICE, 0);
      p2 = ObjectGetValueByTime(0, "Line2", t1);;
   }
   if(t1 == t2)
   {
      p1 = ObjectGetDouble(0, "Line1", OBJPROP_PRICE, 0);
      p2 = ObjectGetDouble(0, "Line2", OBJPROP_PRICE, 0);
   }
   
   double rez = NormalizeDouble(MathAbs(p1 - p2) / _Point, 0) * MathSin(ObjectGetDouble(0,"Line1",OBJPROP_ANGLE));
   Comment("Разница: ", rez /* */);
 
Parece simples ... Mas não obtém o resultado que você quer
 
Itum:
Parece simples ... mas não obtém o resultado que você quer


Sim, tudo é simples, exceto que sua tarefa não é solvível.... ))

Antes de mais nada, esqueça a funçãoObjectGetDouble(0,"Line1",OBJPROP_ANGLE), que sempre retornará 0, pois não pode ser aplicada a uma linha de tendência. Ela é necessária, em particular, para a linha de tendência "angular", que não depende da escala do gráfico MAS também não depende dos preços de barra. Ou seja, seu ângulo não mudará ao mudar a escala, mas a própria linha se afastará das barras...


Mas esse não é o maior problema... A questão é que você quer encontrar o tamanho da perpendicular entre 2 linhas de tendência paralelas, tente desenhar tal perpendicular no gráfico... E depois muda a escala do gráfico... a perpendicular torna-se não perpendicular... )))) Portanto, o problema é exatamente o que você considera uma perpendicular (dependência da escala e como VOCÊ a vê) e um perpendicular matemático.

A perpendicular em uma tabela escalonada de preços é uma ilusão ótica.

Usando a geometria, este problema em sua forma pura é resolvido de uma só vez... MAS o resultado matemático do cálculo nunca coincidirá com o que se vê no gráfico... E você precisa exatamente da partida, então o problema é insolúvel. Basta simplificar suas exigências, não procurar uma perpendicular, mas apenas a distância entre 2 linhas ao mesmo tempo...

 

Eu não tenho palavras.

Eu conheço todas as letras, mas não consigo ler a palavra

Vamos lá, vamos lá, não desista, estude MQL, é só uma questão de tempo
Razão: