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

 
paladin80:
Guarda dove viene usato il totale dopo. Molto probabilmente, allora il ciclo passa attraverso gli ordini per (i=0; i<=totale; i++).

A proposito, sì... Ho già aggiunto il codice completo di questa funzione sopra:

void FindOrders()
{
// - 1 - == Инициализация переменных перед поиском ======================================
   int total = OrdersTotal() - 1;
   g_type = -1;                                    // На текущий момент у нас нет позиций
// - 1 - == Окончание блока =============================================================
 
// - 2 - == Непосредственно поиск =======================================================
   for (int i = total; i >= 0; i--)                // Используется весь список ордеров
      if (OrderSelect(i, SELECT_BY_POS))           // Убедимся, что ордер выбран
         if (MathFloor(OrderMagicNumber()) == i_magicNumber &&// Ордер открыт
             OrderSymbol() == Symbol())            // ..экспертом, который прикреплен к..
         {                                         // ..текущей паре
            g_ticket = OrderTicket();              // Запишем данные ордера
            g_type = OrderType();
         } 
// - 2 - == Окончание блока =============================================================
}

Ho pensato che sarebbe stato più logico non scriverlo in questo modo:

int total = OrdersTotal() - 1;

e poi impostare il ciclo in questo modo:

for(i=total; i>=1; i--)

Giusto? Solo che in qualche modo non è percepito molto bene quando il contatore del numero di posizioni da zero... non è logico e, quindi, perché confondersi...

 
hoz:

A proposito, sì... Ho già aggiunto il codice completo di questa funzione sopra:

Ho pensato che sarebbe stato più logico non scriverlo in questo modo:

e poi impostare il ciclo in questo modo:

Giusto? È solo che il contatore del numero di posizioni da zero non è percepito come tale... Non è logico e, quindi, non c'è motivo di confondersi...

Devi andare a zero, non a uno, per cercare gli ordini.

for(i=total; i>=0; i--)

Una volta un professionista mi ha spiegato che stiamo cercando una serie di ordini, ed è meglio iniziare la ricerca con un numero più alto. Nell'array, il primo elemento ha indice 0 (zero), quindi non dovremmo raggiungere 1 e questo è anche il motivo per cui dovremmo andare a OrdersTotal() - 1, invece di OrdersTotal() semplice.

Ho la ricerca dell'ordine fatta in questo modo:

for (int i=OrdersTotal()-1; i>=0; i--)
 
paladin80:

Devi andare a zero, non a uno, per cercare gli ordini.

Una volta un professionista mi ha spiegato che si tratta di una serie di ordini e allora sì, è meglio iniziare con una cifra più grande. Nell'array, il primo elemento ha un indice di 0 (zero), quindi non a 1 e anche per questo abbiamo bisogno di OrdersTotal() - 1, non solo di OrdersTotal().

È molto interessante. E la prima cosa che ho fatto è stata aprire il libro di testo e cercare di trovare lì la risposta. E poihttps://book.mql4.com/ru/trading/ordermodify ha visto come il tutorial ha fatto traboccare il vaso:

 for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер

Questo è il fattore che mi ha fuorviato...

 
hoz:

Molto interessante. E la prima cosa che ho fatto è stata aprire il libro di testo e cercare di trovare lì la risposta. E poihttps://book.mql4.com/ru/trading/ordermodify ho visto come il libro di testo era esagerato:

Questo è il fattore che mi ha fuorviato...


Non hai notato la riga successiva?

   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер     
   {      
     if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
//
//Тут компенсируется отсутствие нуля с i-1
 
borilunad:


Non hai notato la riga successiva?

No, ma in qualche modo è storto scriverlo. Non voglio criticare il libro di testo, ma... è molto più adeguato contare da 0 piuttosto che da -1. Altrimenti avresti già potuto partire da -30...

ComePaladin80 ha sottolineato sopra, da 0 il valore degli array sarebbe più adeguato che da -N.

 
hoz:

No, ma in qualche modo è storto scriverlo. Non voglio criticare il libro di testo, ma... è molto più adeguato contare da 0 piuttosto che da -1. Altrimenti avresti già potuto partire da -30...

ComePaladin80 ha sottolineato sopra, da 0 il valore degli array sarebbe il più adeguato, se da -N.


Ora pensa in modo logico!

Queste varianti sono identiche, perché se i = 0, dobbiamo cercare da 1 a OrderTotal(), cioè da 0+1 a OrderTotal() - 1+1 (+1, perché i++ è alla fine della dichiarazione for) E lo stesso nel tutorial, solo scritto da 1 a OrderTotal() e, per non contare da 2 a OrderTotal()+1, nellafunzione OrderSelect aggiunto -1 a i. Capito?

A proposito, per quanti programmatori ci siano, ci sono quasi altrettante varianti. Ognuno ha la sua visione, la sua scrittura!

 
hoz:

No, ma in qualche modo è storto scriverlo. Non voglio criticare il libro di testo, ma... è molto più adeguato contare da 0 piuttosto che da -1. Altrimenti avresti già potuto partire da -30...

ComePaladin80 ha sottolineato sopra, 0 sarebbe più adeguato per gli array rispetto a -N.

Se siete interessati alla ricerca di ordini, posso suggerire il seguente schema:

if (OrdersTotal()>0)
{  for (int i=OrdersTotal()-1; i>=0; i--)
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) // ордер выбирается среди открытых
                                                    // и отложенных ордеров
      {  if (OrderSymbol()!=Symbol()) continue;     // если не наш символ, то уходим
         if (OrderMagicNumber()!=555) continue;     // если не наш магик номер, то уходим
                                                    // можно поставить любые другие фильтры
         // ... ваши вычисления
      }
   }
}
 
hoz:

No, ma in qualche modo è storto scriverlo. Non voglio criticare il libro di testo, ma... è molto più adeguato contare da 0 piuttosto che da -1. Altrimenti avresti già potuto partire da -30...

ComePaladin80 ha sottolineato sopra, 0 sarebbe il modo più appropriato per leggere gli array, al contrario di -N.

Ho lo stesso punto di vista, il tutorial è stato scritto da una persona specifica, questa è la sua visione delle cose (organizzazione del ciclo dell'ordine), e ci sono SEMPRE molte decisioni corrette. Ci sono opinioni giuste, e ci sono giuste ed eleganti allo stesso tempo... :)
 
borilunad:


E ora pensa, compresa la logica!

Queste varianti sono identiche, perché se i = 0, cerchiamo di andare da 1 a OrderTotal(), cioè da 0+1 a OrderTotal() - 1+1 (+1, perché i++ è alla fine dell'istruzione for) E lo stesso nel tutorial, solo da 1 a OrderTotal() è scritto e, per non contare da 2 a OrderTotal()+1, l'autore del manuale ha aggiunto -1 a i nella funzione OrderSelect. Capito?

Certo, capisco. Ma non ho mai visto gli ordini analizzati in questo modo:

if (OrderSelect(i-1,SELECT_BY_POS)==true)

di solito solo senza ==vero... Mi piaceva anche questo punto. Anche se è interessante, non avevo mai incontrato un metodo simile in altri EA. Capisco la logica, ma comunque.

[Deleted]  
Per favore, come si può usare un valore di muving di qualche barra fa per il calcolo, cioè dalla storia? Se è solo una media mobile
AlligatorJawsBuffer[i]=iMA(NULL,0,13,8,MODE_SMMA,PRICE_MEDIAN,i);
E se fosse -5 battute fa?