Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 121

 
hoz:

Ho già capito che l'array è preferibile qui))) E in quella variante, che ho descritto sopra non è accurata? (Puramente per interesse. Penso che tutto sia già chiaro)

Qualcosa del genere è quello che avevo in mente. Quindi... la direzione per pensare...

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("Не знаю, чё за тип такой...");
   }
}
//+----------------------------------------------------------------------------+

E quello che hai lì, non ho davvero guardato ...

 
r772ra:

Che ne dite di questo?

La mia versione della funzione è più breve ... :)

//+----------------------------------------------------------------------------+
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:

Forse è così.

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
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);
}

Non funziona nemmeno. Avevo un difetto lì. Ora è così:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
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);
   }
}

Quando non ci sono ordini sul mercato, i contatori non vanno a zero. Questa è una stronzata. Cosa c'è di sbagliato qui non lo so. Guarderò quello che ha scritto Artem.

 
hoz:

Non funziona neanche questo. Avevo un difetto lì. Questo è il modo in cui è ora:

Quando non ci sono ordini sul mercato, i contatori non arrivano a zero. Questa è una stronzata. Cosa c'è di sbagliato qui non lo so. Guarderò quello che ha scritto Artem.


Togliete questo dal giro.

pr ("FindOrders(): " + "t = " + t);
pr ("FindOrders(): " + "p = " + p);
Immagino che questo sia l'output delle informazioni.
 
r772ra:


Togliere questo dal ciclo

Immagino che questo sia l'output delle informazioni.


Giusto. Beh, quello che è successo a me. Alcuni errori stupidi. Ho scavato in C++ per un mese. E ora ho degli errori così stupidi in µl. Il mio cervello deve essere bruciato :(
 
In generale, va bene cercare gli ordini su ogni tick? O è meglio eseguire su ogni barra? Non ho ancora in testa quale sia meglio in un caso e quale nell'altro.
 
hoz:
In generale, va bene cercare gli ordini su ogni tick? O è meglio eseguire su ogni barra? Non so ancora cosa sia meglio in un caso e cosa sia meglio in un altro.
Se una posizione viene chiusa all'interno di una barra durante il monitoraggio dall'apertura della barra, l'Expert Advisor non conoscerà i cambiamenti nel numero di posizioni fino all'apertura della barra successiva.
 
hoz:


t è il numero di tutti gli ordini.

p è il numero di ordini pendenti

Se la condizione è vera:

è vero, allora sia t che p sono incrementati, poiché qualsiasi ordine del tipo da 2 a 5 è sia un ordine in sospeso che un ordine. Questo significa che dovremmo incrementare entrambi i contatori. E se la condizione è vera:

Allora non c'è un ordine pendente ma c'è un ordine a mercato. Significa che aumenteremo il contatore t, cioè il contatore del numero totale di ordini.

E se non c'è niente, allora stamperemo che non ci sono ordini


t = OrdiniTotali();

perché contare???? ha contato??

 

Ciao, cerco errori in questa funzione.

L'idea è che gli ordini pendenti che non sono stati aperti dovrebbero essere cancellati due giorni dopo essere stati piazzati.

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:



Grazie, pako.