Calcolo dell'angolo di pendenza della linea di tendenza. - pagina 15

 
Daniil Kurmyshev:

Ah, bene, allora vedo)) Poi restituisco il codice, forse qualcuno diverso daRenat Akhtyamov ne avrà bisogno, a proposito non mi siedo molto sui forum))

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

// xAngolo ///////////////////////////////////////////////////////////////////////////

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

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)*_Periodo*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;

doppio x1x2_proc=x1x2/Bar1proc;

doppio y1y2_proc=y1y2/Price1proc;

//---

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

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

ritorno(theta);

}

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

Funzione pura, per il calcolo dell'angolo, in modalità automatica, con correzione in base alla scala del grafico, la uso io stesso, funziona perfettamente) Per quanto riguarda la strategia di tendenza, dall'angolo si può stimare la forza, e la durata approssimativa della tendenza.

Qui:

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

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

La divisione per 100 è ridondante. Nella formula finale, essi (100) sono posti nel numeratore e nel denominatore quando si calcola il theta. E sono abbreviati.


Qui:

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

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

la divisione per _Point è ridondante. Lo stesso vale per la divisione per 100.

Nella formula finale doppio y1y2_proc=y1y2/Price1proc;

I punti del numeratore e del denominatore sono ridotti.

Queste semplificazioni, in primo luogo, riducono i calcoli (carico della CPU), e in secondo luogo, possono aumentare la precisione del risultato finale.


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

O forse dovresti provare a usare la funzione ChartTimePriceToXY per determinare i valori dei pixel nei punti di ancoraggio dello strumento grafico.

È più facile calcolare le funzioni trigonometriche usando il numero di pixel in orizzontale e in verticale. Senza la conversione di barre e punti.

Dovrebbe essere molto più semplice.


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

// xAngolo ///////////////////////////////////////////////////////////////////////////

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

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);}

ritorno(theta);

}

Qui if(y2<y1){theta=NormalizeDouble(theta*(-1),2);} aggiusta il segno con il risultato
 
Eugeni Neumoin:

Qui:

.........

Dovrebbe essere molto più semplice.

Sì, tutto questo è completamente inutile perché dipende dalla scala impostata dall'utente, che può essere diversa su diversi grafici.

L'unica vera soluzione è misurare l'andamento del prezzo per unità di tempo.

Una tendenza di "0,0001 eurodollari all'ora" sarà disegnata esattamente allo stesso modo da chiunque, indipendentemente da qualsiasi scala, o anche dalle piattaforme.

 
George Merts:

Tutto questo è completamente inutile perché dipende dalla scala impostata dall'utente, che può essere diversa su diversi grafici.

L'unica soluzione corretta è misurare l'andamento del prezzo per unità di tempo.

Una tendenza di "0,0001 eurodollari all'ora" sarà disegnata esattamente allo stesso modo da chiunque, indipendentemente da qualsiasi scala, o anche dalle piattaforme.

Non stavo prestando attenzione all'argomento del thread. È stato interessante calcolare l'angolo per rendere le iscrizioni inclinate parallele all'andamento. Ho scritto una funzione semplificata per calcolare l'angolo di cui sopra. Non dipende affatto dalla scala. Per evitare la distorsione dell'iscrizione quando si cambia la scala e altre proprietà del grafico, si può usare CHARTEVENT_CHART_CHANGE

=========

Volevo visualizzare una didascalia vicino alle linee, come nell'immagine. Con la funzione modificata qui sopra, ecco come è venuto fuori:


 
Eugeni Neumoin:

Volevo visualizzare le etichette vicino alle linee, come nell'immagine. Ecco come è andata a finire con la funzione di cui sopra:

Bellissimo!
 
Eugeni Neumoin:

Sono d'accordo con te, non mi piace, ma quando ho creato inizialmente questa funzione, ho controllato alcuni modi diversi, e poi non l'ho cambiata) e riguardo ai pixel, sono completamente d'accordo con te, il calcolo più ideale dell'angolo per me personalmente è questo modo, ecco la mia funzione:

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

// 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]);

//---

doppio 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);}

ritorno(theta);

}

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

p.s. nella funzioneif(x[1]<x[0]){return(-1000);} può essere rimosso, come l'ho usato per me), e più specificamente è necessario se l'utente ha scambiato due punti dell'oggetto in alcuni punti.

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

A proposito, per le iscrizioni sul grafico, lo uso. Prima nel ramo ho postato esempi di lavoro di questo indicatore, lì si può vedere.

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

Un ringraziamento speciale a voi e al rispetto)

 
Eugeni Neumoin:

È stato interessante calcolare l'angolo per rendere le iscrizioni inclinate parallele all'andamento. Sopra ho scritto una funzione semplificata per calcolare l'angolo. Non dipende affatto dalla scala.

Sì, è un caso abbastanza diverso. Il compito qui non è quello di determinare la tendenza, ma piuttosto di determinare la pendenza della linea tracciata sul monitor. E in questo caso, è il modo giusto. E tutto è bello nella foto.
 
George Merts:
Sì, questa è una questione diversa. Qui il compito non è quello di determinare la tendenza, ma di determinare la pendenza della linea visualizzata sul monitor. E in questo caso è il modo giusto. E tutto è bello nella foto.
Procedendo dalle tue parole, possiamo disegnare le linee di tendenza e queste mostreranno la direzione della tendenza e l'angolo corretto sarà visualizzato relativamente alla linea disegnata senza giocare. Ho allegato un esempio nella foto, il mio robot costruisce secondo tutte le regole, ma l'essenza è chiara.
File:
 
Daniil Kurmyshev:
Se procediamo dalle tue parole, l'idea è che possiamo disegnare linee di tendenza e queste mostreranno la direzione della tendenza, e l'angolo corretto sarà mostrato in relazione alla linea disegnata senza alcun tamburello. Ho allegato un esempio nella foto, il mio robot costruisce secondo le regole, ma l'essenza è chiara.
L'immagine è una visualizzazione dei vostri calcoli. Le proporzioni di visualizzazione possono essere distorte (cambiare la scala del grafico) e l'immagine cambierà significativamente - le linee cambieranno i loro angoli di pendenza in gradi. Ma i risultati dei vostri calcoli non cambieranno quando cambierete la scala. A meno che, naturalmente, non si calcolino le tendenze in pixel
 
Alexander Puzanov:
L'immagine è una visualizzazione dei vostri calcoli. Potete distorcere le proporzioni della visualizzazione (cambiare la scala del grafico) e l'immagine cambierà significativamente - le linee cambieranno i loro angoli di pendenza in gradi. Ma i risultati dei vostri calcoli non cambieranno quando cambierete la scala. A meno che, ovviamente, non si calcolino le tendenze in pixel.
Sono d'accordo, ma ti rendi conto che su ogni TF, le tendenze sono diverse; quelle che sembravano grandi su una piccola diventano piccole su una più grande e le pendenze cambieranno; questo cambia solo la presentazione della tendenza, non il sistema di misurazione degli angoli; se il sistema di misurazione cambia, non ne verrà fuori niente di buono.
 
Daniil Kurmyshev:
Sono d'accordo con te, ma capisci che su ogni TF, le tendenze sono diverse, quello che sembrava grande su una piccola, è diventato piccolo su una più grande, e le pendenze cambieranno, solo la rappresentazione della tendenza cambia, non il sistema di misurazione dell'angolo, se il sistema di misurazione cambierà, non ne verrà fuori niente di buono.
Cambiare il TF non ha niente a che fare con questo - quando cambiate il TF, i vostri calcoli cambiano. E quando si cambia la scala (con i pulsanti +/- o il pulsante sul terminale, a volte solo scorrendo il grafico), non cambia nulla nei calcoli, e il ° sta galleggiando in mezzo al nulla.