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

 
edutak:

Detestaria mostrar o código, pois a primeira versão provou ser muito sobrevivível. Sobreviveu durante 10 anos sem optimização. Agora quero torná-lo um pouco mais complexo e rentável.

O código é muito simples.

Ainda assim, as ordens podem ser abertas em cada tic tac por causa de um erro na lógica.

Verificar antes de abrir uma posição para ver se esta já está aberta ou não.
 
Vitalii Ananev:
Verifique antes de abrir uma posição para ver se esta já está aberta ou não.
Certo?
for(int pos=0; pos<OrdersTotal(); pos++)
     {
      OrderSelect(pos,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magik)
         kolpos++;
     }
 

Antes de fechar é assim.

 if(OrdersTotal()!=0)
         if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES))
            if(OrderType()==OP_BUY)
 
edutak:
Certo?
   for(int pos=OrdersTotal()-1; pos>=0; pos--)         
   {
      if(!OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)) continue;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magik)  kolpos++;
   }

É algo parecido com isto.

É melhor torná-lo numa função.

int CountOrder(string Smb,int Magik)
{
   int Total = OrdersTotal();
   if (Total==0) return(0);
   int kolpos = 0;
   for(int pos=Total-1; pos>=0; pos--)         
   {
      if(!OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)) continue;
      if(OrderSymbol()==Smb && OrderMagicNumber()==Magik)  kolpos++;
   }
   return(kolpos);
}
 
edutak:

Antes de fechar é assim.

Não tem um cheque para magik e símbolo antes de fechar. Pode fechar negócios de outra EA ou negócios abertos manualmente.
 
Vitalii Ananev:
É algo parecido com isto.

Não, o problema não foi resolvido. não está nesta unidade.

Pode por favor explicar a diferença entre a minha opção e a sua?

 
edutak:

Não, o problema não foi resolvido. não está nesta unidade.

Pode por favor explicar a diferença entre a minha opção e a sua?

Depois está a fazer algo de errado, a trabalhar no seu código.

O meu é melhor :)

...

Desta forma, não falhará nenhuma encomenda. Na sua versão, se nesse momento alguma posição for fechada ou uma ordem for eliminada, pode saltar qualquer uma das restantes.

 
Vitalii Ananev:

Por isso, está a fazer algo de errado, lide com o seu código.

O meu é melhor :)

...

Desta forma, não falhará nenhuma encomenda. Se a sua versão mostrar que se nesse momento alguma posição for fechada ou uma ordem for eliminada, então pode saltar algumas das restantes.

Declarei-a como uma variável global, mas isso dá-me um erro.

int CountOrder;
 
edutak:

Declarei-a como uma variável global, mas dá um erro.

O que vos escrevi é uma função.

Aqui está um exemplo de como utilizá-lo.

int Count = CountOrder(Symbol(),12345);

if (Count==0)
{
//можно открывать
}
 
Vitalii Ananev:

O que vos escrevi é uma função.

Aqui está um exemplo de como utilizá-lo.

Confuso