Cálculo do ângulo de inclinação da linha de tendência. - página 15

 
Daniil Kurmyshev:

Ah, bem, então eu vejo))) Então eu devolvo o código, talvez alguém que nãoRenat Akhtyamov precise dele, a propósito, eu não me sento muito em fóruns))))

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

// xAngle ///////////////////////////////////////////////////////////////////////////

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

duplo xAngle(duplo x1,duplo y1,duplo x2,duplo y2) // x1,x2 Tempo[] - y1,y2 Preço

{

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

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

//---

duplo 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,(data/hora)x1));

x2=iBarShift(NULL,0,(data/hora)x2));

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

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

duplo x1x2_proc=x1x2/Bar1proc;

duplo y1y2_proc=y1y2/Price1proc;

//---

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

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

retorno(theta);

}

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

Função pura, para calcular o ângulo, em modo automático, com correção por escala gráfica, eu mesmo a utilizo, funciona perfeitamente) Quanto à estratégia de tendência, pelo ângulo você pode estimar a força, e a duração aproximada da tendência.

Aqui:

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

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

A divisão por 100 é redundante. Na fórmula final, eles (100) são colocados no numerador e denominador ao calcular a teta. E eles são abreviados.


Aqui:

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

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

divisão por _Point é redundante. O mesmo é válido para a divisão por 100.

Na fórmula final duplo y1y2_proc=y1y2/Price1proc;

_Os pontos no numerador e denominador são reduzidos.

Estas simplificações primeiro, reduzem os cálculos (carga da CPU) e segundo, possivelmente aumentam a precisão do resultado final.


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

Ou talvez você deva tentar usar a função ChartTimePriceToXY para determinar os valores de pixels nos pontos de ancoragem da ferramenta gráfica.

É mais fácil calcular as funções trigonométricas usando o número de pixels horizontalmente e verticalmente. Sem a conversão de barras e pontos.

Deveria ser muito mais simples.


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

// xAngle ///////////////////////////////////////////////////////////////////////////

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

duplo xAngle(data hora x1,duplo y1,data hora x2,duplo y2) // x1,x2 Hora[] - y1,y2 Preço

{

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

int _x1, _y1, _x2, _y2;

GráficoTimePreçoToXY(0,0,x1,y1,_x1, _y1);

GráficoTimePreçoToXY(0,0,x2,y2,_x2,_y2);

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

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

retorno(theta);

}

Aqui se(y2<y1){theta=NormalizarDuplo(theta*(-1),2);} ajustar o sinal pelo resultado
 
Eugeni Neumoin:

Aqui:

.........

Deveria ser muito mais simples.

Sim, tudo isso é completamente inútil, pois depende da escala definida pelo usuário, que pode ser diferente em diferentes gráficos.

A única solução correta é medir a tendência em preço por unidade de tempo.

Uma tendência de "0,0001 Eurodólares por hora" será desenhada exatamente da mesma maneira por qualquer pessoa, independentemente de qualquer escala, ou mesmo plataformas.

 
George Merts:

Tudo isso é completamente inútil, pois depende da escala definida pelo usuário, que pode ser diferente em diferentes gráficos.

A única solução correta é medir a tendência em preço por unidade de tempo.

Uma tendência de "0,0001 Eurodólares por hora" será desenhada exatamente da mesma maneira por qualquer pessoa, independentemente de qualquer escala, ou mesmo plataformas.

Eu não estava prestando atenção ao assunto do fio. Foi interessante calcular o ângulo para fazer inscrições inclinadas paralelas à tendência. Eu escrevi uma função simplificada para calcular o ângulo acima. Não depende em nada da escala. Para evitar distorções da inscrição ao alterar a escala e outras propriedades do gráfico, você pode usar CHARTEVENT_CHART_CHANGE

=========

Eu queria exibir uma legenda perto das linhas, como na foto. Com a função alterada acima, foi assim que aconteceu:


 
Eugeni Neumoin:

Eu queria exibir os rótulos perto das linhas, como na foto. Foi assim que se tornou com a função acima:

