Calculez la distance entre deux lignes parallèles, y compris ! - page 7

 
Олег avtomat:

comme vous le souhaitez.

Comme vous pouvez le constater, il n'y a rien de compliqué. Il faut juste y réfléchir un peu.

Avec une réponse aussi détaillée, je pense que TC sera capable d'écrire le code tout seul.

Beaucoup de gens ici ont déjà oublié les problèmes scolaires parce qu'ils n'ont pas pu en saisir le sens à l'école.

 

La sortie est :

 // ЗАДАЕМ ДВЕ ТОЧКИ ПРИВЯЗКИ ДЛЯ ГЛАВНОЙ ЛИНИИ: ТОЧКА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. ОПТИМАЛЬНЫМ И УНИВЕРСАЛЬНЫМ ПАРАМЕТРОМ РАЗМЕРА НАВЕРНОЕ БУДУТ - ПИКСЕЛИ.

Ensuite, à travers ObjectGetValueByShift("Line1",a++) et ObjectGetValueByShift("Value",a++) et ObjectGetValueByShift("Line2",a++) on recherche l'intersection

Est-ce que je le lis correctement ?
 
Олег avtomat:

Afin de résoudre le problème, vous devez :

1. dessiner une perpendiculaire aux lignes parallèles données

2. déterminer les points d'intersection de la perpendiculaire avec les lignes données

3. calculer la distance entre les points d'intersection


Clairement dans les photos :

(lignes et distances différentes entre elles)



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


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


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


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


Pas convaincant.

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

Pas convaincant.

Ouvrez vos manuels scolaires et laissez-vous convaincre

 
La théorie semble être claire et il semble n'y avoir rien de compliqué mais... La seule chose à faire est de savoir comment le faire en pratique et comment cela va fonctionner...
 
Itum:

Oui

Malheureusement, je ne suis pas un mathématicien (
Pourquoi ne pas le googler ?


angle bleu = 90 - angle de la ligne

convertir un angle en radians

cathetus opposé rouge = hypoténuse verte * sinus (angle bleu)

Nous avons déjà trouvé l'hypoténuse dans ce fil en croisant les deux lignes verticalement

Si l'angle de la ligne est de 90 ou de 0, il faut alors considérer la distance différemment, c'est-à-dire en croisant des lignes parallèles horizontalement ou verticalement.

 
Renat Akhtyamov:
Pourquoi ne pas le googler ?


angle bleu = 90 - angle de la ligne

Convertir l'angle en radians

cathetus opposé rouge = hypoténuse verte * sinus (angle bleu)

Nous avons déjà trouvé l'hypoténuse dans ce fil en croisant les deux lignes verticalement

Si l'angle de la ligne est de 90 ou 0, comptez la distance d'une autre manière, c'est-à-dire en croisant des lignes parallèles horizontalement ou verticalement.

Hmmm...

Pour une raison quelconque, il ne fonctionne pas

   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 /* */);
 
Cela semble simple... Mais cela ne donne pas le résultat escompté.
 
Itum:
Cela semble simple... mais cela ne donne pas le résultat escompté.


Oui, c'est simple, sauf que votre tâche n'est pas soluble..... ))

Tout d'abord, oubliez la fonctionObjectGetDouble(0,"Line1",OBJPROP_ANGLE), qui retournera toujours 0, puisqu'elle ne peut pas être appliquée à une ligne de tendance. Elle est nécessaire, en particulier, pour la ligne de tendance "angle", qui ne dépend pas de l'échelle du graphique MAIS elle ne dépend pas non plus des prix des barres. C'est-à-dire que son angle ne changera pas lors du changement d'échelle, mais la ligne elle-même s'éloignera des barres...


Mais ce n'est pas le plus gros problème... Le but est de trouver la taille de la perpendiculaire entre 2 lignes de tendance parallèles, essayez de dessiner une telle perpendiculaire sur le graphique... Et puis changez l'échelle du graphique... la perpendiculaire devient non-perpendiculaire... )))) Le problème est donc de savoir ce que vous considérez comme une perpendiculaire (qui dépend de l'échelle et de la façon dont VOUS la voyez) et une perpendiculaire mathématique.

La perpendiculaire sur un graphique à échelle de prix est une illusion d'optique.

En utilisant la géométrie, ce problème dans sa forme pure est résolu en une seule fois... MAIS le résultat mathématique du calcul ne coïncidera jamais avec celui vu sur le graphique... Et vous voulez exactement la même chose, donc le problème est insoluble. En simplifiant vos exigences, ne cherchez pas une perpendiculaire, mais juste la distance entre 2 lignes au même point temporel...

 

Je n'ai pas de mots.

Je connais toutes les lettres, mais je ne peux pas lire le mot.

Allez, allez, n'abandonnez pas, étudiez le MQL, c'est juste une question de temps.
Raison: