Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 121

 
hoz:

Ya he entendido que la matriz es preferible aquí))) ¿Y en esa variante, que he descrito arriba no es exacta? (Por puro interés. Creo que ya está todo claro)

Algo así es lo que tenía en mente. Así que... la dirección para pensar...

int i_magic=123;
int OrdersMassive[7];
//+----------------------------------------------------------------------------+
int start() {
   FindOrders(OrdersMassive);
   int i, num=0;
   for (i=0; i<=7; i++) {
      Print("Количество "+GetNameOP(i)+" = "+OrdersMassive[i]);
      num+=OrdersMassive[i];
      }
   Print("Всего ордеров = "+(num-OrdersMassive[6]));
   return(0);
}
//+----------------------------------------------------------------------------+
void FindOrders(int &mass[]) {
   int i, t, k=OrdersTotal()-1;
   ArrayInitialize(mass,0);
   for (i=k; i>=0; i--) {
      if (!OrderSelect(i,SELECT_BY_POS))  continue;
      if (OrderMagicNumber()!=i_magic)    continue;
      if (OrderSymbol()!=Symbol())        continue;
      t=OrderType();
      mass[t]=mass[t]+1;
      }
}   
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
   switch (op) {
      case OP_BUY      : return("Buy");
      case OP_SELL     : return("Sell");
      case OP_BUYLIMIT : return("Buy Limit");
      case OP_SELLLIMIT: return("Sell Limit");
      case OP_BUYSTOP  : return("Buy Stop");
      case OP_SELLSTOP : return("Sell Stop");
      case 6           : return("Неторговое изменение баланса");
      default          : return("Не знаю, чё за тип такой...");
   }
}
//+----------------------------------------------------------------------------+

Y lo que tienes ahí, realmente no lo miré...

 
r772ra:

¿Qué te parece esto?

Mi versión de la función es más corta... :)

//+----------------------------------------------------------------------------+
void FindOrders(int &mass[]) {
   int i, t, k=OrdersTotal()-1;
   ArrayInitialize(mass,0);   
   for (i=k; i>=0; i--) {
      if (!OrderSelect(i,SELECT_BY_POS))  continue;
      if (OrderMagicNumber()!=i_magic)    continue;
      if (OrderSymbol()!=Symbol())        continue;
      t=OrderType();
      mass[t]=mass[t]+1;
      }
}   
//+----------------------------------------------------------------------------+
 
r772ra:

Puede que sí.

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
void FindOrders(int& t, int& p)
{
   t = 0;
   p = 0;
 
   for (int i=OrdersTotal() - 1; i>=0; i--)
      {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderType() > 1 && OrderType() < 6)   p++;
      if (OrderType() < 6)  t++;
       }
  pr ("FindOrders(): " + "t = " + t);
  pr ("FindOrders(): " + "p = " + p);
}

Tampoco funciona. Tuve un fallo ahí. Ahora es así:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
void FindOrders(int& t, int& p)
{
   t = 0;
   p = 0;
 
   for (int i=OrdersTotal() - 1; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderType() > 1 && OrderType() < 6)
      {
          p++;
      }
      if (OrderType() < 6)
          t++;
      else 
      {
         pr("Позиций в рвнке нет!");
      }
      
      pr ("FindOrders(): " + "t = " + t);
      pr ("FindOrders(): " + "p = " + p);
   }
}

Cuando no hay órdenes en el mercado, los contadores no se ponen a cero. Esto es una mierda. ¿Qué ocurre aquí? Miraré lo que ha escrito Artem.

 
hoz:

Tampoco funciona. Tuve un fallo ahí. Así es ahora:

Cuando no hay órdenes en el mercado, los contadores no llegan a cero. Esto es una mierda. No sé qué es lo que falla aquí. Miraré lo que ha escrito Artem.


Saca esto del bucle.

pr ("FindOrders(): " + "t = " + t);
pr ("FindOrders(): " + "p = " + p);
Supongo que esta es la salida de la información.
 
r772ra:


Quita esto del bucle

Supongo que esta es la salida de la información.


Correcto. Bueno, lo que me pasó a mí. Algunos errores tontos. Llevo un mes indagando en C++. Y ahora tengo errores tan tontos en µl. Mi cerebro debe estar quemado :(
 
En general, ¿es correcto buscar órdenes en cada tic? ¿O es mejor ejecutar en cada barra? Todavía no me entra en la cabeza cuál es mejor en un caso y cuál en el otro.
 
hoz:
En general, ¿es correcto buscar órdenes en cada tic? ¿O es mejor ejecutar en cada barra? Todavía no sé qué es mejor en un caso y qué es mejor en otro.
Si una posición se cierra dentro de una barra durante el monitoreo por la apertura de la barra, el Asesor Experto no sabrá de los cambios en el número de posiciones hasta la apertura de la siguiente barra.
 
hoz:


t es el número de todos los pedidos.

p es el número de órdenes pendientes

Si la condición es verdadera:

es verdadero, entonces tanto t como p se incrementan, ya que cualquier orden del tipo 2 a 5 es tanto una orden pendiente como una orden. Por lo tanto, ambos contadores deben incrementarse. Y si la condición es verdadera:

Entonces no hay una orden pendiente pero sí una orden de mercado. Significa que aumentaremos el contador t, es decir, el contador del número total de pedidos.

Y si no hay nada, entonces imprimiremos que no hay pedidos


t = PedidosTotal();

¿por qué cuenta?????

 

Hola! Buscando errores en esta función.

La idea es que las órdenes pendientes que no se han abierto se eliminen dos días después de su colocación.

min=1440;

if(OrdersTotal()<1)
{return;
 }
  for(int i=OrdersTotal()-1;i>=0;i--)
   {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol())
       {
        if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)
        {
          if(TimeCurrent()-OrderOpenTime()>min)            
            {
            OrderDelete(OrderTicket());
          return;
          }
        }
      }
    }
return;}
 
pako:



Gracias, pako.

Razón de la queja: