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

 
Artyom Trishkin:

Redimensiona la matriz nnc_arr_in en 1 más que su tamaño en la celda 0 de la matriz de estructuras:

Gracias.

 

Pregunta mql5

Hay dos posiciones abiertas y una señal(Flag==true)

sólo una posición debe ser cerrada por esta señal, es decir, la que tiene el mayor beneficio.

¿Cómo cerrar sólo el que tiene mayor beneficio?

¿Cuál es la mejor manera de manejar este evento?

Estoy tratando de hacerlo de esta manera:

if (invertStart == true) // получил событие, о том что есть две позиции и одну можно закрыть.
   {     
   int npos_L1=0;   NPos_L1(npos_L1);
   if(npos_L1==1)
   {
   int positions=PositionsTotal();
   for(int i=0;i<=positions;i++)
   {
   ulong ticket=PositionGetTicket(i);
   if(ticket!=0 && PositionGetInteger(POSITION_TYPE)== POSITION_TYPE_SELL && POSITION_PROFIT>=50) //  50  допустим...
   {
   m_trade.PositionClose(ticket); 
   i--;
   invertStart = false;
   return;  
   }
   }
   }
   }  

En consecuencia, se cerrará la última posición abierta.

Por favor, aconsejen cómo hacerlo correctamente, me gustaría tener un ejemplo. Leo libros de referencia y cartillas, pero no siempre entiendo las sutilezas.

 
Vladpedro:

Pregunta mql5

Hay dos posiciones abiertas y una señal(Flag==true)

sólo una posición debe ser cerrada por esta señal, es decir, la que tiene el mayor beneficio.

¿Cómo cerrar sólo el que tiene mayor beneficio?

¿Cuál es la mejor manera de manejar este evento?

Estoy tratando de hacerlo de esta manera:

En consecuencia, se cerrará la última posición abierta.

Por favor, aconsejen cómo hacerlo correctamente, necesito un ejemplo. Leo libros de referencia pero no siempre entiendo los detalles.

Código:

   ulong ticket=ULONG_MAX;
   double profit=DBL_MIN;
   if(invertStart == true)  // получил событие, о том что есть две позиции и одну можно закрыть.
     {
      int positions=PositionsTotal();
      for(int i=PositionsTotal()-1; i>=0; i--)
        {
         ulong tmp_ticket=PositionGetTicket(i);
         if(ticket!=0)
           {
            double tmp_profit=PositionGetDouble(POSITION_PROFIT);
            if(tmp_profit>profit)
              {
               ticket=tmp_ticket;
               profit=tmp_profit;
              }
           }
        }
      //---
      if(ticket!=ULONG_MAX)
         m_trade.PositionClose(ticket);
     }
 
Vladimir Karputov:

Código:

Muchas gracias, parece que funciona. Sólo se queja del ticket, pues ya existe esa variable local.

La declaración de 'ticket' oculta la variable local Lim_Stop_03_Sell_pos_06.mq5 299 10

Es posible que haya que esconder algunos de estos billetes en el interior.

 
Vladpedro:

Muchas gracias, parece que funciona, solo que se queja del ticket, porque ya existe esa variable local.

La declaración de 'ticket' oculta la variable local Lim_Stop_03_Sell_pos_06.mq5 299 10

Es posible que haya que esconder algunos de estos billetes en el interior.

Cambiar el nombre de la variable

ulong ticket=ULONG_MAX;

в

ulong close_ticket=ULONG_MAX;

y, por supuesto, no olvides cambiar el nombre en tu código.

 
Vladimir Karputov:

Cambiar el nombre de la variable

в

y, por supuesto, no te olvides de cambiar el nombre en el código también.

Sí, gracias, ya lo he solucionado... le he cambiado el nombre.

 

¡Buenos días!

Me pueden decir dónde puedo encontrar un EA que envíe un correo electrónico o carta de empuje si el precio está por encima de la línea superior, o por debajo de la línea inferior (línea horizontal o inclinada y se puede mover en el gráfico)

Tal vez alguien tenga uno, por favor, compártalo.

Sólo en MT5

Gracias.

 

si conecto el indicador en EA

int OnInit()
{
   ind_handle = iCustom(_Symbol, indperiod, "MyInd", indParam);
   return(INIT_SUCCEEDED);
}

y luego obtengo los buffers de los indicadores usando CopyBuffer(ind_handle, 0, 1, 3, buffer1)


¿tengo que leer cada tick de los buffers de los indicadores?

Necesito una respuesta, y preferiblemente la fuente - docs, artículos:

1. el indicador siempre se calcula en paralelo

2. el indicador se calcula sólo en el momento de llamar a CopyBuffer()

 
Igor Makanu:

si conecto el indicador en EA

y luego obtengo los buffers de los indicadores usando CopyBuffer(ind_handle, 0, 1, 3, buffer1)


¿tengo que leer cada tick de los buffers de los indicadores?

Necesito una respuesta, y preferiblemente la fuente - docs, artículos:

1. el indicador siempre se calcula en paralelo

2. el indicador se calcula sólo en el momento de llamar a CopyBuffer()

Igor, si el indicador está escrito correctamente, sólo se pueden cambiar los valores de la barra actual. Por lo tanto, si necesita valores actuales, debe utilizar el CopyBuffer justo antes de utilizar estos valores frescos. Y si necesitamos los valores de la historia, no cambian, y no hay razón para releerlos.

Hay información en alguna parte sobre el cálculo del indicador en cada tick. Que yo recuerde, por defecto el indicador se recalcula sólo cuando se accede a él, pero es posible hacer que se recalcule en cada tick. Cómo hacerlo, debes buscarlo en la documentación.

 
Alexey Viktorov:
Igor, si el indicador está escrito correctamente, sólo se pueden cambiar los valores de la barra actual. Por lo tanto, si necesita valores actuales, debe utilizar el CopyBuffer justo antes de utilizar estos valores frescos. Y si necesitamos los valores de la historia, no cambian, y no hay razón para releerlos.

Hay alguna información en alguna parte sobre el cálculo del indicador en cada tick. Por lo que recuerdo, por defecto el indicador se recalcula sólo cuando es llamado, pero es posible hacer que se recalcule en cada tick. La forma de hacerlo está en la documentación.

Bien, de todos modos tendré que probarlo

el problema está en el redibujado del indicador, no quiero reescribir el indicador todavía

Razón de la queja: