La toile est cool ! - page 44

 
Nikolai Semko:

Ces fonctions sont horriblement mal écrites. C'est un sacré truc. Pas d'anticrénelage normal, pas de mélange de couleurs normal et de traitement de la transparence. Nous devrions juste les froisser et les jeter à la poubelle et en écrire de nouveaux.
J'en ai déjà parlé ici.

Dans tous les cas, vous devez absolument remplacer la fonction standard PixelTransform par celle-ci :

https://www.mql5.com/ru/forum/1111/page2553#comment_13054823

J'ai commencé à écrire ma version double (où tous les paramètres d'entrée int sont doubles), mais je ne l'ai pas terminé et l'ai mis sur l'étagère. Une tâche pas très simple malgré son apparente simplicité. Ce n'est pas un problème de l'écrire avec précision, le problème est d'écrire une très haute qualité, pour que l'algorithme soit rapide. Mon principal problème est le perfectionnisme.

Je vois, ils n'ont pas fini)

Il est peu probable que je sois tenté de réécrire l'ensemble de la toile. Je vais devoir en dessiner deux d'un seul pixel, côte à côte, au lieu d'un seul de deux pixels pour le moment.)

 
Andrey Khatimlianskii:

Je vois, ils ne l'ont pas terminé.)

Il est peu probable que je sois tenté de réécrire l'ensemble de la toile. Je devrai juste en dessiner 2 d'un seul pixel côte à côte au lieu d'un seul de deux pixels).

Vous n'avez pas besoin de réécrire toute la toile. L'essentiel est de faire un format de cercle

Circle(double x, double y, double r1, double r2=0, uint clr)  

et rendre les lignes normales.

Polyline(const double &x[],const double &y[], const uint clr,const double size,const uint style,ENUM_LINE_END end_style)

Cela devrait couvrir 95% de vos besoins

 

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Comment convertir tous les objets en un seul

Nikolai Semko, 2019.10.05 22:39

En effet, Canvas est la solution.

Et Canvas est bien plus facile qu'il n'y paraît à première vue.

Voici un exemple primitif d'un indicateur (MQL5 & MQL4) avec un objet OBJ_BITMAP_LABEL dans lequel il y a plusieurs fenêtres.

#property indicator_chart_window
#include <Canvas\iCanvas.mqh> //https://www.mql5.com/ru/code/22164 - MQL5
                              //https://www.mql5.com/en/code/23840 - MQL4

struct win {
   int               x;
   int               y;
   int               width;
   int               height;
   uint              clr;
};
win wnd[30];
int OnInit() {
   for (int i=0; i<ArraySize(wnd); i++) {
      wnd[i].width=rand()%200+70;
      wnd[i].height=rand()%150+50;
      wnd[i].x=rand()%(W.Width-wnd[i].width);
      wnd[i].y=rand()%(W.Height-wnd[i].height);
      wnd[i].clr=ARGB(255,rand()%150+100,rand()%150+100,rand()%150+100);
   }
   ShowAllWind();
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+

int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) {
   return(rates_total);
}

//+------------------------------------------------------------------+

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam) {
   static bool click = false;
   static int x_mouse=0, y_mouse=0;
   static int focus=-1, xfocus=0, yfocus=0;
   int x=(int)lparam;
   int y=(int)dparam;
   if (sparam!="1" && click) focus=-1;
   if (sparam=="1" && !click) {
      focus=-1;
      for (int i=ArraySize(wnd)-1; i>=0; i--) {
         if (wnd[i].x<x && wnd[i].y<y && wnd[i].x+wnd[i].width>x && wnd[i].y+20>y) {
            focus=i;
            xfocus=x;
            yfocus=y;
            break;
         }
      }
      if (focus>=0) ChartSetInteger(0,CHART_MOUSE_SCROLL,false);
      else ChartSetInteger(0,CHART_MOUSE_SCROLL,true);
   }
   click=(sparam=="1")?true:false;
   if (id==CHARTEVENT_MOUSE_MOVE && focus>=0) {
      wnd[focus].x+=x-xfocus;
      wnd[focus].y+=y-yfocus;
      xfocus=x;
      yfocus=y;
      ShowAllWind();
   }
   if (id==CHARTEVENT_CHART_CHANGE) ShowAllWind();
}

//+------------------------------------------------------------------+

void ShowAllWind() {
   Canvas.Erase();
   for (int i=0; i<ArraySize(wnd); i++) {
      Canvas.FillRectangle(wnd[i].x,wnd[i].y,wnd[i].x+wnd[i].width,wnd[i].y+wnd[i].height,ARGB(255,GETRGBR(wnd[i].clr)*0.5,GETRGBG(wnd[i].clr)*0.5,GETRGBB(wnd[i].clr)*0.5));
      Canvas.FillRectangle(wnd[i].x+3,wnd[i].y+23,wnd[i].x+wnd[i].width-3,wnd[i].y+wnd[i].height-3,wnd[i].clr);
      Canvas.FillRectangle(wnd[i].x+3,wnd[i].y+3,wnd[i].x+wnd[i].width-3,wnd[i].y+20,ARGB(255,GETRGBR(wnd[i].clr)*0.7,GETRGBG(wnd[i].clr)*0.7,GETRGBB(wnd[i].clr)*0.7));
   }
   Canvas.Update();
}
//+------------------------------------------------------------------+

 
Nikolai Semko:

Super !

J'ai vraiment besoin de cette fonctionnalité, et de pouvoir dessiner mes propres indicateurs dans ces mini-fenêtres.

Pourquoi une fenêtre se cache-t-elle sous une autre et l'autre par-dessus, pouvez-vous la réparer ?

Autre question, si le même indicateur est exécuté sur un autre graphique, cela fonctionnera-t-il ? Les événements ne se chevaucheront pas comme dans la bibliothèque standard ?

Et si les deux fenêtres ont les mêmes coordonnées, quelle fenêtre sera déplacée avec la souris ?

Est-il possible de redimensionner la fenêtre avec la souris ?

 
Sergey Chalyshev:

Super !

J'ai vraiment besoin de cette fonctionnalité, et de pouvoir dessiner mes propres indicateurs dans ces mini-fenêtres.

Pourquoi une fenêtre se cache-t-elle sous une autre et l'autre par-dessus, pouvez-vous la réparer ?

Autre question, si le même indicateur est exécuté sur un autre graphique, cela fonctionnera-t-il ? Les événements ne se chevaucheront pas comme dans la bibliothèque standard ?

Et si les deux fenêtres ont les mêmes coordonnées, quelle fenêtre sera déplacée avec la souris ?

Est-il possible de redimensionner la fenêtre avec la souris ?

Cet exemple met simplement en œuvre l'ancienneté de la fenêtre. En fait, plus l'index dans le tableau de la structure win est petit, plus la couche de fenêtre virtuelle est basse.

Vous pouvez le mettre en œuvre de la manière que vous voulez. Par exemple, si nous avons "saisi" une fenêtre, elle devient la plus haute sur l'écran et dans le tableau.

Vous pouvez également mettre en œuvre la transparence. Je vous ai montré comment faire ici . (là il faut traiter chaque piskel).

L'autre graphique peut également être exécuté sur l'autre.
Si les coordonnées sont les mêmes, c'est celle du dessus qui est traînée.

avec kanvas, vous pouvez tout faire dans votre fenêtre et dans d'autres fenêtres MT.
En outre, vous pouvez détacher une fenêtre de MT5 et la faire flotter librement, même entre deux moniteurs. Vous pouvez le voirici .

 
Nikolai Semko:

Cet exemple met simplement en œuvre l'ancienneté de la fenêtre. Essentiellement, plus l'index dans le tableau de la structure win est petit, plus la couche de fenêtre virtuelle est basse.

Vous pouvez le mettre en œuvre de la manière que vous souhaitez. Par exemple, si une fenêtre est "saisie", elle devient la plus haute sur l'écran et dans le tableau.

Vous pouvez également mettre en œuvre la transparence. Je vous ai montré comment le faire ici . (là vous devez traiter chaque peekel).

Je peux aussi le faire fonctionner sur un autre graphique.
Si les coordonnées sont les mêmes, c'est celle du dessus qui est traînée.

Avec kanvas, vous pouvez tout faire dans votre fenêtre et dans d'autres fenêtres MT.
De plus, la fenêtre peut être détachée de МТ5 et déplacée dans la zone de flottement libre entre les moniteurs. Vous pouvez le voir ici .

Légèrement faux, je n'ai probablement pas posé la question correctement.

Il n'est pas difficile d'organiser plusieurs fenêtres dans un programme (script, indicateur).

Je veux créer un indicateur qui affiche les données dans sa propre petite fenêtre sur un graphique. Cette fenêtre peut être placée confortablement dans un graphique, vous pouvez la faire glisser avec votre souris, redimensionner la fenêtre avec votre souris (c'est souhaitable, mais vous pouvez le faire quand même). Nous devons faire fonctionner plusieurs indicateurs dans le graphique, chacun avec ses propres paramètres. Je n'ai pas encore trouvé comment faire en sorte que les événements de différents indicateurs ne se chevauchent pas et que l'indicateur réagisse correctement aux événements de la souris. Je n'ai pas encore décidé ce qui est le mieux, le plus simple, la toile ou les objets. Rien ne fonctionne avec la bibliothèque Dialog standard.

 
Sergey Chalyshev:

...Je n'arrive toujours pas à trouver comment faire en sorte que les événements de différents indicateurs ne se chevauchent pas...

Le moyen le plus simple est une variable de type chaîne dans la fenêtre des propriétés, ajoutez-la aux noms des objets graphiques.

 
Dmitry Fedoseev:

Le moyen le plus simple est une variable de type chaîne dans la fenêtre des propriétés, ajoutez-la aux noms des objets graphiques. L'esprit déchiré entre la vérité et l'adhésion ?

Naturellement, c'est ce que je fais. Le problème est le glisser-déposer avec la souris. Si les objets ont les mêmes coordonnées, l'un est exactement sous l'autre. Lorsque vous cliquez dessus, lequel réagit ?

De quels clubs parlez-vous ? Je ne suis inscrit dans aucun club et je n'en ai pas l'intention.)

p.s. Pouvez-vous me montrer un exemple ?

 
Sergey Chalyshev:

Naturellement, je le fais. Le problème est le glisser-déposer avec la souris. Si les objets ont les mêmes coordonnées, l'un est exactement sous l'autre. Lorsque vous cliquez dessus, lequel réagit ?

De quels clubs parlez-vous ? Je ne suis inscrit dans aucun club et je n'en ai pas l'intention.)

p.s. Pouvez-vous me montrer un exemple ?

Mauvais club, désolé... J'en ai fini avec ce club)).

Un objet va répondre. Peut-être que lorsqu'on active un objet, il faut changer son ordre Z pour qu'il soit plus haut que tous les autres. Nous devrions essayer.

 
Sergey Chalyshev:

Naturellement, je le fais. Le problème est le glisser-déposer avec la souris. Si les objets ont les mêmes coordonnées, l'un est exactement sous l'autre. Lorsque vous cliquez dessus, lequel réagit ?

De quels clubs parlez-vous ? Je ne suis inscrit dans aucun club et je n'en ai pas l'intention.)

p.s. Pouvez-vous me montrer un exemple ?

En général, dans une telle situation, l'objet qui a été déplacé en dernier devrait réagir - il est en haut...