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

 
Ho tutti i tipi di sciocchezze come i parametri degli indicatori ecc. come parametri nella mia classe. In generale, cose che saranno statiche e uguali. Quindi perché dovrei passare questi valori ogni volta che creo un oggetto?
 
STARIJ:

è più breve? bool barup=... WindowRedraw(); verrà ancora eseguito - preso da if

può anche essere più breve ... vedi il mio file

Grazie. Come faccio a impostare correttamente l'intervallo in cui vengono disegnati i livelli Fibo? Se è (ora) 9.00, dovrebbe disegnare i livelli da 8.00 a 8.59 su М1.
 
Juer:

Un po' come l'affermazione della domanda è chiara, no? Il punto è inizializzare la stessa cosa.

Come pensate di inizializzare qualcosa che non esiste già? Dopo che l'oggetto è stato creato, comincia ad esistere, ed è allora che può essere inizializzato.

Te l'ho detto subito - fai di un oggetto un costruttore parametrico, e passagli i parametri richiesti, che saranno usati per inizializzare l'oggetto appena creato.

Potete passare parametri attraverso una struttura, che riempite con i dati richiesti (costanti per tutti questi oggetti) in OnInit() del programma. Poi, in OnTick(), per esempio, o in qualsiasi altro gestore standard, create i vostri oggetti, ma quando li create scrivete quanto segue:
CMyObject object = new CMyObject(a_here_structure_with_set_parameters);

Oppure, se i dati dell'oggetto non cambiano da programma a programma e hanno sempre gli stessi valori, allora inizializzateli esplicitamente con i parametri richiesti nel costruttore attraverso la lista di inizializzazione, come ha detto Igor sopra:

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

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

Ihor Herasko, 2018.03.28 17:31

Questo viene fatto nella lista di inizializzazione, che si trova nel costruttore della classe:

class CCandle
{
   int      m_nA;
   double   m_fB;
   datetime m_dtC;


   void CCandle::CCandle(void);
};

CCandle::CCandle(void)
            : m_nA(0)
            , m_fB(0.0)
            , m_dtC(0)
{
}

 
Artyom Trishkin:

Come pensate di inizializzare qualcosa che non esiste già? Dopo che l'oggetto è stato creato, comincia ad esistere, ed è allora che può essere inizializzato.

Te l'ho detto subito - fai di un oggetto un costruttore parametrico, e passagli i parametri richiesti, che saranno usati per inizializzare l'oggetto appena creato.

Potete passare i parametri attraverso una struttura, che riempirete con i dati richiesti (costanti per tutti questi oggetti) in OnInit() del programma. Poi, in OnTick(), per esempio, o in qualsiasi altro gestore standard, create i vostri oggetti, ma alla creazione scrivete quanto segue:
CMyObject object = new CMyObject(a_here_structure_with_set_parameters);

Sì, capisco. Grazie. Beh, in qualche modo ho pensato che ci fosse una soluzione in modo che quando un oggetto viene creato abbia alcuni parametri preimpostati subito senza doverli passare al costruttore o altro. Attraverso una classe di genitori o qualcosa del genere.

 
Juer:
Nella mia classe ho tutti i tipi di cose come i parametri degli indicatori ecc. come parametri. In generale, cose che saranno statiche e uguali. Quindi perché dovrei passare questi valori ogni volta che creo un oggetto?

Quindi non passarlo. Initialize nella lista di inizializzazione, come ho mostrato. Al momento di creare un'istanza della classe, verrà chiamato automaticamente il costruttore della classe, che inizializzerà tutti i membri della classe, specificati nella lista di inizializzazione. Mettete la funzione Print nel metodo CCandle e vedrete come il costruttore viene chiamato senza alcun riferimento ad esso.

 
Juer:

Sì, capisco. Grazie. Beh, in qualche modo ho pensato che c'è una soluzione, in modo che quando un oggetto viene creato ha alcuni parametri preimpostati subito senza doverli passare al costruttore o altro. Tramite una classe madre o qualcosa del genere.

Di nuovo. Potete farlo senza trasferire i dati al costruttore.

 
Ihor Herasko:

Quindi non passarlo. Initialize nella lista di inizializzazione, come ho mostrato. Al momento di creare un'istanza della classe, verrà chiamato automaticamente il costruttore della classe, che inizializzerà tutti i membri della classe, specificati nella lista di inizializzazione. Mettete la funzione Print nel metodo CCandle e vedrete come il costruttore viene chiamato senza alcun riferimento ad esso.

Non capisco, che differenza fa se passarli attraverso il costruttore o attraverso la funzione di inizializzazione?

 
Ihor Herasko:

Quindi non passarlo. Initialize nella lista di inizializzazione, come ho mostrato. Al momento di creare un'istanza della classe, verrà chiamato automaticamente il costruttore della classe, che inizializzerà tutti i membri della classe, specificati nella lista di inizializzazione. Mettete la funzione Print nel metodo CCandle e vedete come il costruttore viene chiamato senza alcun riferimento ad esso.

Con cosa saranno inizializzati? Con quali valori? Non capisco.

Supponiamo che io abbia dei valori iniziali nei parametri di input di Expert Advisor. Quindi, ho bisogno di passarli ad ogni oggetto della classe. Ma non per passarli ad ogni oggetto appena creato.

 

come mai in questo ciclo il mio ordine limite viene cancellato solo se dopo aver piazzato un ordine limite sulla barra successiva non è stato piazzato un altro ordine limite, cioè un ordine limite viene cancellato solo se viene piazzato e poi seguito da due barre senza ordini limite

 int i;
   for(i=0;i<=OrderTicket();i++)
     {
      takelimit=OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);

      if(iBarShift(Symbol(),0,OrderOpenTime())==2)//здесь нужно что бы на 2-ом баре если есть ордер его удалить, но удаляется он только если после его установки небыло на след баре еще лимитника
        {
         deletelimit=OrderDelete(ticket);
         if(!deletelimit)
           {
            Comment(GetLastError());
           }
        }
     }
if(условие для байлимита)
{ордерсенд}
else if(условие для селлимита)
{ордерсенд}
 
Juer:

Con cosa saranno inizializzati? Con quali valori? Non chiaro

Quelli che si scrivono nella lista di inizializzazione.

Supponiamo che io abbia inizializzato i valori nei parametri di input di Expert Advisor. Quindi, ho bisogno di passarli ad ogni oggetto di questa classe. Ma non per passarli ad ogni oggetto appena creato.

Ecco qui:

input int      i_nA     = 10;
input double   i_fB     = 20.0;
input datetime i_dtC    = D'2018.03.08 10:12:14';

class CCandle
{
   int         m_nA;
   double      m_fB;
   datetime    m_dtC;
   
public:
                     CCandle(void);
};

CCandle::CCandle(void)
         : m_nA(i_nA)
         , m_fB(i_fB)
         , m_dtC(i_dtC)
{
   Print("Создан объект со значениями: A = ", m_nA, ", B = ", m_fB, ", C = ", m_dtC);
}

int OnInit()
{
   CCandle arrclass[10];
     
   return(INIT_SUCCEEDED);
}

Se lo eseguiamo, otteniamo:

0       22:09:36.706    Test EURUSD,M1 inputs: i_nA=10; i_fB=20.0; i_dtC=1520503934; 
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: initialized
0       22:09:36.995    Test EURUSD,M1: uninit reason 0
0       22:09:37.062    Script Test EURUSD,M1: removed