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

 
Vitaly Muzichenko:

La función recorre y selecciona la más reciente por tiempo, es decir, la última

A continuación, tenemos un seleccionado, y lo sustituimos en la funcióniBarShift(sym, tf, oot ,true);

La función devuelve el número de barra por tiempo. Eso es todo.

Lamentablemente no puedo comprobarlo, pero cuando lo usé, funcionó perfectamente, así como todas las funciones publicadas aquí por I. Kim

y si tengo un ticket asignado cuando abro un pedido y la función selecciona un número secuencial ¿está bien?
 
Вадим Мотеюнас:
Escribe el error indicandoif( iOpen[0] != time_open )'iOpen' - undeclared identifie

He escrito algo un poco mal, un poco en la otra dirección del pensamiento. Cambia iOpen[0] por Open[0]. Corregido. Sin embargo, para decirlo de forma sencilla. Cuando abro un bar, recuerdo la hora de apertura del bar y no hay pedidos en este bar.

 

También está escrito en la descripción de la función que

La selección de las posiciones a tener en cuenta se establece mediante parámetros externos:

  • sy- Nombre del instrumento de mercado. Si establece este parámetro, la función sólo tendrá en cuenta las posiciones del instrumento especificado. El valor por defecto -NULL significa el instrumento de mercado actual.
  • tf- Marco temporal. El valor por defecto0 significa el marco temporal actual.
  • op- Operación comercial, tipo de posición. Valores válidos:OP_BUY,OP_SELL o-1. El valor por defecto-1 significa cualquier posición.
  • mn- Identificador de posición, MagicNumber. El valor por defecto-1 significa cualquier identificador.
Estos valores deberían declararse antes de la primera función especial, es decir, el hecho de que estén incluidos en la descripción de la propia funciónNumberOfBarOpenLastPos() no es suficiente?

 
Вадим Мотеюнас:

También está escrito en la descripción de la función que

La selección de las posiciones a tener en cuenta se establece mediante parámetros externos:

  • sy- Nombre del instrumento de mercado. Si establece este parámetro, la función sólo tendrá en cuenta las posiciones del instrumento especificado. El valor por defecto -NULL significa el instrumento de mercado actual.
  • tf- Marco temporal. El valor por defecto0 significa el marco temporal actual.
  • op- Operación comercial, tipo de posición. Valores válidos:OP_BUY,OP_SELL o-1. El valor por defecto-1 significa cualquier posición.
  • mn- Identificador de posición, MagicNumber. El valor por defecto-1 significa cualquier identificador.
¿Por los parámetros externos? ¿Es necesario declararlos antes de la primera función especial? es decir,¿no basta con que estén en la descripción de la propia funciónNumberOfBarOpenLastPos()?

Suficiente. En los parámetros externos puedes introducir los valores que necesites: MagicNumber, qué posiciones buscas, si quieres COMPRA(0) y VENTA(1) - entonces escribe "-1".

 
Konstantin Nikitin:

He escrito algo un poco mal, un poco en la otra dirección del pensamiento. Cambia iOpen[0] por Open[0]. Corregido. Sin embargo, para decirlo de forma sencilla. Cuando abra una barra, recordará la hora de apertura de la barra y no se abrirán órdenes en esta barra.

se abren muchas órdenes y parece que la condición if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) se cumple antes de abrir una no orden ya que NumberOfBarOpenLastPos devuelve -1

 
Вадим Мотеюнас:

se abren muchas órdenes, y parece que la condición if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) se cumple antes de que se abra una no-orden, porque NumberOfBarOpenLastPos devuelve -1

Si busca órdenes, entonces debe utilizar la función en su versión completa, es decir, con la posibilidad de buscar por órdenes, no sólo por posiciones:

int NumberOfBarOpenLastPos(string sym="",int tf=0,int op=-1,int mn=-1)
  {
   datetime oot=0; // Инициализируем нулём
   int      i,k=OrdersTotal();

   if(sym=="") sym=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==sym)
           {
            if(OrderType()<6) // Ищем и по ордерам
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime(); // Ищем последнее
                    }
                 }
              }
           }
        }
     }
   return(iBarShift(sym, tf, oot, true));
  }
 
Vitaly Muzichenko:

Esto es suficiente. En los parámetros externos se pueden introducir los valores requeridos: Majik, qué posiciones se buscan, quizás sólo COMPRA, si se necesita COMPRA(0) y VENTA(1) - entonces escribimos "-1".

cuando inicio en el probador, no hay órdenes abiertas, tal vez por eso se devuelve -1, por lo que la condición if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) no se cumple?

 
Вадим Мотеюнас:

Al iniciar en el probador, no hay órdenes abiertas, ¿tal vez por eso se devuelve -1 y por lo tanto no se cumple la condición if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0)?

Lo comprobaré ahora.

 
Vitaly Muzichenko:

Si busca órdenes, entonces debe utilizar la función en su versión completa, es decir, con la posibilidad de buscar por órdenes, no sólo por posiciones:

sigue devolviendo -1

 
Вадим Мотеюнас:

sigue devolviendo -1

Funciona perfectamente.

De dos posiciones ha elegido la última, que está en la barra 11, como se puede ver en la captura de pantalla:


Comprueba el código:

 void OnTick() 
  {
   ...
   Comment( NumberOfBarOpenLastPos("",0,-1,-1) );
   ...
  }

int NumberOfBarOpenLastPos(string sym="",int tf=0,int op=-1,int mn=-1)
  {
   datetime oot=0; // Инициализируем нулём
   int      i,k=OrdersTotal();

   if(sym=="") sym=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==sym)
           {
            if(OrderType()<6) // Ищем и по ордерам
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime(); // Ищем последнее
                    }
                 }
              }
           }
        }
     }
   return(iBarShift(sym, tf, oot, true));
  }