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

 
MakarFX #:

Tiene la condición de abrir dos a la vez si no hay ninguna abierta.

¿Qué es eso?

double GetLotSize()
  {
   double Ls=0;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) {Ls=OrderLots();}
           }
        }
     }
   return Ls;
  }    

Esta cosa cuenta el lote actual.

Este parámetro se establece en los ajustes: LotControl

respectivamente, cuando: GetLotSize()>LotControl - Necesito que abra vOrderOpenSell() en la señal bSignalBuy().

Sí, sé que ambas órdenes se abren por la condición. Lo escribí así al principio. Pero, ¿cómo hago para que vOrderOpenBuy() no se abra?

 
Mihail Matkovskij #:

Si el robot ya ha entrado en el mercado en una dirección, no vuelve a entrar en la misma dirección. ¿Es así como funciona su algoritmo de entrada?

Si se cumple esta condición, se activa

Después de

Y también cuando hay una señal de venta.

Entonces, la razón para entrar en la dirección opuesta es porque la condición se dispara

Sí. Eso es lo que necesito. PERO tiene que detener/excluir una entrada de avance por esta condición:

GetLotSize()>LotControl
 
Kedrov #:

¡Gracias, Makar, por meterte conmigo!

Aquí tienes una captura de pantalla.

Sí, has hecho un lío)

Ahora, en cada carpeta, una por una, renombre las carpetas Expertos a _Expertos e Indicadores a _Indicadores.

Renombrado en una carpeta - iniciar el terminal, si no ayudó - renombrar de nuevo y pasar a la siguiente carpeta.

P.D. La primera vez que el terminal arranque será un poco más largo de lo habitual.

 
законопослушный гражданин #:

esta cosa cuenta el tamaño actual del lote

este parámetro se establece en los ajustes: LotControl

respectivamente, cuando: GetLotSize()>LotControl - Necesito que vOrderOpenSell() ocurra al recibir la señal bSignalBuy().

Sí, sé que ambas órdenes se abren por la condición. Lo escribí así al principio. Pero, ¿cómo hago para que vOrderOpenBuy() no se abra?

        if((bSignalBuy() == true)&&(GetLotSize()>LotControl))
           vOrderOpenSell();
        else
        if(bSignalBuy() == true)
           vOrderOpenBuy();
         
 
законопослушный гражданин #:

Sí. Eso es lo que necesito. PERO es necesario detener/excluir la entrada de la delantera por esta condición:

Estoy confundido por esta condición

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {

con esta condición

GetLotSize()=0
 
MakarFX #:

Gracias. Corregido. Lo pensaré.

 
MakarFX #:

Estoy confundido por esta condición

Con esa condición.

parece que tienes razón.

Sí:

 if((bSignalBuy() == true)&&(GetLotSize()>LotControl))
         vOrderOpenSell();
         else
         if(bSignalBuy() == true)
         vOrderOpenBuy();

no reacciona en absoluto a la condición (GetLotSize()>LotControl)

 
законопослушный гражданин #:

parece que tienes razón.

Sí:

no reacciona en absoluto a la condición (GetLotSize()>LotControl)

GetLotSize() debe tomarse del último cerrado, entonces en

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {

(GetLotSize()>LotControl) funcionará
 
MakarFX #:

GetLotSize() debe tomarse de la última cerrada, entonces en

(GetLotSize()>LotControl) funcionará

Muchas gracias.

 
законопослушный гражданин #:

Sí. Eso es lo que necesito. PERO al hacer esto, necesita detener/excluir la entrada hacia adelante por esta condición:

if (bSignalBuy()) {
  if (GetLotSize() > LotControl)
    vOrderOpenSell();
  else
    vOrderOpenBuy();
}
double GetLotSize()
  {
   double Ls=0;
   datetime last = 0, openTime;
   for (int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic)
           {
             if(OrderType() == OP_BUY || OrderType() == OP_SELL) {
               if ((openTime = OrderOpenTime()) > last) {
                 last = openTime;
                 Ls = OrderLots();
               }
             }
           }
        }
     }
   return Ls;
  }
Razón de la queja: