Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1724

 
EVGENII SHELIPOV #:

Buona giornata signori programmatori!!!!

Provo ancora una volta a porre la mia domanda, ma l'ho riformulata un po'.

In una griglia EA, dobbiamo trovare il biglietto del penultimo ordine. Penso che la soluzione -1 dal biglietto dell'ordine massimo non funzioni nel tester di strategia, ma potrebbe essere così sui conti demo e reali, è difficile capire perché.

Ho scritto il codice della funzione che determina il penultimo biglietto d'ordine. Questa logica è la seguente: se guardiamo tutti gli ordini aperti nella griglia, troveremo il massimo che lo segue e sarà il biglietto d'ordine necessario.

Tuttavia, il mio livello di programmazione non è abbastanza alto e c'è qualche errore nel codice. Il risultato di questa funzione è il biglietto minimo. Queste due funzioni sono max ticket e penultimo ticket. La funzione max ticket funziona senza problemi.

Si prega di consigliare qual è l'errore. Grazie.

Questa seconda immagine mostra che non hai bisogno di un ticket massimo o di un tempo massimo di apertura, ma devi scegliere un prezzo aperto minimo per gli ordini di acquisto e un prezzo aperto massimo per gli ordini di vendita.
 
Alexey Viktorov #:
Questa è la seconda immagine che ti dice che non stai cercando un ticket massimo o un tempo massimo di apertura, ma devi selezionare il prezzo aperto minimo per gli ordini di acquisto e il prezzo aperto massimo per gli ordini di vendita.

Alexei ho le funzioni che determinano questi prezzi potresti spiegare come raggiungere il biglietto che stai cercando?

 
Alexey Viktorov #:
Questa seconda immagine mostra che non hai bisogno di un ticket massimo o di un tempo massimo di apertura, ma devi scegliere un prezzo aperto minimo per gli ordini di acquisto e un prezzo aperto massimo per gli ordini di vendita.
//+----------------------------------------------------------------------------+
//| Определение цены открытия макс лота                                        |
//+----------------------------------------------------------------------------+
double PriceMaxOrder()
  {
   double max_price = 0 ;
   max_ticket = 0;
     {
      for(int cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
        {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                 {
                  if(OrderTicket() > max_ticket)
                    {
                     max_ticket = OrderTicket();
                     max_price = OrderOpenPrice();
                    }
                 }
              }
           }
        }
     }
   return(max_price);
  }
 
EVGENII SHELIPOV #:

Alexei ho le funzioni che determinano questi prezzi potresti spiegare come raggiungere il biglietto che stai cercando?

Come questo.

//+------------------------------------------------------------------+
//| Расчет тикета нижнего ордера BUY в сетке                         |
//+------------------------------------------------------------------+
int GetTicketMaxOrder(int Magic)// int Magic вставлен только для компиляции без ошибок.
 {
  int total = OrdersTotal(),
      my_ticket = 0;
  double minPrice = DBL_MAX;
  for(int cnt = total; cnt-- > 0;)
   {
    if(OrderSelect(cnt, SELECT_BY_POS) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
     {
      if(OrderType() == OP_BUY)
       {
        if(OrderOpenPrice() < minPrice)
          my_ticket = OrderTicket();
       }
     }
   }
  return(my_ticket);
 }
/*****************************End program****************************/
 
Alexey Viktorov #:

Come questo

Alexey grazie!!! Ma prima di entrare nel succo della funzione volevo chiarire: questa funzione serve a selezionare il biglietto del penultimo ordine?

 
EVGENII SHELIPOV #:

Alexey grazie!!! Ma prima di entrare nel succo della funzione volevo chiarire: questa funzione serve a selezionare il biglietto del penultimo ordine?

No, trova il biglietto d'ordine BUY con il prezzo più basso. Da qui in poi tocca a me o a Makar lasciarmi esercitare.

 
Alexey Viktorov #:

No, trova il biglietto d'ordine BUY con il prezzo più basso. Da qui in poi sta a te o a Makar fare pratica.

Alexey, mi sento inadeguato per il secondo giorno in mezzo a voi. Ho delle funzioni per calcolare il biglietto min/max, funzionano senza problemi come la macchina di Kalashnikov, non gliel'ho ancora chiesto, ma il secondo giorno mi hanno trasformato!

//+----------------------------------------------------------------------------+
//| Расчет тикета максимального ордера в сетке                                 |
//+----------------------------------------------------------------------------+
int GetTicketMaxOrder()
  {
   max_ticket = 0;
     {
      for(int cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
        {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                 {
                  if(OrderTicket() > max_ticket)
                     max_ticket = OrderTicket();
                 }
              }
           }
        }
     }
   return(max_ticket);
  }
//+----------------------------------------------------------------------------+
//| Расчет тикета минимального ордера в сетке                                  |
//+----------------------------------------------------------------------------+
int GetTicketMinOrder()
  {
   min_ticket=INT_MAX;
     {
      for(int cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
        {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                 {
                  if(OrderTicket() < min_ticket)
                     min_ticket = OrderTicket();

                 }
              }
           }
        }
     }
   return(min_ticket);
  }

Beh, comunque, grazie per l'avvertimento

 
EVGENII SHELIPOV #:

Sì Alexey mi sento il secondo giorno tra voi non proprio persona adeguata. Le funzioni per calcolare il biglietto min/max funzionano senza problemi come la macchina di Kalashnikov che non ho chiesto a nessuno, ma il secondo giorno mi si accende un intoppo!!!

Beh, comunque, grazie per il consiglio.

Non è questa foto

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Tutte le domande dei neofiti su MQL4 e MQL5, aiuto e discussione di algoritmi e codici

EVGENII SHELIPOV, 2021.11.07 06:43

Buona giornata signori programmatori!!!!

Proverò ancora una volta a porre la mia domanda, ma leggermente riformulata.

In una griglia EA, ho bisogno di trovare il biglietto del penultimo ordine. Una soluzione di -1 dal ticket dell'ordine massimo non funziona nel tester di strategia, forse, ma non funzionerà su un conto demo o reale, quindi allego un'immagine, sarà chiaro perché.

Ho scritto il codice per la funzione che determina il penultimo biglietto d'ordine. Questa logica è la seguente: se guardiamo tutti gli ordini aperti nella griglia, troveremo il massimo che lo segue e sarà il biglietto d'ordine necessario.

Tuttavia, il mio livello di programmazione non è abbastanza alto e c'è qualche errore nel codice. Il risultato di questa funzione è il biglietto minimo. Queste due funzioni sono max ticket e penultimo ticket. La funzione che definisce il biglietto massimo funziona senza problemi.

//+----------------------------------------------------------------------------+
//| Расчет тикета предпоследнего ордера в сетке                                |
//+----------------------------------------------------------------------------+
int GetTicketPenultimateOrder()
  {
   penultimate_ticket = 0;
     {
      for(int cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
        {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                 {
                  if(OrderTicket() > penultimate_ticket && penultimate_ticket != GetTicketMaxOrder())
                     penultimate_ticket = OrderTicket();
                 }
              }
           }
        }
     }
   return(penultimate_ticket);
  }
//+----------------------------------------------------------------------------+
//| Расчет тикета максимального ордера в сетке                                 |
//+----------------------------------------------------------------------------+
int GetTicketMaxOrder()
  {
   max_ticket = 0;
     {
      for(int cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
        {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                 {
                  if(OrderTicket() > max_ticket)
                     max_ticket = OrderTicket();
                 }
              }
           }
        }
     }
   return(max_ticket);
  }

Si prega di consigliare qual è l'errore. Grazie.


le frecce mostrano il biglietto massimo? Qui vedo delle frecce che puntano al secondo prezzo più basso dell'ordine. Cosa c'è che non va?
 
Alexey Viktorov #:

Questa foto è


le frecce mostrano il biglietto massimo? Qui vedo delle frecce che puntano al secondo prezzo più basso dell'ordine. Cosa c'è che non va?

Alexei, puoi ingrandire l'immagine, per favore?

 
EVGENII SHELIPOV #:

Alexei, puoi ingrandire l'immagine, per favore?

Questo è l'ordinePREDICATO

Motivazione: