A lona é legal! - página 28

 
Evgeny Potapov:

Obrigado! Esta opção parece bastante realista!

Obrigado por sua pergunta, porque ao respondê-la eu percebi uma coisa muito importante que eu não sabia.
Ficaria surpreso se alguém soubesse de tudo isso.

Se você redimensionar uma tela ou sua posição usando ObjectSetInteger, você não precisa redesenhá-la.

  • Mesmo que redimensionemos a kanvas gerada e depois a redimensionamos de volta, os dados da kanvas são retidos pelo desenho original.
  • Se você aumentar o tamanho do Kanvas em forma, os dados desaparecerão, mas reaparecerão quando você os redimensionar de volta ao seu tamanho original.
  • Ao redimensionar ou mudar a posição do Kanvas, nem mesmo é necessário fazer Update() ou ChartRedraw(), ele será atualizado com um novo tick ou mudança de janela.

Este indicador o demonstra. A lona é gerada apenas uma vez. Mas seu tamanho e localização podem ser alterados, e a matriz de valores é mantida. Basta mover o mouse sobre a tela

#property indicator_chart_window

#define protected public  // увы, это необходимо, чтобы расширить наши возможности 
#include <Canvas\Canvas.mqh> 
#undef protected
CCanvas C;
int OnInit()
  {
   if(!C.CreateBitmapLabel(0,0,"_Canvas",100,100,600,400,COLOR_FORMAT_ARGB_NORMALIZE))
      Print("Error creating canvas: ",GetLastError());
   DrawCanvas(600,400);
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   C.Destroy();
  }
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,       
                 const int prev_calculated,   
                 const int begin,             
                 const double& price[])       
  {
    return prev_calculated;               
  }

void OnChartEvent(const int id,          
                  const long& lparam,   
                  const double& dparam, 
                  const string& sparam) 
  {
   if (id==CHARTEVENT_MOUSE_MOVE)  DrawCanvas((int)lparam,(int)dparam);
  }
//+------------------------------------------------------------------+
void DrawCanvas(int x, int y)
{
 static bool first=true;
 //Comment(string(x)+"   " +string(y));
 ObjectSetInteger(C.m_chart_id,C.m_objname,OBJPROP_XDISTANCE,x/5);
 ObjectSetInteger(C.m_chart_id,C.m_objname,OBJPROP_YDISTANCE,y/5);
 ObjectSetInteger(C.m_chart_id,C.m_objname,OBJPROP_XSIZE,x);
 ObjectSetInteger(C.m_chart_id,C.m_objname,OBJPROP_YSIZE,y);  
 if(first) // канвас формируется только один раз
 {
   C.Erase();
   C.FillCircle(100,100,70,ColorToARGB(clrViolet,200));
   C.FillCircle(300,200,100,ColorToARGB(clrLightBlue,100));
   C.Rectangle(140,50,250,150,ColorToARGB(clrAqua));
   C.Update(); 
   first=false;
 }
 ChartRedraw(); // можно обойтись и без этого, но тогда перерисовка будет только с каждым тиком или изменением чарта
}
Arquivos anexados:
 
é possível salvar em vídeo?
 
Andrey Dik:
você pode salvar em um vídeo?
você pode
 
Nikolai Semko:
você pode

legal! espero que não criando um milhão de imagens e depois reunindo-as em um vídeo em algum editor de vídeo...))

se você não se importa, por favor, elabore

 
Andrey Dik:

legal! espero que não criando um milhão de imagens e depois reunindo-as em um vídeo em algum editor de vídeo...))

se você não se importa, por favor, elabore

Não, é claro que não.
Ele o fará.

 
Nikolai Semko:

Não, é claro que não.
É um incômodo.

você não precisa do código, dê-me uma dica de como fazê-lo.

 
Nikolai Semko:
  • Ao redimensionar ou mudar a posição da tela, você não precisa nem mesmo fazer Update() ou ChartRedraw(), ela será atualizada com um novo tick ou mudança de janela.

Bem, o terminal chama ChartRedraw() por si só de acordo com estes eventos;)

 
Andrey Dik:

não é necessário código, dica de como fazer

Há muitas opções, dependendo do tipo de vídeo que você deseja capturar. O que acontece na janela em tempo real com o ponteiro do mouse, indicadores, objetos, GUI ? Ou algo mais?

 
Qual é a real utilidade deste chip? Ajuda a encontrar padrões na tabela de preços que ajudem a comercialização?
 
Andrey Khatimlianskii:

Bem, o próprio terminal chama ChartRedraw() sobre estes eventos;)

Eu entendo, só não queria entrar em detalhes.
Chamei sua atenção para isso porque o chartRedraw() não redesenhou o objeto de tela, ele é redesenhado somente durante oUpdate(). E se você usar ObjectSetInteger para redesenhar o objeto de tela é suficiente forçar ChartRedraw() ou esperar pela mudança de gráfico ou chegada de um novo tick, quando ChartRedraw() ocorrer.