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

 
Igor Makanu:

l'allocazione della memoria sarà nell'esempio 1 e nell'esempio 2

l'esempio 2 è sia la dichiarazione che l'inizializzazione, l'esempio 1 solo la dichiarazione

Già più chiaro potrebbe avere scritto su di esso nella guida. L'ho dichiarato subito perché ho calcoli statici nelle classi e non ho bisogno di creare l'oggetto tramite il nuovo operatore.

Ditemi, voglio fare una cosa del genere, cioè voglio dichiarare una classe, poi dichiarare un array e memorizzare nell'array un puntatore alla classe, è possibile farlo o no?

 
Seric29:

Ditemi che voglio fare una cosa del genere, quindi voglio dichiarare una classe poi dichiarare un array e memorizzare nell'array un puntatore alla classe, è possibile farlo o no?

ancora e ancora.... Una classe è prima di tutto un tipo di dati, come int, double...

volete un array di questo tipo di dati? - dichiarare un array, se l'array è dinamico, poi ridimensionarlo, poi inizializzare OGNI ELEMENTO con i dati necessari - avete bisogno di puntatori, poi inizializzarli con puntatori a una classe, avete bisogno di istanze di una classe, poi ogni elemento dell'array non sarà un puntatore ma un oggetto stesso

Questa è l'essenza dell'OOP, ogni classe è prima di tutto un tipo di dati utente.... Non so quanto dire al riguardo, ma la metodologia è la stessa di un normale tipo di dati, e ciò che scriverete all'interno della classe è una questione personale, ma l'inizializzazione di una nuova istanza inizierà sempre con un costruttore, e quale costruttore c'è - di default, con parametri o senza parametri vi dà una scelta su come inizializzare l'oggetto...... ugh, ma ancora leggete libri, non c'è modo di farlo con domande qui

 
Igor Makanu:

Di solito determinano gli ordini superiori/inferiore più esterni in base ai loro prezzi aperti, poi aggiungono qualche valore e ottengono un nuovo prezzo al quale o controllano quando il prezzo rompe questa condizione di livello e piazzano un nuovo ordine o piazzano immediatamente una griglia di ordini pendenti puntando al numero massimo di ordini e poi tracciano questa griglia.

Vi ringrazio per il vostro interesse, ma io intendevo la griglia tratteggiata sul grafico.


Puoi per favore consigliarmi come vengono calcolati i livelli orizzontali per una griglia in mt4 e in mt5? Si spostano quando scorro il grafico senza una scala fissa e si spostano inmt4 e mt5 in modo leggermente diverso. Forse qualcuno sa come si calcola, così non devo indovinare con le rientranze e le legature e così via.

 
Andrey Sokolov:

Grazie per non averci superato, ma non sto parlando di questo, sto parlando della griglia tratteggiata sul grafico.


Puoi dirmi per favore come vengono calcolati i livelli orizzontali per la griglia in mt4 e in mt5? Se la scala non è fissa, si spostano quando scorro il grafico, e si spostano inmt4 e in mt5 un po' diversamente. Forse qualcuno sa come si calcola, così non devo indovinare con rientri, legature e altro.

Divide semplicemente la finestra in parti uguali, a seconda della risoluzione dello schermo.

Sto dividendo verticalmente in 15 parti sia in MT4 che in MT5

 
Igor Makanu:

ancora e ancora.... Una classe è prima di tutto un tipo di dati, come int, double...

vuoi un array di dati di quel tipo? - dichiarare un array, se l'array è dinamico, allora ridimensionarlo, poi inizializzare OGNI ELEMENTO con i dati necessari - avete bisogno di puntatori, poi inizializzarli con puntatori alla classe, avete bisogno di istanze di classe, poi ogni elemento dell'array non sarà un puntatore, ma l'oggetto stesso

Questa è l'essenza dell'OOP, ogni classe è prima di tutto un tipo di dati utente.... Non so quanto dire al riguardo, ma la metodologia è la stessa di un normale tipo di dati, e ciò che scriverete all'interno della classe è una questione personale, ma l'inizializzazione di una nuova istanza inizierà sempre con un costruttore, e quale costruttore - di default, con parametri o senza parametri - potete scegliere come inizializzare l'oggetto...... ugh, ma comunque leggete i libri, non c'è modo di farlo in questo modo

Sì, ho capito che questo non è possibile perché quando si crea un array, il programma ha bisogno di specificare il tipo, e poiché voglio salvare un puntatore di diverse classi in un array, non funzionerà perché l'array non può essere di tipo diverso o vario in mql, in s++ lo faceva, ma non con oggetti così complessi. Quindi la mia idea non funzionerà qui.

 
Seric29:

Sì, mi sono reso conto che questo non è possibile perché quando si crea un array, il programma richiede di specificare il tipo, e poiché voglio salvare un puntatore di diverse classi in un array, non funzionerà perché l'array non può essere di diversi tipi o varietà in mql, in C++ lo faceva, ma non con oggetti così complessi. Quindi la mia idea non funzionerà qui.

Tutto è fatto. Voi ereditate i vostri oggetti dalla classe base e create un array con il tipo della classe base. E tutti gli oggetti ereditati possono essere nell'array.
 
Artyom Trishkin:
Tutto è fatto. Voi ereditate i vostri oggetti dalla classe base e create un array con il tipo della classe base. E tutti gli oggetti ereditati possono essere nell'array.

E mostrare l'esempio più semplice e primitivo, dove ci sono 2 classi quindi l'ereditarietà e come mettere i riferimenti ad ogni classe in un array di 2 elementi (0 prima classe 1 seconda)?

 
Andrey Sokolov:

Makar, perché stai scrivendo qualcosa che è chiaramente falso? Quando si scorre il grafico si può cambiare l'offset delle linee orizzontali della griglia, e si spostano inmodo leggermente diverso inmt4 e in mt5.

Non lo fanno!

Si spostano solo quando c'è una finestra indicatore, in tutti gli altri casi no.

 
Seric29:

E mostrare l'esempio più semplice e primitivo in cui ci sono 2 classi ulteriormente ereditate e come mettere i riferimenti a ciascuna classe in un array di 2 elementi (0 prima classe 1 seconda)?

class CBase{
protected:
   int v;
   public:
                  CBase(): v(0)  {            }
           int    getV()         { return(v); }
   virtual int    calc() = 0;
};

class A:public CBase
{
   public:
   virtual int calc() {return(--v);} //декремент 
};

class B:public CBase
{
   public:
   virtual int calc() {return(++v);} //инкремент
};

//+------------------------------------------------------------------+
void OnStart()
{
// 2 указателя которые инициализируем экземплярами обьектов  A и B
   CBase *arr_base[2];
   arr_base[0] = new A;
   arr_base[1] = new B;
// вызовем 10 раз метод calc() для каждого обьекта   
   for(int j=ArraySize(arr_base)-1; j>=0; j--)
   {
      for(int i=0; i<10; i++)
         {
            arr_base[j].calc();
         }
   }
   
   Print("A.v = ",arr_base[0].getV());
   Print("B.v = ",arr_base[1].getV());
//удалим обьекты   
   for(int j=ArraySize(arr_base)-1; j>=0; j--)
   {
      delete arr_base[j];
   }   
}
//+------------------------------------------------------------------+

2020.03.22 21:21:38.544 tst (EURUSD,H1) A.v = -10

2020.03.22 21:21:38.544 tst (EURUSD,H1) B.v = 10

 
Igor Makanu:

2020.03.22 21:21:38.544 tst (EURUSD,H1) A.v = -10

2020.03.22 21:21:38.544 tst (EURUSD,H1) B.v = 10

Grazie. E le funzioni dovrebbero essere virtuali semplici non possono, mi sperimenterò già da solo.

Motivazione: