Como codificar? - página 312

 

...

Como é declarado o seu LastProfitHigh?

Se for declarado dentro do corpo da função (start() por exemplo) sempre mudará de valor se não for declarado como estático. Portanto, se for declarado como local (dentro da função) tente declará-lo no escopo global ou como variável estática e assim "herdará" valores entre dois ticks.

aud4xtrader:
Olá a todos,

Sou novo na codificação e tenho aprendido lentamente o idioma e a sintaxe, mas tenho me perguntado como o MT4 atualiza as variáveis.

Eu tentei codificar e EA simples que exibe o maior lucro que um comércio atualmente aberto teve e só deveria atualizar se uma nova alta for atingida, mas o que está acontecendo é que a quantidade está se movendo para baixo e para cima como o lucro faz, eu não consigo ver meu erro na lógica do código.

Eu verifico para ter certeza de que o comércio selecionado ainda está aberto.

t_CloseTime=OrderCloseTime(); //retorna 0 se o pedido não for fechado

if(t_CloseTime==0) //Order is closed if not zero.

{

if(OrderProfit() > LastProfitHigh) LastProfitHigh=OrderProfit();

if(LastProfitHigh >= MinProfit && MinProfitReached===falso) MinProfitReached=verdadeiro;

}//endif

Então se a lógica estiver correta, por que esta variável "LastProfitHigh" sobe e desce....

Obrigado por sua ajuda.
 

Novo na codificação

mladen:
Como seu LastProfitHigh é declarado? Se for declarado dentro do corpo da função (start() por exemplo) sempre mudará de valor se você não o declarar como estático. Portanto, se for declarado como local (dentro da função) tente declará-lo no escopo global ou como variável estática e assim "herdará" valores entre dois ticks.

Oi mladen,

Agora movi a variável para fora do func inicial() e declarei-a "dupla estática", obrigado pela resposta e cruzei os dedos para que ela se mostrasse corretamente.

A lógica do código é declarada corretamente??

 

aud4xtrader

A lógica é OK

Se você mover a variável para fora do início, não precisa declará-la estática (é automaticamente uma variável global quando está fora de qualquer corpo de função - e é "visível" através de todo o código) Se você quiser que a variável se mantenha local para alguma função e ainda mantenha o estado anterior dela (o estado em um tick anterior, por exemplo), então você a declara como estática

Aqui estão dois exemplos que terminarão no mesmo resultado

double previousProfit=0;

int start()

{

...

if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();

}

[/PHP]

or the same thing but with static variable

[PHP]

int start()

{

static double previousProfit=0;

...

if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();

}

aud4xtrader:
Oi mladen,

Agora movi a variável para fora do func inicial() e declarei-a "dupla estática", obrigado pela resposta e cruzei os dedos para que ela se mostrasse corretamente.

A lógica do código é declarada corretamente??
 

Como codificar?

Funciona muito bem, obrigado novamente pela excelente ajuda.

mladen:
aud4xtrader

A lógica é OK.

Se você mover a variável para fora do início, não precisa declará-la estática (é automaticamente uma variável global quando está fora de qualquer corpo de função - e é "visível" através de todo o código) Se você quiser que a variável se mantenha local para alguma função e ainda mantenha o estado anterior dela (o estado em um tick anterior, por exemplo), então você a declara como estática

Aqui estão dois exemplos que terminarão no mesmo resultado

double previousProfit=0;

int start()

{

...

if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();

}

[/PHP]

or the same thing but with static variable

[PHP]

int start()

{

static double previousProfit=0;

...

if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();

}

 

Perfeito! Obrigado.

mladen:
Tente estas 2 funções
:Primeiro é descobrir se existe uma ordem com exatamente o mesmo preço em aberto já a Second

está verificando se existe uma ordem que está com pontos nnn a partir do preço desejado

Ambos retornam verdadeiros se o preço for igual ou se a distância do preço de algumas ordens atualmente abertas estiver com a distância especificada

bool existsAtSamePrice(int magicNumber, double price)

{

for (int i=OrdersTotal()-1; i>=0 ; i--)

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;

if (OrderSymbol()!=Symbol()) continue;

if (OrderMagicNumber()!=magicNumber) continue;

if (CompareDouble(OrderOpenPrice(),price)) return(true);

}

return(false);

}

//

//

//

//

//

bool existsAtApproximatePrice(int magicNumber, double price, double distance)

{

for (int i=OrdersTotal()-1; i>=0 ; i--)

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;

if (OrderSymbol()!=Symbol()) continue;

if (OrderMagicNumber()!=magicNumber) continue;

if (MathAbs(OrderOpenPrice()-price)< distance) return(true);

}

return(false);

}

//

//

//

//

//

bool CompareDouble(double val1, double val2)

{

return(NormalizeDouble(val1,Digits)==NormalizeDouble(val2,Digits));

}

 

Como codificar?

Olá Pip,

Obrigado pelos trechos de código, é ótima a maneira como as pessoas podem compartilhar idéias e estilos de codificação, à medida que meu conhecimento cresce posso tirar lições de pessoas como você e mladen.

Pip:
Perfeito! Obrigado.
 

Hi,

tenho um pedido.

Se eu quiser apagar todos os objetos que contêm no nome a palavra "exemplo" com o comando ObjectDelete, como devo escrever o código?

Por exemplo

Nome do objeto

"Exemplo13241"

"Exemplo453623".

quero apagar todos os objetos que contenham a palavra "Exemplo".

Muito obrigado

 

...

Usar algo como isto (isto apagará todos os objetos que têm nomes que começam com "Exemplo") :

string lookFor = "Example";

int lookForLength = StringLen(lookFor);

for (int i=ObjectsTotal()-1; i>=0; i--)

{

string objectName = ObjectName(i);

if (StringSubstr(objectName,0,lookForLength) == lookFor) ObjectDelete(objectName);

}

dasio:
Hi,

tenho um pedido.

Se eu quiser apagar todos os objetos que contenham no nome a palavra "exemplo" com o comando ObjectDelete, como devo escrever o código?

Por exemplo

Nome do objeto

"Exemplo13241"

"Exemplo453623".

quero apagar todos os objetos que contenham a palavra "Exemplo".

Muito obrigado
 
mladen:
Use algo como isto (isto apagará todos os objetos que tenham nomes que comecem com "Exemplo") :
string lookFor = "Example";

int lookForLength = StringLen(lookFor);

for (int i=ObjectsTotal()-1; i>=0; i--)

{

string objectName = ObjectName(i);

if (StringSubstr(objectName,0,lookForLength) == lookFor) ObjectDelete(objectName);

}

Obrigado, é perfeito.

Eu tenho outra pergunta ^^.

Eu crio um segmento de linha de tendência no gráfico com comprimento declarado. Posso definir a cor e está tudo bem. Eu saberia se é possível definir mais de 1 cor na mesma linha de tendência.

Por exemplo, para a primeira 1/3 parte uma cor, para a 2/3 parte outra cor e para a 3/3 parte outra cor.

É possível?

Obrigado ^^

 

..

Em resumo, se você estiver se referindo a objetos, a resposta é não. Você teria que criar 3 objetos para isso

Se você estiver usando buffers para isso, então você precisará de 5 buffers de desenho para uma linha de 3 cores sem pintura, e como existem apenas 8 buffers de desenho, isso limita significativamente

dasio:
Obrigado, é perfeito.

Eu tenho outra pergunta ^^.

Eu crio um segmento de linha de tendência no gráfico com comprimento declarado. Posso definir a cor e está tudo bem. Eu saberia se é possível definir mais de 1 cor na mesma linha de tendência.

Por exemplo, para a primeira 1/3 parte uma cor, para a 2/3 parte outra cor e para a 3/3 parte outra cor.

É possível?

Obrigado ^^
Razão: