Die Funktion, Farbe in Schattierungen zu zerlegen. - Seite 7

 
Vladislav Andruschenko:


Nun, englische Namen wurden aus einem bestimmten Grund erfunden.

Ich kann Ihnen ein weiteres Beispiel nennen, bei dem russische Namen Ihren Code zerstören:

Sie geben Ihren Code an einen Kunden weiter, der nicht über kyrillische Schrift verfügt. Das war's. .... alle weg..... :-)

Und braucht der Kunde den Code oder die Lösung?

 
Реter Konow:

Möchte der Kunde den Code oder die Lösung?

Deshalb müssen Sie sich für das Ziel und die Endnutzer entscheiden.

Versetzen Sie sich in die Lage des Nutzers und vergessen Sie alles, was Sie getan haben: Wie wird sich der Nutzer fühlen?

Wird alles für ihn oder sie einen Sinn ergeben?

 
Vladislav Andruschenko:

Deshalb müssen Sie sich für das Ziel und die Endnutzer entscheiden.

Versetzen Sie sich in die Lage des Nutzers und vergessen Sie alles, was Sie getan haben: Wie wird sich der Nutzer fühlen?

Wird er oder sie alles verstehen?

Ich stimme zu. Ich schreibe in zwei Sprachen. Ich kann es rein auf Englisch machen.

 
Реter Konow:

Es steht Ihnen als Englischsprachigem frei, meine Entscheidung zu ignorieren. Dort gibt es nur wenige englische Wörter.

Übrigens, da Sie so gut mit englischem Code umgehen können, helfen Sie mir bitte mit dem von Nikolay Semko vorgeschlagenen Code:

Ehrlich gesagt, verstehe ich nicht, wie das funktioniert. Es hat viele kurze englische Silben. Genau das, was Sie mögen.

Das ist es ja, ich kann nur etwa 30 % der englischen Sprache, und das auch nur im technischen Bereich, nicht in der Konversation.

In der Programmierung gibt es nur ein paar Dutzend Wörter, und man kann sie sich nach dem Schreiben von buchstäblich 1-2 Programmen merken.

P.S. Der Code, den Sie gepostet haben, besteht aus nur 5 Variablen, wie können sie das nicht verstehen?

 
Vitaly Muzichenko:

Das ist es ja, ich kann nur etwa 30 % der englischen Sprache, und das auch nur im technischen Bereich, nicht in der Konversation.

In der Programmierung gibt es nur ein paar Dutzend Wörter, die man sich durch das Schreiben von buchstäblich 1-2 Programmen einprägen kann.

P.S. Der Code, den Sie gepostet haben, besteht aus nur 5 Variablen, wie können sie das nicht verstehen?

Nun, ich habe in meinem Code (in der Hauptfunktion) 30 Variablen gezählt. Und bis wie viele zählen Sie? (nur ein Scherz).

30% technisches Englisch ist sehr gut. Wissen Sie, wie reichhaltig technisches Englisch ist?

Ein paar Dutzend Wörter in der Programmierung? Jetzt verstehe ich, warum wir uns nicht verstehen)).


zy. Wenn Sie den Code von Nikolai meinen, erklären Sie mir, wie er funktioniert.

 
Alles in allem kann das Thema abgeschlossen werden. Ich freue mich, wenn jemand den Code nützlich findet. Wenn nicht, dann nicht...
 
Реter Konow:

Nach dem Bild zu urteilen, ist die Farbzerlegung hier übrigens nicht vollständig. Nur die Hälfte. Die Palette sollte von ganz weiß über ganz schwarz bis hin zu allen Schattierungen einer bestimmten Farbe reichen.

Ja, Sie haben Recht.

Ich habe versucht, ihn zu implementieren und Ihren Code zu analysieren und zu visualisieren.

Folgendes ist dabei herausgekommen:

#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;
        }
     }
  }

Ihre Variante


meine Variante:


Lassen Sie mich das erklären:

Die weiße Linie ist die Tonwertlinie (Summe der Farben R+B+G) - im Idealfall sollte sie eine gerade diagonale Linie sein. Ich habe es umgesetzt, Sie nicht.

Die roten, blauen und grünen Linien sind Linien des Farbverhältnisses. Nennen wir sie Oberschwingungen des Spektrums, die idealerweise vertikal verlaufen sollten. Aber es ist unmöglich, sie zu realisieren, nachdem die ursprüngliche Höchstfarbe 255 geworden ist. Aber es ist möglich, eine Situation zu erreichen, in der es keine Wendepunkte gibt (durch rote Pfeile gekennzeichnet) und einen glatten Bogen zu machen. Dann wird der Farbverlauf ohne "Klumpen" aussehen. Dieses Problem besteht sowohl in Ihrem als auch in meinem Algorithmus. Es kann behoben werden, aber ich sehe noch keinen Sinn darin, also ist es Zeitverschwendung. In der Praxis benötige ich einen Farbverlauf von einer Farbe zur anderen. Dies ist bei streng vertikalen Oberschwingungen des Spektrums leicht zu realisieren (die Unschärfe der Oberschwingung am oberen Rand ist normal, da sie eine Folge der Rundung ist). Bei diesem Problem geht der Farbverlauf jedoch von Schwarz zu Weiß über eine dritte Farbe, weshalb es diese Knicke gibt.

Seltsam, ich war mir sicher, dass Sie in MQL5 schreiben, aber neben dem 4er Programm selbst haben Sie auch den 4er Programmierstil. Ich habe versucht, Ihren Algorithmus auf 5 zu übertragen, aber es hat nicht funktioniert, weil nur einige Farbstreifen angezeigt werden. Dies geschieht höchstwahrscheinlich aufgrund von Verwechslungen mit dem Geltungsbereich von Variablen, aber es zu beheben, weil der Code nicht debuggingfähig ist, ist extrem schwierig, also habe ich aufgegeben. Ich verstehe, dass Sie an Ihren Programmierstil gewöhnt sind und meinen Stil nicht verstehen. Das beruht auf Gegenseitigkeit, denn ich bin es gewohnt, die Struktur eines Programms zu sehen, anstatt es wie ein Buch zu lesen. Und in Ihrem Code ist es unmöglich zu debuggen und zu verstehen, in welchem Moment der Variablendefinition, die langen Variablennamen 90% des Programmtextes einnehmen, wodurch die Programmstruktur verloren geht und sich in diesen langen barbie-farbigen Variablennamen auflöst. Alles in allem sieht Ihr Code für mich persönlich nach einer Art von SM aus.

Außerdem stellte sich heraus, dass Ihr Algorithmus Dutzende Male langsamer ist, und der Grund dafür ist nicht einmal MQL4. Ich konnte es nicht herausfinden. Welche Tangenten, welche Dreiecke, wenn es nur RGB gibt?

Und versuchen Sie, die Gewerkschaft zu beherrschen - eine sehr nützliche Sache.

Um besser zu verstehen, was ich meine, sollten Sie versuchen, beide Skripte, die ich angehängt habe, mit Ihrem Algorithmus (MQL4) und meinem (MQL5) auszuführen.


Auch Ihnen passieren solche Missgeschicke:

nur verstehe ich es noch nicht, ist es ein Problem der MT4 Trägheit oder ein Fehler in Ihrem Algorithmus.

Dateien:
 
Nikolai Semko:


1. Nikolai, selbst wenn man die ersten beiden von Ihnen zitierten Bilder vergleicht, kann man sofort erkennen, dass über Ihrer Version ein grauer Schleier liegt. Sehen Sie genau hin. Und in meiner Version ist die Farbe viel heller. Glauben Sie, dass Ihre Version die Farbe besser wiedergibt?

2. Ich habe mich an der Farbpalette von Windows orientiert. Die Farbe stimmt zu 99 % überein. Prüfen Sie, ob Ihre Farben mit den Windows-Farben übereinstimmen. Drucken Sie eine Reihe von Farbtönen aus, wie ich es getan habe. Öffnen Sie dann die Diagrammeigenschaften und die Palette. Geben Sie die Werte der Komponenten der Ausgangsfarbe in die Fenster ein und bewegen Sie den Schieberegler nach oben und unten. Die Zahlen werden sich ändern. Sie suchen diese Zahlen auf Ihrem Ausdruck und sehen, wie gut sie übereinstimmen.

3. mir ist bekannt, dass die konkrete Umsetzung unterschiedlich sein kann. Ich habe meinen Algorithmus nicht speziell auf Geschwindigkeit geprüft, und ich habe ihn nicht auf Geschwindigkeit optimiert. Ihre Lösung scheint Ihnen eine höhere Geschwindigkeit zu bieten. Ich werde es nicht leugnen.

4. In der Optik gibt es einen Begriff für ein Prisma. Es gibt den Begriff der Lichtbrechung. Ich bin von genau diesem Paradigma ausgegangen. Ich habe 256*256 (von 0 bis 255) aufgezeichnet. Dann habe ich Linien gezeichnet. Ich habe die Achse der Brechung der Farbe gefunden. Sie befindet sich in der Mitte des Diagramms. Jede Komponente ist eine Kurve, die aus zwei Segmenten besteht. Insgesamt hat die Farbe drei geschwungene Linien, die sich jeweils in der Mitte der Grafik brechen und in zwei Segmente unterteilen. Jedes Segment hat seinen eigenen Winkel. Die ursprüngliche Farbe hat eine Koordinate im Diagramm. Er ist unter seinen Schattierungen zu finden. Meine Aufgabe bestand darin, die Ausgangsfarbe zu finden, die Winkel aller sechs Segmente zu bestimmen und die Werte jeder Komponente entlang ihrer Linie zu ermitteln.

5. Tangenten sind Verhältnisse von aneinandergrenzenden zu gegenüberliegenden Katheten. Sie ist notwendig für die Berechnung der Winkel der Segmente und die Berechnung der Höhe der gegenüberliegenden Katheten (das ist der Wert einer Komponente in einem konkreten Farbton).

6. Was die Programmierungsstile betrifft, so schlage ich vor, dass wir nicht darüber diskutieren. Auf das Wesentliche des Themas kommt es nicht an.

7. Über Missgeschicke - vielleicht sind sie das. Aber ich bin noch nicht auf sie gestoßen. Ich weiß es also nicht.


Übrigens, sagen Sie mir, wie die Farbzerlegung in Ihrer Version funktioniert. Ich verstehe das nicht ganz.

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


Ich verstehe es einfach noch nicht, ist es ein Problem der MT4 Langsamkeit oder ein Fehler in Ihrem Algorithmus.

Über den Geschwindigkeitsunterschied zwischen den Algorithmen:

1) Ihr Algorithmus füllt ein uint-Array, während meiner ein string-Array füllt. (Ich brauche genau eine Schnur, um die notwendigen Komponenten leicht aus dem Schatten zu extrahieren und dann mit ihnen zu arbeiten). Der Unterschied in der Geschwindigkeit beim Füllen der beiden Arten von Arrays ist im folgenden Skript zu sehen.

2. Ihr Algorithmus funktioniert auf МТ5, meiner auf МТ4. Der Unterschied in der Geschwindigkeit des Auffüllens von Arrays auf diesen Plattformen wurde von mir hier diskutiert -https://www.mql5.com/ru/forum/222333. Anhand des nachstehenden Skripts können Sie den Unterschied selbst erkennen. Stellen Sie es auf beide Plattformen und vergleichen Sie.

//+------------------------------------------------------------------+
//|                        Проверка скорости заполнения массивов.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);//Этот код нужен, иначе компилятор не заполняет массив.
  }
//+------------------------------------------------------------------+

Ich habe die Geschwindigkeit von 30 000 Zellen von int- und string-Arrays auf MT4 und MT5 gemessen (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

Wie Sie sehen können, ist mein Algorithmus aus zwei Gründen langsamer:

  1. Es füllt das String-Array und nicht das uint-Array.
  2. Sie haben es nur auf MT4 getestet. Die Geschwindigkeit des Auffüllens von Arrays kann von Plattform zu Plattform um ein Vielfaches variieren.
P.S. Außerdem kann mein Algorithmus die Nummer der Feldzelle zurückgeben, in der sich die ursprüngliche Farbe befindet. Es hilft, einen Farbverlauf zu erzeugen. Schließlich müssen Sie wissen, von welcher Zelle aus Sie sich nach links oder rechts bewegen müssen.
MT5 vs MT4. Скорость заполнения массивов.
MT5 vs MT4. Скорость заполнения массивов.
  • 2017.12.12
  • www.mql5.com
Возникла необходимость замерить и сравнить скорость заполнения локальных и глобальных массивов на МТ4 и МТ5...
 
Реter Konow:

Über den Unterschied in der Geschwindigkeit der Algorithmen:

1. Ihr Algorithmus füllt ein uint-Array, während meiner ein String-Array füllt. (Ich benötige eine Zeichenfolge, um die erforderlichen Komponenten leicht aus dem Farbton zu extrahieren und dann mit ihnen zu arbeiten). Der Unterschied in der Geschwindigkeit beim Füllen der beiden Arten von Arrays ist im folgenden Skript zu sehen.

2. Ihr Algorithmus funktioniert auf МТ5, meiner auf МТ4. Der Unterschied in der Geschwindigkeit des Auffüllens von Arrays auf diesen Plattformen wurde von mir hier diskutiert -https://www.mql5.com/ru/forum/222333. Anhand des nachstehenden Skripts können Sie den Unterschied selbst erkennen. Stellen Sie es auf beide Plattformen und vergleichen Sie.

Ich habe die Geschwindigkeit von 30 000 Zellen von int- und string-Arrays auf MT4 und MT5 gemessen (ms):

Wie Sie sehen können, ist mein Algorithmus aus zwei Gründen langsamer:

  1. Es füllt das String-Array und nicht das uint-Array.
  2. Sie haben es nur auf MT4 getestet. Die Geschwindigkeit des Auffüllens von Arrays kann von Plattform zu Plattform um ein Vielfaches variieren.
P.S. Außerdem kann mein Algorithmus die Nummer der Feldzelle zurückgeben, in der sich die ursprüngliche Farbe befindet. Es hilft, einen Farbverlauf zu erzeugen. Schließlich müssen Sie wissen, von welcher Zelle aus Sie sich nach links oder rechts bewegen müssen.
Ich habe die Tangas aus deinem Algorithmus entfernt. Es war mir ein Rätsel, warum Sie sie verwendet haben. Schauen Sie in den Code, wie würde ich dann die echte Farbe ausgeben. Sie haben eine Menge unnötiger Prüfungen, Sie verwenden Funktionen wie Tangens, Array-Sortierung, ich nur +-*//. Mt4 ist langsamer, das ist verständlich, aber nicht 30 Mal langsamer.
Ok, ich werde meinen Algorithmus später auf 4 setzen und sehen. Warum verwenden Sie überhaupt 4? Für eine grafische Benutzeroberfläche ist 4 überhaupt nicht gut. Er liest nicht einmal die Ressourcen. Von 4 auf 5 ist es viel schwieriger, den Code zu überarbeiten als umgekehrt.