Librerías: Easy Canvas - página 9

 
¿Funcionará la biblioteca en el Probador de Estrategias? Quiero probar la prueba manual en el Probador de Estrategias.
 
jaffer wilson:
¿Funcionará la biblioteca en el Probador de Estrategias? Quiero probar la prueba manual en el Probador de Estrategias.
Sí, funcionará. Pero hay que tener cuidado con un par de cosas, porque los eventos en el probador no funcionan correctamente y no sobrecargar el probador con cálculos de lienzo debido a la mayor densidad de tiempo.
Voy a dar un ejemplo un poco más tarde.
Pero por ahora puedes echar un vistazo aquí.
https://www.mql5.com/en/forum/229521/page4#comment_15005864
Possibilities of Canvas.
Possibilities of Canvas.
  • 2020.01.18
  • www.mql5.com
Demonstration of the possibilities of Сanvas in dynamics. The picture never repeats. This script also works on MQL4, but much slower...
 
jaffer wilson:
¿Funcionará la biblioteca en el Probador de Estrategias? Quiero probar manualmente en el Probador de Estrategias.
#property indicator_chart_window
#include <Canvas\iCanvas.mqh> //https://www.mql5.com/es/code/22164
//+------------------------------------------------------------------+
int max=0,min=0;
double Max=0,Min=0;
int OnInit() {
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
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[]) {
   max= ArrayMaximum(high,rates_total-W.Left_bar,W.BarsInWind);
   min= ArrayMinimum(low,rates_total-W.Left_bar,W.BarsInWind);
   Max=high[max];
   Min=low[min];
   max=rates_total-1-max;
   min=rates_total-1-min;
   if (rates_total>0) Draw();
   return(rates_total);
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // identificador del evento
                  const long& lparam,   // parámetro de evento de tipo long
                  const double& dparam, // parámetro de evento de tipo doble
                  const string& sparam) { // parámetro de evento de tipo cadena
   if (id==CHARTEVENT_MOUSE_MOVE) Draw(); 
}
//+------------------------------------------------------------------+
void Draw () {
   static double pr=0;
   static uint clr=0;
   static uint lastCalc=0;
   uint cur=GetTickCount();
   if (cur-lastCalc<30) return;
   lastCalc=cur; 
   double Ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double Bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   if (Canvas.tester) ChartChanged();        // actualizar los parámetros del gráfico si está en modo tester
   if (pr<Ask) clr=0x800000FF;               // rojo
   if (pr>Ask) clr=0x80FF0000;               // azul
   Canvas.Erase(clr);
   Canvas.FillCircle((int)Canvas.X(double(max)),(int)Canvas.Y(Max),20,0xAA50FF50);
   Canvas.FillCircle((int)Canvas.X(double(min)),(int)Canvas.Y(Min),20,0xAAFFFF50);
   Canvas.CurentFont("Tahoma",50,50,0xFF80FF80,0.4);
   Canvas.TextPosition(W.MouseX,W.MouseY);
   Canvas.Comm("Ask = " + DoubleToString(Ask,_Digits));
   Canvas.Comm("Bid = " + DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits));
   Canvas.Comm("Spread = " + DoubleToString((Ask-Bid)/_Point,0));
   Canvas.Update();
   pr=Ask;
}
//+------------------------------------------------------------------+

Lo que está resaltado en amarillo es lo necesario para reducir la carga en el probador
Lo que está resaltado en verde es lo necesario para renderizar las coordenadas correctamente. Trate de eliminar esta línea y ver qué pasa en el probador.

En este indicador el color de la pantalla cambia dependiendo de la dirección del cambio de precio, el precio mínimo y máximo en la pantalla se resalta y se muestra información de texto sobre la Oferta y la Demanda en la posición actual del puntero del ratón.


Pero, desafortunadamente, en el Probador el evento de movimiento del ratón se ejecuta sólo cuando se presiona el botón izquierdo del ratón.
Esto se aplica no sólo a mi clase iCanvas, sino también a cualquier salida gráfica en el Probador.
Sólo que tengo una manera más simple de implementarlo.
E incluso el control GUI funciona bastante bien:


 
Muchas gracias por la respuesta y el ejemplo.
 
jaffer wilson:
Muchas gracias por la respuesta y el ejemplo.
De nada
 

Hola,

muy buen trabajo. Gracias.

¿Puedes comprobar el ejemplo de CanvasBar? No funciona en tester incluso con las modificaciones sugeridas.


Saludos, Mighty

 
Mighty7:

Hola,

muy buen trabajo. Muchas gracias.

¿Puedes comprobar el ejemplo de CanvasBar? No funciona en tester incluso con las modificaciones sugeridas.

Saludos, Mighty

Intenta mover ChartChanged antes de CopyRates

 
Gracias por la rápida respuesta, pero sigue sin funcionar.
 
Mighty7:
Gracias por la rápida respuesta, pero sigue sin funcionar.

Esto se debe a que la llamada proviene de OnChartEvent, que no está funcionando correctamente en el probador.

Prueba con esto.

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[])
  {
   if(rates_total==prev_calculated)
     {
      Bar0.close=close[rates_total-1];Bar0.open=open[rates_total-1]; Bar0.high=high[rates_total-1];Bar0.low=low[rates_total-1];
      ShowBars(false);
     }
   else if (Canvas.tester) ShowBars();
   return(rates_total);
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   if(id==CHARTEVENT_CHART_CHANGE) ShowBars(true);
  }
En el futuro, por favor, adjunta un código o enlace. Después de todo, no recuerdo el nombre de mi código, que escribí hace casi 2 años.
Archivos adjuntos:
CanvasBar.mq5  7 kb
 

"En el futuro, por favor, adjunta un código o enlace. Después de todo, no recuerdo el nombre de mi código, que escribí hace casi 2 años."

Ok, lo haré. Ahora ya funciona (tuve que quitar las líneas GetTickCount para que se sincronizara). Gracias.