Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1206

 
Artyom Trishkin:

Redimensionar a matriz nnc_arr_in em 1 mais do que o seu tamanho na célula 0 da matriz de estruturas:

Obrigado.

 

Pergunta mql5

Há duas posições abertas e um sinal(Flag===verdadeiro)

apenas uma posição deve ser fechada por este sinal, ou seja, aquela com o maior lucro.

Como fechar apenas o que tem maior lucro?

Qual é a melhor maneira de lidar com este evento?

Estou a tentar fazê-lo desta forma:

if (invertStart == true) // получил событие, о том что есть две позиции и одну можно закрыть.
   {     
   int npos_L1=0;   NPos_L1(npos_L1);
   if(npos_L1==1)
   {
   int positions=PositionsTotal();
   for(int i=0;i<=positions;i++)
   {
   ulong ticket=PositionGetTicket(i);
   if(ticket!=0 && PositionGetInteger(POSITION_TYPE)== POSITION_TYPE_SELL && POSITION_PROFIT>=50) //  50  допустим...
   {
   m_trade.PositionClose(ticket); 
   i--;
   invertStart = false;
   return;  
   }
   }
   }
   }  

A última posição aberta será fechada em resultado disso.

Por favor, aconselhar como fazê-lo correctamente, gostaria de ter um exemplo. Leio livros de referência e primários, mas nem sempre compreendo as subtilezas.

 
Vladpedro:

Pergunta mql5

Há duas posições abertas e um sinal(Flag===verdadeiro)

apenas uma posição deve ser fechada por este sinal, ou seja, aquela com o maior lucro.

Como fechar apenas o que tem maior lucro?

Qual é a melhor maneira de lidar com este evento?

Estou a tentar fazê-lo desta forma:

A última posição aberta será fechada em resultado disso.

Por favor, aconselhe como fazê-lo correctamente, preciso de um exemplo. Leio livros de referência mas nem sempre compreendo detalhes.

Código:

   ulong ticket=ULONG_MAX;
   double profit=DBL_MIN;
   if(invertStart == true)  // получил событие, о том что есть две позиции и одну можно закрыть.
     {
      int positions=PositionsTotal();
      for(int i=PositionsTotal()-1; i>=0; i--)
        {
         ulong tmp_ticket=PositionGetTicket(i);
         if(ticket!=0)
           {
            double tmp_profit=PositionGetDouble(POSITION_PROFIT);
            if(tmp_profit>profit)
              {
               ticket=tmp_ticket;
               profit=tmp_profit;
              }
           }
        }
      //---
      if(ticket!=ULONG_MAX)
         m_trade.PositionClose(ticket);
     }
 
Vladimir Karputov:

Código:

Muito obrigado, parece funcionar. Apenas se queixa do bilhete, uma vez que já existe uma variável local deste tipo.

A declaração de 'bilhete' esconde a variável local Lim_Stop_03_Sell_pos_06.mq5 299 10

Alguns destes bilhetes poderão ter de ser escondidos no interior.

 
Vladpedro:

Muito obrigado, parece estar a funcionar. Apenas se queixa do bilhete, porque já existe uma variável local.

A declaração de 'bilhete' esconde a variável local Lim_Stop_03_Sell_pos_06.mq5 299 10

Alguns destes bilhetes podem ter de ser escondidos no interior.

Renomear a variável

ulong ticket=ULONG_MAX;

в

ulong close_ticket=ULONG_MAX;

e, claro, não se esqueça de o renomear no seu código.

 
Vladimir Karputov:

Renomear a variável

в

e, claro, não se esqueça de o renomear também no código.

Sim, obrigado, já resolvi o problema... renomeei-o.

 

Bom dia!

Pode dizer-me onde posso encontrar uma EA que envie um e-mail ou uma carta de empurrão se o preço estiver acima da linha superior, ou abaixo da linha inferior (linha horizontal ou inclinada e pode ser movida no gráfico)

Talvez alguém tenha um, por favor partilhe.

Apenas em MT5

Obrigado!

 

se eu ligar o indicador na EA

int OnInit()
{
   ind_handle = iCustom(_Symbol, indperiod, "MyInd", indParam);
   return(INIT_SUCCEEDED);
}

e depois recebo buffers indicadores usando CopyBuffer(ind_handle, 0, 1, 3, buffer1)


tenho de ler todos os sinais indicadores?

Preciso de uma resposta, e de preferência a fonte - docs, artigos:

1. o indicador calcula-se sempre em paralelo

2. o indicador é calculado apenas no momento da chamada de CopyBuffer()

 
Igor Makanu:

se eu ligar o indicador na EA

e depois recebo buffers indicadores usando CopyBuffer(ind_handle, 0, 1, 3, buffer1)


tenho de ler todos os sinais indicadores?

Preciso de uma resposta, e de preferência a fonte - docs, artigos:

1. o indicador calcula-se sempre em paralelo

2. o indicador é calculado apenas no momento da chamada de CopyBuffer()

Igor, se o indicador for escrito correctamente, apenas os valores da barra actual podem ser alterados. Portanto, se precisar de valores actuais, deve utilizar o CopyBuffer imediatamente antes de utilizar estes novos valores. E se precisarmos de valores históricos, eles não mudam, e não há razão para os reler.

Há informação algures sobre o cálculo do indicador em cada carrapato. Tanto quanto me lembro, por defeito, o indicador é recalculado apenas quando é acedido, mas é possível fazê-lo recalcular em cada tic tac. Como o fazer, deve procurar na documentação.

 
Alexey Viktorov:
Igor, se o indicador for escrito correctamente, apenas os valores da barra actual podem ser alterados. Portanto, se precisar de valores actuais, deve utilizar o CopyBuffer imediatamente antes de utilizar estes novos valores. E se precisarmos de valores históricos, eles não mudam, e não há razão para os reler.

Existe alguma informação algures sobre o cálculo do indicador em cada tic. Tanto quanto me lembro, por defeito o indicador é recalculado apenas quando é chamado, mas é possível fazê-lo recalculado a cada tick. Como fazer isto está na documentação.

OK, então terei de o testar de qualquer maneira

o problema está no indicador redesenhado, ainda não quero reescrever o indicador