Lindo!
 
Eugeni Neumoin:

Concordo com você, não gosto, mas quando inicialmente criei esta função, verifiquei algumas maneiras diferentes, e depois não a mudei) e sobre os pixels, concordo completamente com você, o cálculo mais ideal do ângulo para mim pessoalmente é desta maneira, aqui está minha função:

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

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

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

duplo xAnglePixels(data hora x1,duplo y1,data hora x2,duplo y2) // x1,x2 Hora[] - y1,y2

{

if(x1==0 ||| x2==0 ||| y1==y2){retorno(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]);

//---

o dobro da teta;

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

else{theta=90;}

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

retorno(theta);

}

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

p.s. na funçãoif(x[1]<x[0]){retorno(-1000);} pode ser removido, como eu mesmo o usei), e mais especificamente é necessário se o usuário tiver trocado dois pontos do objeto em lugares.

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

A propósito, para as inscrições no gráfico, eu o utilizo. Anteriormente, no ramo em que coloquei exemplos de trabalho deste indicador, lá você pode vê-lo.

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

Especial agradecimento a você e respeito)

 
Eugeni Neumoin:

Foi interessante calcular o ângulo para fazer inscrições oblíquas paralelas à tendência. Acima escrevi uma função simplificada para o cálculo do ângulo. Não depende em nada da escala.

Sim, é um caso bem diferente. A tarefa aqui não é determinar a tendência, mas sim determinar a inclinação da linha traçada no monitor. E, neste caso, é o caminho certo. E tudo é lindo na foto.
 
George Merts:
Sim, esta é uma questão diferente. Aqui a tarefa não é determinar a tendência, mas determinar a inclinação da linha exibida no monitor. E, neste caso, é o caminho certo. E tudo é lindo na foto.
Procedendo de suas palavras, podemos traçar linhas de tendência e elas mostrarão a direção da tendência e o ângulo correto será exibido relativamente à linha traçada sem jogar jogos. Anexei um exemplo na foto, meu robô constrói de acordo com todas as regras, mas a essência é clara.
Arquivos anexados:
 
Daniil Kurmyshev:
Se procedermos de suas palavras, a idéia é que podemos desenhar linhas de tendência e elas mostrarão a direção da tendência, e o ângulo correto será mostrado em relação à linha desenhada sem qualquer pandeiro. Anexei um exemplo na foto, meu robô constrói de acordo com as regras, mas a essência é clara.
A imagem é uma visualização de seus cálculos. As proporções de visualização podem ser distorcidas (mudar a escala do gráfico) e a imagem mudará significativamente - as linhas mudarão seus ângulos de inclinação em graus. Mas os resultados de seus cálculos não mudarão quando você mudar a escala. A menos, é claro, que você calcule as tendências em pixels
 
Alexander Puzanov:
A imagem é uma visualização de seus cálculos. Você pode distorcer as proporções da visualização (mudar a escala do gráfico) e a imagem mudará significativamente - as linhas mudarão seus ângulos de inclinação em graus. Mas os resultados de seus cálculos não mudarão quando você mudar a escala. A menos, é claro, que você estivesse calculando as tendências em pixels.
Concordo, mas você percebe que em cada TF, as tendências são diferentes; as que pareciam grandes em uma pequena tornam-se pequenas em uma maior e as inclinações mudarão; isto muda apenas a apresentação das tendências, não o sistema de medição de ângulos; se o sistema de medição mudar, nada de bom sairá dele.
 
Daniil Kurmyshev:
Concordo com você, mas você entende que em cada TF, as tendências são diferentes, o que parecia grande em uma pequena, tornou-se pequeno em uma maior, e as inclinações mudarão, apenas a representação da tendência muda, não o sistema de medição do ângulo, se o sistema de medição mudar, nada de bom sairá dele.
A mudança do TF não tem nada a ver com isso - quando você muda o TF, seus cálculos mudam. E quando você muda a escala (com os botões +/- ou o botão no terminal, às vezes apenas rolando o gráfico), nada nos cálculos muda, e o ° está flutuando no meio do nada.