Bibliotecas: Easy Canvas - página 9

 
A biblioteca funcionará no Strategy Tester? Quero tentar fazer testes manuais no Strategy Tester.
 
jaffer wilson:
A biblioteca funcionará no Strategy Tester? Quero experimentar o teste manual no Strategy Tester.
Sim, funcionará. Mas você precisa tomar cuidado com algumas coisas, porque os eventos no testador não funcionam corretamente e para não sobrecarregar o testador com cálculos de tela devido à maior densidade de tempo.
Darei um exemplo um pouco mais tarde.
Mas, por enquanto, você pode dar uma olhada aqui.
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:
A biblioteca funcionará no Strategy Tester? Quero tentar fazer testes manuais no Strategy Tester.
#property indicator_chart_window
#include <Canvas\iCanvas.mqh> //https://www.mql5.com/pt/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 de evento
                  const long& lparam,   // parâmetro de evento de tipo longo
                  const double& dparam, // parâmetro de evento do tipo double
                  const string& sparam) { // parâmetro de evento do tipo string
   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();        // atualizar os parâmetros do gráfico se estiver no modo testador
   if (pr<Ask) clr=0x800000FF;               // vermelho
   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;
}
//+------------------------------------------------------------------+

O que está destacado em amarelo é o necessário para reduzir a carga no testador
O que está destacado em verde é o necessário para renderizar as coordenadas corretamente. Tente remover essa linha e veja o que acontece no testador.

Nesse indicador, a cor da tela muda dependendo da direção da mudança de preço, o preço mínimo e máximo na tela é destacado e as informações de texto sobre Bid e Ask na posição atual do ponteiro do mouse são exibidas.


Mas, infelizmente, no Tester, o evento de movimento do mouse é executado somente quando o botão esquerdo do mouse é pressionado.
Isso se aplica não somente à minha classe iCanvas, mas também a qualquer saída gráfica no Tester.
Só que eu tenho uma maneira mais simples de implementá-lo.
E até mesmo o controle GUI funciona muito bem:


 
Muito obrigado pela resposta e pelo exemplo.
 
jaffer wilson:
Muito obrigado pela resposta e pelo exemplo.
Sem problemas
 

Olá,

trabalho muito bom. Muito obrigado.

Você pode verificar a amostra do CanvasBar? Ele não funcionará no testador, mesmo com as modificações sugeridas.


Atenciosamente, Mighty

 
Mighty7:

Olá,

trabalho muito bom. Muito obrigado.

Você pode verificar a amostra do CanvasBar? Ele não funcionará no testador, mesmo com as modificações sugeridas.

Atenciosamente, Mighty

Tente mover ChartChanged antes de CopyRates

 
Obrigado pela resposta rápida, mas ainda não está funcionando.
 
Mighty7:
Obrigado pela resposta rápida, mas ainda não está funcionando.

Isso ocorre porque a chamada vem de OnChartEvent, que não está funcionando corretamente no testador.

Tente o seguinte.

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);
  }
No futuro, anexe um código ou link. Afinal de contas, não me lembro do nome do meu código, que escrevi há quase dois anos.
Arquivos anexados:
CanvasBar.mq5  7 kb
 

"No futuro, anexe um código ou link. Afinal de contas, não me lembro do nome do meu código, que escrevi há quase dois anos."

Ok, vou fazer isso. Agora está funcionando (tive que remover as linhas GetTickCount para sincronizar). Muito obrigado.