Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1929

 
È sorta una domanda. Come conoscere il numero di finestre aperte e i loro ID. Ho trovato solo l'id della prima, dell'attuale e della prossima finestra. Ho capito bene che non possiamo ottenere il totale, ma solo il primo, non-ext e come capire che non c'è una finestra successiva.
 
Valeriy Yastremskiy #:
È sorta una domanda. Come conoscere il numero di finestre aperte e i loro ID. Ho trovato solo l'id della prima, dell'attuale e della prossima finestra. Ho capito bene che non possiamo ottenere il totale, ma solo il primo, non-ext e come capire che non c'è una finestra successiva.
    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 #:

Non si può presumere che le finestre siano aperte per tutte le posizioni aperte. Quindi l'algoritmo dovrebbe cercare una finestra con il simbolo richiesto, e se è assente, aprire una finestra e disegnare la situazione. Cioè i livelli, poi trovare su quale SL si è verificata la modifica, e cancellare o cambiare il colore del livello.

 
Valeriy Yastremskiy #:

Non si può presumere che le finestre siano aperte per tutte le posizioni aperte. Quindi l'algoritmo dovrebbe cercare la finestra con il simbolo richiesto, e se è assente, aprire la finestra e disegnare la situazione. Cioè i livelli, poi trovare su quale SL si è verificata la modifica e cancellare o cambiare il colore del livello.

Metti una bandiera, se c'è una finestra aperta, allora disegna, se non c'è aperta - salta. Non ha senso aprire e disegnare se non è aperto/chiuso

    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 #:

Metti una bandiera se c'è una finestra aperta, allora disegna, se non c'è una finestra aperta, allora salta. Non ha senso aprire e disegnare se non si sa che è aperto/chiuso

Se aprirne uno nuovo se il simbolo non è aperto, dipende dal cliente. Per me, con l'apertura è un resoconto più completo della situazione del cliente. Dalla ricerca, avete bisogno dell'id della finestra del simbolo che state cercando.Poi disegnate la finestra che state cercando.

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 ha corretto. Questa è una funzione)))

 
Valeriy Yastremskiy #:

Se aprire o meno una nuova, se il simbolo non è aperto, spetta al cliente. Per me, l'apertura è un resoconto più completo della situazione del cliente. Dalla ricerca, avete bisogno dell'id della finestra del simbolo che state cercando.Poi disegnate la finestra che state cercando.


Zy ha corretto. È una funzione)))

In modo ottimale, compilate un array globalmente visibile di grafici aperti e poi lavorate con l'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); // количество графиков
}

Poi, eseguitelo su un evento per aggiornare il riempimento, per esempio quando il numero di posizioni è cambiato.

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

Questo ridurrà il carico, non ci sarà bisogno di eseguire un ciclo inutile

 
Vitaly Muzichenko #:

In modo ottimale, riempite un array globalmente visibile con i grafici aperti e poi lavorate con l'array

Poi, eseguilo su un evento per aggiornare il riempimento, per esempio quando il numero di posizioni cambia

Questo ridurrà il carico, e non ci sarà bisogno di un inutile looping

Forse mi sfugge qualcosa, ma non capisco perché non usate SYMBOL_SELECT e SYMBOL_VISIBLE per determinare se il grafico è aperto

Quando si passa attraverso gli ordini, fare il controllo

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

Forse mi sfugge qualcosa, ma non capisco perché non usate SYMBOL_SELECT e SYMBOL_VISIBLE per determinare l'apertura del grafico

Passare attraverso gli ordini e fare il controllo

Beh, questo viene da un'altra opera e ha a che fare con Market Watch, non con i grafici aperti. O lo è?

P.S. Se c'è una posizione aperta, il simbolo inMarket Watch sarà comunque visibile.
 
Vitaly Muzichenko #:

Beh, questo viene da un altro thread e ha a che fare con Market Watch, non con i grafici aperti. O lo è?

P.S. Se c'è una posizione aperta, il simbolo inMarket Watch sarà comunque visibile.

SYMBOL_SELECT sì, ma SYMBOL_VISIBLE non è necessario.

E sì, sono d'accordo, non deve essere un grafico aperto.

 
Vitaly Muzichenko #:

In modo ottimale, riempite un array globalmente visibile con i grafici aperti e poi lavorate con l'array

Poi, eseguilo su un evento per aggiornare il riempimento, per esempio quando il numero di posizioni cambia

Questo ridurrà il carico, non c'è bisogno di eseguire un ciclo inutile

Non capisco la logica. Gli eventi di apertura di una posizione, modifica di SL, chiusura di una posizione sono monitorati per alcuni simboli. Quando si apre una posizione, cerchiamo se una finestra con il simbolo dato è aperta (cerchiamo l'id della finestra); se è aperta, tracciamo i livelli e poi monitoriamo il SL trawl. In caso contrario, o apriamo una finestra con il simbolo e il timeframe richiesti e disegniamo i livelli o non la apriamo. L'evento di modifica, trova la finestra del simbolo richiesto, i livelli sono già stati disegnati e cambia il colore del livello o cancellalo e disegna di nuovo il livello.

In generale, per escludere l'influenza del cliente, all'inizio del lavoro dovremmo analizzare le posizioni e le finestre e aprire le finestre per i simboli con posizioni aperte e non aperte.