Diskussion zum Artikel "Die statistische Verteilung in Form von einem Histogramm ohne Indikator-Puffer und Arrays"

 

Neuer Artikel Die statistische Verteilung in Form von einem Histogramm ohne Indikator-Puffer und Arrays :

Im Artikel wird die Bildungsmöglichkeit der Histogramme der statistischen Verteilungen der Markt-Charakteristiken unter Verwendung des graphischen Gedächtnisses betrachtet, das heißt ohne Verwendung der Indikator-Puffer und Arrays. Es wurden die ausführlichen Beispiele des Aufbaus solcher Histogramme aufgeführt und wurde die sogenannte "verborgene" Funktional der graphischen Objekte der Sprache MQL5 vorgeführt.

Im vorliegenden Artikel werden wir auf die vertikalen Histogramme der Variationsreihen betrachten: die Preiswerte der untersuchten Charakteristiken werden sich auf der vertikalen Achse in aufsteigender Reihenfolge befinden, und der Frequenz — auf der horizontalen Achse (in Abb. 1). Die ins Terminal kommenden Preisdaten werden verteilt und werden auf der laufenden Bar gruppiert und es können verhältnismäßig seiner Achse links dargestellt, rechts oder gleichzeitig von beiden Seiten.

in Abb. 1. Das vertikale Histogramm der Verteilung der Preise Bid und Ask 

in Abb. 1. Das vertikale Histogramm der Verteilung der Preise Bid und Ask

Autor: Sergey Pavlov

 
Ist der Einband nicht im Weg?
 

eine große Hilfe bei der Arbeit auf dem Markt wäre die Erstellung eines Indikators in Form eines Histogramms im Hauptfenster mit Daten aus dem Stapel über die Anzahl der Aufträge, aber in Dynamik....

(ein Beispiel ist der Indikator #Xaser-info

 
Erinnert an diese Art der Darstellung in Indikatoren von VSA. Klar und effektiv
 

Sergey, das ist sehr interessant und ich würde gerne darüber sprechen.

Zunächst einmal weiß ich nicht, wie ich den Code aus dem News-Post herausbekomme. Ich habe den Code schließlich gespeichert und aus der gespeicherten Datei kopiert und eingefügt. Ich bin mir nicht sicher, was eine .mht-Datei ist.

Jedenfalls habe ich die Funktion DrawHistogram() eingefügt, aber als ich versuchte, sie zu kompilieren, gab es undefinierte Variablen, z. B. color_R_active. Können Sie mir helfen, diese zu definieren?

Ich danke Ihnen.

Chuck Stangor

 
cstangor:

Sergey, das ist sehr interessant und ich würde gerne darüber sprechen.

Zunächst einmal weiß ich nicht, wie ich den Code aus dem News-Post herausbekomme. Ich habe den Code schließlich gespeichert und aus der gespeicherten Datei kopiert und eingefügt. Ich bin mir nicht sicher, was eine .mht-Datei ist.

Jedenfalls habe ich die Funktion DrawHistogram() eingefügt, aber als ich versuchte, sie zu kompilieren, gab es undefinierte Variablen, z. B. color_R_active. Können Sie mir helfen, diese zu definieren?

Ich danke Ihnen.

Chuck Stangor

Zeigen Sie den vollständigen Code.

 
Sergey Pavlov:

Den vollständigen Code anzeigen.

//+------------------------------------------------------------------+
//|draw_histogram.mqh |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//+------------------------------------------------------------------+
//| definiert|
//+------------------------------------------------------------------+
// #define MacrosHello "Hallo, Welt!"
// MacrosJahr 2010 #define
//+------------------------------------------------------------------+
//| DLL-Importe|
//+------------------------------------------------------------------+
// #import "user32.dll"
// int SendMessageA(int hWnd,int Msg,int wParam,int lParam);
// #import "my_expert.dll"
// int ExpertRecalculate(int wParam,int lParam);
// #import
//+------------------------------------------------------------------+
//| EX5-Importe|
//+------------------------------------------------------------------+
// #import "stdlib.ex5"
// string ErrorDescription(int error_code);
// #import
//+------------------------------------------------------------------+

void DrawHistogram(bool draw,     // Zeichnen eines Histogramms nach links oder nach rechts
                   string h_name, // eindeutiges Präfix für den Objektnamen
                   double price,  // Preis (analysierter Parameter)
                   datetime time, // ein Histogramm an den aktuellen Balken binden
                   int span,      // analysierter Parameter Ziffernkapazität
                   int swin=0)    // Histogramm-Fenster
  {
   double y=NormalizeDouble(price,span);
   string pfx=DoubleToString(y,span);
// wenn draw=true, wird das Histogramm nach rechts gezeichnet
   if(draw)
     {
      string name="+ "+h_name+pfx;                   // Objektname: Präfix+Preis
      ObjectCreate(0,name,OBJ_TREND,swin,time,y);    // das Objekt erstellen
      ObjectSetInteger(0,name,OBJPROP_COLOR,color_R_active); // Einstellen der Objektfarbe
      ObjSet;                                                // Makro zur Codeverkürzung
      if(StringFind(ObjectGetString(0,name,OBJPROP_TEXT),"*",0)<0)
        {// wenn der resultierende Preis zum ersten Mal in die Stichprobe eintritt
         ObjectSetString(0,name,OBJPROP_TEXT,"*1");          // die Preisfrequenz ist 1
         ObjectSetInteger(0,name,OBJPROP_TIME,1,time+hsize); // Definition der Zeitkoordinate
        }
      else
        {// wenn der resultierende Preis nicht zum ersten Mal in die Stichprobe eintritt
         string str=ObjectGetString(0,name,OBJPROP_TEXT);    // Abrufen des Eigenschaftswerts
         string strint=StringSubstr(str,1);                  // Hervorhebung der Teilzeichenkette
         long n=StringToInteger(strint);                     // Ermitteln einer Frequenz für weitere Berechnungen
         n++;                                                // den Wert um 1 erhöhen
         ObjectSetString(0,name,OBJPROP_TEXT,"*"+(string)n); // einen neuen Wert in die Eigenschaft schreiben
         ObjectSetInteger(0,name,OBJPROP_TIME,1,time+hsize*n);//Die Zeitkoordinate festlegen
        }
     }
// wenn draw=false, wird das Histogramm nach links geschrieben
   if(!draw)
     {
      string name="- "+h_name+pfx;
      ObjectCreate(0,name,OBJ_TREND,swin,time,y);
      ObjectSetInteger(0,name,OBJPROP_COLOR,color_L_active);
      ObjSet;
      if(StringFind(ObjectGetString(0,name,OBJPROP_TEXT),"*",0)<0)
        {
         ObjectSetString(0,name,OBJPROP_TEXT,"*1");
         ObjectSetInteger(0,name,OBJPROP_TIME,1,time-hsize);
        }
      else
        {
         string str=ObjectGetString(0,name,OBJPROP_TEXT);
         string strint=StringSubstr(str,1);
         long n=StringToInteger(strint);
         n++;
         ObjectSetString(0,name,OBJPROP_TEXT,"*"+(string)n);
         ObjectSetInteger(0,name,OBJPROP_TIME,1,time-hsize*n);
        }
     }
  ChartRedraw();
}
 
//+------------------------------------------------------------------+
//|draw_histogram.mqh |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//--- Макросы
#define   R        43    // значения префикса (+) для гистограммм справа
#define   L        45    // значения префикса (-) для гистограммм слева
#define   WIDTH    2     // толщина линий
#define   ObjSet1  ObjectSetInteger(0,name,OBJPROP_WIDTH,WIDTH)
#define   ObjSet2  ObjectSetDouble(0,name,OBJPROP_PRICE,0,y)
#define   ObjSet3  ObjectSetInteger(0,name,OBJPROP_TIME,0,time)
#define   ObjSet4  ObjectSetDouble(0,name,OBJPROP_PRICE,1,y)
#define   ObjSet5  ObjectSetInteger(0,name,OBJPROP_BACK,true)
#define   ObjSet   ObjSet1;ObjSet2;ObjSet3;ObjSet4;ObjSet5
//---
int      hsize=10;                     // масштаб гистограммы
color    color_R_active=clrRed;        // цвет активных линий справа
color    color_R_passive=clrLightCoral;// цвет пассивных линий справа
color    color_L_active=clrBlue;       // цвет активных линий слева
color    color_L_passive=clrSkyBlue;   // цвет пассивных линий слева

void DrawHistogram(bool draw,     // Zeichnen eines Histogramms nach links oder nach rechts
                   string h_name, // eindeutiges Präfix für den Objektnamen
                   double price,  // Preis (analysierter Parameter)
                   datetime time, // ein Histogramm an den aktuellen Balken binden
                   int span,      // analysierter Parameter Ziffernkapazität
                   int swin=0)    // Histogramm-Fenster
  {
   double y=NormalizeDouble(price,span);
   string pfx=DoubleToString(y,span);
// wenn draw=true, wird das Histogramm nach rechts gezeichnet
   if(draw)
     {
      string name="+ "+h_name+pfx;                   // Objektname: Präfix+Preis
      ObjectCreate(0,name,OBJ_TREND,swin,time,y);    // das Objekt erstellen
      ObjectSetInteger(0,name,OBJPROP_COLOR,color_R_active); // Einstellen der Objektfarbe
      ObjSet;                                                // Makro zur Codeverkürzung
      if(StringFind(ObjectGetString(0,name,OBJPROP_TEXT),"*",0)<0)
        {// wenn der resultierende Preis zum ersten Mal in die Stichprobe eintritt
         ObjectSetString(0,name,OBJPROP_TEXT,"*1");          // die Preisfrequenz ist 1
         ObjectSetInteger(0,name,OBJPROP_TIME,1,time+hsize); // Definition der Zeitkoordinate
        }
      else
        {// wenn der resultierende Preis nicht zum ersten Mal in die Stichprobe eintritt
         string str=ObjectGetString(0,name,OBJPROP_TEXT);    // Abrufen des Eigenschaftswerts
         string strint=StringSubstr(str,1);                  // Hervorhebung der Teilzeichenkette
         long n=StringToInteger(strint);                     // Ermitteln einer Frequenz für weitere Berechnungen
         n++;                                                // den Wert um 1 erhöhen
         ObjectSetString(0,name,OBJPROP_TEXT,"*"+(string)n); // einen neuen Wert in die Eigenschaft schreiben
         ObjectSetInteger(0,name,OBJPROP_TIME,1,time+hsize*n);//Die Zeitkoordinate festlegen
        }
     }
// wenn draw=false, wird das Histogramm nach links geschrieben
   if(!draw)
     {
      string name="- "+h_name+pfx;
      ObjectCreate(0,name,OBJ_TREND,swin,time,y);
      ObjectSetInteger(0,name,OBJPROP_COLOR,color_L_active);
      ObjSet;
      if(StringFind(ObjectGetString(0,name,OBJPROP_TEXT),"*",0)<0)
        {
         ObjectSetString(0,name,OBJPROP_TEXT,"*1");
         ObjectSetInteger(0,name,OBJPROP_TIME,1,time-hsize);
        }
      else
        {
         string str=ObjectGetString(0,name,OBJPROP_TEXT);
         string strint=StringSubstr(str,1);
         long n=StringToInteger(strint);
         n++;
         ObjectSetString(0,name,OBJPROP_TEXT,"*"+(string)n);
         ObjectSetInteger(0,name,OBJPROP_TIME,1,time-hsize*n);
        }
     }
  ChartRedraw();
}
 
Sergey Pavlov:
//+------------------------------------------------------------------+
//|draw_histogram.mqh |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//--- Макросы
#define   R        43    // значения префикса (+) для гистограммм справа
#define   L        45    // значения префикса (-) для гистограммм слева
#define   WIDTH    2     // толщина линий
#define   ObjSet1  ObjectSetInteger(0,name,OBJPROP_WIDTH,WIDTH)
#define   ObjSet2  ObjectSetDouble(0,name,OBJPROP_PRICE,0,y)
#define   ObjSet3  ObjectSetInteger(0,name,OBJPROP_TIME,0,time)
#define   ObjSet4  ObjectSetDouble(0,name,OBJPROP_PRICE,1,y)
#define   ObjSet5  ObjectSetInteger(0,name,OBJPROP_BACK,true)
#define   ObjSet   ObjSet1;ObjSet2;ObjSet3;ObjSet4;ObjSet5
//---
int      hsize=10;                     // масштаб гистограммы
color    color_R_active=clrRed;        // цвет активных линий справа
color    color_R_passive=clrLightCoral;// цвет пассивных линий справа
color    color_L_active=clrBlue;       // цвет активных линий слева
color    color_L_passive=clrSkyBlue;   // цвет пассивных линий слева

void DrawHistogram(bool draw,     // Zeichnen eines Histogramms nach links oder nach rechts
                   string h_name, // eindeutiges Präfix für den Objektnamen
                   double price,  // Preis (analysierter Parameter)
                   datetime time, // ein Histogramm an den aktuellen Balken binden
                   int span,      // analysierter Parameter Ziffernkapazität
                   int swin=0)    // Histogramm-Fenster
  {
   double y=NormalizeDouble(price,span);
   string pfx=DoubleToString(y,span);
// wenn draw=true, wird das Histogramm nach rechts gezeichnet
   if(draw)
     {
      string name="+ "+h_name+pfx;                   // Objektname: Präfix+Preis
      ObjectCreate(0,name,OBJ_TREND,swin,time,y);    // das Objekt erstellen
      ObjectSetInteger(0,name,OBJPROP_COLOR,color_R_active); // Einstellen der Objektfarbe
      ObjSet;                                                // Makro zur Codeverkürzung
      if(StringFind(ObjectGetString(0,name,OBJPROP_TEXT),"*",0)<0)
        {// wenn der resultierende Preis zum ersten Mal in die Stichprobe eintritt
         ObjectSetString(0,name,OBJPROP_TEXT,"*1");          // die Preisfrequenz ist 1
         ObjectSetInteger(0,name,OBJPROP_TIME,1,time+hsize); // Definition der Zeitkoordinate
        }
      else
        {// wenn der resultierende Preis nicht zum ersten Mal in die Stichprobe eintritt
         string str=ObjectGetString(0,name,OBJPROP_TEXT);    // Abrufen des Eigenschaftswerts
         string strint=StringSubstr(str,1);                  // Hervorhebung der Teilzeichenkette
         long n=StringToInteger(strint);                     // Ermitteln einer Frequenz für weitere Berechnungen
         n++;                                                // den Wert um 1 erhöhen
         ObjectSetString(0,name,OBJPROP_TEXT,"*"+(string)n); // einen neuen Wert in die Eigenschaft schreiben
         ObjectSetInteger(0,name,OBJPROP_TIME,1,time+hsize*n);//Die Zeitkoordinate festlegen
        }
     }
// wenn draw=false, wird das Histogramm nach links geschrieben
   if(!draw)
     {
      string name="- "+h_name+pfx;
      ObjectCreate(0,name,OBJ_TREND,swin,time,y);
      ObjectSetInteger(0,name,OBJPROP_COLOR,color_L_active);
      ObjSet;
      if(StringFind(ObjectGetString(0,name,OBJPROP_TEXT),"*",0)<0)
        {
         ObjectSetString(0,name,OBJPROP_TEXT,"*1");
         ObjectSetInteger(0,name,OBJPROP_TIME,1,time-hsize);
        }
      else
        {
         string str=ObjectGetString(0,name,OBJPROP_TEXT);
         string strint=StringSubstr(str,1);
         long n=StringToInteger(strint);
         n++;
         ObjectSetString(0,name,OBJPROP_TEXT,"*"+(string)n);
         ObjectSetInteger(0,name,OBJPROP_TIME,1,time-hsize*n);
        }
     }
  ChartRedraw();
}
Ich danke Ihnen!
 

Herr Sergey,

Ich versuche, Plot Tick kaufen und verkaufen Volumen statt Geld und Brief, um ein Volumen zu Preis wie Indikator haben, ist es möglich? haben Sie einige Code mit Tick kaufen / verkaufen Volumen, die Post?

Vielen Dank!


Beispiel der Daten, die ich plotten möchte, es plottet ein horizontales Histogramm von Kauf/Verkauf Tick Volumen in einem separaten Fenster möchte ich ein vertikales Histogramm im Hauptfenster Chart plotten:

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//
#property indicator_label1  "SELL Tick"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrTomato
#property indicator_style1  STYLE_SOLID
//
#property indicator_label2  "BUY Tick"
#property indicator_type2   DRAW_HISTOGRAM
#property indicator_color2  clrSpringGreen
#property indicator_style2  STYLE_SOLID
#property indicator_width2  5

//--- Indikatorpuffer
double         ExtBuyBuffer[];
double         ExtSellBuffer[];

int OnInit()
  {
//--- Zuordnung von Indikatorpuffern
   SetIndexBuffer(0,ExtBuyBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtSellBuffer,INDICATOR_DATA);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);
//---
   return(INIT_SUCCEEDED);
  }



int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

static int ticks=0;
//---
   if(ticks==0)
     {
      ArrayInitialize(ExtSellBuffer,0);
      ArrayInitialize(ExtBuyBuffer,0);
     }
//---
   MqlTick last_tick;
   if(SymbolInfoTick(Symbol(),last_tick) && last_tick.flags == 56)
     {
         ExtBuyBuffer[ticks]+=NormalizeDouble(last_tick.volume,2); 
         int shift=rates_total-1-ticks;
         ticks++;
         ExtBuyBuffer[rates_total-1]=last_tick.volume;
         PlotIndexSetInteger(0,PLOT_SHIFT,shift);
     }
   if(SymbolInfoTick(Symbol(),last_tick) && last_tick.flags == 88)
     {
         ExtSellBuffer[ticks]+=NormalizeDouble(last_tick.volume,2); 
         int shift=rates_total-1-ticks;
         ticks++;
         ExtSellBuffer[rates_total-1]=last_tick.volume;
         PlotIndexSetInteger(1,PLOT_SHIFT,shift);
     }

//
//--- Rückgabe des Wertes von prev_calculated für den nächsten Aufruf

   return(rates_total);
 }