Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1345

 
Vitaly Muzichenko #:

Müssen Sie auch hier das Präfix beim Laden der nächsten Kopie ändern?

Können Sie in Worten sagen, was der Zweck ist?

Schaltflächen können von außerhalb Ihres Fensters erstellt und gesteuert werden.


Was wird es sein?

 
Igor Makanu #:

Können Sie in Worten sagen, was der Zweck ist?

Die Schaltflächen können auch außerhalb Ihres Fensters erstellt und gesteuert werden.


Was könnte das sein?

Ich weiß es nicht, aber es sollte so sein: Erstellen Sie in Ihrem Unterfenster, und wenn Sie klicken, erhalten Sie die Nummer dieses Unterfensters. Sie brauchen nichts zu zeichnen, sondern nur eine Schaltfläche, die, wenn sie angeklickt wird, Informationen über die Nummer des Unterfensters in Alert anzeigt

 
Vitaly Muzichenko #:

Ich weiß es nicht, aber so geht's: Erstellen Sie in Ihrem Unterfenster, und wenn Sie darauf klicken, erhalten Sie die Nummer des Unterfensters. Sie brauchen nichts zu zeichnen, sondern nur eine Schaltfläche, die, wenn sie angeklickt wird, Informationen über die Nummer des Unterfensters in Alert anzeigt

meine erste Quelle überprüft:

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
#include <Controls\Button.mqh>
CButton button;

//--- indicator buffers
double         Label1Buffer[];
input int MASlow = 21; // Период медленной МА
input int MAFast = 8;  // Период быстрой МА
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
   string short_name = MQLInfoString(MQL_PROGRAM_NAME) + "=Set (" + (string)MASlow + "/" + (string)MAFast + ")";
   IndicatorSetString(INDICATOR_SHORTNAME, short_name);

  // IndicatorSetString(INDICATOR_SHORTNAME, "IndicatorSetString() Demo");
   SetIndexBuffer(0, Label1Buffer, INDICATOR_DATA);
   srand(GetTickCount());
   long c_id = ChartID();
   int c_wf = ChartWindowFind();
   Print(c_id, " / ", c_wf);
   button.Create(c_id, "button" + (string)rand(), c_wf, 10, 10, 100, 100);
   button.Text("Button");
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
{
   for(int i = prev_calculated == 0 ? 0 : prev_calculated - 1; i < rates_total; i++)
   {
      Label1Buffer[i] = close[i];
   }
   return(rates_total);
}
//+------------------------------------------------------------------+


leider ist alles so, wie Sie geschrieben haben - wenn Sie mehrere Kopien dieses Indikators mit Standardparametern ausführen, wird die Schaltfläche nur auf dem ersten Indikator in einem Unterfenster angezeigt

aber wenn Sie die Parameter während des Starts ändern, ist alles in Ordnung


im Allgemeinen ist die Situation unklar

 
Igor Makanu #:

Ich habe es bei meiner ersten Quelle überprüft:

leider ist alles so, wie Sie schreiben - wenn Sie mehrere Kopien dieses Indikators mit Standardparametern ausführen, wird die Schaltfläche nur auf dem ersten Indikator im Unterfenster angezeigt

aber wenn Sie die Parameter während des Starts ändern, ist alles in Ordnung

im Allgemeinen ist die Situation unklar

Hier also eine Frage: Wie kann man Parameter automatisch ändern, ohne in die Einstellungen zu gehen?

Nichts funktioniert bisher ...

---

P.S. Idealerweise, aber leider

input long MASlow = TimeLocal(); //
 
Vitaly Muzichenko #:

Bis jetzt funktioniert es nicht ...

Und das wird es auch nicht:

eingefügt:

int OnInit()
{
   Print(__FUNCTION__);

Ich setze einen Indikator - ich bekomme OnInit im Log, aber der nächste Indikator ist bereits still, d.h. nur eine Kopie des Indikators läuft wirklich, und die anderen Indikatoren sind nur eine grafische Hülle

 
Igor Makanu #:

und es wird nicht funktionieren:

eingefügt:

Ich setze den Indikator - ich bekomme OnInit im Protokoll, aber der nächste Indikator ist bereits still, d.h. nur eine Kopie des Indikators läuft wirklich, und die anderen Indikatoren sind nur eine grafische Hülle

So ist das nun einmal. Ich denke, die Architektur von mt5 ist nicht richtig. Das mt4-Terminal funktioniert einwandfrei.

Wenn Sie sich entschieden haben, dies in mt5 zu tun, würden Sie verbieten, Indikator-Kopien mit den gleichen Eingabeparametern auszuführen, weil es scheint, vorhanden zu sein, aber nicht vorhanden.

 
Vitaly Muzichenko #:

So ist es nun einmal. Die Architektur von mt5 muss ein Chaos sein. In mt4 funktioniert alles einwandfrei.

Wenn Sie sich dazu entschlossen haben, dies in mt5 zu tun, hätten Sie den Start von Indikatorkopien mit denselben Eingabeparametern verbieten sollen, denn er scheint vorhanden zu sein, ist es aber in Wirklichkeit nicht.

Der Berechnungsteil des Indikators ist nicht mit dem grafischen Teil identisch. Daher ist der Berechnungsteil für alle gleich. Es gibt mehrere grafische Versionen.

Können Sie nicht einfach alle Unterfenster in einem einzigen Indikator suchen und dort Etiketten mit der Nummer des Unterfensters einfügen? Zur gleichen Zeit in den Timer die Anzahl der Unterfenster des Diagramms zu fangen: erhöht - zu einem neuen Unterfenster Etikett hinzufügen. Suchen Sie aber auch nach dem Indikator, der darin platziert ist - wenn er anders ist, dann fügen Sie ihn nicht hinzu...

Nur eine ungetestete Idee.

ZS: Ich bin mit der "Krümmung" nicht einverstanden. Ein Berechnungsteil für 20 gleiche Indikatoren ist besser als 20 Berechnungsteile für 20 gleiche Indikatoren.

 
Artyom Trishkin #:

Der Berechnungsteil eines Indikators ist nicht dasselbe wie der grafische Teil. Daher ist der Berechnungsteil für alle gleich. Es gibt mehrere grafische Versionen.

Können wir nicht einfach nach allen Unterfenstern in einem Indikator suchen und Beschriftungen mit Unterfensternummern einfügen? Gleichzeitig wird im Timer die Anzahl der Unterfenster des Diagramms erfasst: wenn sie erhöht wird - wird ein neues Unterfensteretikett hinzugefügt. Suchen Sie aber auch nach dem Indikator, der darin platziert ist - wenn er anders ist, dann fügen Sie ihn nicht hinzu...

Nur eine ungetestete Idee.

ZS: Ich bin mit der "Krümmung" nicht einverstanden. Ein Berechnungsteil für 20 gleiche Indikatoren ist besser als 20 Berechnungsteile für 20 gleiche Indikatoren.

Hat, keine Reaktion auf die Schaltfläche - OnChartEvent Kopie nicht auslösen und nicht verstehen, die Subwindow-Nummer.

Wie auch immer, hier ist, was nicht funktioniert, und zusammen mit ihm der Rest des Codes

Forum für Handel, automatisierte Handelssysteme und Strategietests

FAQ von Anfängern MQL5 MT5 MetaTrader 5

Igor Makanu, 2021.09.12 21:53

Sie nicht:

hinzugefügt zu:

int OnInit()
{
   Print(__FUNCTION__);

Ich setze einen Indikator - ich bekomme OnInit im Protokoll, aber der nächste Indikator ist bereits still, d.h. nur eine Kopie des Indikators läuft tatsächlich, und die anderen Indikatoren sind nur eine grafische Hülle


 
Vitaly Muzichenko #:

Getan, keine Reaktion auf Schaltfläche - OnChartEvent-Kopie funktioniert nicht und versteht keine Unterfensternummer.

Wie auch immer, hier ist, was nicht funktioniert und damit der Rest des Codes


ABER!!! Wenn ich eine Vorlage mit 2-3 dieser Indikatoren unter dem Namen "Debug.tpl" erstelle und mit dem Debugging des Indikators beginne, dann funktioniert OnInit() so wie es sollte.

Im Allgemeinen habe ich ein solches Experiment durchgeführt:

Ich habe #property auf sein Maximum in OnInit() übertragen, in der Hoffnung, dass der Indikator, solange er noch nicht erstellt wurde, OnInit() ausführen und einen kurzen Namen für den Indikator vergeben wird, abhängig von der Anzahl der Indikatoren im Fenster.

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
//#property indicator_label1  "Label1"
//#property indicator_type1   DRAW_LINE
//#property indicator_color1  clrRed
//#property indicator_style1  STYLE_SOLID
//#property indicator_width1  2
//--- indicator buffers
double         Label1Buffer[];
input int MASlow = 21; // Период медленной МА
input int MAFast = 8;  // Период быстрой МА
//input string shortName = "1";  // Префикс…
long chart_id = ChartID();
string short_name = "";
/********************************************************************\
|           Custom indicator initialization function                 |
\********************************************************************/
int OnInit()
 {
//--- indicator buffers mapping
  long windows_total = ChartGetInteger(chart_id, CHART_WINDOWS_TOTAL);
  short_name = (string)windows_total;
  Print(short_name);
  PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE);
  PlotIndexSetInteger(0, PLOT_LINE_COLOR, clrRed);
  PlotIndexSetInteger(0, PLOT_LINE_STYLE, STYLE_SOLID);
  PlotIndexSetInteger(0, PLOT_LINE_WIDTH, 2);
  PlotIndexSetString(0, PLOT_LABEL, "Label1");
  IndicatorSetString(INDICATOR_SHORTNAME, short_name);
  SetIndexBuffer(0, Label1Buffer, INDICATOR_DATA);
  return(INIT_SUCCEEDED);
 }/******************************************************************/

Aber es hat nicht geholfen:

Ich beginne die erste Kopie

Bezeichnung des Indikators 2.........

Ich starte die zweite Kopie - der Indikatorname ist immer noch 2 für beide Indikatoren

Ich starte das Debugging und was sehe ich! Der noch nicht geladene Indikator wird bereits gedruckt... lesen Sie die zweite und dritte Zeile...

Wie kann das sein?


Weiteres Debugging wurde beim Eintritt in OnInit() gestoppt, die Variable windows_total enthält Müll, short_name ist immer noch ein leerer String...

Hi......... aber es ist schon alles gedruckt... wie kommt das???

Und der Kurzname hat sich bereits geändert.

Nach dem vollständigen Laden des Indikators im Debug-Modus hat der Indikator daher folgende Namen

Vielleicht sollten wir die Entwickler auf solche Fehler aufmerksam machen...

 
Hallo Freunde, vielleicht bin ich an der falschen Stelle, aber ich sehe den Abschnitt namens: "Fragen von Anfängern MQL5 MT5 MetaTrader 5". Also meine Frage ist: Ich verwendet, um Demo EAs von Market zum Testen jetzt herunterladen, was auch immer ich tat MT5 kann nicht herunterladen Demo. MT4 ohne Probleme, MT5 nicht, was ist der Grund?