Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 172

 

Salve.

Per favore, consigliatemi come farlo correttamente.

C'è una collezione globale di oggetti:

CArrayObj array;

C'è una classe aggiuntiva dove vengono fatti molti calcoli e questo include la creazione di oggetti e la loro aggiunta alla collezione:

class CCheck : public CArrayObj
  {
  }
bool CCheck::SomeMethod(void)
  {
   CSample *sample_object=new CSample();
   array.Add(sample_object);
  }

Questo oggetto supplementare della classe CCheck lo creo regolarmente in un ciclo. Ma non posso distruggerlo, perché ho bisogno di oggetti CSample nella collezione di array. Se distruggo CCheck, perdo anche i sample_objects nell'array.

Ora spingo questi oggetti CCheck in un altro array di oggetti garbage, che cancello quando non ho più bisogno degli oggetti corrispondenti nell'array. Ma ottengo un errore di esaurimento della memoria perché devo tenere molti oggetti CCheck pesanti nell'array. Ma non ho bisogno dell'intero oggetto, ho solo bisogno dell'oggetto CSample creato. Potresti per favore dirmi come farlo correttamente, così posso salvare solo l'oggetto CSample e cancellare quello CCheck. Non riesco a capirlo.

Il codice è così:

CArrayObj array;
CArrayObj gargage_array;

void OnTick()
  {
   for(int i=0;i<total;i++)
     {
      CCheck *check_obj=new CCheck();
      check_obj.Check();
      garbage_array.Add(check_obj);
     }
   if(..)
     {
      array.Clear();
      garbage_array.Clear();
     }
  }

class CCheck : public CArrayObj
  {
   public:
   void         Check(void);
   protected:
   bool         SomeMethod(void);
  };
void CCheck::Check(void)
  {
   ...
   SomeMethod();
  }
bool CCheck::SomeMethod(void)
  {
   CSample *sample_object=new CSample();
   array.Add(sample_object);
  }

class CSample : public CObject
  {
  };
 

La soluzione è stata su un forum da qualche parte, ma non riesco a trovare la risposta.

Che ha trovato un "antidoto" contro questo:

Pannello standard

Il codice è standard:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {   
//--- create application dialog
      if(!ExtDialog.Create(0,"For Example ",0,40,40,760,400))
      //return(INIT_FAILED);
      return(false);            // исключительно для того, чтобы продемонстрировать наложение "панелей"
//---
//--- run application
   ExtDialog.Run();
//--- succeed
//-----
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy dialog
   ExtDialog.Destroy(reason);
//---
  }
//+------------------------------------------------------------------+
//| Expert chart event function                                      |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // event ID  
                  const long& lparam,   // event parameter of the long type
                  const double& dparam, // event parameter of the double type
                  const string& sparam) // event parameter of the string type
  {
   ExtDialog.ChartEvent(id,lparam,dparam,sparam);
   ChartRedraw();
  }

L'essenza: Expert Advisor si blocca quando si passa da un timeframe all'altro. In mt5 non c'è questo problema.

C'è una soluzione? Oppure è meglio dimenticare i pannelli in mt4 :)

 
Vjacheslav Lapaev:

La soluzione era già da qualche parte sul forum, ma non riesco a trovare la risposta.

Chi ha trovato "l'antidoto" contro questo:


Il codice è standard:

L'essenza: Expert Advisor si blocca quando passo da un timeframe all'altro. In mt5 non c'è questo problema.

C'è una soluzione? Oppure è meglio dimenticare i pannelli in mt4 :)

Forse qualcuno potrebbe usarlo. In sostanza, c'era un Expert, l'ho salvato come Indicatore, tutto funziona. Intendo il codice del pannello.

 

Buon pomeriggio!

Pensavo fosse possibile stampare semplicemente un array, ma non ricordo e non riesco a trovare come farlo. Come?

 
Nauris Zukas:

Buon pomeriggio!

Pensavo fosse possibile stampare semplicemente un array, ma non ricordo e non riesco a trovare come farlo. Come?

ArrayPrint
 
Vladislav Andruschenko:
ArrayPrint

Ah, era in MQL5, grazie chiaramente!

 

Non capisco cosa bisogna fare per risolvere il problema:

4030 è "il grafico non risponde".

Ieri ha funzionato :( L'unica differenza è che MT5 viene ottimizzato in parallelo (usa anche il timer), ma ci sono risorse libere. Il grafico con questo Expert Advisor è assolutamente "pulito", non c'è niente attaccato.

 
Igor Zakharov:

L'unica differenza è che MT5 è ottimizzato in parallelo (usa anche il timer), ma ci sono risorse libere. Il grafico con questo Expert Advisor è "pulito", niente è attaccato ad esso.

Ho fermato l'ottimizzazione in 5 e funziona. Non dovrebbe esserci una connessione?

 
Ecco la mia domanda su Unicode. Perché è stato cancellato?
 
secret:
La mia domanda su Unicode era qui. Perché è stato cancellato?

Lasciate che vi dia un po' di background:

Un po' meno espressione nelle domande e non verranno cancellate. È semplice: fare una domanda non significa scaricare la propria negatività sugli altri. Sei in una comunità.
Rispettate il luogo dove fate le vostre domande e vi aspettate di ottenere una risposta, non la reazione di un moderatore.