Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 81

 
oldiol: Escribo en el código: if(!m_Trade.PositionClose(_Symbol,100))//--- cerramos la posición por el símbolo actual. El resultado es que la posición se invierte. Estaría muy agradecido si me dieran pistas sobre cómo cerrar la posición.
La posición se invierte porque el programa envía dos peticiones idénticas al servidor. El programa envía dos peticiones idénticas al servidor, porque su código no comprueba la presencia de una petición enviada anteriormente (y no comprueba el resultado del procesamiento de esta petición en el servidor).
 
Yedelkin:
La posición se invierte porque el programa envía dos peticiones idénticas al servidor. El programa envía dos peticiones idénticas al servidor porque su código no comprueba si se ha enviado una petición anterior (y no comprueba el resultado de procesar esta petición en el servidor).
Por favor, arregle mi código al correcto...
 

Yedelkin escribe: su código no comprueba si hay una solicitud enviada previamente. ¿Puede decirme qué función comprueba esto?

 
oldiol: Por favor, corrijan mi código al correcto...

Cada persona tiene una comprensión diferente del código correcto. Así que al final hay que escribir el código "correcto". Y como otro consejo - intente ver si este código funciona de la manera correcta (uso esquemático de la bandera sentRequest):

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:

Cada persona tiene una comprensión diferente del código correcto. Así que al final hay que escribir el código "correcto". Y como otro consejo - intente ver si este código funciona en la tecla correcta (uso esquemático de la bandera sentRequest):

¡Muchas gracias! Probando...

 

El resultado es el siguiente: el código cierra correctamente una posición larga y no abre una corta... Al reabrir una posición larga, el EA no la cierra según la condición. Hay mensajes en la ventana de EA todo el tiempo:

¿Cómo puedo utilizar este código en el cuerpo del Asesor Experto, si sólo funciona una vez)?

 

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

Debería ser bastante sencillo en este asunto. En el código del esquema, el indicador sentRequest debe ponerse a cero si la posición abierta no es una posición de compra (última línea de código). Vea por qué esta bandera no se pone a cero en su código cuando no hay una posición abierta o la posición abierta no es una posición de compra.

 

¡Hurra! Funcionó)))) Eliminado if(sentRequest) sentRequest=false; Y escrito antes del bloque if(PositionsTotal()==0) sentRequest=false; Muchas gracias a Yedelkin por su ayuda, ¡Suerte!

 
oldiol Eliminado if(sentRequest) sentRequest=false; Y escrito antes del bloque if(PositionsTotal()==0) sentRequest=false;
¿Así que no había ninguna comprobación de posición en el código principal? Entonces añadiría que la posición de un símbolo concreto se selecciona mediante las funciones PositionGetSymbol o PositionSelect.
 

oldiol : Al reabrir un largo, EA ya no cierra la posición por condición. Hay mensajes en la ventana de EA todo el tiempo: ¿Cómo puedo usar este código en el cuerpo de EA, si funciona sólo 1 vez)? Lo siento, mi error... Hay una condición más en el código

if(PositionSelect(_Symbol)==true) // hay una posición abierta
{

POSICIÓN CERRAR BLOQUE

} // ... por lo tanto

if(sentRequest) sentRequest=false;// se coloca detrás del siguiente paréntesis y todo funciona perfectamente. Yedelkin ¡GRACIAS!