Como codificar? - página 303

 

outras perguntas de iniciantes

Olá, sou novo na programação, mas não sou novo no comércio. Eu não postei nada por um tempo e agora, desde que comecei a desenvolver minha EA, tenho muitas perguntas. Comecei a construir um indicador primeiro, e uma vez que ele faça o que eu quero, irei mais longe. Li todos os manuais que pude encontrar, então agora é hora de seguir em frente com a codificação.

Desculpe, se for um tópico errado - por favor, me avise onde devo postar tais perguntas então.

Tenho 2 perguntas básicas, provavelmente, por enquanto, por favor:

1. Em muitos indicadores que usam MAs eu vejo linhas verificando quantas barras estão no gráfico. Então, se eu precisar do MA200 e o gráfico tiver, digamos, apenas 100 barras, o iMA200 funcionaria então? Eu acho que sim - eu verifiquei e qualquer MA é desenhado sem qualquer problema em qualquer gráfico, então eu acho que este é um erro antigo que Metaquotes corrigido agora. Então, há algum ponto de verificar quantas barras há no gráfico para desenhar MA ou usar a função iMA?

2. Qual é a diferença entre Close e iClose? Meu entendimento é que Close pode retornar um fechamento das barras somente no gráfico atual, e iClose pode retornar qualquer fechamento de qualquer par de moedas e qualquer período de tempo. E em ambos os casos, a fim de obter uma última barra fechada, tenho que usar índice [1]. Estou vendo isso corretamente?

Obrigado.

 

Eu já fiz isso. Veja o vermelho destacado abaixo:

//--- Deterime se a ordem de venda anterior é rentável

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

if (OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)

{

se (OrderProfit() >= 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "W";

retornar (WinLossPreviousShort);

}

se ((OrderProfit() < 0 && OrderType() == OP_SELL) || LastOpenTicket() == -1)

{

WinLossPreviousShort = "L";

retornar (WinLossPreviousShort);

}

}

}

Ainda completamente em branco.

Coçando minha cabeça. Sei que sua ajuda é limitada porque não colei o código, mas o código acima lhe parece bem?

Também com a primeira linha abaixo, preciso fazer referência ao LastOpenTicket com () depois?

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

 

...

Se você estiver chamando essa função com o número do último bilhete aberto como argumento, então o código após a linha azul nunca será executado (o OrderSelect() falha se o número do LastOpenTicket for -1 (que nesse momento é equivalente ao resultado da função LastOpenTicket()), e o código não conseguir executar o bloco após a linha azul)

crsnape@btinternet.com:
Eu já fiz isso. Veja o vermelho destacado abaixo:

//--- Deterime se a ordem de venda anterior é lucrativa

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

if (OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)

{

se (OrderProfit() >= 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "W";

retornar (WinLossPreviousShort);

}

se ((OrderProfit() < 0 && OrderType() == OP_SELL) || LastOpenTicket() == -1)

{

WinLossPreviousShort = "L";

retornar (WinLossPreviousShort);

}

}

}

Ainda completamente em branco.

Coçando minha cabeça. Sei que sua ajuda é limitada porque não colei o código, mas o código acima lhe parece bem?

Também com a primeira linha abaixo, preciso fazer referência ao LastOpenTicket com () depois?

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)
 

Não tenho certeza se estou entendendo.

se ((OrderProfit() < 0 && OrderType() == OP_SELL) || LastOpenTicket() == -1)

Portanto, como estou chamando a função LastOpenTicket() na linha acima, o resto dessa função não é executada e a OrderSelect() falha. Estou seguindo você certo?

 

...

Vamos supor o seguinte :

- você não tinha pedidos anteriores

- LastOpenedTicket() retornou -1 (sem pedidos anteriores) como resultado

- você chama a função com esse resultado

OrderSelect() falha uma vez que o bilhete de pedido -1 não existe e nenhum dos códigos por trás do pedido selecionado é executado. Mesmo quando a LastOpenTicket é > -1, a "condição da linha azul" que LastOpenTicket() == -1 nunca pode ser verdadeira, pois a única maneira de chegar a essa parte do código é quando a LastOpenTicket é > -1

É por isso que sugeri o "3º estado : o "Na", já que de fato você tem 3 estados por causa do estado inicial "sem ordens anteriores".

crsnape@btinternet.com:
Não tenho certeza se estou entendendo.

se ((OrderProfit() < 0 && OrderType() == OP_SELL) || LastOpenTicket() == -1)

Então porque estou chamando a função LastOpenTicket() na linha acima, o resto dessa função não é executada e a OrderSelect() falha. Estou seguindo você certo?
 

algumas questões de codificação, provavelmente de iniciantes

Olá, sou novo na programação, mas não sou novo no comércio. Estou construindo minha EA, mas comecei a construir primeiro um indicador, e uma vez que ele faça o que eu quero, irei mais longe. Li todos os manuais que pude encontrar e agora estou codificando-o.

Agradecia qualquer conselho - todos vocês começaram onde estou agora...

Tenho 2 perguntas básicas, provavelmente, por enquanto, por favor:

1. Em alguns indicadores que usam MAs vejo linhas que verificam quantas barras estão no gráfico. Então, se eu precisar do MA200 e o gráfico tiver, digamos, apenas 100 barras, o iMA200 funcionaria então? Eu acho que sim - eu verifiquei e qualquer MA é desenhado sem problemas em qualquer gráfico, então eu acho que este é um problema antigo que as Metaquotas corrigiram agora. Então, há algum ponto de verificar quantas barras há no gráfico para desenhar MA ou usar a função iMA?

2. Qual é a diferença entre Close e iClose? Meu entendimento é que Close pode retornar um fechamento das barras somente no gráfico atual, e iClose pode retornar qualquer fechamento de qualquer par de moedas e qualquer período de tempo. E em ambos os casos, a fim de obter uma última barra fechada, tenho que usar índice [1]. Isso é correto?

Obrigado.

 

Assim?

//--- Deterime se a ordem de venda anterior é lucrativa

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

if (OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)

{

se (OrderProfit() >= 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "W";

retornar (WinLossPreviousShort);

}

if (OrderProfit() < 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "L";

retornar (WinLossPreviousShort);

}

se (LastOpenTicket() == -1)

{

WinLossPreviousShort = "NA";

retornar (WinLossPreviousShort);

}

}

}

OU ESTE? muda em vermelho.

//--- Deterime se a ordem de venda anterior é rentável

string GetWinLossPreviousShort (int LastOpenTicket, int LastTicket, string WinLossPreviousShort)

{

if (OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)

{

se (OrderProfit() >= 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "W";

retornar (WinLossPreviousShort);

}

if (OrderProfit() < 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "L";

retornar (WinLossPreviousShort);

}

se (LastTicket == -1)

{

WinLossPreviousShort = "NA";

retornar (WinLossPreviousShort);

}

}

}

 

ah seu clique final, eu não posso usar OrderSelect em um número de bilhete que é -1 porque -1 não existe. Os bilhetes vão de 0 para cima.

Eu preciso declarar LastOpenTicket fora da função OrderSend, certo?

 

...

Tente assim ..:

string GetWinLossPreviousShort (int LastOpenTicket, int LastTicket, string WinLossPreviousShort)

{

if (LastTicket == -1)

{

WinLossPreviousShort = "NA";

return (WinLossPreviousShort);

}

//

//

// if LastTicket == -1 no need even to try to execute the code bellow

// you already have exited for case when it is -1, so the code bellow

// will be executed properly

//

//

if (OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)

{

if (OrderProfit() >= 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "W";

return (WinLossPreviousShort);

}

if (OrderProfit() < 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "L";

return (WinLossPreviousShort);

}

}
 

Graças mladen, o código abaixo equivale basicamente ao mesmo que o seu? Eu digitei isto como você postou seu último! :-)

EDITED-

//--- Deterime se a ordem de venda anterior é lucrativa

string GetWinLossPreviousShort (int LastOpenTicket, int LastTicket, string WinLossPreviousShort)

{

if (OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)

{

se (OrderProfit() >= 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "W";

retornar (WinLossPreviousShort);

}

if (OrderProfit() < 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "L";

retornar (WinLossPreviousShort);

}

}

se (LastTicket == -1)

{

WinLossPreviousShort = "NA";

retornar (WinLossPreviousShort);

}

}

Razão: