Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 72

 
Vitalie Postolache:


Si lo comparas con la balanza, así es:

Gracias.

 
trader781:

Bien, entonces según entiendo, obtenemos tres funciones personalizadas diferentes con el retorno de la correcta (si buscamos tres parámetros diferentes)

ArraySort

entonces

ArrayBsearch por el número correcto

y luego, ¿cómo afrontarlo?

Exactamente la transición de una matriz a un elemento de la estructura

No lo entiendes.

Necesitas hacer una única función que rellene y ordene el array declarado globalmente. La matriz tendrá que ser pasada a la función por referencia.

Y necesitas funciones adicionales que saquen los datos que necesitas de este array.

 
Artyom Trishkin:

No lo entiendes.

Necesitas hacer una sola función que llene y ordene el array declarado globalmente. La matriz tendrá que ser pasada a la función por referencia.

Y necesitas funciones adicionales que tomen los datos que necesitas de este array.

ok, ¿puede demostrar cómo sacar algo de un array de estructuras? digamos que rellenado y ordenado

cómo transferir por referencia y escribir

 

Por favor, indique cómo debería ser la condición. Si se activa un stop loss, entonces el lote se multiplica por 2, y si la siguiente orden activa un take profit, el lote volvería al lote original, que estaba antes del stop loss.

Lo entiendo así, pero no sé cómo seguir...

for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
   if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)
      {
      if (OrderMagicNumber()==magic)
         {
         if (OrderStopLoss()==OrderClosePrice())
            {
            lot=lot*4;
            }
         }
      }

   } 

 

otra pregunta, ¿qué escribí mal en el bloque de borrar órdenes? no siempre borra las órdenes, en el registro dice

OrderDelete error 4108
market order #1 cannot be deleted

if (Hour()==23 && Minute()==59)            
         {
         for(int n=OrdersTotal()-1;n>=0;n--)
            {
            if(OrderSelect(n,SELECT_BY_POS))
               {
               if(OrderMagicNumber()==magic)
                  {
                  bool del=OrderDelete(OrderTicket());
                  if (del==true)
                     {
                     otl_b=0; otl_s=0; //обнуляем переменные отложек
                     }
                  
                  }  
               }  
            }
         }
 
wishmast:

Otra pregunta, ¿qué he escrito mal en el bloque para borrar los pedidos? No siempre borra los pedidos, en el registro dice

OrderDelete error 4108
market order #1 cannot be deleted

if (Hour()==23 && Minute()==59)            
         {
         for(int n=OrdersTotal()-1;n>=0;n--)
            {
            if(OrderSelect(n,SELECT_BY_POS))
               {
               if(OrderMagicNumber()==magic)
                  {
                  bool del=OrderDelete(OrderTicket());
                  if (del==true)
                     {
                     otl_b=0; otl_s=0; //обнуляем переменные отложек
                     }
                  
                  }  
               }  
            }
         }


Está intentando eliminar una orden de mercado, no se eliminan, se cierran con la función OrderClose(). Para que el bucle se borre o se cierre correctamente, tenemos que distinguir la orden por su tipo.

if(OrderType()<=OP_SELL) - para órdenes de mercado, if(OrderType()>OP_SELL) - para órdenes pendientes.

 

Hay una cosa llamadaCHARTEVENT_MOUSE_MOVE

Pregunta: ¿funciona esto en dispositivos móviles donde no hay ratón?

 
wishmast:

Por favor, indique cómo debería ser la condición. Si se activa un stop loss, entonces el lote se multiplica por 2, y si la siguiente orden activa un take profit, el lote volvería al lote original, que estaba antes del stop loss.

Lo entiendo así, pero no sé cómo seguir...

for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
   if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)
      {
      if (OrderMagicNumber()==magic)
         {
         if (OrderStopLoss()==OrderClosePrice())
            {
            lot=lot*4;
            }
         }
      }

   } 

Si lo has hecho rápidamente, aparecerá la última orden de pérdida, qué hacer con ella y qué parámetros corregir, creo que lo entenderás.
Archivos adjuntos:
last1.mq4  4 kb
 
wishmast:

Por favor, indique cómo debería ser la condición. Si se activa un stop loss, entonces el lote se multiplica por 2, y si la siguiente orden activa un take profit, el lote volvería al lote original, que estaba antes del stop loss.

Lo entiendo así, pero no sé cómo seguir...

for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
   if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)
      {
      if (OrderMagicNumber()==magic)
         {
         if (OrderStopLoss()==OrderClosePrice())
            {
            lot=lot*4;
            }
         }
      }

   } 

La solución a este problema depende de la lógica completa del Asesor Experto, usted puede rastrear la activación de stoploss o takeprofit por su comentario.

  if(StringFind(OrderComment(),"sl")>=0)// сработал стоплосс
  if(StringFind(OrderComment(),"tp")>=0)// сработал тейкпрофит

...

 
Artyom Trishkin:

No lo entiendes.

Necesitas hacer una sola función que llene y ordene el array declarado a nivel global. La matriz tendrá que ser pasada a la función por referencia.

Y necesitas funciones adicionales que saquen los datos que necesitas de este array.

Artem, estás equivocado. El array, declarado a nivel global, es visible en todas las partes del programa, y no tienes que pasarlo a algún lugar desde algún sitio. Simplemente se rellena en un lugar del programa, se ordena en otro y se lee en el tercero, no importa.
Razón de la queja: