Ciclo Operador 'para' perguntas - página 10

 
WhooDoo22:

Eu corrigi o erro "bilhete inválido" para o exercício de codificação que você me aconselhou a completar. Anexei uma cópia do assessor especializado para sua visualização pessoal.

OrdemFechar() seção de função deste exercício que acredito estar completa.

Imprimir() seção de função deste exercício que acredito estar completa.

Tudo o que eu acredito que resta é a terceira seção, função OrderModify().

Obrigado.

Você não corrigiu o problema, você trabalhou em torno dele, isto é típico quando o problema não é compreendido. Como eu já disse, corrija a causa e não o sintoma ...

Você ainda não está imprimindo o número do bilhete USDJPY, por favor, verifique a exigência original.

Suas chamadas MarketInfo() estão erradas, mesmo que funcionem . .

 

Simon,

A função OrderModify() é executada sem erros.

A função OrderPrint() é executada sem erro.

A função OrderClose() é executada sem erro.

Por favor, poste sua resposta.

Obrigado.

Arquivos anexados:
 
WhooDoo22:


Por favor, envie sua resposta.


RaptorUK:

Você não resolveu o problema, você trabalhou em torno dele, isto é típico quando o problema não é compreendido. Como eu já disse, resolva a causa e não o sintoma ...

Você ainda não está imprimindo o número do bilhete USDJPY, por favor, verifique a exigência original.

Suas chamadas MarketInfo() estão erradas, mesmo que funcionem . .

E, além disso . .

se você tiver a mesma situação que antes, onde não há ordem USDJPY você terá falhado as chamadas OrderStopLoss(), OrderTakeProfit(), OrderSelect() e OrderType()

o que isto significa fazer ? qual é a sua expectativa desta linha de código ? por favor, responda sem consultar a documentação.

GetLastError();

No último bloco de código, por que deseja executar esta linha de código? . . .

   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}

somente se . . . .

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       

mas você sempre executará esta linha de código, e todo o código que a segue, independentemente do TP e SL ?

   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);} 

Suas chamadas MarketInfo() ainda estão erradas. . . olhe a documentação para descobrir o porquê.

 

Simon,


Você não resolveu o problema, você trabalhou em torno dele.

Que problema você acredita que eu ainda não resolvi?


Você ainda não está imprimindo o número do bilhete USDJPY...

Encomendar o número do bilhete.



Suas chamadas MarketInfo() estão erradas, mesmo que funcionem. . .

Exemplo de função MarketInfo() do dicionário MetaEditor:

Amostra:

// MarketInfo() function example;

   double bid   =MarketInfo("EURUSD",MODE_BID);
   double ask   =MarketInfo("EURUSD",MODE_ASK);
   double point =MarketInfo("EURUSD",MODE_POINT);
   int    digits=MarketInfo("EURUSD",MODE_DIGITS);
   int    spread=MarketInfo("EURUSD",MODE_SPREAD);

Aqui está uma amostra do meu bloco de código de função OrderClose():

// OrderClose() function code block example;

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      Print(OrderCloseTime());
      GetLastError();
     }

O que você acha que está errado com o formato de amostra do meu código da função OrderClose()? Parece quase idêntico à amostra 'MarketInfo()' fornecida pelo dicionário MetaEditor.


E, além disso . . .


o que isto significa fazer ? qual é a sua expectativa desta linha de código ? por favor responda sem consultar a sua documentação.

GetLastError();

A função GetLastError() imprime um erro na página 'Especialistas' enquanto executa testes. Se a função não encontrar nenhum erro, zero (0) é impresso. Observe o zero impresso no snapshot I fornecido acima.


No bloco final do código, por que deseja executar esta linha de código . . . .

if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}

somente se . . .

if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))

mas você sempre executará esta linha de código, e todo o código que a segue, independentemente do TP e SL ?

if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}


Sim, fico feliz que você tenha levantado esta questão porque vou explicar meu raciocínio por trás de fazer isto.

Se todos os outros blocos de código forem omitidos da execução do programa usando comentários de múltiplas linhas "/* - */" e os únicos dois blocos de código restantes dentro das funções Start() e Return(0) são...

   int i;
   double bid_ask,
          OM_Param_3,
          OM_Param_4;

// code block 1;   

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

// code block 2;

   if((OrderStopLoss()==0)&&(OrderTakeProfit()==0))
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))   
     {
      Print(OrderTicket());     
      GetLastError();
     }

abaixo do bloco de código dois, está a chamada de função:

     {
      Print(OrderTicket());     
      GetLastError();
     }

A função Print() continua a imprimir o número para o painel de especialistas indefinidamente e continua a imprimir. Eu acreditava que se eu adicionasse...

if((OrderStopLoss()==0)&&(OrderTakeProfit()==0))

a função Print() seria executada apenas uma vez porque, uma vez executada a função OrderModify() diretamente abaixo dela, o SL e TP não seriam mais zero e fariam com que a função Print() fosse arrastada.

Agora percebo que este não é o caso por causa de como um programa é executado. Entendo que um programa é executado de cima para baixo, portanto, quando o programa terminava seu ciclo inteiro, a primeira vez que tentava executar de cima para baixo novamente e falhava em imprimir o bilhete para o painel de 'Especialistas' porque não há uma ordem no par de moedas USDJPY.


Obrigado.

 
WhooDoo22:

Simon,


Você não consertou o problema, você trabalhou em torno dele...

Que problema você acredita que eu ainda não resolvi?

O problema subjacente que é causado pela forma como você codificou seu loop while . . . o problema que estava causando o ticket Inválido para a função OrderClose eUnknown ticket 2 para OrderModify você não corrigiu porque você abordou o sintoma.

WhooDoo22:

Suas chamadas MarketInfo() estão erradas, mesmo que funcionem...

MetaEditor dicionário MarketInfo() exemplo de função:


Desculpe, meu erro, você resolveu esse problema . . . você sabe a que problema eu estava me referindo?

WhooDoo22:

Simon,

o que isto significa fazer ? qual é a sua expectativa desta linha de código ? por favor, responda sem consultar a documentação.

A função GetLastError() imprime um erro na página 'Especialistas' durante a execução dos testes. Se a função não encontrar nenhum erro, zero (0) é impresso. Observe o zero impresso na foto que forneci acima.


Não, GetLastError() não imprime para o log . . it"A função retorna o último erro ocorrido, então o valor da variável especial last_error onde o último código de erro é armazenado será zerado. Portanto, a próxima chamada para GetLastError() retornará 0".

O 0 em sua imagem é provavelmente de . . .

Print(OrderCloseTime());

. . e é um erro, pois a Ordem não está mais selecionada, pois não está mais no pool de Ordem como agora foi fechado, assim como está no pool de História. para fazer o que você está tentando fazer, você precisaria de algo assim . .

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      int ClosedTicketNum = OrderTicket();   //  <---- add this line
      
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      
      OrderSelect(ClosedTicketNum, SELECT_BY_TICKET);   //  <---- add this line

      Print(OrderCloseTime());
      GetLastError();
     }

. . . adicione estas duas linhas e experimente.

WhooDoo22:

A função Print() continua a imprimir o número para o painel de especialistas indefinidamente e continua a imprimir. Eu acreditava que se eu adicionasse...

if((OrderStopLoss()==0)&&(OrderTakeProfit()==0))

a função Print() seria executada apenas uma vez porque, uma vez executada a função OrderModify() diretamente abaixo dela, o SL e TP não seriam mais zero e fariam com que a função Print() fosse arrastada.

Agora percebo que este não é o caso por causa de como um programa é executado. Entendo que um programa é executado de cima para baixo, portanto, quando o programa terminava seu ciclo inteiro, a primeira vez que tentava executar de cima para baixo novamente e falhava em imprimir o bilhete para o painel de 'Especialistas' porque não há uma ordem no par de moedas USDJPY.

Acho que você não está me entendendo ... se eu adicionar alguns braquetes, talvez fique mais claro . . você fez isso . .

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
      {
      if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
      }

   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      Print(OrderCloseTime());
      GetLastError();
     }

. você queria fazer isto?

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
      {
      if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
      if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
         {
         OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
         Print(OrderCloseTime());
         GetLastError();
         }
      )
 
WhooDoo22:

Simon,

Você ainda não está imprimindo o número do bilhete USDJPY...


A exigência era . . . "imprimir o número do bilhete para o log no formulário "Número do bilhete para USDJPY = "".

 

Simon,


A questão subjacente que é causada pela forma como você codificou seu loop while . . . a questão que estava causando o ticket Inválido para a função OrderClose e Unknown ticket 2 para OrderModify você não te corrigiu porque você abordou o sintoma.

Desejo discutir esta questão com você em detalhes, permitindo-me concentrar meus pensamentos na resolução da questão sem nenhuma distração de outros pontos.


Desculpe, meu erro, você resolveu o problema... você sabe qual era o problema ao qual eu estava me referindo?

Sim, obrigado por trazê-lo à tona!


"A função retorna o último erro ocorrido, então o valor da variável especial last_error onde o último código de erro é armazenado será zerado. Portanto, a próxima chamada para GetLastError() retornará 0".

O dicionário MetaEditor lê:

int GetLastError( )
A função retorna o último erro ocorrido, então o valor da variável especial last_error onde o último código de erro é armazenado será zerado. Portanto, a próxima chamada para GetLastError() retornará 0.

Esta função retorna o último erro ocorrido, então o valor da última variável de erro especial onde o último código de erro é armazenado será zerado...

Overde é entendido e o amarelo não é entendido.


. . . adicione estas duas linhas e tente.

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      int ClosedTicketNum = OrderTicket();   //  <---- add this line
      
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      
      OrderSelect(ClosedTicketNum, SELECT_BY_TICKET);   //  <---- add this line

      Print(OrderCloseTime());
      GetLastError();
     }

Será feito.


Acho que você não está me entendendo. . . se eu adicionar algumas chaves, talvez fique mais claro. . . você fez isso . .

Creio que pretendia fazer isto . ...

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
      {
      if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
      if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
         {
         OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
         Print(OrderCloseTime());
         GetLastError();
         }
      }

Isto porque eu desejava a condição . ...

if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))

a ser aplicada à seção de código dentro dos aparelhos ("{ }").


O requisito era . . . "imprimir o número do bilhete para o log no formulário "Número do bilhete para USDJPY = "".

Isso pode ser feito.


Obrigado.

 
WhooDoo22:


"A função retorna o último erro ocorrido, então o valor da variável especial last_error onde o último código de erro é armazenado será zerado. Portanto, a próxima chamada para GetLastError() retornará 0".

O dicionário MetaEditor lê:

int GetLastError( )
A função retorna o último erro ocorrido, então o valor da variável especial last_error onde o último código de erro é armazenado será zerado. Portanto, a próxima chamada para GetLastError() retornará 0.

Esta função retorna o último erro ocorrido, então o valor da última variável de erro especial onde o último código de erro é armazenado será zerado...

Overde é entendido e o amarelo não é entendido.

OK, como você pode ver na documentação GetLastError() não imprime nada . . . apenasretorna o número do erro . . . para usá-lo, você precisa fazer algo com ele . . .

Print("The last error was error number: ", GetLastError());

//  or . . .

int ErrorNumber = GetLastError();

//  or . . .

if(GetLastError() == 130)

Quando você chama GetLast Error() ele retorna o erro e depois limpa para zerar a variável que estava usando internamente para reter o último erro . . . então se você fez isso . .

OrderDelete(-1);   //  should produce an error 4108 or 3

Print("Last error was number ", GetLastError());    //  should print - Last error was number 4108

Print("Last error was number ", GetLastError());    //  should print - Last error was number 0  the previous call cleared the GetlastError internal variable
 

a 2ª chamada para GetLastError() retornará 0 como a primeira chamada zerou a variável que contém o número do erro . . . também tenha em mente que apenas o erro mais recente é retido.

 
WhooDoo22:


Acho que você não está me entendendo... se eu acrescentar alguns aparelhos, talvez seja mais claro... . você fez isso . .

Creio que pretendia fazer isto . . .

Isto é porque eu desejava a condição ...

a ser aplicada à seção de código dentro dos aparelhos ("{ }").

Mas você não . . . perdeu-o em seu projeto, depois perdeu-o quando codificou, depois perdeu-o quando leu seu código e verificou que ele faria o que você queria, depois perdeu-o quando testou . . os aparelhos são uma dessas coisas fundamentais que você deve saber como a palma de sua mão.

Você precisa entender por que perdeu isso e resolver esse problema . . . ninguém mais pode fazer isso por você, a menos que você queira pagá-los para codificar para você.

 

Simon,


O 0 em sua imagem é provavelmente de . . .

Print(OrderCloseTime());


Nah-uh-uh! ;)

Vamos fazer uma viagem pela faixa de documentação... Hahaha.

data/hora OrdemFecharTempo( )
Retorna em horário fechado para a ordem atualmente selecionada. Se a hora de fechamento da ordem não for 0, então a ordem selecionada e foi fechada e recuperada do histórico da conta. O tempo de fechamento de pedidos abertos e pendentes é igual a 0.

Nota: A ordem deve ser previamente selecionada pela função OrderSelect().


Primeiro, vamos ambos dar uma olhada no bloco de código da função OrderClose() que codifiquei recentemente...

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      Print(OrderCloseTime());
     }

A seguir, vamos ambos dar uma olhada no resultado mostrado em um instantâneo do painel de 'Especialistas'...

Resultado do painel de 'Especialistas'.

Aaah, o que temos aqui? :)


Favor postar uma resposta para o novo assessor especializado anexo. O exercício ainda atende a todos os critérios incluídos?


A questão subjacente que é causada pela forma como você codificou seu loop while . . . a questão que estava causando o ticket Inválido para a função OrderClose e Unknown ticket 2 para OrderModify você não te corrigiu porque você abordou o sintoma.

Desejo discutir este assunto com você em detalhes, permitindo-me concentrar meus pensamentos na resolução do problema sem nenhuma distração de outros pontos.


Obrigado.

Arquivos anexados:
Razão: