Errores, fallos, preguntas - página 2796

 
Mihail Matkovskij:

¿No tienes nada más que hacer en este foro, Alexey, que tergiversar mis mensajes para que parezcan reclamaciones a los desarrolladores en mi nombre...? Me pregunto cuál es el motivo de ese extraño "entusiasmo" por su parte. ¡Prefieres ayudar a los novatos con sus preguntas en los hilos correspondientes, que hacer tonterías aquí...!

Pero aun así, has escrito claramente "bicho". Esto indica un fallo en la plataforma, no que no hayas leído la documentación hasta su conclusión lógica.

 
Artyom Trishkin:

Pero aun así, has escrito claramente "bicho". Esto indica un fallo en la plataforma, no que no hayas leído la documentación hasta su conclusión lógica.

Bueno, sí, lo hice. Leí la nota en la descripción de la función ObjectDelete, pero no pensé que fuera el problema... ¿Quién no lo hace?...

Pero todo está dando vueltas en círculos. Para ser más exactos, está dando vueltas a que lo escribí mal o me confundí... Pero, por alguna razón, nadie dijo una palabra sobre cómo resolver este error... Por supuesto, a excepción de la función ObjectsDeleteAll sugerida, para la que tendría que rehacer todo el proyecto, que es lo que menos quiero.

 
Mihail Matkovskij:

Sí, me confundí. Leí la nota en la descripción de la función ObjectDelete, pero no pensé que fuera el problema... ¿Quién no lo hace?

Sucede que...

 

Mihail Matkovskij:

... Por alguna razón, nadie ha dicho una palabra sobre cómo resolver este error... Por supuesto, salvo la función ObjectsDeleteAll sugerida, para la que tendría que rehacer todo el proyecto, que es lo que menos quiero.

Intente utilizar un prefijo para los nombres de los objetos gráficos: es una práctica normal para identificar sus objetos. Utiliza el prefijo para comprobar si hay basura y eliminarla al mismo tiempo.

¿Añadir el prefijo a los nombres de los objetos requerirá rehacer todo el proyecto?

¿Escribe en estilo procesal? Bueno, tampoco es tan difícil cambiar las funciones de creación de nombres de objetos allí.

 
Artyom Trishkin:

Intente utilizar un prefijo para los nombres de los objetos gráficos: es una práctica normal para identificar sus objetos. Utiliza el prefijo para comprobar si hay basura y eliminarla al mismo tiempo.

¿Añadir un prefijo a los nombres de los objetos requerirá rehacer todo el proyecto?

Ok, si no hay otras opciones, lo intentaré.

Artyom Trishkin:

¿Escribe en estilo procesal? No es tan difícil cambiar la función que crea los nombres de los objetos.

¿Una tarea de Sísifo? :)


Gracias a Rashid Umarov por su ayuda para encontrar la causa de mi error en el indicador.
 
Mihail Matkovskij:

¿No tienes nada más que hacer en este foro, Alexey, que tergiversar mis mensajes para que parezcan reclamaciones a los desarrolladores en mi nombre...? Me pregunto qué ha provocado ese extraño "entusiasmo" por su parte. ¡Prefieres ayudar a los novatos con sus preguntas en los hilos correspondientes que hacer tonterías aquí...!

Eso es lo que estoy tratando de ayudarte. Intento ayudarte y explicarte en qué te equivocas. Pruebe otra opción para borrar los objetos gráficos y todo irá bien. Y todos los fallos de los que hablabas desaparecerán. No hace falta que retuerzas tus palabras y te citaré.

 
Alexey Viktorov:

Eso es lo que estoy tratando de ayudarte. Te estoy explicando en qué te equivocas. Prueba otra opción para eliminar los objetos gráficos y todo estará bien. Y todos los fallos de los que hablabas desaparecerán. No hace falta tergiversar tus palabras, tú lo has dicho, yo lo he citado.

Intento ayudarte y al mismo tiempo acusar sin fundamento, no olvides añadir. Te pregunté qué era lo que provocaba ese entusiasmo maníaco, pero por alguna razón no me respondiste. ¿Por qué evades la respuesta, Alexey?

 
Mihail Matkovskij:

Trato de ayudarte y al mismo tiempo te acuso sin reparos, no te olvides de añadir. Te pregunté qué provocaba ese entusiasmo maníaco, pero por alguna razón no me respondiste. ¿Por qué evades la respuesta, Alexey?

Deberías haberte callado hace mucho tiempo y no habría continuado.

Este es mi sincero intento de ayudar sin ningún tipo de acusación.

Este es el foro para el comercio, los sistemas automatizados de comercio y la prueba de las estrategias de comercio

Errores, fallos, preguntas

Alexey Viktorov, 2020.07.11 17:12

¿Cómo puede ser que el bucle dure más que el tiempo necesario para ejecutar OnDeinit?

Después de todo, todos los objetos de tu ejemplo tienen el prefijo "tendencia", ¿por qué no utilizarlo y rechazar el bucle?

int  ObjectsDeleteAll(
   long           chart_id,   // идентификатор графика
   const string     prefix,   // префикс имени объекта
   int       sub_window=-1,   // индекс окна
   int      object_type=-1    // тип объекта для удаления
   );

¿Cuál es la respuesta? Lee tus respuestas.
 
Alexey Viktorov:

Te habrías callado hace mucho tiempo y yo no habría continuado.

А... ¡Ahí está la razón de las acusaciones contra mí! Ya veo... :)

Alexey Viktorov:
¿Cuál es su respuesta? Lee tus respuestas.

Todo está ahí. Lo único es que al principio me negué a utilizar esta función. Y debe haberte avergonzado. Bueno, lo siento entonces... :)

 

Sustituyó la función ObjectDeleteAll primero en su ejemplo:

//+------------------------------------------------------------------+
//|                                           DeleteChartObjects.mq5 |
//|                                      Copyright 2020, © Cyberdev. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, © Cyberdev."
#property version   "1.00"
#property indicator_chart_window

#property indicator_plots 0

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

#include <ChartObjects\ChartObjectsLines.mqh>
#include <Arrays\ArrayObj.mqh>

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//--- input parameters
input int      nBars = 100000;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int customN_Bars = 0;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CArrayObj listOfTrendLines;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
//--- indicator buffers mapping
  int totalBars = iBars(NULL, PERIOD_CURRENT);
  customN_Bars = (nBars < totalBars) ? nBars : totalBars;
//---
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]
) {
  CChartObjectTrend * trend;
  int delta = rates_total - customN_Bars;
  int shift;
  int i;
  for(i = 0; i < customN_Bars; i++) {
    shift = delta + customN_Bars - i - 1;
    trend = new CChartObjectTrend();
    if(trend.Create(0, "trend"+(string)i, 0, time[shift], low[shift], time[shift], high[shift]))
      listOfTrendLines.Add(trend);
    else
      delete trend;
  }
  return(rates_total);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
  
  ObjectsDeleteAll(0, "trend", 0, OBJ_TREND);
  
  CChartObjectTrend * trend;
  
  int i = listOfTrendLines.Total() - 1;
  for(; i >= 0; i--) {
    trend = dynamic_cast <CChartObjectTrend *> (listOfTrendLines.At(i));
    
    if(CheckPointer(trend) == POINTER_INVALID)
      continue;
    
    delete trend;
  }
}
//+------------------------------------------------------------------+

Luego en el indicador.

Artyom Trishkin:

¿Añadir un prefijo a los nombres de los objetos requerirá rehacer todo el proyecto?

Resultó que el uso deObjectDeleteAll en mi proyecto era fácil. Para eliminar todos los objetos, sólo tenía que cambiar el prefijo 3 veces y llamar a ObjectDeleteAll 3 veces. El gráfico es claro como resultado. El lenguaje MQL5 tiene muchas sutilezas. Pero al mismo tiempo es un lenguaje muy bien pensado.

Gracias a todos los que me han ayudado a resolver este problema.

Razón de la queja: