を含む2本の平行線間の距離を計算する! - ページ 7

 
Олег avtomat:

好きなように

ご覧の通り、複雑なことは何もありません。少し考えればわかることです。

これだけ詳しい回答があれば、TCも自分でコードを書けるようになるのではないでしょうか。

ここでは、学校の問題は学校で意味を把握できなかったので、すでに忘れてしまったという人が多い。

 

と出力されます。

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

次に、ObjectGetValueByShift("Line1",a++) と ObjectGetValueByShift("Value",a++) と ObjectGetValueByShift("Line2",a++) により交差部を検索する。

私の読みは正しいのでしょうか?
 
Олег avtomat:

問題を解決するためには

1. 与えられた平行線に垂直な線を引く。

2. 垂直線と与えられた線との交点を決定する。

3. 交点間の距離を計算する


写真で見ると一目瞭然。

(異なるラインとその間の距離)



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


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


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


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


説得力がない。

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

説得力がない。

教科書を開いて納得

 
理論は明快で、難しいことは何もなさそうですが......。ただ、実際にどうやるか、どう効果が出るかは...。
 
Itum:

はい

残念ながら私は数学者ではありません(
ググってみてはいかがでしょうか?


青の角度 = 90 - 線の角度

角度をラジアン変換する

赤の反対勾配 = 緑の斜辺 * サイン (青の角度)

このスレッドでは、すでに両方の線を垂直に交差させることで斜辺を求めました

直線の角度が90または0であれば、平行線を水平または垂直に交差させるという、異なる方法で距離を考える。

 
Renat Akhtyamov:
ググってみてはいかがでしょうか?


青の角度 = 90 - 線の角度

角度をラジアンに変換する

赤の反対勾配 = 緑の斜辺 * サイン (青の角度)

このスレッドでは、すでに両方の線を垂直に交差させることで斜辺を求めました

直線の角度が90または0であれば、別の方法、つまり平行線を水平または垂直に交差させて距離を数える。

うーん...。

なぜか動作しない

   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 /* */);
 
簡単なことだと思うのですが.しかし、思うような結果が得られない
 
Itum:
簡単なことだと思います.が、思うような結果が得られません。


そう、すべてがシンプルなのです。ただし、あなたのタスクは解決不可能ですが......。))

まず最初に、ObjectGetDouble(0,"Line1",OBJPROP_ANGLE) 関数は忘れてください。 それはトレンドラインに適用できないので、常に0を返します。特に、チャートスケールに 依存しない「角度」トレンドラインには必要です。つまり、スケールを変えてもその角度は変わらないが、線そのものは棒から離れる......ということだ。


でも、一番の問題はそこじゃないんです...。要は、平行な2本のトレンドライン間の垂直線の大きさを求めたい、そんな垂直線をチャート上に描いてみよう...ということです。そして、グラフの縮尺を変えると...垂直が非垂直になる...。))))つまり問題は、あなたが考える垂直(縮尺やあなたの見方による)と数学的な垂直の違いなのです。

価格スケーリングチャート上の垂直は目の錯覚です。

幾何学を使って、この問題を純粋な形で一挙に解決する...。しかし、数学的な計算結果は、チャートで見たものと一致することはない......。しかも、正確に一致させる必要があるので、問題は解決できない。ただ、要件を単純化すると、垂直を探すのではなく、同じ時点の2本の直線の距離だけを探すことになる...。

 

言葉がありません。

文字は全部わかるけど、文字が読めない

さあさあ、あきらめないでMQLを勉強してください、時間の問題です