Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 645

 

Taras, ist es möglich, eine solche Graphnormalisierung für den Rahmenwechsel per Mausklick vorzunehmen?

Manchmal klicke ich aus Gewohnheit, wenn sich der Cursor in der Nähe der Schaltfläche befindet, aber das Ergebnis gefällt mir nicht.

In der Liste der Ereignisbehandlung habe ich nichts Passendes gefunden, es gibt nurCHARTEVENT_CHART_CHANGE ohne eine spezifische Beschreibung. Ich kann versuchen, einen Mausklick zu binden, aber soweit ich weiß, kann der Benutzer nicht mit dem Systemmenü arbeiten, sondern nur, wenn er seine eigenen Schaltflächen erstellt. Gibt es eine einfache Lösung?

 
psyman:

Taras, ist es möglich, eine solche Graphnormalisierung für den Rahmenwechsel per Mausklick vorzunehmen?

Manchmal klicke ich aus Gewohnheit, wenn sich der Cursor in der Nähe der Schaltfläche befindet, aber das Ergebnis gefällt mir nicht.

In der Liste der Ereignisbehandlung habe ich nichts Passendes gefunden, es gibt nurCHARTEVENT_CHART_CHANGE ohne spezifische Beschreibung. Ich kann versuchen, den Mausklick zu binden, aber soweit ich weiß, kann der Benutzer nicht mit dem Systemmenü arbeiten, sondern nur, wenn er seine eigenen Schaltflächen erstellt. Gibt es eine einfache Lösung?

Das heißt, auf einige "Tap-Zonen" im Diagramm zu klicken?
Sie können, müssen Sie die Cursor-Koordinaten und Maustastenklicks verfolgen.

CHARTEVENT_MOUSE_MOVE

 

Forum für Handel, automatisierte Handelssysteme und Strategietests

Alle Fragen für Anfänger auf MQL4, Hilfe und Diskussion über Algorithmen und Codes

Taras Slobodyanik, 2018.10.04 09:37

Sie meinen, dass Sie mit Ihrer Maus auf einige "Tap-Zonen" auf dem Diagramm klicken?
Sie können, müssen Sie die Cursor-Koordinaten und Mausklicks verfolgen.



Die Sache ist die, dass es sich um einen Klick auf das Diagramm handelt, nicht auf eine Schaltfläche im Systemmenü. Wie man ein solches Ereignis verarbeitet, weiß ich nicht.
 
psyman:

Die Sache ist die, dass es sich um einen Klick auf ein Diagramm handelt und nicht um eine Schaltfläche aus dem Systemmenü. Ich weiß nicht, wie ich ein solches Ereignis verarbeiten soll.

Merken Sie sich den aktuellen Zeichenzeitraum und überprüfen Sie bei"CHARTEVENT_CHART_CHANGE" die Änderungen und tun Sie, was Sie tun müssen

 
OK, nochmals vielen Dank.
 

Bitte sagen Sie mir, warum die gleiche Funktion aus dem EA Körper OnTick() nicht funktioniert (oder besser gesagt, es funktioniert, aber nicht auf allen Charts korrekt)

Aber von der Prozedur OnInit() aus funktioniert es gut und auch von einem normalen Skript aus. Der Expert Advisor ist auf 80 Charts gleichzeitig installiert (20 Währungen, jeweils 4 Fenster W1 D1 H4 H1) kann nur mein Computer nicht bewältigen? Bitte beraten Sie mich. Der Zweck des Roboters ist es, die MessageBox-Meldungen auf dem Bildschirm auszugeben, wenn ein Signal auf einem der Charts erkannt wird. Vielleicht ist der Computer zum Zeitpunkt des Starts dieser Meldungen langsam?
 

Ich habe Probleme, mich an den Zeitraum vor der Bearbeitung eines Ereignisses zu erinnern, wo kann ich das tun?

Beschlossen, durch Nachricht zu verfolgen, stellt sich heraus, dass CHARTEVENT_CHART_CHANGE 2 mal in einem Klick verarbeitet wird, die ctime-Variable zurückgesetzt wird.


#Eigenschaft streng

#property indicator_chart_window

int ctime;


void OnInit()

{

Print(" OnInit------------1 ", ChartPeriod(0));

Print("OnInit ctime = ", ctime);

// ctime=ChartPeriod(0);

}


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 &Volumen[],

const int &spread[])

{

ctime=ChartPeriod(0);

return(rates_total);

}

void OnChartEvent(const int id,

const long &lparam,

const double &dparam,

const string &sparam)


{


if(id==CHARTEVENT_CHART_CHANGE)

{

Print("CHARTEVENT_CHART_CHANGE wird gestartet ctime=", ctime);

if(ctime!=ChartPeriod(0))

{

Print(ChartPeriod(0), "CHANGED!!!!!!!!!!!!!!! ", ctime);

}

}

}



Hinzufügen des Indikators auf stündlicher Basis, dann Wechsel zu täglich

2018.10.05 01:04:45.171 _t1 CADJPY,Daily: CHARTEVENT_CHART_CHANGE wird gestartet ctime=1440

2018.10.05 01:04:45.156 _t1 CADJPY,Daily: 1440 CHANGED!!!!!!!!!!!!!!! 0

2018.10.05 01:04:45.156 _t1 CADJPY,Daily: CHARTEVENT_CHART_CHANGE wird gestartet ctime=0

2018.10.05 01:04:45.156 _t1 CADJPY,Daily: initialisiert

2018.10.05 01:04:45.156 _t1 CADJPY,Daily: OnInit ctime=0

2018.10.05 01:04:45.156 _t1 CADJPY,Daily: OnInit------------1 1440

2018.10.05 01:04:45.156 _t1 CADJPY,H1: uninit Grund 3

2018.10.05 01:02:02.000 _t1 CADJPY,H1: CHARTEVENT_CHART_CHANGE wird gestartet ctime=60

2018.10.05 01:02:02.000 _t1 CADJPY,H1: 60 CHANGED!!!!!!!!!!!!!!! 0

2018.10.05 01:02:02.000 _t1 CADJPY,H1: CHARTEVENT_CHART_CHANGE wird gestartet ctime=0

2018.10.05 01:02:02.000 _t1 CADJPY,H1: initialisiert

2018.10.05 01:02:02.000 _t1 CADJPY,H1: OnInit ctime=0

2018.10.05 01:02:02.000 _t1 CADJPY,H1: OnInit------------1 60

2018.10.05 01:02:01.078 Benutzerdefinierter Indikator _t1 CADJPY,H1: erfolgreich geladen





 
psyman:

Ich habe Schwierigkeiten, mich an den Zeitraum vor der Verarbeitung des Ereignisses zu erinnern, wo muss das gemacht werden?

Beschlossen, durch Nachricht zu verfolgen, stellt sich heraus, dass CHARTEVENT_CHART_CHANGE 2 mal in einem Klick verarbeitet wird, die ctime-Variable zurückgesetzt wird.

Fügen Sie den Code korrekt in die Nachricht ein! In dieser Form ist es sehr schwer zu lesen. Das muss so aussehen.

#property strict
#property indicator_chart_window
int ctime;
void OnInit()
   {
     Print("  OnInit------------1  ", ChartPeriod(0));
     Print("OnInit ctime = ", ctime);
   //  ctime=ChartPeriod(0);   
   }
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[])
  {
   ctime=ChartPeriod(0);         
   return(rates_total);
  }
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   if(id==CHARTEVENT_CHART_CHANGE)
      {
      Print("CHARTEVENT_CHART_CHANGE     is started  ctime=", ctime);
      if(ctime!=ChartPeriod(0))
      {
      Print(ChartPeriod(0), "  CHANGED!!!!!!!!!!!!!!!   ", ctime);
      }
      } 
}

Wenn Sie die Parameter eines Diagramms ändern, wird der Indikator zwangsweise neu geladen. Lesen Sie in der Dokumentation den Grund für die Deinitialisierung und die entsprechende Grundvariable.

Sie können globale Terminalvariablen verwenden, um die erforderlichen Parameter zu speichern.

 
Vitaly Gorbunov:

Fügen Sie den Code korrekt in die Nachricht ein! Es ist sehr schwierig, sie so zu lesen. Das sollte so sein.

Der Indikator wird zwangsweise neu gestartet, wenn Sie die Chart-Parameter ändern. Lesen Sie in der Dokumentation den Grund für die Deinitialisierung und die Variable für den Grund.

Sie können globale Variablen des Terminals verwenden, um die erforderlichen Parameter zu speichern.

Ja, Sie müssen die Werte in GlobalVariable speichern und dann beim Start ihre Existenz überprüfen.

Das heißt, die Kartennummer, das Symbol und der Punkt sollten gespeichert werden.
Und dann löschen Sie unnötige Variablen, oder machen Sie sie zunächst zu temporären globalen Variablen.

ps. Sie können Informationen auch in Objekten auf dem Diagramm speichern - solange das Diagramm existiert, existieren auch die Objekte.

 

Ich dachte, es wäre viel einfacher :-)

Dann eine ziemlich kindische Frage - mein Code beinhaltet keinen Handel oder Grafiken, welche Art von Programm sollte ich verwenden?

Die Skripte sind einmalig, aber können sie in einer Schleife ausgeführt werden? Ich habe aus reiner Trägheit einen benutzerdefinierten Indikator deklariert, weil ich noch nie Expert Advisors verwendet habe. Ich habe sie noch nie benutzt, aber sie starten automatisch neu, was ich nicht brauche. Ich brauche Ihren Rat.

ps

Objekte können die Größe Null haben, so dass sie optisch nicht im Weg sind?

Grund der Beschwerde: