Ajuda na codificação - página 38

 

...

Em indicador a única maneira de fazer isso seria mantê-lo em loop infinito até que algum evento (teclado, mouse, ...) seja detectado

Mas isso também significaria que a execução do resto das funções do terminal é interrompida (é o mesmo que quando você tem um mau indicador que trava - bloqueia seu metatarraxador) Portanto, não é uma boa solução. A função que normalmente é usada para isso (sono) que permite a execução de outro código enquanto seu código é pausado (que seria o momento em que você permitiria que o resto das coisas no terminal fizesse o trabalho) é desativada nos indicadores para que não possa ser usada para uma solução

marley60:
se houver um alarme, ele faz um som de "pling" uma vez. existe a possibilidade de tocar um som de alarme até que eu o pare? (razão: não ouvirei um único "pling" quando estou no banheiro ou na cozinha)substituí o som do alarme por uma canção, mas preferiria ter uma escolha entre tocar uma vez/jogar até parar (como se estivesse na estação comercial).
 

Pergunta sobre o Índice

Olá, Mladen;

Vi que um indicador de chamada como o Ind[3][0][1] assim, o que significa primeiro e segundo índices definidos?

de antemão

kemal

 

Problema ZigZag na EA

Hi,

Eu uso o padrão Zigzag indy em minha EA. Utilizo o seguinte código para determinar os nós em ziguezague. Notei que às vezes o MT4 retorna os nós em ziguezague a partir de um período de tempo errado. Por exemplo, quando tento obter os nós em ziguezague H1, o MT4 retorna os valores dos nós em ziguezague M15. Alguém já se deparou com tal problema antes? Se você souber mais informações sobre ziguezague e a possível área do problema, por favor, informe.

Muito obrigado.

FFJason

Nota: TF é o período de tempo que eu alimento diferentes valores para obter nós em ziguezague a partir de diferentes períodos de tempo. De alguma forma o MT4 misturou os valores dos nós quando um TF específico é usado.

void vGetNode2(int TF,double& lwnd2[2],double& hgnd2[2])

{ int t=0; int p=0; int q=0; double nd2i;

for (i=0; i<=150; i++)

{ nd2i=iCustom(NULL,TF,"ZigZag",13,8,5,0,i);

if (nd2i==iLow(NULL,TF,i)) {if (p<=1) {lwnd2[p]=nd2i; p++;}}

if (nd2i==iHigh(NULL,TF,i)) {if (q<=1) {hgnd2[q]=nd2i; q++;}}

if (p==2 && q==2) break;

}

return;

}

 

Como abrir um novo pedido após S/L do pedido anterior?

Abrir novo pedido após S/L do pedido anterior.
Prezado senhor;

Algum órgão conhece o programa da EA para depois de fechar o pedido com base no S/L o novo pedido é aberto?

Atenciosamente
 

...

Você provavelmente tem um caso quando o pico ZigZag de um período é o mesmo que o pico ZigZag de outro período (o que não é um caso incomum, pois eles estão procurando por picos). No que diz respeito aos períodos de tempo, você está obtendo valores de período de tempo corretos com esse código. Talvez apenas uma mudança no código tenha que ser feita para garantir que você obtenha 4 últimos valores ZigZag, e então o código seria assim

void vGetNode2(int TF,double& lwnd2[2],double& hgnd2[2])

{

int p=0; int q=0; int max=iBarShift(NULL,TF,0); double nd2i;

for (int i=0; i<max; i++)

{

nd2i=iCustom(NULL,TF,"ZigZag",13,8,5,0,i);

if (nd2i==iLow(NULL,TF,i)) {if (p<=1) {lwnd2[p]=nd2i; p++;}}

if (nd2i==iHigh(NULL,TF,i)) {if (q<=1) {hgnd2[q]=nd2i; q++;}}

if (p==2 && q==2) break;

}

return;

}

[/PHP]

As you can see only the loop end is changed from "150" to "Bars-1"

novalight:
Hi,

I use standard Zigzag indy in my EA. I use the following code to determine the zigzag nodes. I noticed that sometimes the MT4 returns the zigzag nodes from the wrong time frame. For example, when I try to get H1 zigzag nodes, MT4returns M15 zigzag node values. Has anyone come across such problem before? If you know more info about zigzag and the possible problem area, please advise.

Many thanks.

FFJason

note: TF is the time frame which I feed different values for getting zigzag nodes from different time frame. Somehow MT4 mixed up the node values when a specific TF is used.

[PHP]

void vGetNode2(int TF,double& lwnd2[2],double& hgnd2[2])

{ int t=0; int p=0; int q=0; double nd2i;

for (i=0; i<=150; i++)

{ nd2i=iCustom(NULL,TF,"ZigZag",13,8,5,0,i);

if (nd2i==iLow(NULL,TF,i)) {if (p<=1) {lwnd2[p]=nd2i; p++;}}

if (nd2i==iHigh(NULL,TF,i)) {if (q<=1) {hgnd2[q]=nd2i; q++;}}

if (p==2 && q==2) break;

}

return;

}

 

Problema ZigZag na EA

Olá, donzela,

Muito obrigado por sua ajuda.

Eu fiz algumas leituras no iBarShift, e seu iBarShift(NULL,TF,0) parece obter o número total de barras no gráfico. Por favor, me corrija se eu entendi mal sua intenção de usar o iBarShift.

Eu olho para aqueles casos em que o ZigZag retornou valores de nós errados, e o número de busca (eu uso 150) não foi o problema. Além disso, entendo que alguns nós são iguais para um período de tempo diferente, mas os erros que encontrei foram dois ou mais nós e os números de barra correspondentes apontavam para um período de tempo diferente. Esse foi o problema que me intrigou.

Hoje eu encontrei mais problemas intrigantes com o Zigzag. Uso Alerta para exibir os nós retornados pela rotina e descobri que às vezes a rotina retorna um par correto de nós e seu número de barras, mas o outro nó e número de barras eram ambos 0. Isso é realmente estranho. Melhoro ainda mais a rotina, garantindo que nenhum nó tenha o valor 0 com os seguintes códigos. Só espero que não seja o MT4 pulando um batimento cardíaco ou uma parada, e jogando lixo fora para minha EA. A razão pela qual digo isto é que meu outro EA que mostra mensagens de alerta quando meu programa tenta inserir SL e TP, ou reunir valores OP, e aconteceu com bastante freqüência que o MT4 simplesmente pulou estes passos, e retornou valores 0. Tenho que aprimorar meu programa para olhar para estas instâncias e ter certeza de que estas tarefas sejam executadas corretamente.

Por favor, avise. Estou no fim da minha sagacidade. Sua ajuda é muito apreciada. Abraço,

Novalight

int iGetNode4(int TF, double& lwnd4, double& hgnd4, int& lwnd4bar, int& hgnd4bar)

{ lwnd4=0; hgnd4=0; lwnd4bar=0; hgnd4bar=0; int t=0,p=0; //node 4 = arrow

for (i=0; i<=120; i++)

{ double lowi=iLow(NULL,TF,i); double highi=iHigh(NULL,TF,i);

if (iCustom(NULL,TF,"ZigZag",80,35,12,0,i)==lowi && lowi!=0) {if (t==0) {lwnd4=iLow(NULL,TF,i); lwnd4bar=i; t++; if(lwnd4==0) Alert(lwnd4);}}

if (iCustom(NULL,TF,"ZigZag",80,35,12,0,i)==highi && highi!=0) {if (p==0) {hgnd4=iHigh(NULL,TF,i); hgnd4bar=i; p++;if (hgnd4==0) Alert(hgnd4);}}

if (t==1 && p==1) break;

}

if (lwnd4bar<hgnd4bar) return(1); //current node 4 is a low node for Long

if (lwnd4bar>hgnd4bar) return(-1); //current node 4 is a high node for Short

return;

}

[/PHP]

mladen:
You probably have a case when the ZigZag peak of one time frame is the same as the ZigZag peak of another time frame (which is not an unusual case since they are looking for peaks). As far as time frames are concerned, you are getting correct time frame values with that code. Maybe just one change in the code has to be done in order to ensure that you get 4 last ZigZag values, and then the code would be like this

[PHP]void vGetNode2(int TF,double& lwnd2[2],double& hgnd2[2])

{

int p=0; int q=0; int max=iBarShift(NULL,TF,0); double nd2i;

for (int i=0; i<max; i++)

{

nd2i=iCustom(NULL,TF,"ZigZag",13,8,5,0,i);

if (nd2i==iLow(NULL,TF,i)) {if (p<=1) {lwnd2[p]=nd2i; p++;}}

if (nd2i==iHigh(NULL,TF,i)) {if (q<=1) {hgnd2[q]=nd2i; q++;}}

if (p==2 && q==2) break;

}

return;

}

As you can see only the loop end is changed from "150" to "Bars-1"
 

...

A partir do iBarShift(NULL,TF,0) : sim, ele retorna o total de barras de um período de tempo alvo. Mas o loop não será executado tantas vezes, Ele existirá assim que os últimos 4 picos ZigZag forem encontrados.

Agora, por uma questão de argumentação, imagine isto: você chama a função por um período de tempo e tem o limite de 150 barras para procurar os últimos 4 picos. Ele faz o trabalho e depois você procura em outro período de tempo. E, apenas por uma questão de argumentação, imagine que o 4º pico esteja fora das primeiras 150 barras. O que vai acontecer. Como suas matrizes não foram limpas, alguns resultados para o período de tempo procurado anteriormente ainda estão lá, já que na 150ª barra não foram encontrados todos os 4 picos e alguns picos encontrados anteriormente são deixados lá como foram encontrados no período de tempo procurado atualmente.

Esse foi o objetivo de acrescentar esse código: garantir que ele encontre realmente os últimos 4 picos. Às vezes serão necessárias 10 barras, às vezes 1000 (depende inteiramente do ZigZag e não é um número fixo de barras), mas não fará "loop" de "barras" vezes. Ele fará loop apenas os tempos necessários e certificar-se-á de que todos os 4 picos estejam a partir do período de tempo alvo.

No que diz respeito à confusão de prazos, não creio que isso esteja acontecendo. A forma como o arquivo de histórico para os quadros de tempo alvo é aberto (simplesmente adicionando minutos do quadro de tempo alvo ao nome do símbolo) torna impossível ler dados de 2 quadros de tempo em um único loop se o parâmetro de quadro de tempo não for alterado (apenas 1 arquivo de histórico é aberto nesse caso e não pode acessar dados de quadros de tempo diferentes).

novalight:
Olá, donzela,

Muito obrigado por sua ajuda.

Eu fiz algumas leituras no iBarShift, e seu iBarShift(NULL,TF,0)parece obter o número total de barras no gráfico. Por favor, me corrija se eu entendi mal sua intenção de usar o iBarShift.

Eu olho para aqueles casos em que o ZigZag retornou valores de nós errados, e o número de busca (eu uso 150) não foi o problema. Além disso, entendo que alguns nós são iguais para um período de tempo diferente, mas os erros que encontrei foram dois ou mais nós e os números de barra correspondentes apontavam para um período de tempo diferente. Esse foi o problema que me intrigou.

Hoje eu encontrei mais problemas intrigantes com o Zigzag. Uso Alerta para exibir os nós retornados pela rotina e descobri que às vezes a rotina retorna um par correto de nós e seu número de barras, mas o outro nó e número de barras eram ambos 0. Isso é realmente estranho. Melhoro ainda mais a rotina, garantindo que nenhum nó tenha o valor 0 com os seguintes códigos. Só espero que não seja o MT4 pulando um batimento cardíaco ou uma parada, e jogando lixo fora para minha EA. A razão pela qual digo isto é que meu outro EA que mostra mensagens de alerta quando meu programa tenta inserir SL e TP, ou reunir valores OP, e aconteceu com bastante frequência que o MT4 simplesmente pulou estes passos, e retornou valores 0. Tenho que aprimorar meu programa para olhar para estas instâncias e ter certeza de que estas tarefas sejam executadas corretamente.

Por favor, avise. Estou no fim da minha sagacidade. Sua ajuda é muito apreciada. Abraço,

Novalight

int iGetNode4(int TF, double& lwnd4, double& hgnd4, int& lwnd4bar, int& hgnd4bar)

{ lwnd4=0; hgnd4=0; lwnd4bar=0; hgnd4bar=0; int t=0,p=0; //node 4 = arrow

for (i=0; i<=120; i++)

{ double lowi=iLow(NULL,TF,i); double highi=iHigh(NULL,TF,i);

if (iCustom(NULL,TF,"ZigZag",80,35,12,0,i)==lowi && lowi!=0) {if (t==0) {lwnd4=iLow(NULL,TF,i); lwnd4bar=i; t++; if(lwnd4==0) Alert(lwnd4);}}

if (iCustom(NULL,TF,"ZigZag",80,35,12,0,i)==highi && highi!=0) {if (p==0) {hgnd4=iHigh(NULL,TF,i); hgnd4bar=i; p++;if (hgnd4==0) Alert(hgnd4);}}

if (t==1 && p==1) break;

}

if (lwnd4bar<hgnd4bar) return(1); //current node 4 is a low node for Long

if (lwnd4bar>hgnd4bar) return(-1); //current node 4 is a high node for Short

return;

}

 

Problema ZigZag na EA

Olá, donzela,

Você está absolutamente certo! Revi meu código e descobri que 150 é insuficiente para o ziguezague grande, e se não forem encontrados todos os 4 nós, toda a lógica de identificar qual nó vem em punho ou por último será o haywire.

Em conclusão, não há nada de errado com Zigzag ou MT4, é puramente meu próprio erro ao definir um número de busca muito pequeno. Agradeço por seu tempo, paciente, e mais importante, por sua disposição em ajudar ......

Cuide-se .....

Novalight

mladen:
A partir do iBarShift(NULL,TF,0) : sim, ele retorna o total de barras de um período de tempo alvo. Mas o loop não será executado tantas vezes, Ele existirá assim que os últimos 4 picos ZigZag forem encontrados.

Agora, por uma questão de argumentação, imagine isto: você chama a função por uma vez e tem o limite de 150 barras para procurar os últimos 4 picos. Ele faz o trabalho e depois você olha para outro período de tempo. E, só por uma questão de argumentação, imagine que o 4º pico esteja fora das primeiras 150 barras. O que vai acontecer. Como suas matrizes não foram limpas, alguns resultados para o período de tempo procurado anteriormente ainda estão lá, já que na 150ª barra não foram encontrados todos os 4 picos e alguns picos encontrados anteriormente são deixados lá como foram encontrados no período de tempo procurado atualmente.

Esse foi o objetivo de acrescentar esse código: garantir que ele encontre realmente os últimos 4 picos. Às vezes serão necessárias 10 barras, às vezes 1000 (depende inteiramente do ZigZag e não é um número fixo de barras), mas não fará "loop" de "barras" vezes. Ele fará loop apenas os tempos necessários e certificar-se-á de que todos os 4 picos estejam a partir do período de tempo alvo.

No que diz respeito à confusão de prazos, não creio que isso esteja acontecendo. A forma como o arquivo de histórico para os quadros de tempo alvo é aberto (simplesmente adicionando minutos do quadro de tempo alvo ao nome do símbolo) torna impossível ler dados de 2 quadros de tempo em um único loop se o parâmetro de quadro de tempo não for alterado (apenas 1 arquivo de histórico é aberto nesse caso e não pode acessar dados de quadros de tempo diferentes).
 

Ajuda com o código

Alguém teria a gentileza de acrescentar código ao indicador SnakeBorders para adicionar as duas parcelas a seguir:

1. Uma trama de linha que traça o meio da faixa branca (como representado pela linha vermelha na figura).

2. Uma trama de linha que plote o extremo oposto da linha amarela (como representado pela linha cian na foto).snakeborders.mq4

Arquivos anexados:
sb.gif  39 kb
 

por favor, alguém ajude a criar este indicador para mim

Indicador que eu quero

Condição

Compra quando o preço da vela do corpo cruza acima do indicador ma e rsi > rsi 50 depois que a vela fecha abre nova vela começa uma flecha Azul e Linha Azul até Vender

Vender quando o preço da vela do corpo cruzar o indicador ma inferior e rsi < rsi 50 após a vela fechar abrir nova vela iniciar uma seta vermelha e linha vermelha até a compra

por favor, acrescente também entradas para mudança de valor

Desculpe em meu inglês ruim

Muito obrigado