Canvas - это круто! - страница 100

 
Alexey Volchanskiy #:

Если один и тот же, то да, как-то не подумал )) Но предвижу массу проблем с пользователями, у большинства уровень ниже плинтуса.

Ну, не знаю). Ко мне не раз обращались люди с вопросом как использовать мои панели в тестере. Для многих этот вопрос актуален. И если бы я не оставил МТ4, мог бы запросто им помочь. Что касается МТ5, предполагаю что такая схема не будет работать. Но не проверял. 

В общем, спрос на панели торгующие в тестере есть. И странно что при таком уровне программисткой МОЩИ форумчан, никто не занял пустую нишу.))
 
Maxim Kuznetsov #:

и без внешней доп.DLL, исключительно API cairographics.org

рисует :-) РАБОТАЕТ !!


ну и финальный тест конечно-же SVG :-)

//+------------------------------------------------------------------+
//|                                                        Test2.mq5 |
//|                                         Maxim Kuznetsov (c) 2024 |
//|                                       https://luxtrade.unaux.com |
//+------------------------------------------------------------------+
#property copyright "Maxim Kuznetsov (c) 2024"
#property link      "https://luxtrade.unaux.com"
#property version   "1.00"

#include <WinApi/LibLoaderApi.mqh>

// api cairographics.org
// как наполнится можно в отдельный mqh :-)
#define cairo_surface_ptr ulong
#define cairo_ptr ulong
#define cairo_format_t int
#define CAIRO_FORMAT_ARGB32 0

#import "libcairo-2.dll"
// surface
cairo_surface_ptr cairo_image_surface_create_for_data(uint &data[], cairo_format_t format,int width,int height,int stride);
void cairo_surface_flush(cairo_surface_ptr);
void cairo_surface_destroy(cairo_surface_ptr);
// cairo
cairo_ptr cairo_create(cairo_surface_ptr);
void cairo_destroy(cairo_ptr);
void cairo_stroke(cairo_ptr);
//paths
void cairo_new_path(cairo_ptr);
void cairo_move_to(cairo_ptr,double x,double y);
void cairo_rel_move_to(cairo_ptr,double dx,double dy);
void cairo_line_to(cairo_ptr,double x,double y);
void cairo_rel_line_to(cairo_ptr,double dx,double dy);
void cairo_rectangle(cairo_ptr,double x,double y,double width,double height);
void cairo_set_source_rgba(cairo_ptr,double red,double green,double blue,double alpha);
void cairo_fill(cairo_ptr);
#import

struct RsvgRectangle {
  double x;
  double y;
  double width;
  double height;
};
#define RsvgHandle_ptr ulong

#import "librsvg-2-2.dll"
RsvgHandle_ptr rsvg_handle_new_from_data(uchar &utf8[],ulong bytes,ulong shouldBeZero);
RsvgHandle_ptr rsvg_handle_new_from_file(uchar &nameUtf[],ulong shouldBeZero);
int rsvg_handle_render_document(RsvgHandle_ptr,cairo_ptr,RsvgRectangle &viewport,ulong shouldBeZero);
void rsvg_handle_set_dpi_x_y (RsvgHandle_ptr,double dpi_x,double dpi_y);
void rsvg_handle_set_dpi(RsvgHandle_ptr,double dpi);
#import

#import "libgobject-2.0-0.dll"
int g_object_unref(ulong);
#import

#import "libgthread-2.0-0.dll"
void g_thread_init(ulong shouldBeZero=0);
#import

string prefix="test2";

void Test2 (int width=800,int height=600) 
{
   string fileName=TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL5\\Files\\Ghostscript_Tiger.svg";
   PrintFormat("svg from %s",fileName);
   uint data[];
   string obj=prefix+".test1";
   string rc_name=prefix+".test1";
   // create image   
   ArrayResize(data,width*height);
   ArrayInitialize(data,0x10101010);
   // call cairo
   cairo_surface_ptr surface=cairo_image_surface_create_for_data(data,CAIRO_FORMAT_ARGB32,width,height,width*sizeof(uint));
   if (surface==0) {
      Print("cairo_image_surface_create_for_data() failed");
      return;
   }
   cairo_ptr cr=cairo_create(surface);
   if (cr==0) {
      Print("cairo_create() failed");
      cairo_surface_destroy(surface);
      return;
   }
   uchar fileNameUtf[];
   int bytes=StringToCharArray(fileName,fileNameUtf,0,WHOLE_ARRAY,CP_UTF8);
   RsvgHandle_ptr rsvg=rsvg_handle_new_from_file(fileNameUtf,0);
   if (rsvg!=0) {
      RsvgRectangle viewport={0.0, 0.0, width, height};
      rsvg_handle_render_document(rsvg,cr,viewport,0);
      g_object_unref(rsvg);
   } else {
      cairo_set_source_rgba(cr,0.8,0.8,0,0.1);
      cairo_move_to(cr,0,0);
      cairo_rectangle(cr,0,0,width-1,height-1);
      cairo_fill(cr);
      
      cairo_set_source_rgba(cr,0,0,0.9,0.5);
      cairo_rectangle(cr,0,0,width-1,height-1);
      cairo_stroke(cr);
   }
   cairo_surface_flush(surface);      
   // create(update) resource from data
   if (!ResourceCreate(rc_name,data,(uint)width,(uint)height,0,0,(uint)width,COLOR_FORMAT_ARGB_RAW)) {
      Print("ResourceCreate failed");
      return;
   }
   cairo_destroy(cr);
   cairo_surface_destroy(surface);
   // create object with resource
   if (!ObjectCreate(0,obj,OBJ_BITMAP_LABEL,0,0,0)) {
      Print("ObjectCreate failed (exists?)");
   }
   ObjectSetInteger(0,obj,OBJPROP_HIDDEN,false);
   ObjectSetInteger(0,obj,OBJPROP_XSIZE,width);
   ObjectSetInteger(0,obj,OBJPROP_YSIZE,height);
   ObjectSetInteger(0,obj,OBJPROP_XDISTANCE,100);
   ObjectSetInteger(0,obj,OBJPROP_YDISTANCE,100);
   ObjectSetString(0,obj,OBJPROP_BMPFILE,"::"+rc_name);
   ChartRedraw();
}   
bool Module(string dllname) 
{
   if (!GlobalVariableCheck(dllname)) {
      GlobalVariableSet(dllname,1.0);
      GlobalVariableTemp(dllname);
      if (LoadLibraryW(dllname)==0) {
         GlobalVariableDel(dllname);
         Alert(StringFormat("Module %s not loaded - pls. restart terminal for omit bugs",dllname));
         return false;
      }
   }
   return true;
}
int OnInit()
{
   EventSetTimer(60);
   // load and fixate cairo in app
   if (!Module("libcairo-2.dll")) return INIT_FAILED;
   if (!Module("librsvg-2-2.dll")) return INIT_FAILED;
   if (!Module("libgobject-2.0-0.dll")) return INIT_FAILED;
   if (!Module("libgthread-2.0-0.dll")) return INIT_FAILED;
   g_thread_init(0);
   // invoke test
   Test2();
   ChartRedraw();
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
   ObjectsDeleteAll(0,prefix+".");
   EventKillTimer();
}
void OnTick()
{
}
void OnTimer()
{
}
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
}

 
Реter Konow #:
Ну, не знаю). Ко мне не раз обращались люди с вопросом как использовать мои панели в тестере. Для многих этот вопрос актуален. И если бы я не оставил МТ4, мог бы запросто им помочь. Что касается МТ5, предполагаю что такая схема не будет работать. Но не проверял. 

В общем, спрос на панели торгующие в тестере есть. И странно что при таком уровне программисткой МОЩИ форумчан, никто не занял пустую нишу.))
Есть такие панели и бесплатно даром никому не нужны.Если бы их купляли я давно бы уже сделал.Любая функция работает в тестер,а если внедрить Dll даже координаты можно заставить считывать.В маркете 3 топа уже 10 лет висят , переплюнуть их думаю невозможно,какие бы фичи в вашей панели не были . Ребята на Чили по 20к в месяц делают пока бедные скамеры все свои Нейронки перезаписывают каждый месяц 
 
Maxim Kuznetsov #:

ну и финальный тест конечно-же SVG :-)

Класс!
Спасибо Максим!
 
Nikolai Semko #:
Класс!
Спасибо Максим!

Всегда пожалуйста ;-)

Если кто захочет повторить (первые тесты, не факт что легко воспроизводимы):

у меня установлен msys2 https://www.msys2.org/ и длл-ки брались из него, из его пакетов. 

чтобы библиотеки находились системой, пути добавлены в %PATH% 

деплой без msys2, в виде самостоятельного-автономного приложения советника/индикатора это отдельная песня и боль :-) Куда, как и какие DLL раскладывать чтобы MT всё правильно и в любом случае находил - можно роман писать

MSYS2
MSYS2
  • www.msys2.org
MSYS2 is a collection of tools and libraries providing you with an easy-to-use environment for building, installing and running native Windows software. It consists of a command line terminal called mintty, bash, version control systems like git and subversion, tools like tar and awk and even build systems like autotools, all based on a...
 
Maxim Kuznetsov #:

ну и финальный тест конечно-же SVG :-)

прикол. Я тоже использовал эту SVG, когда баловался в написании библиотек SVG на JS несколько лет назад

https://nikolaisemko.github.io/DWLibDemo/

 
Nikolai Semko #:

прикол. Я тоже использовал эту SVG, когда баловался в написании библиотек SVG на JS
https://nikolaisemko.github.io/DWLibDemo/

это классическое тестовое векторное изображение..изначально постскрипт насколько знаю

 
Реter Konow #:
Ну, не знаю). Ко мне не раз обращались люди с вопросом как использовать мои панели в тестере. Для многих этот вопрос актуален. И если бы я не оставил МТ4, мог бы запросто им помочь. Что касается МТ5, предполагаю что такая схема не будет работать. Но не проверял. 

В общем, спрос на панели торгующие в тестере есть. И странно что при таком уровне программисткой МОЩИ форумчан, никто не занял пустую нишу.))

Я посмотрел панели в маркете, это на 99% варианты бай-селл + СЛ+ТП. Я хочу свои методы DSP из скальпера вставить.

 
Alexey Volchanskiy #:

DLL я писать умею с детского садика, чем они могут помочь, не понял. Ставлю вопрос по другому: как сделать GUI с кнопками и полями ввод без использования ChartEvent? чтобы это работало в тестере?

Я собираюсь сделать панель для Маркета, так что нужен стандартный тестер. Или придется делать демо-версию для проверки панели на демо-счете.
Я делал циферблат с кнопками для ввода значений в тестере.Пишем значения в строку,а её уже отправляем в поля и переменные.А Вот  как заставить там считывать координаты это уже Аля проблем.Ненавижу стандартные графические объекты я сторонник канвас и математики координат но для тестера придется первое использовать 
Файлы:
 
Dz Mak #:
Я делал циферблат с кнопками для ввода значений в тестере.Пишем значения в строку,а её уже отправляем в поля и переменные.А Вот  как заставить там считывать координаты это уже Аля проблем.Ненавижу стандартные графические объекты я сторонник канвас и математики координат но для тестера придется первое использовать 
Для тестера работает и канвас. Писал об этом много раз. Просто частоту его вывода нужно контролировать по реальному времени. Только в тестере в советниках не работают события, поэтому управление в панелях управления невозможно. Но возможно с горем пополам в индикаторах