Indicadores de elite :) - página 183

 

Mensagem DTosc...

Mladen,

Recebo uma mensagem no Expers Folder que diz: "Posição de início 10148 incorreta para a função Máxima de Array" - o indicador parece comportar-se perfeitamente.

Alguma explicação, por favor?

Agradecemos antecipadamente.

 

ValeoFX

Sem saber de que indicador se trata, geralmente é algo parecido com isto Encontrar onde o limite é determinado e mudá-lo para algo como isto :

limit=MathMin(Bars-counted_bars,Bars-1);

O segundo parâmetro nesta expressão (Bars-1), neste caso, garante que o limite não seja maior que o número de barras no gráfico.

Mas, como você já notou, é um erro "benigno": acontecerá apenas uma vez (quando o indicador é carregado ou quando o prazo é alterado) e, ao contrário de alguns outros erros, não pára o cálculo do indicador para que todo o resto do cálculo seja feito corretamente e os valores sejam calculados corretamente

cumprimentos

mladen

ValeoFX:
Mladen,

Recebo uma mensagem no Expers Folder que diz: "Posição de início 10148 incorreta para a função Máxima de Array" - o indicador parece comportar-se perfeitamente.

Alguma explicação, por favor?

Agradecendo-lhe antecipadamente.
 

Obrigado...

mladen:
ValeoFX

Sem saber de que indicador se trata, geralmente é algo parecido com isto Encontrar onde o limite é determinado e mudá-lo para algo como isto :

limit=MathMin(Bars-counted_bars,Bars-1);

O segundo parâmetro nesta expressão (Bars-1), neste caso, garante que o limite não seja maior do que o número de barras no gráfico.

Mas, como você já notou, é um erro "benigno": acontecerá apenas uma vez (quando o indicador é carregado ou quando o prazo é alterado) e, ao contrário de alguns outros erros, não pára o cálculo do indicador para que todo o resto do cálculo seja feito corretamente e os valores sejam calculados corretamente

cumprimentos

mladen

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

Desculpe Mladen, eu tinha o nome do indicador na janela "Título" (DTOsc) e não pensei em repeti-lo novamente. No entanto, obrigado pela explicação - vou olhar para ela imediatamente.

Na linha 124 eu encontrei:

limite = MathMax(limite,MathMin(Bars,iCustom(NULL,timeFrame,IndicatorFileName, "getBarsCount",0,0)*timeFrame/Period()));

Como é diferente do que você sugeriu, você se importaria de elaborar sobre o que eu deveria fazer para retificar isso, por favor?

Muito apreciado.

 

ValeoFX

Não prestei atenção ao subtítulo da mensagem, desculpe

De qualquer forma, se você está usando a mensagem deste post : https://www.mql5.com/en/forum/general então você está recebendo essa mensagem

Por outro lado, se você está usando a mensagem deste post: https: //www.mql5.com/en/forum/general (a mais recente), então você não vai receber essa mensagem

Não me lembro exatamente quando fiz o primeiro post, mas mudei alguns estilos de codificação desde então (daí a falta daquela mensagem de erro) e, francamente, antes não me importei muito com aquela mensagem de erro, pois ela realmente não muda nada. Depois disso, simplesmente decidi não deixar espaço para eventuais erros, daí a "verificação de segurança" ao determinar o limite

____________________________________

PS: essa linha funciona em modo multitemporal. Ela 'pergunta' ao período de tempo alvo quantas barras mudaram no período de tempo alvo a fim de poder recalcular o número exato de barras no período de tempo atual necessário. Portanto, essa linha só é eficaz quando no modo mtf

 

mladen,

Eu sou novo em codificação. E é difícil. Mas se eu tiver apenas o livro do CodersGuru para fazer uma EA......., não será suficiente...

ver meu post página 183

 

Tradefx1

Da tendência diária que você está tentando encontrar : você precisa redefini-la (reescrevê-la). Agora mesmo está escrito assim :

int GetDailyTrend (int res){

double MA5_1 = double iMA(NULL,1440,5,0,1,0,1);

double MA5_0 = double iMA(NULL,1440,5,0,1,0,0);

double MA8_1 = double iMA(NULL,1440,8,0,1,0,1);

double MA8_0 = double iMA(NULL,1440,8,0,1,0,0);

if (MA5_1 MA8_0) res =1;//Cross up

if (MA5_1 > MA8_1 && MA5_0 < MA8_0) res =2;//Cross down

BarCount=Bars;

return (res);

}[/php]and you are calling it like this :

if (GetDailyTrend(1) && ...) Order = SIGBNAL_BUY;

if (GetDailyTrend(2) && ...) Order = SIGNAL_SELL;

[/php]The way it is used and called now expressions GetDailyTrend(1) and GetDailyTrend(2) are always true (in metatrader any value not equal to 0 is considered a true.

_________________________

Redefine the GetDailyTrend() to something like this:

[php]int GetDailyTrend ()

{

int res = 0;

double MA5_1 = double iMA(NULL,1440,5,0,1,0,1);

double MA5_0 = double iMA(NULL,1440,5,0,1,0,0);

double MA8_1 = double iMA(NULL,1440,8,0,1,0,1);

double MA8_0 = double iMA(NULL,1440,8,0,1,0,0);

if (MA5_1 MA8_0) res =1;//Cross up

if (MA5_1 > MA8_1 && MA5_0 < MA8_0) res =2;//Cross down

return (res);

}

And then use it this way :

[php]if (GetDailyTrend()==1 && ...) Order = SIGBNAL_BUY;

if (GetDailyTrend()==2 && ...) Order = SIGNAL_SELL;

_________________________

A partir do livro e da codificação : sempre acreditei que a melhor maneira de aprender a codificação é a partir de exemplos e programas de trabalho. Acredite ou não, mas o pessoal da Microsoft é excelente para aprender (eles escrevem o código uniformemente (o que significa que eles têm regras firmes de como o código deve ser escrito) muito limpo e estão tentando torná-lo o mais eficiente possível).

Há muitos exemplos e EAs de trabalho na seção elite que qualquer pessoa pode usar (posso recomendar este aqui https://www.mql5.com/en/forum/180383 ) por razões que já declarei nesse tópico e acho que ele pode ser facilmente usado como uma "moldura" para outros EAs. Mas também, há muitos outros EAs muito úteis que podem ser usados para aprender e fazer EAs de trabalho.

E lembre-se sempre de uma coisa: as línguas de codificação são exatamente isso: "línguas". O que significa que é uma conversa simples como qualquer outra conversa. Basta ter cuidado com o que você "diz" ao computador porque o computador, ao contrário das pessoas, não questiona o que você diz, mas simplesmente o executa (e às vezes não é o que queremos que ele faça ) E então, após algum tempo, você se acostuma a "falar" com o PC e então tudo fica muito mais fácil

 

Só no caso de ...

No caso de alguém estar se perguntando qual é a lógica básica por trás do indicador adxvma, aqui está um passo intermediário dele que pode ser tão útil quanto o próprio indicador. (há etapas adicionais após esta, portanto não compare os 2 indicadores, mas esta etapa parece particularmente interessante)

Se parecer familiar a alguém, a resposta é "sim". Parece que é o indicador de tendência de poder (a tendência de poder "real", não as que são postadas e publicadas como tal - disso não tenho 100% de certeza (tudo que vi do "real" são fotos dele), mas com certeza se parece muito com ele).
Arquivos anexados:
 
mladen:
ValeoFX

Não prestei atenção ao subtítulo da mensagem, desculpe

De qualquer forma, se você está usando a mensagem deste post : https://www.mql5.com/en/forum/general então você está recebendo essa mensagem

Por outro lado, se você está usando a mensagem deste post: https: //www.mql5.com/en/forum/general (a mais recente), então você não vai receber essa mensagem

Não me lembro exatamente quando fiz o primeiro post, mas mudei alguns estilos de codificação desde então (daí a falta daquela mensagem de erro) e, francamente, antes não me importei muito com aquela mensagem de erro, pois ela realmente não muda nada. Depois disso, simplesmente decidi não deixar espaço para eventuais erros, daí a "verificação de segurança" ao determinar o limite

____________________________________

PS: essa linha funciona em modo multitemporal. Ela 'pergunta' ao período de tempo alvo quantas barras mudaram no período de tempo alvo a fim de poder recalcular o número exato de barras no período de tempo atual necessário. Portanto, essa linha só é eficaz quando no modo mtf

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

Muito obrigado pela explicação. Muito apreciado e também por me ajudar a entender melhor a codificação.

Vou baixar a segunda imediatamente.

Os melhores votos.

 

adxvma

mladen,

Estaria eu fora de linha para lhe pedir para postar a versão Tradestation?

Ray

mladen:
Pessoal, notei uma coisa ilógica no indicador (o primeiro passo é como a parte adx é calculada) e parece que há um erro no indicador que herdei sem pensar nisso . Neles, esse erro é corrigido. Mesmo os resultados são melhores desta forma.
Este cálculo é muito mais próximo ao da seção pública (portanto o da seção pública é um indicador bastante correto) com código muito mais rápido em 99% do tempo e extras que são específicos apenas para estes postados na seção de elite. Portanto, se você baixou os indicadores de posts anteriores, por favor, use estes em seu lugar. Também adicionamos mais uma opção à versão "regular": MultiColorMode- se definido como falso, apenas uma cor será usada para exibir adxvma (útil se quiser usar um par de adxvma para verificar se há cruzes como sinais).

cumprimentos

Mladen
 

Ray,

Aqui está. O indicador :

inputs:

Price (close),

length (14);

vars:

av (0);

av = ADXVMA(Price, length);

Plot1(av, "Rising");

Plot2(av, "Falling");

Plot3(av, "Neutral");

Plot4(av, "ADXVMA", iff(av = av[1], GetPlotColor(3), iff(av > av[1], GetPlotColor(1), GetPlotColor(2))));

NoPlot(1);

NoPlot(2);

NoPlot(3); [/php]and the adxvma function

[php]inputs:

Price (NumericSeries),

Length (NumericSimple);

vars:

TR(0),

DI_Diff(0),

DI_Sum(0),

ma(0),

pdm(0),

mdm(0),

pdi(0),

mdi(0),

DI_Factor(0),

VI(0),

diff(0),

HHV(0),

LLV(0),

WeightDM(Length),

WeightDI(Length),

WeightDX(Length),

ChandeEMA(Length),

out(0),

j(0);

once ma=Price;

//

// in order to make it right the "pdm=0; mdm=0;" must be added (it does not

// exist in original and that is an error, tradestation inherits values fom

// a previous loop and they must be zeroed before these calculations)

//

pdm=0; mdm=0;

if(Price>Price[1]) then pdm=Price-Price[1] else mdm=Price[1]-Price;

pdm=((WeightDM-1)*pdm[1] + pdm)/WeightDM;

mdm=((WeightDM-1)*mdm[1] + mdm)/WeightDM;

TR=pdm+mdm;

if (TR>0) then begin pdi=pdm/TR; mdi=mdm/TR; end

else begin

pdi=0;

mdi=0;

end;

pdi=((WeightDI-1)*pdi[1] + pdi)/WeightDI;

mdi=((WeightDI-1)*mdi[1] + mdi)/WeightDI;

DI_Diff=pdi-mdi;

if (DI_Diff<0) then DI_Diff= -DI_Diff;

DI_Sum=pdi+mdi;

DI_Factor=0;

if (DI_Sum>0) then out=DI_Diff/DI_Sum else out=0;

out=((WeightDX-1)*out[1] + out)/WeightDX;

if (out>out[1]) then begin HHV=out; LLV=out[1]; end

else begin

HHV=out[1];

LLV=out;

end;

for j = 1 to Length-1 begin

if(out[j+1]>HHV)then HHV=out[j+1];

if(out[j+1]<LLV) then LLV=out[j+1];

end;

diff = HHV - LLV;

VI=0;

if (diff>0) then VI=(out-LLV)/diff;

ma=((ChandeEMA-VI)*ma[1]+VI*Price)/ChandeEMA;

ADXVMA = ma;

Comentário adicionado e uma correção de código que não existia no original (esta é a única mudança que fiz nele). Alguns dos nomes das variáveis são enganosos: não há cálculo de EMA em nenhuma das etapas. Essa é uma média móvel suavizada usada nas etapas intermediárias de suavização, não EMA. Você também notará que mesmo que a lógica básica de cálculo seja de ADX, na verdade não é um ADX, mas está perto o suficiente para merecer o nome no caso deste indicador "híbrido".

cumprimentos

Mladen

traderduke:
mladen,

Estaria eu fora de linha para lhe pedir para postar a versão Tradestation?

Ray
Razão: