[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.

 
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?
Motivazione: