Спасибо! Этот вариант вполне реалистично выглядит!
Спасибо за Ваш вопрос, потому что, отвечая на него, я понял одну очень важную вещь, о которой не знал. Удивлюсь, если об этом вообще кто-то знал.
Если делать ресайз канваса или его положение с помощью ObjectSetInteger, то не требуется его перерисовка.
Даже если мы уменьшили размер сформированного канваса, а потом вернули этот размер, то данные канваса сохраняются первоначальной прорисовки.
Если увеличили размер сформированного канваса, то данные проподают, но появляются вновь когда возвращаем первоначальный размер.
При ресайзе или изменения положения канваса даже вовсе не обязательно делать Update() или ChartRedraw(), он обновиться с приходом нового тика или изменения окна.
Этот индикатор демонтрирует это. Канвас формируется только один раз. Но при этом его размер и местоположение можно менять, а массив значений при этом сохраняется. Просто двигайте мышкой по экрану
#property indicator_chart_window#define protectedpublic// увы, это необходимо, чтобы расширить наши возможности #include <Canvas\Canvas.mqh>
#undef protected
CCanvas C;
intOnInit()
{
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);
}
//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
C.Destroy();
}
//+------------------------------------------------------------------+intOnCalculate (constint rates_total,
constint prev_calculated,
constint begin,
constdouble& price[])
{
return prev_calculated;
}
voidOnChartEvent(constint id,
constlong& lparam,
constdouble& dparam,
conststring& sparam)
{
if (id==CHARTEVENT_MOUSE_MOVE) DrawCanvas((int)lparam,(int)dparam);
}
//+------------------------------------------------------------------+void DrawCanvas(int x, int y)
{
staticbool 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(); // можно обойтись и без этого, но тогда перерисовка будет только с каждым тиком или изменением чарта
}
При ресайзе или изменения положения канваса даже вовсе не обязательно делать Update() или ChartRedraw(), он обновиться с приходом нового тика или изменения окна.
Существует масса вариантов в зависимости от того, какое видео нужно снимать. Просто что происходит в окне в реальном времени в окне с указателем мыши, индикаторами, объектами, ГУИ ? Или что-то другое?
это понятно, просто не стал углубляться. Акцентировал на этом внимание, потому что для перерисовки объекта канваса при ChartRedraw() перерисовки не происходит, а происходит только при Update(). А в случае применения ObjectSetInteger для перерисовки объекта канваса достаточно принудительного ChartRedraw() или дождаться изменения чатра или прихода нового тика, при которых происходит ChartRedraw().
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Спасибо! Этот вариант вполне реалистично выглядит!
Спасибо за Ваш вопрос, потому что, отвечая на него, я понял одну очень важную вещь, о которой не знал.
Удивлюсь, если об этом вообще кто-то знал.
Если делать ресайз канваса или его положение с помощью ObjectSetInteger, то не требуется его перерисовка.
Этот индикатор демонтрирует это. Канвас формируется только один раз. Но при этом его размер и местоположение можно менять, а массив значений при этом сохраняется. Просто двигайте мышкой по экрану
а в видео можно сохранять?
можно
круто! надеюсь не созданием миллиона изображений с последующей сборкой в видео в каком нибудь видеоредакторе?))
если не затруднит, пожалуйста подробнее
круто! надеюсь не созданием миллиона изображений с последующей сборкой в видео в каком нибудь видеоредакторе?))
если не затруднит, пожалуйста подробнее
нет, конечно, не так.
Затруднит.
нет, конечно, не так.
Затруднит.
код не нужен, намекните как это сделать
Ну так по этим событиям терминал сам и вызывает ChartRedraw() ;)
код не нужен, намекните как это сделать
Существует масса вариантов в зависимости от того, какое видео нужно снимать. Просто что происходит в окне в реальном времени в окне с указателем мыши, индикаторами, объектами, ГУИ ? Или что-то другое?
Ну так по этим событиям терминал сам и вызывает ChartRedraw() ;)
это понятно, просто не стал углубляться.
Акцентировал на этом внимание, потому что для перерисовки объекта канваса при ChartRedraw() перерисовки не происходит, а происходит только при Update(). А в случае применения ObjectSetInteger для перерисовки объекта канваса достаточно принудительного ChartRedraw() или дождаться изменения чатра или прихода нового тика, при которых происходит ChartRedraw().