Fonction de décomposition de la couleur en nuances. - page 7

 
Vladislav Andruschenko:


Eh bien, les noms anglais ont été inventés pour une raison.

Je peux vous donner un autre exemple où les noms russes vont tuer votre code :

Vous transmettez le code à un client qui n'a pas le cyrillique. C'est tout. .... tout est parti..... :-)

Et le client a-t-il besoin du code, ou de la solution ?

 
Реter Konow:

Le client veut-il le code ou la solution ?

c'est pourquoi vous devez décider de la cible et des utilisateurs finaux.

Mettez-vous à la place de l'utilisateur et oubliez tout ce que vous avez fait : comment l'utilisateur se sentira-t-il ?

Est-ce que tout aura un sens pour lui ou elle ?

 
Vladislav Andruschenko:

c'est pourquoi vous devez décider de la cible et des utilisateurs finaux.

Mettez-vous à la place de l'utilisateur et oubliez tout ce que vous avez fait : comment l'utilisateur se sentira-t-il ?

Est-ce qu'il ou elle comprendra tout ?

Je suis d'accord. J'écris en deux langues. Je peux le faire uniquement en anglais.

 
Реter Konow:

Vous, en tant qu'anglophone, vous êtes libre d'ignorer ma décision. Il y a peu de mots anglais.

Au fait, puisque vous êtes si doué avec le code anglais, veuillez m'aider avec le code proposé par Nikolay Semko :

Honnêtement, je ne comprends pas comment ça marche. Il a beaucoup de syllabes anglaises courtes. Juste ce que vous aimez.

C'est la chose que je connais sur 30% de l'anglais, et seulement technique, pas conversationnel.

En programmation, il n'y a que quelques dizaines de mots, et vous pouvez les mémoriser après avoir écrit littéralement un ou deux programmes.

P.S. Le code que vous avez posté, il n'y a que 5 variables, comment ne peuvent-ils pas comprendre ?

 
Vitaly Muzichenko:

C'est le problème, je connais environ 30% de l'anglais, et seulement la technique, pas la conversation.

En programmation, il n'y a que quelques dizaines de mots, et on peut les mémoriser en écrivant littéralement 1 ou 2 programmes.

P.S. Le code que vous avez posté ne comporte que 5 variables, comment pouvez-vous ne pas les comprendre ?

J'ai compté 30 variables dans mon code (dans la fonction principale). Et jusqu'à combien comptez-vous ? (je plaisante).

30% d'anglais technique est très fort. Savez-vous à quel point l'anglais technique est riche ?

Quelques dizaines de mots en programmation ? Maintenant je vois pourquoi nous ne nous comprenons pas)).


zy. Si vous parlez du code de Nikolaï, expliquez comment il fonctionne.

 
En somme, le sujet peut être clos. Je suis heureux si quelqu'un trouve le code utile. Si non, alors non...
 
Реter Konow:

D'ailleurs, à en juger par l'image, la décomposition des couleurs n'est pas complète ici. Seulement la moitié. La gamme doit s'étendre du blanc complet au noir complet, en passant par toutes les nuances d'une couleur particulière.

Oui, vous avez raison.

J'ai essayé de l'implémenter et d'analyser et de visualiser votre code.

Voici ce qui en est ressorti :

#include <Canvas\iCanvas.mqh> //https://www.mql5.com/ru/code/22164

