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

 
Es hat sich eine Frage ergeben. Wie kann man die Anzahl der geöffneten Fenster und deren IDs ermitteln? Ich habe nur die ID des ersten, aktuellen und nächsten Fensters gefunden. Ich verstehe richtig, dass wir nicht die Gesamtsumme erhalten können, sondern nur die erste, nicht-extra und wie zu verstehen, dass es kein nächstes Fenster gibt.
 
Valeriy Yastremskiy #:
Es hat sich eine Frage ergeben. Wie kann man die Anzahl der geöffneten Fenster und deren IDs ermitteln? Ich habe nur die ID des ersten, aktuellen und nächsten Fensters gefunden. Ich verstehe richtig, dass wir nicht die Gesamtsumme erhalten können, sondern nur die erste, nicht-extra und wie zu verstehen, dass es kein nächstes Fenster gibt.
    long currChart=ChartFirst();
    int i=0;
    while(i<CHARTS_MAX) {
      if(ChartSymbol(currChart)==symbol)
        break;
      currChart=ChartNext(currChart);
      if(currChart==-1) break;
      i++;
    }
    symb=ChartSymbol(currChart);
 
Vitaly Muzichenko #:

Es kann nicht davon ausgegangen werden, dass die Fenster für alle offenen Positionen geöffnet sind. Daher sollte der Algorithmus nach einem Fenster mit dem gewünschten Symbol suchen, und wenn es nicht vorhanden ist, ein Fenster öffnen und die Situation zeichnen. D.h. Ebenen, dann finden Sie, auf welcher SL eine Änderung stattgefunden hat, und löschen oder ändern die Farbe der Ebene.

 
Valeriy Yastremskiy #:

Es kann nicht davon ausgegangen werden, dass die Fenster für alle offenen Positionen geöffnet sind. Daher sollte der Algorithmus nach dem Fenster mit dem gewünschten Symbol suchen, und wenn es nicht vorhanden ist, das Fenster öffnen und die Situation zeichnen. D.h. Ebenen, dann finden Sie, auf welcher SL eine Änderung stattgefunden hat und löschen oder ändern die Farbe der Ebene.

Setzen Sie eine Flagge, wenn es ein offenes Fenster gibt, dann zeichnen, wenn es kein offenes gibt - überspringen. Es hat keinen Sinn, zu öffnen und zu zeichnen, wenn es nicht geöffnet/geschlossen ist.

    long currChart=ChartFirst();
    int i=0;
    flag=false;
    while(i<CHARTS_MAX) {
      if(ChartSymbol(currChart)==symbol) {
        flag=true;
        break;
      }
      currChart=ChartNext(currChart);
      if(currChart==-1) break;
      i++;
    }
    if(flag) {
    symb=ChartSymbol(currChart);
    ...
 
Vitaly Muzichenko #:

Setzen Sie eine Flagge, wenn es ein offenes Fenster gibt, dann zeichnen Sie, wenn es kein offenes Fenster gibt, dann lassen Sie es aus. Es hat keinen Sinn, eine Zeichnung zu öffnen und zu zeichnen, wenn nicht bekannt ist, dass sie offen/geschlossen ist.

Ob ein neues eröffnet wird, wenn das Symbol nicht geöffnet ist, bleibt dem Kunden überlassen. Für mich ist die Eröffnung ein vollständigerer Bericht über die Situation des Kunden. Für die Suche benötigen Sie die Fensterkennung des gesuchten Symbols.Zeichnen Sie dann das gesuchte Fenster ein.

int FcurrChartSimbol(symbol){   
long currChart=ChartFirst();
    int i=0;
    while(i<CHARTS_MAX) {
      if(ChartSymbol(currChart)==symbol)
      return(currChart);
      currChart=ChartNext(currChart);i++;
      if(currChart==-1)return(-1);
      
    }}

Zy korrigierte. Dies ist eine Funktion)))

 
Valeriy Yastremskiy #:

Ob er ein neues eröffnet, wenn das Symbol nicht offen ist, bleibt dem Kunden überlassen. Für mich ist die Eröffnung ein umfassenderer Bericht über die Situation des Kunden. Für die Suche benötigen Sie die Fensterkennung des gesuchten Symbols.Zeichnen Sie dann das gesuchte Fenster ein.


Zy korrigierte. Es ist eine Funktion)))

Optimalerweise füllen Sie ein global sichtbares Array von offenen Charts aus und arbeiten dann mit dem Array

int FcurrChartSimbol(symbol) {   
   long currChart=ChartFirst();
    int i=0;
    while(i<CHARTS_MAX) {
      i++;
      mass[i-1]=currChart;
      currChart=ChartNext(currChart);
      if(currChart==-1)
        break;
    }
   return(i); // количество графиков
}

Führen Sie es dann bei einem Ereignis aus, um die Füllung zu aktualisieren, z. B. wenn sich die Anzahl der Positionen ändert

int OT=OrderTotal();
if(OT != pOT) {
 FcurrChartSimbol(symbol);
 pOT=OT;
}

Dadurch wird die Belastung verringert, und es besteht keine Notwendigkeit, eine nutzlose Schleife laufen zu lassen.

 
Vitaly Muzichenko #:

Optimalerweise füllen Sie ein global sichtbares Array mit offenen Charts und arbeiten dann mit dem Array

Führen Sie es dann bei einem Ereignis aus, um die Füllung zu aktualisieren, z. B. wenn sich die Anzahl der Positionen ändert

Dadurch wird die Belastung verringert, und es sind keine unnötigen Schleifen erforderlich.

Vielleicht übersehe ich etwas, aber ich verstehe nicht, warum Sie nicht SYMBOL_SELECT und SYMBOL_VISIBLE verwenden, um festzustellen, ob das Diagramm geöffnet ist

Wenn Sie die Aufträge durchgehen, prüfen Sie

    if(!SymbolInfoInteger(Order_Symbol, SYMBOL_SELECT) || !SymbolInfoInteger(Order_Symbol, SYMBOL_VISIBLE))
      SymbolSelect(Order_Symbol, true);
 
Alexey Viktorov #:

Vielleicht übersehe ich etwas, aber ich verstehe nicht, warum Sie nicht SYMBOL_SELECT und SYMBOL_VISIBLE verwenden, um die Offenheit des Diagramms zu bestimmen

Gehen Sie die Aufträge durch und prüfen Sie

Nun, dies stammt aus einer anderen Oper und hat mit Market Watch zu tun, nicht mit offenen Charts. Oder doch nicht?

P.S. Wenn es eine offene Position gibt, wird das Symbol inMarket Watch trotzdem sichtbar sein.
 
Vitaly Muzichenko #:

Nun, das stammt aus einem anderen Thread und hat mit Market Watch zu tun, nicht mit offenen Charts. Oder doch nicht?

P.S. Wenn es eine offene Position gibt, wird das Symbol inMarket Watch trotzdem sichtbar sein.

SYMBOL_SELECT ja, aber SYMBOL_VISIBLE ist nicht notwendig.

Und ja, ich stimme zu, es muss kein offenes Diagramm sein.

 
Vitaly Muzichenko #:

Optimalerweise füllen Sie ein global sichtbares Array mit offenen Charts und arbeiten dann mit dem Array

Führen Sie es dann bei einem Ereignis aus, um die Füllung zu aktualisieren, z. B. wenn sich die Anzahl der Positionen ändert

Dadurch wird die Belastung verringert, und es ist nicht nötig, eine nutzlose Schleife laufen zu lassen.

Ich verstehe die Logik nicht. Die Ereignisse der Eröffnung einer Position, der Änderung des SL und der Schließung einer Position werden für ein paar Symbole überwacht. Wenn wir eine Position eröffnen, suchen wir, ob ein Fenster mit dem gegebenen Symbol geöffnet ist (wir suchen nach der Fensterkennung); wenn es geöffnet ist, zeichnen wir die Levels und überwachen dann das SL-Trawl. Ist dies nicht der Fall, öffnen wir entweder ein Fenster mit dem gewünschten Symbol und Zeitrahmen und zeichnen die Levels ein oder wir öffnen es nicht. Im Falle einer Änderung suchen Sie das gewünschte Symbolfenster, die Ebenen wurden bereits gezeichnet und ändern die Farbe der Ebene oder löschen sie und zeichnen die Ebene erneut.

Um den Einfluss des Kunden auszuschließen, sollten wir zu Beginn der Arbeit Positionen und Fenster analysieren und Fenster für Symbole mit offenen Positionen und nicht offenen Fenstern öffnen.