Berechnung des Neigungswinkels der Trendlinie. - Seite 15

 
Daniil Kurmyshev:

Ah, gut, dann sehe ich)) Dann gebe ich den Code, vielleicht jemand anderes alsRenat Akhtyamov wird es brauchen, durch die Art, wie ich nicht auf Foren viel sitzen)))

//-----------------------------------------------------------------------------------

xWinkel ///////////////////////////////////////////////////////////////////////////

//-----------------------------------------------------------------------------------

double xAngle(double x1,double y1,double x2,double y2) // x1,x2 Time[] - y1,y2 Price

{

if(x1==0 || x2==0 || y1==y2){return(0);}

if(y1==y2) {return(0);}

//---

double PriceMAX=ChartGetDouble(0,CHART_PRICE_MAX,0);

double PriceMIN=ChartGetDouble(0,CHART_PRICE_MIN,0);

double Bar1proc=(double)(ChartGetInteger(0,CHART_WIDTH_IN_BARS,0)*_Period*60)/100;

double Price1proc=((PriceMAX-PriceMIN)/_Point)/100;

x1=iBarShift(NULL,0,(datetime)x1);

x2=iBarShift(NULL,0,(datetime)x2);

double x1x2=MathAbs(x1-x2)*_Period*60;

double y1y2=MathAbs(y1-y2)/_Point;

double x1x2_proc=x1x2/Bar1proc;

double y1y2_proc=y1y2/Preis1proc;

//---

double theta=MathArctan(y1y2_proc/x1x2_proc)*(180/3.1415926535);

if(y2<y1){theta=NormalizeDouble(theta*(-1),2);}

return(theta);

}

//+------------------------------------------------------------------+

Reine Funktion, zur Berechnung des Winkels, im automatischen Modus, mit Korrektur durch Chart-Skala, ich benutze es selbst, es funktioniert perfekt) Wie für die Trend-Strategie, durch den Winkel können Sie die Stärke, und die ungefähre Dauer des Trends zu schätzen.

Hier:

double Bar1proc=(double)(ChartGetInteger(0,CHART_WIDTH_IN_BARS,0)*_Period*60)/100;

double Price1proc=((PriceMAX-PriceMIN)/_Point)/100;

Die Division durch 100 ist überflüssig. In der endgültigen Formel werden sie (100) bei der Berechnung von Theta in den Zähler und in den Nenner gestellt. Und sie sind abgekürzt.


Hier:

double Price1proc=((PriceMAX-PriceMIN)/_Point)/100;

double y1y2=MathAbs(y1-y2)/_Point;

Division durch _Point ist überflüssig. Das Gleiche gilt für die Division durch 100.

In der endgültigen Formel ist y1y2_proc=y1y2/Price1proc doppelt vorhanden;

Die Punkte im Zähler und Nenner werden reduziert.

Diese Vereinfachungen reduzieren erstens die Berechnungen (CPU-Last) und erhöhen zweitens möglicherweise die Genauigkeit des Endergebnisses.


===============================

Oder vielleicht sollten Sie versuchen, die Funktion ChartTimePriceToXY zu verwenden, um die Pixelwerte an den Ankerpunkten des grafischen Werkzeugs zu bestimmen.

Es ist einfacher, trigonometrische Funktionen anhand der Anzahl der Pixel in horizontaler und vertikaler Richtung zu berechnen. Ohne die Umrechnung von Balken und Punkten.

Es sollte viel einfacher sein.


//-----------------------------------------------------------------------------------

xWinkel ///////////////////////////////////////////////////////////////////////////

//-----------------------------------------------------------------------------------

double xAngle(datetime x1,double y1,datetime x2,double y2) // x1,x2 Time[] - y1,y2 Price

{

if(x1==0 || x2==0 || y1==y2){return(0);}

int _x1, _y1, _x2, _y2;

ChartTimePriceToXY(0,0,x1,y1,_x1, _y1);

ChartTimePriceToXY(0,0,x2,y2,_x2, _y2);

double theta=MathArctan((double)MathAbs(_y1-_y2)/(double)MathAbs(_x1-_x2))*(180/3.1415926535);

if(y2<y1){theta=NormalizeDouble(theta*(-1),2);}

return(theta);

}