union rgb {uint clr; uchar c[4];};
void OnStart()
  {
   rgb c,cc;
   double d=5;
   while(!IsStopped())
     {
      c.c[2]=uchar(127.5*(1+sin(d*1.2))+0.4999); c.c[1]=uchar(127.5*(1+sin(d*1.9))+0.4999); c.c[0]=uchar(127.5*(1+sin(d*2.8))+0.4999);  // генерируем новый цвет
      cc.clr=c.clr;
      uint CLR[];
      ulong t=GetMicrosecondCount();
      Gradient(c.clr,CLR,W.Height);
      t=GetMicrosecondCount()-t;
      for(int y=0; y<W.Height; y++)
        {
         Canvas.LineHorizontal(0,W.Width-1,y,ColorToARGB(CLR[y],240));
         c.clr=CLR[y];
         Canvas.PixelSet((int)c.c[2]+(int)c.c[1]+(int)c.c[0],y,ColorToARGB(clrWhite));
         if (c.c[1]>0) Canvas.PixelSet(int(50.0*(int)c.c[2]/(double)c.c[1]+50.0*(int)c.c[0]/(double)c.c[1]),y,ColorToARGB(clrGreen));
         if (c.c[2]>0) Canvas.PixelSet(int(50.0*(int)c.c[1]/(double)c.c[2]+50.0*(int)c.c[0]/(double)c.c[2]),y,ColorToARGB(clrRed));
         if (c.c[0]>0) Canvas.PixelSet(int(50.0*(int)c.c[2]/(double)c.c[0]+50.0*(int)c.c[1]/(double)c.c[0]),y,ColorToARGB(clrBlue));
        }
      Canvas.FillRectangle(W.Width/2-80,W.Height/2-50,W.Width/2+80,W.Height/2+50,ColorToARGB(cc.clr,240));
      Canvas.CurentFont("Tahoma",20,22,ColorToARGB(~cc.clr)); // 20 -  размер шрифта, 22 - межстрочный интервал
      Canvas.TextPosition(W.Width/2-70,W.Height/2-40); // Стартовая позиция для шрифта в пикселях
      Canvas.Comm("Текущий цвет:");
      Canvas.Comm("R = "+string(cc.c[2]));
      Canvas.Comm("G = "+string(cc.c[1]));
      Canvas.Comm("B = "+string(cc.c[0]));
      Canvas.CurentFont("Times New Roman",30);
      Canvas.TextPosition(25.0,10.0);  // Стартовая позиция для шрифта в процентах от размеров экрана
      Canvas.Comm("Время формирования градиентного массива из "+string(W.Height)+" элементов = "+string(t)+" микросекунд");
      ChartChanged(); // на всякий случай контролируем изменение размеров окна, т.к. это скрипт (в индикаторах и экспертах это происходит автоматически)
      Canvas.Update();
      d+=0.01;
      Sleep(30);
     }
  }
//+------------------------------------------------------------------+

void Gradient(uint clr,uint &arr[],uint size)
  {
   if(size==0) return;
   ArrayResize(arr,size);
   rgb c;
   c.clr=clr;
   uchar R=c.c[2],G=c.c[1],B=c.c[0];
   uint i=0, tone=uint((size-1)*(((double)R+(double)G+(double)B)/765.0)+0.4999);
   double kR,kG,kB;
   if(tone!=0)
     {
      kR=(double)R/tone;
      kG=(double)G/tone;
      kB=(double)B/tone;
      for(i=0;i<=tone;i++)
        {
         c.c[2]=uchar(i*kR+0.4999);
         c.c[1]=uchar(i*kG+0.4999);
         c.c[0]=uchar(i*kB+0.4999);
         arr[i]=c.clr;
        }
     }
   if(tone!=(size-1))
     {
      kR=(double)(255-R)/(size-i);
      kG=(double)(255-G)/(size-i);
      kB=(double)(255-B)/(size-i);
      for(uint j=1;i<size;i++,j++)
        {
         c.c[2]=uchar(R+j*kR+0.4999);
         c.c[1]=uchar(G+j*kG+0.4999);
         c.c[0]=uchar(B+j*kB+0.4999);
         arr[i]=c.clr;
        }
     }
  }

Votre variante


ma variante :


Laissez-moi vous expliquer :

La ligne blanche est la ligne de tonalité (somme des couleurs R+B+G) - idéalement, il devrait s'agir d'une ligne diagonale droite. Je l'ai mis en place, pas vous.

Les lignes rouge, bleue et verte sont des lignes de rapport de couleur. Appelons-les des harmoniques du spectre. Idéalement, elles devraient être verticales. Mais il est impossible de le réaliser après que la couleur maximale initiale soit devenue 255. Mais il est possible d'atteindre une situation où il n'y aura pas de points d'inflexion (marqués par des flèches rouges) et de faire un arc lisse. Le gradient sera alors sans "grumeaux". Ce problème existe aussi bien dans vos algorithmes que dans les miens. Il peut être corrigé, mais je n'en vois pas encore l'intérêt, c'est donc une perte de temps. En pratique, j'ai besoin d'un dégradé d'une couleur à une autre. Ceci est facilement mis en œuvre avec les harmoniques strictement verticales du spectre (le flou de l'harmonique du haut est normal, car il s'agit d'une conséquence de l'arrondi). Dans ce problème, cependant, le gradient va du noir au blanc en passant par une troisième couleur, d'où l'existence de ces coudes.

C'est étrange, j'étais sûr que vous écriviez en MQL5. Mais en plus du programme 4's lui-même, vous avez aussi le style de programmation 4's. J'ai essayé de transférer votre algorithme sur 5 mais cela n'a pas fonctionné, car il n'affiche que quelques bandes de couleur. Cela se produit très probablement à cause d'une confusion avec la portée des variables, mais il est extrêmement difficile de résoudre ce problème parce que le code ne se prête pas au débogage, alors j'ai abandonné. Je comprends que vous êtes habitué à votre style de programmation et que vous ne comprenez pas mon style. C'est mutuel parce que j'ai l'habitude de voir la structure d'un programme au lieu de le lire comme un livre. Et dans votre code, il est impossible de déboguer et de comprendre à quel moment de la définition des variables, les longs noms de variables occupent 90% du texte du programme, ce qui fait que la structure du programme se perd, se dissolvant dans ces longs noms de variables aux couleurs de Barbie. Dans l'ensemble, votre code ressemble personnellement à une sorte de S&M.

En outre,votre algorithme s'est avéré être des dizaines de fois plus lent, et la raison n'est même pas MQL4. Je n'arrivais pas à comprendre. Quelles tangentes, quels triangles quand il n'y a que duRVB?

Et essayez de maîtriser le syndicat - une chose très utile.

Pour mieux comprendre ce que je veux dire, vous devriez essayer d'exécuter les deux scripts que j'ai joints avec votre algorithme (MQL4) et le mien (MQL5).


Vous avez aussi de telles mésaventures :

Seulement je ne comprends pas encore, est-ce un problème de lenteur de MT4 ou un bug dans votre algorithme.

Dossiers :
 
Nikolai Semko:


1. Nikolaï, même en comparant les deux premières photos que vous avez citées, on voit immédiatement qu'une brume grise plane sur votre version. Regardez bien. Et dans ma version, la couleur est beaucoup plus vive. Pensez-vous que votre version transmet mieux la couleur ?

2. J'ai pris la palette de couleurs de Windows comme référence. J'ai une correspondance de couleur de 99%. Vérifiez vos couleurs pour voir si elles correspondent à celles de Windows. Imprimez un éventail de teintes comme je l'ai fait. Ensuite, ouvrez les propriétés du graphique et la palette. Entrez dans les fenêtres des valeurs des composants de la couleur initiale, puis déplacez le curseur vers le haut et vers le bas. Les chiffres vont changer. Vous recherchez ces chiffres sur votre impression et voyez s'ils correspondent bien.

3. je comprends que la mise en œuvre spécifique peut varier. Je n'ai pas vérifié mon algorithme spécifiquement pour la vitesse, et je ne l'ai pas optimisé pour la vitesse. Votre solution peut sembler vous donner une vitesse plus élevée. Je ne vais pas le nier.

4. Il existe une notion de prisme en optique. Il existe une notion de réfraction de la lumière. Je partais de ce même paradigme. J'ai tracé 256*256 (de 0 à 255). Puis j'ai tracé des lignes. J'ai trouvé l'axe de réfraction de la couleur. Il se trouve au centre du graphique. Chaque composante est une courbe composée de deux segments. Au total, la couleur présente trois lignes courbes, dont chacune est réfractée au centre du graphique, se divisant en deux segments. Chaque segment a son propre angle. La couleur d'origine a une coordonnée sur le graphique. On peut le trouver parmi ses nuances. Ma tâche consistait à trouver la couleur initiale, à déterminer les angles des six segments et à obtenir les valeurs de chaque composant le long de sa ligne.

5. Les tangentes sont des rapports entre des cathéters adjacents et des cathéters opposés. Elle est nécessaire pour le calcul des angles des segments et le calcul de la hauteur des cathéters opposés (qui est la valeur d'un composant dans un ton concret de couleur).

6. Quant aux styles de programmation, je suggère de ne pas en discuter. L'essence du sujet n'est pas pertinente.

7. A propos des mésaventures - peut-être le sont-elles. Mais je ne les ai pas encore rencontrés. Par conséquent, je ne sais pas.


Au fait, dites-moi comment fonctionne la décomposition des couleurs dans votre version. Je ne le comprends pas complètement.

Просмотр и настройка графиков - Графики котировок, технический и фундаментальный анализ - MetaTrader 5
Просмотр и настройка графиков - Графики котировок, технический и фундаментальный анализ - MetaTrader 5
  • www.metatrader5.com
Графики в торговой платформе отображают изменение котировок финансовых инструментов во времени. Они необходимы для проведения технического анализа и работы советников. Они позволяют трейдерам наглядно следить за котировками валют и акций в режиме реального времени и моментально реагировать на любое изменение ситуации на финансовых рынках...
 
Nikolai Semko:


Je ne comprends pas encore, est-ce un problème de lenteur de MT4 ou un bug dans votre algorithme.

A propos de la différence de vitesse des algorithmes :

1. votre algorithme remplit un tableau d'uint, tandis que le mien remplit un tableau de string. (J'ai exactement besoin d'une chaîne, pour extraire facilement les composants nécessaires de l'ombre et ensuite travailler avec eux). Vous pouvez voir la différence dans la vitesse de remplissage des deux types de tableaux dans le script ci-dessous.

2. Votre algorithme fonctionne sur МТ5, et le mien sur МТ4. La différence de vitesse de remplissage des tableaux sur ces plateformes a été discutée par moi ici -https://www.mql5.com/ru/forum/222333. Le script ci-dessous vous permet de constater vous-même la différence. Mettez-le sur les deux plateformes et comparez.

//+------------------------------------------------------------------+
//|                        Проверка скорости заполнения массивов.mq5 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int int_Array[30000];
string string_Array[30000];
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   ulong t1 = GetMicrosecondCount();
   //--------------------------
   for(int b1 = 0; b1 < 30000; b1++)int_Array[b1] = 1;
   //--------------------------
   ulong t2 = GetMicrosecondCount();
   //--------------------------
   int q = int_Array[0] + int_Array[1];//Этот код нужен, иначе компилятор не заполняет массив.
   //--------------------------
   Print("//----------------------------------------------------------------------------------");
   Print(" Время заполнения массива      int:  ",t2-t1);
   
 
 
   ulong t3 = GetMicrosecondCount();
   //--------------------------
   for(int b2 = 0; b2 < 30000; b2++)string_Array[b2] = "1";
   //--------------------------
   ulong t4 = GetMicrosecondCount();
   //--------------------------
   int q2 = int_Array[0] + int_Array[1];//Этот код нужен, иначе компилятор не заполняет массив.
   //--------------------------
   Print(" Время заполнения массива string:  ",t4-t3);   
   Print("//----------------------------------------------------------------------------------");
   
   Alert(q + q2);//Этот код нужен, иначе компилятор не заполняет массив.
  }
//+------------------------------------------------------------------+

J'ai mesuré la vitesse de 30 000 cellules de tableaux d'int et de string sur MT4 et MT5 (ms) :

MT5
2018.10.11 13:29:24.502 Замер скорости заполнения массивов (RTS-12.18,H1)  Время заполнения массива string:  464
2018.10.11 13:29:24.502 Замер скорости заполнения массивов (RTS-12.18,H1)  Время заполнения массива    int:  14

MT4
2018.10.11 13:30:39.199 Замер скорости заполнения массивов GBPUSD,M30:     Время заполнения массива string:  692
2018.10.11 13:30:39.199 Замер скорости заполнения массивов GBPUSD,M30:     Время заполнения массива    int:  363

Comme vous pouvez le constater, mon algorithme est plus lent pour deux raisons :

  1. Il remplit le tableau de chaînes de caractères et non le tableau d'unités.
  2. Vous ne l'avez testé que sur MT4. La vitesse de remplissage des tableaux entre les plateformes peut varier des dizaines de fois.
P.S. Par ailleurs, mon algorithme peut renvoyer le numéro de la cellule du tableau où se trouve la couleur originale. Il permet de créer un gradient. Après tout, vous devez savoir à partir de quelle cellule vous déplacer vers la gauche ou la droite.
MT5 vs MT4. Скорость заполнения массивов.
MT5 vs MT4. Скорость заполнения массивов.
  • 2017.12.12
  • www.mql5.com
Возникла необходимость замерить и сравнить скорость заполнения локальных и глобальных массивов на МТ4 и МТ5...
 
Реter Konow:

A propos de la différence dans la vitesse des algorithmes :

1. votre algorithme remplit un tableau d'uint, alors que le mien remplit un tableau de string. (J'ai besoin d'une chaîne pour extraire facilement les composants nécessaires de l'ombre et ensuite travailler avec eux). Vous pouvez voir la différence dans la vitesse de remplissage des deux types de tableaux dans le script ci-dessous.

2. Votre algorithme fonctionne sur МТ5, et le mien sur МТ4. La différence de vitesse de remplissage des tableaux sur ces plateformes a été discutée par moi ici -https://www.mql5.com/ru/forum/222333. Le script ci-dessous vous permet de constater vous-même la différence. Mettez-le sur les deux plateformes et comparez.

J'ai mesuré la vitesse de 30 000 cellules de tableaux d'int et de string sur MT4 et MT5 (ms) :

Comme vous pouvez le constater, mon algorithme est plus lent pour deux raisons :

  1. Il remplit le tableau de chaînes de caractères et non le tableau d'unités.
  2. Vous ne l'avez testé que sur MT4. La vitesse de remplissage des tableaux entre les plateformes peut varier des dizaines de fois.
P.S. Par ailleurs, mon algorithme peut renvoyer le numéro de la cellule du tableau où se trouve la couleur originale. Il permet de créer un gradient. Après tout, vous devez savoir à partir de quelle cellule vous déplacer vers la gauche ou la droite.
J'ai enlevé les strings de ton algorithme. C'était un mystère pour moi de savoir pourquoi tu les utilisais. Regardez dans le code, comment je sortirais la vraie couleur alors. Vous avez beaucoup de vérifications inutiles, vous utilisez des fonctions comme la tangente, le tri de tableau, je ne fais que +-*//. Mt4 est plus lent, c'est compréhensible, mais pas 30 fois plus lent.
Ok, je vais mettre mon algorithme sur 4 plus tard et voir. Pourquoi utilisez-vous le 4 ? Pour une interface graphique, 4 n'est pas bon du tout. Il ne lit même pas les ressources. De 4 à 5, il est beaucoup plus difficile de refaire le code que l'inverse.