Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1929

 
Ha surgido una pregunta. Cómo saber el número de ventanas abiertas y sus identificaciones. Sólo he encontrado la identificación de la primera, actual y siguiente ventana. Entiendo correctamente que no podemos obtener el total, sino sólo el primero, el no-ext y cómo entender que no hay una ventana siguiente.
 
Valeriy Yastremskiy #:
Ha surgido una pregunta. Cómo saber el número de ventanas abiertas y sus identificaciones. Sólo he encontrado la identificación de la primera, actual y siguiente ventana. Entiendo correctamente que no podemos obtener el total, sino sólo el primero, el no-ext y cómo entender que no hay una ventana siguiente.
    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 #:

No se puede suponer que las ventanas estén abiertas para todas las posiciones abiertas. Por lo tanto, el algoritmo debe buscar la ventana con el símbolo requerido, y si está ausente, abrir la ventana y dibujar la situación. Es decir, los niveles, y luego encontrar en qué SL se produjo la modificación, y eliminar o cambiar el color del nivel.

 
Valeriy Yastremskiy #:

No se puede suponer que las ventanas estén abiertas para todas las posiciones abiertas. Por lo tanto, el algoritmo debe buscar la ventana con el símbolo requerido, y si está ausente, abrir la ventana y dibujar la situación. Es decir, los niveles, luego encontrar en qué SL se produjo la modificación y eliminar o cambiar el color del nivel.

Poner una bandera, si hay una ventana abierta, a continuación, dibujar, si no hay abierto - saltar. No tiene sentido abrir y dibujar si no se abre/cierra

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

Poner una bandera si hay una ventana abierta, entonces dibujar, si no hay ninguna ventana abierta, entonces omitirla. No tiene sentido abrir y dibujar si no se sabe que está abierto/cerrado

Abrir o no uno nuevo si el símbolo no está abierto es decisión del cliente. Para mí, con la apertura es un relato más completo de la situación del cliente. En la búsqueda se necesita el identificador de la ventana del símbolo que se busca.A continuación, dibuje en la ventana que está buscando.

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 corrigió. Esto es una función)))

 
Valeriy Yastremskiy #:

Abrir o no uno nuevo, si el símbolo no está abierto, depende del cliente. Para mí, la apertura es un relato más completo de la situación del cliente. En la búsqueda, necesita el identificador de la ventana del símbolo que está buscando.A continuación, dibuje en la ventana que está buscando.


Zy corrigió. Es una función)))

Lo ideal es rellenar una matriz visible globalmente de gráficos abiertos y luego trabajar con la matriz

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); // количество графиков
}

A continuación, ejecútelo en un evento para actualizar el relleno, por ejemplo, cuando cambie el número de puestos

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

Esto reducirá la carga, no habrá necesidad de ejecutar un bucle inútil

 
Vitaly Muzichenko #:

Lo ideal es rellenar una matriz visible globalmente con gráficos abiertos y luego trabajar con la matriz

A continuación, ejecútelo en un evento para refrescar el relleno, por ejemplo, cuando el número de posiciones cambia

Esto reducirá la carga, y no habrá necesidad de bucles inútiles

Tal vez me estoy perdiendo algo, pero no entiendo por qué no se utiliza SYMBOL_SELECT y SYMBOL_VISIBLE para determinar si el gráfico está abierto

Al repasar los pedidos, haga la comprobación

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

Tal vez me estoy perdiendo algo, pero no entiendo por qué no se utiliza SYMBOL_SELECT y SYMBOL_VISIBLE para determinar la apertura del gráfico

Revisa los pedidos y haz la comprobación

Bueno, esto es de una ópera diferente y tiene que ver con Market Watch, no con los gráficos abiertos. ¿O no?

P.D. Si hay una posición abierta, el símbolo enMarket Watch será visible de todos modos.
 
Vitaly Muzichenko #:

Bueno eso es de otro hilo y tiene que ver con Market Watch, no con los gráficos abiertos. ¿O no?

P.D. Si hay una posición abierta, el símbolo enMarket Watch será visible de todos modos.

SYMBOL_SELECT sí, pero SYMBOL_VISIBLE no es necesario.

Y sí, estoy de acuerdo, no tiene que ser una carta abierta.

 
Vitaly Muzichenko #:

Lo ideal es rellenar una matriz visible globalmente con gráficos abiertos y luego trabajar con la matriz

A continuación, ejecútelo en un evento para refrescar el relleno, por ejemplo, cuando el número de posiciones cambia

Esto reducirá la carga, sin necesidad de ejecutar un bucle inútil

No entiendo la lógica. Los eventos de apertura de una posición, modificación del SL, cierre de una posición son monitoreados por unos pocos símbolos. Al abrir una posición, buscamos si una ventana con el símbolo dado está abierta (buscamos el id de la ventana); si lo está, trazamos niveles y seguimos vigilando el arrastre de SL. Si no es así, o bien abrimos una ventana con el símbolo y el marco temporal necesarios y dibujamos los niveles o no la abrimos. El evento de modificación, encuentra la ventana de símbolos requerida, los niveles ya han sido dibujados y cambia el color del nivel o lo elimina y dibuja el nivel de nuevo.

En general, para excluir la influencia del cliente, al principio del trabajo debemos analizar las posiciones y las ventanas y abrir las ventanas para los símbolos con posiciones abiertas y no abiertas.

Razón de la queja: