Diskussion zum Artikel "Die statistische Verteilung in Form von einem Histogramm ohne Indikator-Puffer und Arrays"
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
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
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.
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();
}
//|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();
}
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); }

- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
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
Autor: Sergey Pavlov