La tela è forte! - pagina 82

 
Vitaliy Kuznetsov #:

È emerso che il metodo di miglioramento del codice dell'indicatore abituale non può risolvere globalmente il conflitto con gli EA in codice chiuso che utilizzano gli oggetti.

Spero che il miglioramento dell'Expert Advisor risolva globalmente il conflitto con tutti gli indicatori del cruscotto (che è il mio compito).

Ho scritto nel thread MT4 build 1353, forse i programmatori del terminale presteranno attenzione.

P.S. Ho apportato modifiche ai gufi e qualcosa non è andato...

Guardate tutto il codice (indicatore e Expert Advisor) per scoprire dove e perché vengono chiamati ObjectGetXXX, ObjectFind, ObjectsTotal, ObjectName, etc. - sono sincroni e possono rallentare seriamente tutto. Cercate di eliminarli, se possibile.

Non dimenticate di chiamare ChartRedraw()!!!! sopra...

 

Signori moderatori, mi vengono attribuite un sacco di sciocchezze e non mi è permesso di rispondere? Incredibile!

 
Maxim Kuznetsov #:

Esaminate l'intero codice (indicatore e EA) per scoprire dove e perché vengono richiamati ObjectGetXXX, ObjectFind, ObjectsTotal, ObjectName, ecc. Se possibile, cercate di eliminarli.

Non dimenticate di chiamare ChartRedraw()!!!!...

Basta fare OnChartEvent() in modo saggio e non reagire a tutti gli eventi di fila. Oppure non so cosa ci sia... E perché stare qui a pensare per il ragazzo che non è nemmeno condiscendente a mostrare il codice con il problema?

Ora ho inserito un ciclo di 1000000 ripetizioni di ObjectFind() e ObjectGet() - tutto è normale.

 
Dmitry Fedoseev #:

Signori moderatori, mi vengono attribuite un sacco di sciocchezze e non mi è permesso di rispondere? Incredibile!

Non sei l'unico ad essere stato sottoposto a tale selettività.

 
Dmitry Fedoseev #:

Basta fare OnChartEvent() in modo saggio e non reagire a tutti gli eventi di fila. Oppure non so cosa sia.... E perché stare qui a pensare per il tizio che non si preoccupa nemmeno di mostrare il codice con il problema?

Ora ho inserito un ciclo di 1000000 ripetizioni di ObjectFind() e ObjectGet() - tutto è normale.

Bene, lo scriverò per la quarta volta, non è difficile per me.

https://www.mql5.com/ru/forum/379526/page9#comment_25865481


Se aprite il link, troverete un allegato con il codice in fondo al post. Poi puoi leggere i post, da chi e come si è sviluppata la discussione lì.

Il problema non è specificamente nel codice proposto (puoi scrivere tu stesso qualsiasi Expert Advisor con un oggetto), ma in un errore globale che colpisce tutti gli Expert Advisor con oggetti (con una sola eccezione) quando si lavora con la funzione di commutazione del grafico tramite un indicatore.

Nikolay ha offerto la sua soluzione, ma io ho degli errori nel lavoro di questo codice e mi sto occupando ulteriormente del problema.

Новая версия платформы MetaTrader 4 build 1350 - Если у вас проблемы с дешбордами, то придется удалять объекты чарта.
Новая версия платформы MetaTrader 4 build 1350 - Если у вас проблемы с дешбордами, то придется удалять объекты чарта.
  • 2021.11.10
  • www.mql5.com
точнее в очередностях OnInit удалении своих объектов чарта. Тут ремонт терминала не имеет смысла не создавайте объектов по крайней мере до первого OnChartEvent. И удалять объекты пачкой лучше по ChartObjectsDelete
 
Dmitry Fedoseev #:

Basta fare OnChartEvent() in modo saggio e non reagire a tutti gli eventi di fila. Oppure non so cosa sia.... E perché stare qui a pensare per il tizio che non si preoccupa nemmeno di mostrare il codice con il problema?

Ora ho inserito un ciclo di 1000000 ripetizioni di ObjectFind() e ObjectGet() - tutto è normale.

Ho un vago dubbio: hai mai scritto qualcosa di più complicato di un ciclo?

 
Vitaliy Kuznetsov #:

Beh, scriverò per la quarta volta, non è un problema per me.

https://www.mql5.com/ru/forum/379526/page9#comment_25865481


Se aprite il link, troverete un allegato con il codice in fondo al post. Poi puoi leggere i post, da chi e come si è sviluppata la discussione lì.

Il problema non è specificamente nel codice proposto (puoi scrivere tu stesso qualsiasi Expert Advisor con un oggetto), ma in un errore globale che colpisce tutti gli Expert Advisor con oggetti (con una sola eccezione) quando si lavora con la funzione di commutazione del grafico tramite un indicatore.

Nikolay ha offerto la sua soluzione, ma io ho degli errori nel lavoro di questo codice e mi sto occupando ulteriormente del problema.

Ecco le modifiche:

   if(sparam=="Win_Ea_"){ // вот тут надо поцивильней сделать, из класса брать имя... но уж сами как-нибудь 
      if(id == CHARTEVENT_OBJECT_CLICK){
         if(win.BtnClickUP()){
         
            win.Process();
            
            ChartPeriodSet(true);
            
         }
         if(win.BtnClickDN()){
         
            win.Process();
            
            ChartPeriodSet(false);
            
         }
      }
   }
   if(id == CHARTEVENT_MOUSE_MOVE){
      MouseX=(int)lparam;
      MouseY=(int)dparam;
      
   }

Sono riuscito a eliminare i terribili blocchi. Se si premono i pulsanti con un ritmo misurato, tutto va bene.

Ma se si inizia a battere come un picchio, si verificano di nuovo dei blocchi, solo che sono diversi e più brevi. Non credo che

che non sia possibile liberarsene. Forse è legato alla costruzione dei tempi.

Devo lavorare sui pulsanti in modo che ci siano posizioni premute/non premute e introdurre l'inerzia in modo che il pulsante non venga premuto immediatamente.

Un ritardo di 0,1 secondi risolverebbe la situazione e l'utente non se ne accorgerebbe.

--

In realtà, senza un esperto si possono martellare i pulsanti a un ritmo indiavolato....

 

Ed eccoci qui, mi sono completamente liberato degli appendimenti.

Forse è storto, ma il punto è quello principale:

void windows_class::~windows_class(){
   //Canvas.Destroy();
}
int OnDeinit(const int r){
   if(r==REASON_REMOVE){
      Canvas.Destroy();
   }
}

Il punto è non cancellare un oggetto quando si cambia grafico.

Dovremmo vedere cosa succede quando Destroy()... se è possibile lasciarlo così...

 

Ciao a tutti !)

Mi scuso, ma se stiamo parlando di mq4, allora forse si può risolvere così :?)

void OnChartEvent(const int     id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
{
   if(id == CHARTEVENT_CLICK
   || id == CHARTEVENT_CHART_CHANGE)
   {ChartSetSymbolPeriod(0,NULL,0);}
}
 

Ecco cos'altro può creare freni:

void OnTick(void){
  win.Process();
}

Perché?