Ciclo Operador 'para' perguntas

 

Olá comunidade MQL4,


Primeira referência: https://book.mql4.com/operators/for

De acordo com a primeira referência, um exemplo de formato do operador 'para' é escrito como tal:

  for (Expression_1; Condition; Expression_2)         // Cycle operator header
      One operator, cycle body                     // Cycle body is one operator


Segunda referência: https://docs.mql4.com/basis/operators/for

De acordo com a segunda referência, o exemplo fornecido do operador "para" é descrito como tal:

for (Expression1; Expression2; Expression3)
   operator;


Por que este primeiro exemplo contém uma "condição" como segundo parâmetro enquanto o segundo exemplo contém "Expressão2 " como segundo parâmetro?

Qual é o significado desta contradição?

Será que isso importa?

Se eu quiser usar o operador do ciclo "para", acredito que devo ter um profundo conhecimento de todos os seus parâmetros.

Obrigado.

 

Talvez você possa entender melhor um loop for loop, entendendo primeiro um loop while . . . um loop for loop é apenas um loop while com condição inicial e incremento embutidos nele . .

Confira a documentação sobreo loop diz . .

"Opara operador é equivalente à seguinte sucessão de operadores:"

Expression1;
while(Expression2)
  {
   operator;
   Expression3;
  };


Especificamente relacionado à sua pergunta,"Por que este primeiro exemplocontém uma "condição" como segundo parâmetro enquanto o segundo exemplo contém "Expressão2"como segundo parâmetro?" uma expressão pode ser uma condição, uma condição resulta em um valor verdadeiro ou falso, por exemplo (a > b) ou (c ||| d) ou (OrderTotal() >= 0) , também a documentação também diz . ."Expressão2 é o teste condicional para o término do ciclo."

 

Simon,

uma expressão pode ser uma condição

Então, o parâmetro dois em um cabeçalho de operador 'para' pode ser uma expressão OU condição? Eu assumo que Expressão_1 e Expressão_3 devem permanecer expressões e não mudar para condições corretas? Não vejo porque as expressões 1 e 3 também não poderiam ser condições. Ambas as expressões 1&3 são apenas parâmetros a serem preenchidos. (sendo uma condição COULD ser alternativamente o parâmetro dois aka Expression_2's purpose)

Por favor, confirme os seus pensamentos.

As expressões podem ser operações aritméticas (2+2=4), atribuição, etc. (todas listadas no MetaEditor Dictionary).

A condição é verdadeira || falsa (exemplos: a>b, a>=b, a===b, etc.).

As operações também estão contidas no MetaEditor Dictionary (exemplos: Break, Continue, Return, while, for, etc.).

Obrigado

 
WhooDoo22:

Simon,

uma expressão pode ser uma condição

Então, o parâmetro dois em um cabeçalho de operador 'para' pode ser uma expressão OU condição? Eu assumo que Expressão_1 e Expressão_3 devem permanecer expressões e não mudar para condições corretas? Não vejo porque as expressões 1 e 3 também não poderiam ser condições. Ambas as expressões 1&3 são apenas parâmetros a serem preenchidos. (sendo uma condição COULD ser alternativamente o parâmetro dois aka Expression_2's purpose)

Aprenda a usar corretamente . . . . um loop for loop é um loop while apenas arranjado de uma forma mais agradável esteticamente. Então as expressões vs condições tudo isso fará sentido . . faça um favor a si mesmo e reduza as opções para dores de cabeça . . . estudeenquanto

Documentação - enquanto

Livro - enquanto
 
WhooDoo22: Então, o parâmetro dois em um cabeçalho de operador 'para' pode ser uma expressão OU condição?
Qualquer expressão resulta em um número. O número, convertido em um booleano, é uma condição. A mesma coisa. Você diz tuh-mey-toh-toh , e eu digotuh-mah-toh
 

Simon, vou praticar o uso enquanto estiver operando em código. faça um favor a si mesmo... Eu gosto do som disto! :) muito obrigado.

William, O número, convertido em booleano é uma condição ... (1=verdadeiro,0=falso). Muito obrigado.

Muito obrigado.

 

Simon,

Eu escrevi um EA que deve ;) poder fazer o que você pediu.

Estou compartilhando uma combinação deste EA juntamente com um instantâneo do resultado da aba "Especialistas" no Terminal.


A EA parece ser capaz de selecionar a ordem USDJPY e imprimir suas informações na aba "Experts". Por que a EA não fecha o pedido, bem como imprime as informações do pedido?

Obrigado.

Arquivos anexados:
 
WhooDoo22:

Simon,

Eu escrevi um EA que deve ;) poder fazer o que você pediu.

Estou compartilhando uma combinação deste EA juntamente com um instantâneo do resultado da aba "Especialistas" no Terminal.


O EA parece ser capaz de selecionar a ordem USDJPY e imprimir suas informações na aba "Experts". Por que a EA não fecha o pedido, bem como imprime as informações do pedido?

Obrigado.

Você disse que entendeu os aparelhos?https://www.mql5.com/en/forum/142732


Por favor, explique seu código e o que ele deve fazer . . . em particular, fale comigo durante o tempo, por favor.
 

Simon,

Por favor, explique seu código e o que ele deve fazer . . . em particular, fale comigo durante o tempo, por favor.

Farei o meu melhor para explicar o código e o seu propósito.


Objetivo do código:

1. Selecione a ordem USDJPY a partir do pool de três ordens.

2. Modificar TP e SL de pedido de USDJPY.

3. Executar a função OrderPrint().

4. Fechar pedido de USDJPY.


Explicação do código:

Primeiramente, as variáveis são declaradas.

   int i;
   double bid_ask;

Em segundo lugar, o loop 'enquanto' é executado.

Lógica de loop 'while':

Afunção OrderSelect() usa a variável 'i' como substituto para um número 1,2,3,etc... (apenas tenha isto em mente, por favor)

Portanto, se a variável i dentro da função OrderSelect() e OrderSymbol() NÃO for USDJPY, aumente a variável i em 1. ( i++; )

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

         i++;

O loop 'while' aumenta a variável 'i' até que a função OrderSelect() selecione o bilhete de pedido apropriado E a função OrderSymbol() selecione um pedido USDJPY. Quando ambos os objetivos são atingidos, o loop while se torna falso e o controle é passado abaixo de i++; (o corpo do loop while).

Em terceiro lugar, a função OrderModify() é executada.

OrderModify(i,OrderOpenPrice(),50*Point,50*Point,0,CLR_NONE);

Em quarto lugar, a função OrderPrint() é executada.

OrderPrint();

Em quinto lugar, são incluídos parâmetros para discernir se a ordem a ser fechada é uma ordem de compra ou venda.

         if(OrderType()==OP_BUY){bid_ask=Bid;}
         if(OrderType()==OP_SELL){bid_ask=Ask;}

Em sexto lugar, uma vez que o programa distingue se a ordem é comprada ou vendida, ele executa a função OrderClose().

OrderClose(i,OrderLots(),bid_ask,3,CLR_NONE);

Sétimo (e por último), o programa inclui um comentário que mostrará a variável 'i' para confirmar que o número do bilhete é realmente o bilhete em USDJPY durante o teste visual no testador de estratégia.

Comment("i = " ,i);

Obrigado.

 
WhooDoo22:

Simon,


lógica de laço 'while':

A função OrderSelect() utiliza a variável 'i' como um substituto para um número 1,2,3,etc. (basta ter isto em mente, por favor)

Portanto, se a variável i dentro da função OrderSelect() e OrderSymbol() NÃO for USDJPY, aumente a variável i em 1. ( i++; )

O loop 'while' aumenta a variável 'i' até que a função OrderSelect() selecione o bilhete de pedido apropriado E a função OrderSymbol() selecione uma ordem USDJPY. Quando ambos os objetivos são atingidos, o loop while se torna falso e o controle é passado abaixo de i++; (o corpo do loop while).

Desculpe, eu estava lendo mal seu código. . obrigado pela explicação, entendo o que você está fazendo agora. O problema que você tem é muito simples . . basta olhar para a mensagem de erro na tela que você postou . . olhar para o que a OrderPrint() produz, incluindo o número do pedido, então olhe para o erro.

Se você tivesse incluído a verificação dos valores de retorno e o relatório de erro, provavelmente você mesmo teria visto seu problema.
 

Simon,

Eu não vejo o que você está vendo, mas ;) Vou incluir prontamente a função GetLastOrder() para iluminar um pouco esta questão. Peço desculpas por colocar uma pergunta sem antes incluir a função GetLastOrder() com o código.

Obrigado.

Razão: