El lienzo es genial. - página 82

 
Vitaliy Kuznetsov #:

Resulta que el método de mejora habitual del código del indicador no puede resolver globalmente el conflicto con los EA en código cerrado que utilizan objetos.

Espero que la mejora del Asesor Experto resuelva globalmente el conflicto con todos los indicadores del tablero (que es mi tarea).

Escribí en el hilo de MT4 build 1353, quizás los programadores del terminal presten atención.

P.D. Hice cambios en los búhos y algo los esquís no iban ...

Mira a través de todo el código (indicador y Asesor Experto) para averiguar dónde y por qué ObjectGetXXX, ObjectFind, ObjectsTotal, ObjectName, etc se llaman - son síncronos y pueden ralentizar seriamente todo. Trate de deshacerse de ellos si es posible.

No olvide llamar a ChartRedraw()!!!! arriba...

 

Señores moderadores, ¿se me atribuyen todo tipo de tonterías y no se me permite responder? ¡Increíble!

 
Maxim Kuznetsov #:

Revise todo el código (indicador y EA) para averiguar dónde y por qué se llama a ObjectGetXXX, ObjectFind, ObjectsTotal, ObjectName, etc. - son síncronos y pueden ralentizar seriamente todo. Trate de deshacerse de ellos si es posible.

No olvide llamar a ChartRedraw()!!!! arriba...

Sólo necesitas hacer OnChartEvent() sabiamente y no reaccionar a todos los eventos seguidos. O no se que hay ahí... ¿Y por qué sentarse aquí y pensar por el tipo que ni siquiera condescender a mostrar el código con el problema?

Ahora he insertado un bucle de 1000000 repeticiones de ObjectFind() y ObjectGet() - todo es normal.

 
Dmitry Fedoseev #:

Señores moderadores, ¿se me atribuyen todo tipo de tonterías y no se me permite responder? ¡Increíble!

No eres el único que ha sido objeto de tal selectividad.

 
Dmitry Fedoseev #:

Sólo tienes que hacer OnChartEvent() sabiamente, y no reaccionar a todos los eventos en una fila. O no sé lo que es.... ¿Y por qué sentarse aquí y pensar por el tipo que ni siquiera se molestan en mostrar el código con el problema?

Ahora he insertado un bucle de 1000000 repeticiones de ObjectFind() y ObjectGet() - todo es normal.

Bueno, voy a escribir por cuarta vez, no es difícil para mí.

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


Si abres el enlace, encontrarás un adjunto con el código al final del post. Luego puedes leer los posts, por quién y cómo se desarrolló la discusión allí.

El problema no está específicamente en el código propuesto (tú mismo puedes escribir cualquier Asesor Experto con un objeto), sino en un error global que afecta a todos los Asesores Expertos con objetos (con una única excepción) cuando se trabaja con la función de cambio de gráfico a través de un indicador.

Nikolay ofreció su solución, pero tengo errores con el trabajo de dicho código, estoy tratando el problema más a fondo.

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

Sólo tienes que hacer OnChartEvent() sabiamente, y no reaccionar a todos los eventos en una fila. O no sé lo que es.... ¿Y por qué sentarse aquí y pensar por el tipo que ni siquiera se molestan en mostrar el código con el problema?

Ahora he insertado un bucle de 1000000 repeticiones de ObjectFind() y ObjectGet() - todo es normal.

Tengo una vaga duda: ¿has escrito alguna vez algo más complicado que un bucle?

 
Vitaliy Kuznetsov #:

Bueno, escribiré por cuarta vez, no es problema para mí.

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


Si abres el enlace, encontrarás un archivo adjunto con el código al final del post. Luego puedes leer los posts, por quién y cómo se desarrolló la discusión allí.

El problema no está específicamente en el código propuesto (tú mismo puedes escribir cualquier Asesor Experto con un objeto), sino en un error global que afecta a todos los Asesores Expertos con objetos (con una única excepción) cuando se trabaja con la función de cambio de gráfico a través de un indicador.

Nikolay ofreció su solución, pero tengo errores con el trabajo de dicho código, estoy tratando el problema más a fondo.

Aquí están los cambios:

   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;
      
   }

Me las arreglé para deshacerse de terribles cuelga. Y si usted presiona los botones a un ritmo medido, todo está bien.

Pero si empiezas a golpear como un pájaro carpintero, vuelves a tener cuelgues, sólo que son diferentes y más cortos. No creo

que no puedas deshacerte de ellos. Tal vez esté relacionado con la construcción del marco temporal.

Tengo que trabajar en los botones para que haya posiciones pulsado/no pulsado e introducir inercia para que el botón no se pulse inmediatamente.

Un retardo de 0,1 segundos arreglaría la situación y el usuario no lo notaría.

--

En realidad, sin un experto puedes machacar los botones a un ritmo endiablado....

 

Y aquí estamos, me he librado completamente de los cuelgues.

Puede estar torcido, pero el punto es lo principal:

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

La cuestión es no borrar un objeto al cambiar de gráfico.

Habría que ver qué pasa ahí cuando Destroy()... si es posible dejarlo así...

 

Hola a todos !)

Pido disculpas, pero si estamos hablando de mq4, entonces tal vez se puede resolver así :?)

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);}
}
 

Eso es lo que más puede crear frenos:

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

¿Por qué?

Razón de la queja: