Calcolo dell'angolo di pendenza della linea di tendenza. - pagina 15
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
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 risultatoQui:
.........
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.
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:
Volevo visualizzare le etichette vicino alle linee, come nell'immagine. Ecco come è andata a finire con la funzione di cui sopra:
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)
È 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ì, 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.
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. 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 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.