Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 81

 
oldiol: Escrevo no código: if(!m_Trade.PositionClose(_Symbol,100))//--- fechamos a posição pelo símbolo actual. O resultado é que a posição é invertida! Ficaria muito grato por dicas sobre como fechar a posição.
A posição é invertida porque o programa envia dois pedidos idênticos para o servidor. O programa envia dois pedidos idênticos para o servidor, porque o seu código não verifica a presença de um pedido enviado anteriormente (e não verifica o resultado do processamento deste pedido no servidor).
 
Yedelkin:
A posição é invertida porque o programa envia dois pedidos idênticos para o servidor. O programa envia dois pedidos idênticos para o servidor porque o seu código não verifica um pedido enviado anteriormente (e não verifica o resultado do processamento deste pedido no servidor).
Por favor, fixe o meu código para o correcto...
 

Yedelkin escreve: o seu código não verifica um pedido previamente enviado. Pode dizer-me qual é a função que verifica?

 
oldiol: Por favor corrija o meu código para o correcto...

Todos têm uma compreensão diferente do código certo. Por isso, é preciso escrever o código "correcto" no final. E como outra dica - tente ver se este código funciona correctamente (uso esquemático da bandeira sendRequest):

bool sentRequest=false;  //задать на уровне глобальных переменных программы
...

   if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
     {
      if(!sentRequest)
        {                           
         if(p_close1<buy_stop_level)
           {
            if(!m_Trade.PositionClose(_Symbol,100))
              Print("Метод PositionClose() потерпел неудачу. Код возврата=",m_Trade.ResultRetcode(),". Описание кода: ",m_Trade.ResultRetcodeDescription());
            else
               {
                Print("Метод PositionClose() выполнен успешно. Код возврата=",m_Trade.ResultRetcode()," (",m_Trade.ResultRetcodeDescription(),")");       
                sentRequest=true;
               }
            }  
         }
       else Print("Блок закрытия позиции: имеется POSITION_TYPE_BUY и ранее отосланный запрос на закрытие позиции");        
       }
    else 
      if(sentRequest) sentRequest=false;
 
Yedelkin:

Todos têm uma compreensão diferente do código certo. Por isso, é preciso escrever o código "correcto" no final. E como outra dica - tente ver se este código funciona na chave certa (uso esquemático da bandeira sendRequest):

Muito obrigado! A experimentar...

 

O resultado é o seguinte: o código fecha devidamente uma posição longa e não abre uma posição curta... Ao reabrir uma posição longa, a EA não a fecha de acordo com a condição. Há mensagens na janela EA a toda a hora:

Como posso utilizar este código no organismo do Expert Advisor, se ele só funciona uma vez)?

 

oldiol: При повторном открытии лонга, эксперт не закрывает больше позу по условию. В окне эксперта всё время идут сообщения:    Как же использовать этот код в теле эксперта, если он работает только 1 раз)?

Deve ser bastante simples nesta matéria. No código esquemático a bandeira sendRequest deve ser colocada a zero se a posição aberta não for uma posição de compra (última linha de código). Veja porque é que esta bandeira não é colocada a zero no seu código quando ou não há posição aberta ou a posição aberta não é uma posição de Compra.

 

Viva! Funcionou)))) Removido if(sentRequest) sentRequest=false; E escrito antes do bloco if(PositionsTotal()==0) sentRequest=false; Muito obrigado a Yedelkin pela sua ajuda, BOA Sorte!

 
oldiol Removido if(sentRequest) sentRequest=false; e escrito antes do bloco if(PositionsTotal()==0) sentRequest=false;
Então não houve verificação de posição no código principal? Depois acrescentaria que a posição para um determinado símbolo é seleccionada usando as funções PositionGetSymbol ou PositionSelect.
 

oldiol : Ao reabrir um longo, a EA já não fecha a posição por condição. Há mensagens na janela EA o tempo todo: Como posso usar este código no corpo da EA, se funciona apenas 1 vez)? Desculpe, erro meu... Há mais uma condição no código

if(PositionSelect(_Symbol)===true) // existe uma posição aberta
{

POSIÇÃO FECHAR BLOCO

} // ... portanto

if(sentRequest) sentRequest=false;// colocou-o atrás do parêntese seguinte e tudo funciona perfeitamente. Yedelkin OBRIGADO!

Razão: