Ciclo Operador 'para' perguntas - página 4

 

Simon,

Ok, deixe-me tentar adicionar também o nível de parada ao EA só para uma boa medida.

O nível de congelamento para USDJPY é 0 e o nível de parada é 30.

Presumo que 30 representa 3 porque o corretor tem 5 dígitos. Eu tentei usar o MODE_SPREAD e recebi 20. Obviamente o spread para USDJPY não é 20, mas ;) 2.0. Também poderia ser dito que 2 pips é equivalente a 20 pontos.

Obrigado.

 

Uma pista para você . . . .

 

Simon,

Esta parece ser mais uma vez uma questão de ordem seletiva.

A função OrderClose() está tentando fechar uma ordem (não a ordem USDJPY). Ela está tentando fechar a ordem no gráfico EURUSD.

A função OrderPrint() foi previamente selecionada antes de sua execução e se assemelha claramente ao seu propósito como pretendido.

A cor vermelha circundando o preço inválido deve indicar ERRADO.

A cor verde que circunda o USDJPY deve indicar DIREITO.

Portanto, se tudo for verdade, devo me concentrar no círculo vermelho e selecionar a ordem antes da execução da função OrderClose().

Obrigado.

 
WhooDoo22:


o que é Licitações e Pedidos ?

Ask é o último preço conhecido do vendedor (ask price) para o símbolo atual.

Bid é o mais recente preço conhecido do comprador (preço de oferta, preço de compra) do símbolo atual.

Você já sabe a razão pela qual o fechamento falhou . . . pense cuidadosamente por um minuto.


Veja o seu código, qual o preço que você usa para fechar o pedido ?

 

Simon,

Ask/Bid é o último preço conhecido do vendedor/comprador para o símbolo atual.

O preço que a EA deseja fechar o pedido é o preço do símbolo EURUSD.

Por que a EA depende de ser colocada em um gráfico USDJPY para fechar sua ordem? A função OrderSelect( ) foi destinada a selecionar o número do bilhete e uma vez selecionado o número do bilhete, a EA poderia então selecionar

Aparentemente, a EA deve estar no gráfico do símbolo USDJPY para fechar os pedidos nesse


Risque tudo o que acabei de dizer.

Esta é a solução. O erro está dentro do terceiro parâmetro. Estou considerando especificar o símbolo e ENTÃO colocar a variável ask/bid dentro de seu parâmetro (localização 3º parâmetro da função OrderClose()). Isto deve remover qualquer obscurecimento do pensamento.

Obrigado.

 
WhooDoo22:.

Esta é a solução. O erro está dentro do terceiro parâmetro. Estou considerando especificar o símbolo e ENTÃO colocar a variável pedido/proposta dentro de seu parâmetro (local 3º parâmetro da função OrderClose()). Isto deve remover qualquer obscurecimento do pensamento.

Obrigado.

Bid and Ask are Predefined Variables and are relevant ONLY to the current chart that the EA is on. If you want Bid or Ask for a different symbol than the chart that the EA is on you can't use the Bid and Ask predefined variables. Você pode usar MarketInfo() embora ;-)
 

Simon,

O erro está dentro do terceiro parâmetro da função OrderClose() porque ;) Ask/Bid é o último preço conhecido do vendedor/comprador para o símbolo atual. Se "para o símbolo atual" significa o gráfico atual no qual a EA é colocada, então isto pode ser um pouco confuso. Devo lembrar que a MQL4 já existe há algum tempo e tem seus métodos únicos de ilustração e representação.

A solução é substituir as variáveis pré-definidas Ask/Bid por uma alternativa, como...

// solution 1.

MarketInfo("USDJPY",MODE_BID);

// solution 2.

MarketInfo("USDJPY",MODE_ASK);

O que você diz a isto?


Eu adicionei uma versão deste EA que tem a capacidade de imprimir informações de ordem USDJPY e fechá-lo independentemente do gráfico em que é colocado. Ainda não confirmei se modificou o pedido de USDJPY SL e TP, mas confirmarei após a verificação. A EA produz um erro final que não deve ser difícil de resolver. Estou trabalhando nisto atualmente. aqui está um instantâneo da leitura do erro:

erro de bilhete inválido

Obrigado.

Arquivos anexados:
 
WhooDoo22:

Simon,

O erro está dentro do terceiro parâmetro da função OrderClose() porque ;) Ask/Bid é o último preço conhecido do vendedor/comprador para o símbolo atual. Se "para o símbolo atual" significa o gráfico atual no qual a EA é colocada, então isto pode ser um pouco confuso. Devo lembrar que a MQL4 já existe há algum tempo e tem seus métodos únicos de ilustração e representação.

A solução é substituir as variáveis pré-definidas Ask/Bid por uma alternativa como...

O que você diz a isto?


Eu adicionei uma versão deste EA que tem a capacidade de imprimir informações de pedido USDJPY e fechá-lo independentemente do gráfico em que é colocado. Ainda não confirmei se modificou o pedido de USDJPY SL e TP, mas confirmarei após a verificação. A EA produz um erro final que não deve ser difícil de resolver. Estou trabalhando nisto atualmente. aqui está um instantâneo da leitura do erro:


Obrigado.

E agora você vê as limitações de seu código . . você não tem mais uma ordem USDJPY, então seu enquanto encontra a ordem na posição 0 e não é USDJPY, então encontra a próxima na 1 e não é USDJPY então olha para a posição 2 e a OrderSelect() falha, isto termina o tempo mas o resto do código é então executado, isto dá uma OrderModify() falhada, uma OrderPrint() falhada, uma OrderType() falhada e OrderClose() falhada. . o que é que GetLastError() está fazendo por conta própria?
 

Simon,

O ciclo 'enquanto' o operador é realizado como tal: Se a expressão for verdadeira, o operador é executado até que a expressão se torne falsa. Se a expressão for falsa, o controle será dado ao próximo operador.

O propósito do código na caixa SRC abaixo, é fazer o seguinte:

Enquanto a variável 'i' (contida na função OrderSelect() ) NÃO é o número de posição do bilhete USDJPY E o símbolo de ordem não é USDJPY, avariável 'i' é aumentada até que a variável 'i' seja o número de posição do bilhete USDJPY E o símbolo de ordem seja USDJPY. Uma vez que o ciclo 'while' se torna falso, o controle é então passado abaixo, para a próxima linha de código.

Eu forneci o cabeçalho 'while' e o corpo para ajuda visual.

while(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()!="USDJPY")

i++;

Acredito que você entende como o ciclo "while" localiza um bilhete no par de moedas USDJPY mesmo sem que um bilhete esteja atualmente no par de moedas mas ;) Receio que eu não entendo.

Como o ciclo 'while' pode localizar um bilhete no gráfico USDJPY se não há ordem no gráfico USDJPY para localizar?

Acredito que você tenha escrito algo no sentido de localizar a ordem na posição 0. Você pode expor sobre isso ou possivelmente fornecer um link para estudo?

Obrigado.

 
WhooDoo22:


Acredito que você entende como o ciclo "enquanto" localiza um bilhete no par de moedas USDJPY mesmo sem que um bilhete esteja atualmente no par de moedas, mas ;) Receio que eu não entendo.

Como o ciclo "while" pode localizar um bilhete no gráfico USDJPY se não há ordem no gráfico USDJPY para localizar?

Acredito que você tenha escrito algo no sentido de localizar a ordem na posição 0. Você pode expor sobre isso ou possivelmente fornecer um link para estudo?

Se você quiser escrever código para si mesmo, então você precisa realizar a tarefa de 3 pessoas, talvez até 4. A pessoa que elabora o documento de requisitos, o engenheiro de software e o engenheiro de testes. Não é suficiente conhecer a sintaxe ao contrário e ser capaz de escrever código . . você deve entender o problema que está tentando resolver e como vai resolvê-lo, e também deve saber como testar o código para ter certeza de que ele atende ao requisito.

Em um nível básico, isto significa passar por seu código linha por linha e certificar-se de que ele faz o que você queria que ele fizesse, geralmente isto é com uma faixa de valores para cada variável indo desde seu valor mínimo, passando por valores típicos até o valor máximo.


Vamos fazer isso com seu loop . .

Quando você declara uma variável int sem definir seu valor, ela tem um valor inicial de 0, então quando você declara i (por que não usar um nome de variável que seja mais descritivo ?) ela tem um valor 0, portanto, na primeira vez em torno do loopi é 0, então a OrderSelect() tenta selecionar a ordem na posição 0 se isso funcionar sua chamada OrderSymbol() retornará o nome correto do símbolo para a ordem na posição 0 e se não for "USDJPY" então a expressão(OrderSymbol() != USDJPY") resultará em um valor verdadeiro , se a OrderSelect() for verdadeira e a verificação do símbolo for verdadeira,verdadeira e verdadeira =verdadeira e a próxima linha de código ( isto está dentro do laço enquanto) for executada.

Agorai é 1 , a OrderSelect() seleciona a ordem na posição 1 para que resulte em um valor verdadeiro, a verificação do símbolo não encontra um símbolode USDJPY assim retorna verdadeiro, novamente verdadeiro e verdadeiro = verdadeiro assim i++ é executado novamente

Agorai
é 2 , a OrderSelect() tenta selecionar a Ordem na posição 2 mas falha . . há apenas 2 ordens abertas, nas posições 0 & 1, então a OrderSelect() retorna falsa, o que faz a OrderSymbol() ? não há nenhuma ordem válida selecionada . . mas mesmo que retorne verdadeiro por alguma razão estranha, a OrderSelect() já retornou falso,falso e verdadeiro = falso . . o loop while terminou ei está definido em 2

Agora trabalhe através do resto do código tendo em mente queeu tenho um valor de 2. .

Razão: