Discusión sobre el artículo "Creación de indicadores personalizados usando la clase CCanvas" - página 2

 
fxsaber:

¡Qué buena noticia! ¿Cuál es la idea? ¿En lugar de un historial de ticks, una serie temporal personalizada?

No. Dibujar un histograma de la tasa de ticks junto al historial de ticks.

Así, jugando con los parámetros, podrás determinar visualmente los periodos de actividad y, tal vez, encontrar algunos patrones.

 
Dennis Kirichenko:

Buen tema. Gracias al autor, va a hacer un indicador de garrapatas en canvas.....

Me di cuenta de esto.

Hay un miembro de datos privado m_canvas_name, pero el método que establece su valor - Name() - es público. Imho, el principio de encapsulación se viola. Voy a hacer este método privado.

¿Tal vez protegido? Porque todos los demás heredan de CCanvasBase. Y entonces será imposible utilizar este método en ellos. Aunque no sé, tal vez usted ha cambiado algo más en la estructura general.

 
Alexander Fedosov:

¿Quizás protegido? Porque todos los demás heredan de CCanvasBase. Y entonces no se puede usar este método en ellos. Aunque no sé, igual has cambiado algo más en la estructura general.


Así que sí, protected.

Entonces aquí:

bool CCanvasBase::DeleteCanvas()
  {
   return(ObjectDelete(0,m_canvas_name)?true:false);
  }
//+------------------------------------------------------------------+
//| Función personalizada de desinicialización del indicador ||
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ind.Delete();
   ChartRedraw();
  }

¿Por qué tan complicado en el indicador? Imho, es necesario limpiar el propio lienzo. Yo añadiría ChartRedraw() al método DeleteCanvas().

 
fxsaber:

Cuando tengas bocetos, por favor envía capturas de pantalla/vídeo. Yo mismo publiqué un indicador de este tipo, pero no llegó a la gente. Aunque no he encontrado uno mejor. Es interesante ver otras soluciones en kanvas.


Estoy haciendo uno para FORTS. La hice en el formato habitual, pero en el Tester funciona fatal cuando se llama desde el cuerpo del EA. Ahora transferiré todo el código al EA...

 
Dennis Kirichenko:

Sí, así es.

Entonces aquí:

¿Por qué tan complicado en el indicador? En mi opinión, es necesario limpiar el propio lienzo. Yo añadiría ChartRedraw() al método DeleteCanvas().

Sí, de esta manera habrá menos líneas innecesarias. Limpiamos el lienzo y enviamos el redibujado allí.

 

Esa no es realmente la forma de hacerlo:

//+------------------------------------------------------------------+
//|| Elimina un recurso gráfico|
//+------------------------------------------------------------------+
bool CCanvasBase::DeleteCanvas()
  {
   return(ObjectDelete(0,m_canvas_name)?true:false);
  }

¿Por qué un operador ternario? - Cuando puedes hacerlo así:

//+------------------------------------------------------------------+
//|| Elimina un recurso gráfico|
//+------------------------------------------------------------------+
bool CCanvasBase::DeleteCanvas()
  {
   return ObjectDelete(0,m_canvas_name);
  }

Yo lo hice así:

//+------------------------------------------------------------------+
//|| Elimina un recurso gráfico|
//+------------------------------------------------------------------+
bool CCanvasBase::DeleteCanvas()
  {
   if(ObjectFind(0,m_canvas_name)>-1)
      if(ObjectDelete(0,m_canvas_name))
        {
         ChartRedraw();
         return true;
        }
   return false;
  }


Pero canvas tiene su propio método de borrado CCanvas::Destroy().

¿Por qué necesitamos añadir algo más?

 

Tengo un problema con el escalado vertical.

Quiero hacer un gráfico de ticks en RTS, donde el máximo en el eje Y sea 97784.0 y el mínimo 97756.0.

Hago esto en el código:

//--- actualizar el gráfico
double min_y=NormalizeDouble(min_pr-0.2*diff,_Digits);
double max_y=NormalizeDouble(max_pr+0.2*diff,_Digits);
ticks_ind.YMin(min_y);
ticks_ind.YMax(max_y);
ticks_ind.SetArrayValue(prices);


Obtengo esto

https://www.mql5.com/ru/charts/7227612/rts-9-17-m1-ao-otkritie-broker

El mínimo se muestra correctamente, pero luego hay algunos zumbidos.

Aparentemente, el método CLineGraph::VerticalScale() no está tan afinado como creo, o peor, como debería.

График RTS-9.17, M1, 2017.06.19 15:22 UTC, АО ''Открытие Брокер'', MetaTrader 5, Real
График RTS-9.17, M1, 2017.06.19 15:22 UTC, АО ''Открытие Брокер'', MetaTrader 5, Real
  • www.mql5.com
Символ: RTS-9.17. Период графика: M1. Брокер: АО ''Открытие Брокер''. Торговая платформа: MetaTrader 5. Режим торговли: Real. Дата: 2017.06.19 15:22 UTC.
 
Документация по MQL5: Стандартная библиотека / Научные графики / CGraphic
Документация по MQL5: Стандартная библиотека / Научные графики / CGraphic
  • www.mql5.com
Стандартная библиотека / Научные графики / CGraphic - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Anatoly, gracias por el consejo, lo usaré. Es una pena que la idea resulte ser código poco amigable...