Hier if(y2<y1){theta=NormalizeDouble(theta*(-1),2);} das Vorzeichen um das Ergebnis anpassen
 
Eugeni Neumoin:

Hier:

.........

Das sollte viel einfacher sein.

Ja, all dies ist völlig nutzlos, da es von der vom Benutzer eingestellten Skala abhängt, die bei verschiedenen Karten unterschiedlich sein kann.

Die einzig richtige Lösung besteht darin, die Entwicklung des Preises pro Zeiteinheit zu messen.

Ein Trend von "0,0001 Eurodollars pro Stunde" wird von jedem auf genau dieselbe Weise gezeichnet, unabhängig von einer Skala oder sogar von Plattformen.

 
George Merts:

Dies alles ist völlig nutzlos, da es von der vom Benutzer eingestellten Skala abhängt, die bei verschiedenen Karten unterschiedlich sein kann.

Die einzig richtige Lösung besteht darin, die Entwicklung des Preises pro Zeiteinheit zu messen.

Ein Trend von "0,0001 Eurodollars pro Stunde" wird von jedem auf genau dieselbe Weise gezeichnet, unabhängig von einer Skala oder sogar von Plattformen.

Ich habe nicht auf das Thema des Threads geachtet. Es war interessant, den Winkel zu berechnen, um schräge Inschriften parallel zum Trend zu machen. Ich habe eine vereinfachte Funktion zur Berechnung des obigen Winkels geschrieben. Das hängt überhaupt nicht von der Skala ab. Um eine Verzerrung der Beschriftung beim Ändern des Maßstabs und anderer Diagrammeigenschaften zu vermeiden, können Sie CHARTEVENT_CHART_CHANGE

=========

Ich wollte eine Beschriftung neben den Zeilen anzeigen, wie auf dem Bild. Mit der oben geänderten Funktion sah es dann so aus:


 
Eugeni Neumoin:

Ich wollte die Beschriftungen in der Nähe der Linien anzeigen, wie auf dem Bild. So sieht es mit der obigen Funktion aus:

Wunderschön!
 
Eugeni Neumoin:

Ich stimme Ihnen zu, ich mag es nicht, aber als ich diese Funktion ursprünglich erstellt habe, habe ich ein paar verschiedene Möglichkeiten geprüft und sie dann nicht mehr geändert), und was die Pixel angeht, stimme ich Ihnen völlig zu, die idealste Berechnung des Winkels für mich persönlich ist diese Art, hier ist meine Funktion:

//-----------------------------------------------------------------------------------

// xAnglePixels /////////////////////////////////////////////////////////////////////

//-----------------------------------------------------------------------------------

double xAnglePixels(datetime x1,double y1,datetime x2,double y2) // x1,x2 Time[] - y1,y2

{

if(x1==0 || x2==0 || y1==y2){return(0);}

//---

int x[2],y[2];

ChartTimePriceToXY(0,0,x1,y1,x[0],y[0]);

ChartTimePriceToXY(0,0,x2,y2,x[1],y[1]);

//---

if(x[1]<x[0]){return(-1000);}

//---

double x1x2=MathAbs(x[0]-x[1]);

double y1y2=MathAbs(y[0]-y[1]);

//---

Doppeltes Theta;

if(x1x2!=0){theta=MathArctan(y1y2/x1x2)*(180/3.1415926535);}

else{theta=90;}

if(y2<y1){theta=NormalizeDouble(theta*(-1),2);}else{theta=NormalizeDouble(theta,2);}

return(theta);

}

//---------------------------------------------------------------------------------

p.s. in der Funktionif(x[1]<x[0]){return(-1000);} kann entfernt werden, da ich sie für mich selbst verwendet habe), und zwar wird sie benötigt, wenn der Benutzer zwei Punkte des Objekts an einigen Stellen vertauscht hat.

//-----------------

Übrigens, für die Inschriften auf dem Chart verwende ich es. Früher in der Branche habe ich Beispiele für die Arbeit dieses Indikators gepostet, dort können Sie es sehen.

//-----------------

Besonderen Dank an Sie und Respekt)

 
Eugeni Neumoin:

Es war interessant, den Winkel zu berechnen, um schräge Inschriften parallel zum Trend zu machen. Oben habe ich eine vereinfachte Funktion zur Berechnung des Winkels geschrieben. Das hängt überhaupt nicht von der Skala ab.

Ja, das ist ein ganz anderer Fall. Hier geht es nicht darum, den Trend zu ermitteln, sondern die Steigung der auf dem Bildschirm dargestellten Linie zu bestimmen. Und in diesem Fall ist es der richtige Weg. Und alles ist schön auf dem Bild.
 
George Merts:
Ja, das ist eine andere Sache. Hier geht es nicht darum, den Trend zu bestimmen, sondern die Steigung der auf dem Bildschirm angezeigten Linie zu ermitteln. Und in diesem Fall ist es der richtige Weg. Und alles ist schön auf dem Bild.
Ausgehend von Ihren Worten können wir Trendlinien zeichnen, die die Trendrichtung anzeigen, und der richtige Winkel wird relativ zur gezeichneten Linie angezeigt, ohne dass wir Spielchen spielen. Ich habe ein Beispiel im Bild beigefügt, mein Roboter baut nach allen Regeln, aber das Wesentliche ist klar.
Dateien:
 
Daniil Kurmyshev:
Wenn wir von Ihren Worten ausgehen, ist die Idee, dass wir Trendlinien zeichnen können und sie die Trendrichtung anzeigen, und der richtige Winkel wird in Bezug auf die gezeichnete Linie ohne Tamburin angezeigt. Ich habe ein Beispiel im Bild angehängt, mein Roboter baut nach den Regeln, aber das Wesentliche ist klar.
Das Bild ist eine Visualisierung Ihrer Berechnungen. Die Proportionen der Visualisierung können verzerrt werden (ändern Sie den Maßstab des Diagramms) und das Bild wird sich deutlich verändern - die Linien werden ihre Neigungswinkel in Grad ändern. Die Ergebnisse Ihrer Berechnungen werden sich jedoch nicht ändern, wenn Sie den Maßstab ändern. Es sei denn, Sie berechnen Trends in Pixeln
 
Alexander Puzanov:
Das Bild ist eine Visualisierung Ihrer Berechnungen. Sie können die Proportionen der Visualisierung verzerren (den Maßstab des Diagramms ändern) und das Bild wird sich deutlich verändern - die Linien werden ihre Neigungswinkel in Grad ändern. Die Ergebnisse Ihrer Berechnungen werden sich jedoch nicht ändern, wenn Sie den Maßstab ändern. Es sei denn, Sie haben die Trends in Pixeln berechnet.
Ich stimme zu, aber Sie wissen schon, dass die Trends auf jeder TF anders sind; die Trends, die auf einer kleinen TF groß erschienen, werden auf einer größeren TF klein, und die Steigungen ändern sich; dies ändert nur die Trenddarstellung, nicht das Winkelmesssystem; wenn sich das Messsystem ändert, wird nichts Gutes dabei herauskommen.
 
Daniil Kurmyshev:
Ich stimme Ihnen zu, aber Sie verstehen, dass die Trends bei jeder TF anders sind. Was bei einer kleinen TF groß schien, wurde bei einer größeren klein, und die Steigungen werden sich ändern, nur die Darstellung des Trends ändert sich, nicht das Winkelmesssystem.
Die Änderung der TF hat damit nichts zu tun - wenn Sie die TF ändern, ändern sich Ihre Berechnungen. Und wenn man die Skala ändert (mit den +/- Tasten oder der Taste auf dem Terminal, manchmal auch nur durch Scrollen des Diagramms), ändert sich nichts an den Berechnungen, und der ° schwebt mitten im Nirgendwo.