Cálculo do ângulo de inclinação da linha de tendência. - página 15
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
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 resultadoAqui:
.........
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.
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:
Eu queria exibir os rótulos perto das linhas, como na foto. Foi assim que se tornou com a função acima:
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)
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, 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.
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. 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 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.