Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1928

 
Valeriy Yastremskiy #:
Surgiu uma pergunta. Como saber o número de janelas abertas e suas identificações. Encontrei apenas a identificação da primeira, atual e próxima janela. Entendo corretamente que não podemos obter o total, mas apenas o primeiro, o não-extremo e como entender que não há próxima janela.
    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 #:

Não se pode supor que as janelas estejam abertas para todas as posições abertas. Portanto, o algoritmo deve procurar uma janela com o símbolo necessário e, se ela estiver ausente, abrir uma janela e desenhar a situação. Isto é, os níveis, depois descobrir em que nível ocorreu a modificação do SL, e apagar ou mudar a cor do nível.

 
Valeriy Yastremskiy #:

Não se pode supor que as janelas estejam abertas para todas as posições abertas. Portanto, o algoritmo deve procurar uma janela com o símbolo necessário e, se ela estiver ausente, abrir uma janela e desenhar a situação. Isto é, os níveis, depois descobrir em que nível ocorreu a modificação do SL e apagar ou mudar a cor do nível.

Coloque uma bandeira, se houver uma janela aberta, então desenhe, se não houver abertura - pule. Não faz sentido abrir e desenhar se não for aberto/fechado

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

Coloque uma bandeira se houver uma janela aberta, depois desenhe, se não houver uma janela aberta, depois pule-a. Não vale a pena abrir e desenhar se não se souber que está aberto/fechado

A abertura ou não de um novo se o símbolo não estiver aberto é da responsabilidade do cliente. Para mim, com a abertura, é um relato mais completo da situação do cliente. A partir da busca, você precisa da identificação da janela do símbolo que está procurando.Em seguida, desenhe na janela que você está procurando.

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 corrigido. Esta é uma função))))

 
Valeriy Yastremskiy #:

A abertura ou não de um novo, se o símbolo não estiver aberto, fica a cargo do cliente. Para mim, a abertura é um relato mais abrangente da situação do cliente. A partir da busca, você precisa da identificação da janela do símbolo que está procurando.Em seguida, desenhe na janela que você está procurando.


Zy corrigido. É uma função))))

Otimamente, preencha uma matriz globalmente visível de gráficos abertos e depois trabalhe com a 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); // количество графиков
}

Em seguida, execute-o em um evento para atualizar o enchimento, por exemplo, quando o número de posições tiver mudado.

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

Isto reduzirá a carga, não haverá necessidade de fazer um loop inútil

 
Vitaly Muzichenko #:

Otimamente, preencha uma matriz globalmente visível com gráficos abertos e depois trabalhe com a matriz

Em seguida, execute-o em um evento para atualizar o preenchimento, por exemplo, quando o número de posições mudar

Isto reduzirá a carga, e não haverá necessidade de looping inútil

Talvez eu esteja perdendo algo, mas não entendo porque você não usa SYMBOL_SELECT e SYMBOL_VISIBLE para determinar se a tabela está aberta

Ao analisar as ordens, faça a verificação

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

Talvez eu esteja perdendo algo, mas não entendo porque você não usa SYMBOL_SELECT e SYMBOL_VISIBLE para determinar a abertura do gráfico

Analisar as ordens e fazer a verificação

Bem, isto é de uma ópera diferente e tem a ver com a Market Watch, não com gráficos abertos. Ou será?

P.S. Se houver uma posição aberta, o símbolo emMarket Watch será visível de qualquer forma.
 
Vitaly Muzichenko #:

Bem, isso é de outro fio e tem a ver com o Market Watch, não com gráficos abertos. Ou será?

P.S. Se houver uma posição aberta, o símbolo emMarket Watch será visível de qualquer forma.

SYMBOL_SELECT sim, mas SYMBOL_VISIBLE não é necessário.

E sim, concordo, não tem que ser uma tabela aberta.

 
Vitaly Muzichenko #:

Otimamente, preencha uma matriz globalmente visível com gráficos abertos e depois trabalhe com a matriz

Em seguida, execute-o em um evento para atualizar o preenchimento, por exemplo, quando o número de posições mudar

Isto reduzirá a carga, não há necessidade de fazer um loop inútil

Eu não entendo a lógica. Os eventos de abertura de uma posição, modificação do SL, fechamento de uma posição são monitorados por alguns símbolos. Abrindo uma posição, procuramos se uma janela com o símbolo dado está aberta (procure pela id da janela); se estiver, desenhamos níveis e monitoramos ainda mais a rede de arrasto SL. Caso contrário, ou abrimos uma janela com o símbolo e o cronograma necessários e níveis de desenho ou não o abrimos. O evento de modificação, encontrar a janela de símbolo necessária, os níveis já foram desenhados e mudar a cor do nível ou eliminá-lo e desenhar o nível novamente.

Em geral, para excluir a influência do cliente, no início do trabalho devemos analisar posições e janelas e abrir janelas para símbolos com posições abertas e não janelas abertas.

 
Valeriy Yastremskiy #:

Eu não entendo um pouco a lógica. Os eventos de abertura de posição, modificação de SL, fechamento de posição em vários símbolos são monitorados. Abertura de posição - procurar se uma janela com o símbolo dado está aberta (procurar a id da janela), se está aberta, então desenhamos níveis e depois monitoramos a rede de arrasto SL. Caso contrário, ou abrimos uma janela com o símbolo e o cronograma necessários e níveis de desenho ou não o abrimos. O evento de modificação, encontrar a janela de símbolo necessária, os níveis já foram desenhados e mudar a cor do nível ou eliminá-lo e desenhar o nível novamente.

Geralmente, para excluir a influência do cliente, no início do trabalho devemos analisar posições e janelas e abrir janelas para símbolos com posições abertas e não janelas abertas.

O importante em tudo isso é um algoritmo de arrasto que funcione corretamente, ou seja, as próprias operações comerciais.

O desenho está em segundo plano, é informativo e não tem nada a ver com a rentabilidade do sistema.

Portanto, se houver uma posição mas o gráfico estiver fechado e não fechar por si só, não há necessidade de abrir nada, o algoritmo de arrasto funcionará e as paradas serão movidas para lá. Uma situação muito pior é quando o gráfico está obviamente fechado, mas o programa o abriu novamente literalmente para o desenho do gráfico - isto já é ruim.

Razão: