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

 
EVGENII SHELIPOV #:

¡¡¡Buenos días!!!

Por favor, ayúdame a escribir el código para cerrar las órdenes mínimas y máximas en un EA de rejilla cuando se alcanza un determinado nivel de reducción

He escrito dos funciones para calcular el beneficio de las órdenes máximas y mínimas

Tengo una función que calcula el importe de estos pedidos. Parece que no hay ningún problema.

La pregunta es cómo cerrar sólo estas dos órdenes He encontrado la función ClosseAll().

La pregunta es cómo cambiar la función OrderTicket() que cierra todos los pedidos

adjuntar las variables max_ticket y min_ticket que determinan los tickets de los pedidos mínimos y máximos en la parrilla

¿O tiene USTED la solución a este problema?

void ClosseAll()
{
  int slip = MarketInfo(_Symbol,MODE_SPREAD)*2;
  for(int i = OrdersTotal()-1; i>=0; i--)
  {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {
      if (OrderClose(max_ticket , OrderLots(), Bid, slip)&&OrderClose(min_ticket , OrderLots(), Bid, slip))
            Print("OK");
      else
            Print("Не удалось закрыть ордер! ",GetLastError());
     }
  }
}

y arreglarlo.

if(OrderTicket() > max_ticket) max_ticket = OrderTicket();
 
makssub #:

Lo siento, lo he vuelto a escribir mal. Déjame intentarlo de nuevo)

Hay una parrilla de órdenes abiertas. Necesito encontrar el precio de apertura (OrderOpenPrice) de la orden más cercana al precio actual. Para seguir construyendo la red, pero mis órdenes se construyen casi caóticamente.

Entiendo cómo se escribe el rebasamiento, pero soy incapaz de expresarlo correctamente en el idioma (soy como un perro, lo entiendo todo)).

Si tienes ejemplos o enlaces a ejemplos, publícalos, por favor. MQL4

en un bucle:

if (MathAbs(OrderOpenPrice()-Bid)<previous_value)
   {
   previous_value=MathAbs(OrderOpenPrice()-Bid);
   nearest_order=OrderTicket();
   }

antes del bucle inicializar previous_value=DBL_MAX a nearest_order=0

 
PapaYozh #:

Por cierto, ¿en qué se diferencia, aparte de que se llama implícitamente cuando se crea el objeto?

y además cuando se llama en el constructor no se asigna memoria todavía, no compila:

class A
{
public:
   int               val;
                     A() {}
};
//+------------------------------------------------------------------ +
class B
{
public:
   A                 a;
                     B():a(),a.val(10) {} //
};

pero en el cuerpo del constructor, no hay problema:

class A
{
public:
   int               val;
                     A() {}
};
//+------------------------------------------------------------------ +
class B
{
public:
   A                 a;
                     B():a() {a.val=10;}
};



sobre los constructores de la clase base - pueden ser llamados explícitamente:

class A
{
public:
   int               val;
                     A(const int v): val(v) {}
                     A() {}
};
//+------------------------------------------------------------------ +
class B: public A
{
public:
                     B(): A(100) {}
};
 
MakarFX #:

Arregla eso también.

Sobre el deslizamiento que ya tengo al principio del consejero

MakarFX #:

y arreglar eso.

MakarFX #:

arreglar esto

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init() 
{
   Spread = MarketInfo(Symbol(), MODE_SPREAD) * Point;
   MinLot = MarketInfo(Symbol(),MODE_MINLOT);
   return (0);
}

Sólo se cierran las órdenes máximas según los resultados de cierre


 
Taras Slobodyanik #:

en el bucle:

inicializar previous_value=DBL_MAX a nearest_order=0 antes del bucle

MakarFX #:

y corregir esto

MakarFX #:

y arreglar eso.

Para los errores en el registro


 
Buenas tardes ¿Alguien ha oído hablar de MirachLtd-Real?

 
EVGENII SHELIPOV #:

Sobre el deslizamiento que ya tengo al principio del EA

Este deslizamiento es exactamente para esta función... para que no tenga que pasar por COMPRA o VENTA

//--- global parameters
int max_ticket = 0;
int min_ticket = INT_MAX;
//+----------------------------------------------------------------------------+
void ClosseAll()
{
  int slipp = MarketInfo(_Symbol,MODE_SPREAD)*2;
  for(int i = OrdersTotal()-1; i>=0; i--)
  {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {
      if (OrderClose(max_ticket , OrderLots(), Bid, slipp)&&OrderClose(min_ticket , OrderLots(), Bid, slipp))
            Print("OK");
      else
            Print("Не удалось закрыть ордер! ",GetLastError());
     }
  }
}
//+----------------------------------------------------------------------------+
//| Расчет профита максимального ордера в сетке                                |
//+----------------------------------------------------------------------------+
double GetProfitMaxOrder()
{
   double max_ticket_profit = 0 ;
      {
      for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
         {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
            {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                  {
                  if(OrderTicket() > max_ticket) 
                     {
                     max_ticket = OrderTicket();
                     max_ticket_profit =  OrderProfit();
                     }
                  }
               }
            }
         }
      }
   return( max_ticket_profit);
}
//+----------------------------------------------------------------------------+
//| Расчет профита минимального ордера в сетке                                 |
//+----------------------------------------------------------------------------+
double GetProfitMinOrder()
{
   double min_ticket_profit = 0;
      {
      for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
         {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
            {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) 
               {
               if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                  {
                  if(OrderTicket() < min_ticket)
                     {
                     min_ticket = OrderTicket();
                     min_ticket_profit = OrderProfit(); 
                     }
                  }
               }
            }
         }
      }
   return(min_ticket_profit);
 
¿Cómo es mejor crear un objeto de clase: después de la descripción de la clase o localmente, por ejemplo en OnTick()? La segunda opción probablemente no sea muy económica: la carga de la CPU y la RAM.
 
MakarFX #:

Este deslizamiento es sólo para esta función... para que no tenga que pasar por COMPRA o VENTA

int slipp = MarketInfo(_Symbol,MODE_SPREAD)*2;

Aquí no es necesario multiplicar por un punto

posible pérdida de datos debido a la conversión de tipo NEVALASHKA.mq4 376 13

Recibo una advertencia en tiempo de compilación


 
EVGENII SHELIPOV #:

No es necesario multiplicar por un punto

posible pérdida de datos debido a la conversión de tipo NEVALASHKA.mq4 376 13

Recibo una advertencia en tiempo de compilación


No multiplicar MODE_SPREAD - Spread en pips

puede comprobar

   Print(MarketInfo(_Symbol,MODE_SPREAD)," / ",MarketInfo(_Symbol,MODE_SPREAD)*Point);

y hacer así

int slipp = (int) MarketInfo(_Symbol,MODE_SPREAD)*2;
Razón de la queja: