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

 
ksbr:
Quiero poner una acción (futuros) en MT5 para probar la mía, ¿cómo?
No puede. Busque una casa de bolsa con los futuros
 
sergeev:
De ninguna manera. Busque una casa de bolsa con estos futuros

%))) No hay DC con este fuchs))) Tiene que estar pegado...

Qué pena, qué pena, todo empezó tan bien...

 

¡Saludos a todos!

Estoy tratando de implementar dos funciones en mi EA, la primera define el beneficio de la última operación, la segunda define el lote de la última operación.

Busqué en este sitio de la A a la Z e hice varias funciones, siguiendo los ejemplos de los artículos y otros EAs, pero no hay resultado - ambas funciones siempre devuelven 0.00.

Aquí me parece la variante más cercana a la correcta, pero el resultado es siempre 0:

double LossLastPos(){
// --- определение границ требуемой торговой истории
   datetime end=TimeCurrent();                 // текущее серверное время
   datetime start=end-PeriodSeconds(PERIOD_D1);// установим начало на сутки назад
//--- запросим в кэш программы торговую историю за день
   HistorySelect(start,end);
//--- получим количество ордеров в истории
   int history_orders=HistoryOrdersTotal();
//--- получим тикет ордера из истории, имеющего последний индекс в списке
   ulong order_ticket=HistoryOrderGetTicket(history_orders-1);
   if(order_ticket>0) // получили в кэш исторический ордер, работаем с ним
     {
      //Получаем значение прибыли последнего ордера
      double  profit = HistoryDealGetDouble(order_ticket,DEAL_PROFIT);
      return(profit);
     }
}

Trato de obtener el tamaño del lote de la misma manera:

double  volume = HistoryDealGetDouble(order_ticket,DEAL_VOLUME);
      return(volume);

Y nada funciona, los valores son siempre cero.

Yo mismo acabo de empezar la migración de mql4 a mql5. La implementación de dichas funciones en mql4 no era muy difícil, pero aquí hay un punto muerto.

Por favor, aconséjenme una solución real y que funcione.

 
karakos:

...

Por favor, sugiera una solución real y que funcione.

Utilice HistoryDealGetTicket() y HistoryDealsTotal().

Y hacer la validación:

   if(HistorySelect(start,end))
     {
      // ...
     }
 

¡tol64 muchas gracias! Todo está funcionando.

Aquí hay una solución que funciona al 100% - la función devuelve el beneficio de la última posición cerrada en el historial de la terminal:

//+------------------------------------------------------------------+       
//|Функция возвращает профит последней позиции                       |
//+------------------------------------------------------------------+
double ProfitLastPos()
  {
// --- определение границ требуемой торговой истории
   datetime end=TimeCurrent();                 // текущее серверное время
   datetime start=end-PeriodSeconds(PERIOD_D1);// установим начало на сутки назад
//--- запросим в кэш программы торговую историю за день
   if(HistorySelect(start,end))
     {
      //--- получим количество сделок в истории
      int history_orders=HistoryDealsTotal();
      //--- получим тикет сделки из истории, имеющей последний индекс в списке
      ulong order_ticket=HistoryDealGetTicket(history_orders-1);

      if(order_ticket>0) // получили в кэш историческую сделку, работаем с ней
        {
         profit=HistoryDealGetDouble(order_ticket,DEAL_PROFIT);
        }
     }
   return(profit);
  }

Por analogía obtenemos el tamaño del lote de la última operación:

 Volume = HistoryDealGetDouble(order_ticket,DEAL_VOLUME);
 
karakos:

¡tol64 muchas gracias! Todo está funcionando.

...

Y si además pulsas Ctrl+ en el editor, obtendrás un código bien formateado. Especialmente importante antes de subir el ejemplo al foro (mejor legibilidad). ))
 
tol64:
Si además pulsas Ctrl+ en el editor, obtendrás un código bien formateado. Esto es especialmente importante antes de subir el ejemplo al foro (mejor legibilidad). ))
Estilizado el código, ¡gracias de nuevo!
 

Buenos días! Recientemente he empezado a aprender MQL5. Tengo un problema con el cierre de posiciones. En código: if(!m_Trade.PositionClose(_Symbol,100))//--- cerrar la posición por el símbolo actual. El resultado es que la posición se invierte. Te agradecería mucho una pista, ¿cómo puedo cerrar una posición?

 
//_____________________________________________________________________________________________________________________________________________
//--------  блок работы с длинной позицией  ---------------------------------------------------------------------------------------------------
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
                          
         if( p_close1 <  buy_stop_level   )// если бар 1 закрылся ниже уровня стоп
         {
          if(!m_Trade.PositionClose(_Symbol,100))//--- закрываем позицию по текущему символу
         {
      //--- сообщим о неудаче
      Print("Метод PositionClose() потерпел неудачу. Код возврата=",m_Trade.ResultRetcode(),
            ". Описание кода: ",m_Trade.ResultRetcodeDescription());
         }
   else
         {
       Print("Метод PositionClose() выполнен успешно. Код возврата=",m_Trade.ResultRetcode(),
            " (",m_Trade.ResultRetcodeDescription(),")");       
          }
    
     
           }          
            }
 

Registro de EA después de que la barra haya cerrado por debajo del nivel de parada. Posición larga = 1 lote, posición corta = 1 lote)

Razón de la queja: